ingest: Public Release, Corpus Purge and History Squash Session 2026-09-01
Files changed: - kb/concepts/Delete Rather Than Anonymize.md - kb/concepts/Dual Licensing by File Plan.md - kb/concepts/INDEX.md - kb/entities/projects/Chemenu.md - kb/entities/tools/wikitool.md - kb/index.md - kb/log.md - kb/provenance.md - kb/sources/INDEX.md - kb/sources/Source - Public Release, Corpus Purge and History Squash Session 2026-09-01.md - raw/notes/Conversation Transcript - Private-Instance Merge Correction and Issue 30 Session 2026-09-01.md - raw/notes/Conversation Transcript - Public Release, Corpus Purge and History Squash Session 2026-09-01.md - raw/notes/Conversation Transcript - Publish-Remote Gate and Issue Triage Session 2026-09-01.md
This commit is contained in:
+154
@@ -0,0 +1,154 @@
|
||||
# Conversation Transcript - Publish-Remote Gate and Issue Triage Session
|
||||
|
||||
> Source: Claude Code session (`claude-opus-5`), chemenu workspace
|
||||
> Collected: 2026-09-01
|
||||
> Participant: Torben
|
||||
> Fidelity: **faithful summary transcript, not a verbatim log.** Torben's instructions are
|
||||
> quoted verbatim; the assistant's design reasoning is condensed. Command outputs and test
|
||||
> results shown are real. No credentials appeared in the session; where a private hostname
|
||||
> could have been used as a code example, a generic placeholder is used instead, matching what
|
||||
> was actually committed.
|
||||
> Continues directly from "Public Release, Corpus Purge and History Squash Session" (same day).
|
||||
> Two of three transcripts cut from this session; the third covers a bug found afterward in the
|
||||
> procedure this one builds (issue #30).
|
||||
|
||||
Covers building the Publish-Remote Gate (a third code-enforced gate, alongside the Mass-Update
|
||||
and rebase-review gates), writing `instructions/private-instance.md`, updating six open Gitea
|
||||
issues for the rename and the new architecture, opening three new issues (#27, #28, #29), and
|
||||
deleting the Gitea Actions run history at Torben's request. Resulted in version 2.2.0, then a
|
||||
documentation-only 2.2.2.
|
||||
|
||||
---
|
||||
|
||||
## Turn 1 - "1. remote allowlist. 2. unterbreche und warte auf mich, wenn ich gitea scharf schalten soll... 3. setup a) meiner lokalen dev-umgebung"
|
||||
|
||||
Torben asked for three things in one message, plus: "parallel issuen anlgen und aktualisieren
|
||||
nach eigenem ermessen, prüfe auch vorhandene, evtl. müssen wir hier auch noch tätig werden?"
|
||||
|
||||
**The gate.** Designed to pin the **resolved push URL**, not the remote name - a name-based
|
||||
allowlist would pass a `publish` whose `origin` had been repointed, which is the exact failure
|
||||
it exists to catch. `git remote get-url --push <remote>` is read at check time so a `pushurl`
|
||||
override is respected. The file (`.wikitool-remotes.json`) is gitignored and per-checkout, for
|
||||
the same reason `ENVIRONMENT.md` is: two clones push to two different places, and a committed
|
||||
copy would tell a private clone the public upstream is a legitimate target for its own content.
|
||||
Absence means unrestricted, matching the pattern of the other optional per-checkout files;
|
||||
`doctor` reports the state and WARNs only when a checkout has more than one remote and no
|
||||
allowlist.
|
||||
|
||||
**Deliberately no `--confirm` token**, unlike the other two gates. Their question ("is this
|
||||
change right?") is answerable per changeset; this gate's question ("does this content belong in
|
||||
that repository?") is a standing property of the checkout, so the only way past it is the user
|
||||
editing the file themselves - an agent editing it to clear a refusal would be opening a gate on
|
||||
its own initiative, which the repository's own rules forbid.
|
||||
|
||||
Implementation: `config.PUBLISH_REMOTES_FILENAME`, `read_allowed_push_urls()` /
|
||||
`push_url_for()` / `publish_remote_refusal()` in `git_publish.py`, checked before the reconcile
|
||||
step in `publish_command` (before any network contact, so a refused publish never even fetches
|
||||
from the wrong place), `doctor.check_publish_remotes()`, twelve new tests covering the URL-vs-name
|
||||
distinction, `pushurl` precedence, a broken/missing/empty allowlist, and that no flag exists to
|
||||
bypass it. `instructions/gates.md` and `AGENTS.md` updated to describe a third gate. Version
|
||||
bumped `2.1.1 -> 2.2.0`; the Mass-Update Gate itself fired at 10 files and Torben cleared it with
|
||||
the printed token.
|
||||
|
||||
**`instructions/private-instance.md`** (new): the procedure for cloning with the public repo as
|
||||
`upstream`, arming the gate *before* the first `publish` (not after - the assistant stressed this
|
||||
ordering explicitly, since a gate added later leaves the earlier window open), taking the write
|
||||
credential away from the private clone as a second, independent control, and where stack
|
||||
development happens ("in the public repo, not here" - not a preference but a structural fact,
|
||||
since `instructions/dev/` does not survive `dist export`). **This file's description of what a
|
||||
`git merge upstream/main` actually does to the content stages was wrong as first written** - see
|
||||
the third transcript for the correction.
|
||||
|
||||
**The Gitea admin cheat-sheet** (delivered as a reply, not committed): what to check before
|
||||
flipping the repo public (`DISABLE_REGISTRATION`, `REQUIRE_SIGNIN_VIEW`, rate limits, the
|
||||
Actions runner's network exposure), and the follow-up steps (`INSTALL.md`, anonymous release
|
||||
check, a clone test). Also flagged that the open issues would go public with the repo, which is
|
||||
what motivated the issue-triage pass below.
|
||||
|
||||
## Turn 2 - Issue triage
|
||||
|
||||
Read the labels (`prio/1..3`, `size/XS..L`) and the open issues. Several pre-dated the
|
||||
`llm-wiki-test1` -> `chemenu` rename (issue #3) and still named the old package path
|
||||
(`tools/wiki_tools/...`) or the old repository name in code examples:
|
||||
|
||||
- **#6** title corrected in place (`wiki_tools` -> `chemenu` path).
|
||||
- **#7** (`dist upgrade`) commented: the "origin repo is private" fallback it describes no
|
||||
longer applies once the repo is public, and its urgency for *this* instance specifically
|
||||
dropped, because the private instance now takes updates via `git merge upstream/main` (real
|
||||
three-way merge) rather than the tarball-copy path the issue was written against - it remains
|
||||
the right design for any instance without shared git history.
|
||||
- **#10** (coverage reporting) commented: step 1 is done (1.8.1 shipped `pytest-cov` without a
|
||||
failure threshold), the test count referenced is stale (630 -> 752, and the gap is itself
|
||||
evidence for the issue's own argument - the raw_dir fixture bug from the first transcript), and
|
||||
one code example named a private CI branch and needs neutralizing before being read publicly.
|
||||
- **#4, #5** flagged as needing the same path correction but not rewritten in this pass.
|
||||
|
||||
**Three new issues opened**, each traced to a decision made and then set aside earlier in the
|
||||
day rather than invented fresh:
|
||||
|
||||
- **#27** - the shipped-manual idea the debate rejected (first transcript, Turn 2) needs a
|
||||
decay/lint exemption for distributed pages before it becomes buildable at all; names the exact
|
||||
blocker (`confidence_decay.py` has no exemption path) and the two things still undecided (how
|
||||
a shipped page is recognized, what exactly is exempted).
|
||||
- **#28** - the demo-vs-testbed tension the debate argued through (assistant recommended
|
||||
testbed, C objected) is not resolved, only decided for now; proposes a curated fixture corpus
|
||||
as the eventual answer and names why (`kb_dir`/`raw_dir` fixtures already cover the small case,
|
||||
this is about the dense, interconnected one).
|
||||
- **#29** - catalogs which open issues still carry pre-rename paths and a private hostname
|
||||
(#10's CI example), separating "pointer, fix it" references from "citation of what was true
|
||||
then, date it" references rather than blanket-editing everything.
|
||||
|
||||
## Turn 3 - Public verification and the actions-history request
|
||||
|
||||
After Torben confirmed the repository was public, verification ran anonymously: repo API
|
||||
(`private: false`), release feed (latest tag served without auth), a clean HTTPS clone from an
|
||||
empty directory (three commits, two tags, all three license files present, 170 pages, no leak
|
||||
hits including in hidden files), and the full `INSTALL.md` release-tarball path end to end -
|
||||
checksum verified, license files present in the unpacked tree, `kb/`/`raw/` empty as designed,
|
||||
`instructions/dev/` absent.
|
||||
|
||||
Torben: "an der Stelle: wenn du per mcp die action runner historie löschen kannst, leere sie
|
||||
bitte komplett, da finde ich keinen knopf für und dort dürften noch alte tarballs herumgeistern."
|
||||
The assistant checked: the Gitea MCP server exposes `dispatch`/`cancel`/`rerun` for Actions runs
|
||||
but no delete, and the delete route Gitea's own API defines (`DELETE
|
||||
/api/v1/repos/{owner}/{repo}/actions/runs/{run}`) requires a token the assistant did not hold.
|
||||
Findings reported instead of silently working around the missing capability: **zero artifacts**
|
||||
existed already (confirmed via the anonymous artifacts API), but an anonymous SPA data endpoint
|
||||
the run pages call was readable and returned old commit titles from the squashed-away history -
|
||||
no hostnames or personal data among the six reachable runs, but development history the squash
|
||||
was meant to remove. A `curl` loop using a write-scoped token was handed to Torben to run
|
||||
himself, rather than asking for a token in the session.
|
||||
|
||||
Torben ran it and reported back ("die action-historie habe ich jetzt per api gelöscht") in the
|
||||
same message as "korrigiere die install.md wie vorgeschlagen." Both handled: the anonymous SPA
|
||||
endpoint was re-tested across all previously-reachable run numbers and returned nothing for any
|
||||
of them, closing the loop; `INSTALL.md`'s "repo is currently private, you need a token" language
|
||||
was removed from three places (the download command, the configuration table, a dedicated
|
||||
paragraph - the paragraph rewritten to explain the token is still needed **for a private fork**,
|
||||
not for this repository), "Weg C" was reworded from "Torben's personal wiki" to a description of
|
||||
the testbed/demo nature of the corpus, and a new "Weg D" documented the private-instance path
|
||||
with a pointer to `private-instance.md`. No version bump (prose only).
|
||||
|
||||
## Turn 4 - Wiring audit (from the third transcript's closing turn, included here for the gate/issue thread)
|
||||
|
||||
A later pass (opened by a different question, documented fully in the third transcript) checked
|
||||
whether the gate work here was actually cross-referenced: `tools/CONTRACT.md` did not mention
|
||||
the Publish-Remote Gate at all despite it being `publish`'s third exit-42 path - fixed in both
|
||||
the command-table entry and the error-contract entry, since a tool's error contract is exactly
|
||||
where a caller learns what a given exit code means and whether retrying is safe. `gates.md` did
|
||||
not link to `private-instance.md`, the procedure it exists for - fixed. The project's own KB
|
||||
page (`kb/entities/projects/Chemenu.md`) still described the instance as a personal wiki with no
|
||||
mention of the license or its public, testbed-and-demo status - rewritten, keeping the
|
||||
historical note about the pre-restructuring `AGENTS.md` but dating it explicitly rather than
|
||||
stating it as a current fact. Published as 2.2.2.
|
||||
|
||||
## Outcome
|
||||
|
||||
- **Version:** 2.1.1 -> 2.2.0 -> 2.2.2
|
||||
- **Commits:** Publish-Remote Gate + `private-instance.md` (2.2.0, Mass-Update Gate cleared),
|
||||
`INSTALL.md` correction (unversioned prose), documentation wiring + project-page rewrite
|
||||
(2.2.2)
|
||||
- **Tests:** 752, all green throughout (12 new for the gate)
|
||||
- **Issues:** #6 title fixed; #7, #10 commented; #27, #28, #29 opened
|
||||
- **CI:** green on every push in this transcript's scope; Gitea Actions run history removed by
|
||||
Torben via the API, verified anonymously empty afterward
|
||||
Reference in New Issue
Block a user