Chemenu kompiliert Rohnotizen zu einem verlinkten, quellengebundenen Wiki: raw/ -> types/ + tools/ -> kb/ -> reports/. Was mechanisch ist, macht tools/wikitool; was Urteil braucht, macht ein Agent unter Contracts, deren Grenzen in Code durchgesetzt sind statt im Prompt. Dieser Commit ist der Startpunkt der oeffentlichen Historie. Die vorherige Entwicklung fand in einer privaten Instanz statt und ist nicht Teil dieses Repositorys; ihre Erzaehlung steht vollstaendig in CHANGES.md, das mit 44 Eintraegen von 0.1.0 bis 2.1.0 erhalten geblieben ist. Der mitgelieferte Korpus ist ein Testbett und eine Demo: 170 Seiten ueber den Stack selbst - Gates, Lint, Versionierung, Suche, das Wiki-Muster. Er dokumentiert das Werkzeug mit den eigenen Mitteln des Werkzeugs. Lizenz: AGPL-3.0 fuer den Stack (tools/, types/), CC-BY-4.0 fuer die Inhalte. Die Grenze zwischen beiden ist der Dateiplan, den dist export berechnet - siehe NOTICE.
11 KiB
Conversation Transcript - Nightly Drift-Check Workflow and doctor's Bootstrap Gap Session
Source: Claude Code session (
claude-opus-5), llm-wiki-test1 workspace Collected: 2026-08-31 Participant: Torben Fidelity: faithful summary transcript, not a verbatim log. Torben's instructions and decisions are quoted verbatim; issue text, workflow YAML, and Gitea API/job-log output shown below are real, taken from the session; the assistant's reasoning is condensed. No second-hand material. No credentials appeared in the session; the Gitea MCP tool calls used the session's own configured access, not a token pasted into chat. One of two transcripts cut from this session; the other coverslint's blindness to code-shown notation and the quote-limit miscount (Gitea #20, #22) - a different part of the stack, bundled into the same publish but a separate subject.
Covers Gitea issue #9: a nightly scheduled workflow closing the gap ci.yml's content
paths-ignore opened, where lint --fail-on-error no longer runs on a content-only publish.
Workflow added in commit 49bd7d4, a bootstrap gap in it fixed by 397d8af. Issue left open
- the one fact this session could not establish is whether Gitea actually fires the
scheduletrigger on this instance; only manualworkflow_dispatchruns were observed.
Turn 1 - reading the issue and its precedent
Torben's instruction (/stack-dev implementiere #9, #22, #20) covered this issue alongside two
unrelated lint fixes (see the sibling transcript). The assistant read #9 in full, including its
one existing comment, which had already confirmed (Gitea #11) that ci.yml's content
paths-ignore genuinely suppresses CI on a content-only publish - commit f916376 produced no
run while stack commits on either side produced two each. The issue's acceptance criteria
included a specific one worth quoting, since it shaped the whole implementation:
"Ein absichtlich gebrochener Korpus (ein
[[Ziel]], das nicht auflöst) macht den Lauf rot - sonst ist er Dekoration."
The issue named the exact runner shape to reuse from ci.yml (Debian trixie-slim, nodejs
installed before actions/checkout@v7 because act_runner executes that action's JavaScript
inside the job container and a slim image has no node), and named
WIKITOOL_SESSION_ID/WIKI_TRACE_DIR as required environment. It also flagged an open
precondition explicitly: whether this Gitea instance evaluates on: schedule at all, which - per
Gitea's own behavior - only fires on the default branch, so a test branch would prove nothing.
Turn 2 - checking the one fact that could be checked immediately
The assistant queried the instance directly rather than assuming a version:
$ curl -s https://gitea.nehmer.net/api/v1/version
{"version":"1.26.1"}
1.26.1 is well past the 1.20 release that introduced Actions schedules, which makes the feature plausible on this instance - not proven, since evaluating a workflow file and actually firing its cron are different claims. This was stated as such to Torben rather than treated as confirmation.
Turn 3 - decision point: how should a failed run become visible
The issue left "how failure surfaces without visiting the Actions page" explicitly open, so the
assistant asked via AskUserQuestion rather than picking silently, offering:
- "Gitea-Issue anlegen" (labeled Recommended, listed first): an
if: failure()step files or comments on aprio/1 size/Sissue via the Gitea API, deduplicated by title search. - "Nur Gitea-Notification": no extra step; rely on Gitea's own run-failure notification/mail.
- "Erst beobachten": ship with no visibility mechanism yet, observe whether the schedule fires at all first, and treat visibility as a follow-up.
Torben chose option 2, explicitly against the assistant's own recommendation:
"Nur Gitea-Notification."
The workflow was built with no failure-reporting step. The reasoning for the omission -
issue-filing needs an Actions token with issues: write and a dedup rule, more machinery than a
red run already carries - was written into the workflow's own header comment specifically so a
later reader would not mistake the omission for something forgotten.
Turn 4 - writing the workflow
.gitea/workflows/nightly.yml: on: schedule (17 3 * * *, UTC - Gitea evaluates cron in UTC)
plus workflow_dispatch, no push trigger. The runner block is copied from ci.yml rather than
re-derived, per the issue's own instruction not to re-derive it. The six commands from the issue
were grouped into four steps so a red run's step name alone would indicate which layer broke:
tool-environment setup; doctor; docs verify + instructions verify; lint --fail-on-error;
sources coverage + migrate status. migrate verify --from <rev> was deliberately left out,
matching the issue's own reasoning: "yesterday" is not a meaningful comparison revision, and a
changed page between two arbitrary points in time is the desired outcome of normal operation, not
a finding.
The first draft set WIKI_AUTHOR: Nightly as an environment variable, reasoning that doctor
FAILs without an author and a container has no git configuration to read one from. This turned
out to be an incomplete fix, discovered in Turn 7.
Turn 5 - proving the acceptance criterion locally, before any push
Before publishing, the assistant ran doctor, docs verify, instructions verify,
sources coverage, and migrate status locally - all green. Then, to satisfy the issue's own
"a broken corpus must turn the run red, or it's decoration" criterion, it deliberately appended
an unresolvable wikilink to kb/entities/systems/Nathan.md:
$ tools/wikitool lint --fail-on-error >/dev/null 2>&1; echo "exit=$?"
exit=1
$ # (Nathan.md restored from backup)
$ tools/wikitool lint --fail-on-error >/dev/null 2>&1; echo "restored exit=$?"
restored exit=0
This was shown to Torben as evidence, not asserted as fact - the distinction the issue's acceptance criterion was written to force.
Turn 6 - shipping and dispatching
The workflow was published together with the two lint fixes from the sibling transcript, as part
of the same 16-file changeset Torben approved with "Freigegeben." (commit 49bd7d4). Because the
actual schedule trigger cannot be observed inside a single session - it fires on a clock the
session doesn't control - the assistant instead dispatched the workflow manually via the Gitea
MCP tool (actions_run_write / dispatch_workflow) to at least prove the job itself runs. This
was stated to Torben as proving "the job, not the timer."
Turn 7 - the first dispatch failed, and correctly so
Run 83 (workflow_dispatch on 49bd7d4) failed at the doctor step. Real job log excerpt:
OK author: 'Nightly' (from WIKI_AUTHOR)
FAIL git-identity: `git config user.name` is not set
...
FAIL skills: No skills published yet
Both FAILs were genuine gaps in the workflow, not wiki drift: doctor checks a working
instance, and a bare actions/checkout is not one yet - it's the fresh clone
instructions/bootstrap.md describes. .agents/skills/ and .claude/skills/ are generated and
deliberately not committed, so they don't exist until wikitool instructions sync runs; and
WIKI_AUTHOR had covered only the author check, not the separate git-identity check, because
a container has no git configuration at all. Notably, instructions verify - which checks the
same "published copies match source" fact docs verify/doctor do - never even ran: the
doctor failure aborted the job before reaching it, meaning the run's real purpose (checking the
corpus) was never attempted. This was the value of running it at all: the failure sat in front of
what the run exists to observe, not inside it.
Turn 8 - the fix
397d8af: added git config --global user.name "Nightly" / user.email and
tools/wikitool instructions sync to the Tool environment step, before doctor runs. Removed
WIKI_AUTHOR entirely - one mechanism (a real git identity) now covers both checks instead of
two mechanisms covering one each. The reasoning was written into the step's own comment, matching
the pattern already used for the failure-visibility omission in Turn 3: recorded at the point of
the decision, not only in this transcript, so a future edit doesn't strip the bootstrap step as
apparently-redundant ballast.
Turn 9 - re-verifying
Re-dispatched via the same MCP call. Run 85 (workflow_dispatch on 397d8af): all seven steps
success. Run 84, the ordinary push-triggered ci.yml run on the same commit, was also
success - confirming the shared runner shape still holds for both workflows.
| Step | Result |
|---|---|
| System dependencies | success |
actions/checkout@v7 |
success |
| Tool environment (incl. bootstrap) | success |
doctor |
success |
docs verify + instructions verify |
success |
lint --fail-on-error |
success |
sources coverage + migrate status |
success |
Turn 10 - reporting, and leaving the issue open on purpose
The assistant posted the full diagnosis (Turn 7's log excerpt, the fix, and Run 85's table) as a
comment on #9, and explicitly did not close it. The unresolved half of the issue's own
acceptance criterion - "läuft tatsächlich ohne Push" - cannot be verified from inside this
session: both observed runs were workflow_dispatch, which proves the job executes but says
nothing about whether Gitea 1.26.1 evaluates the cron trigger at all. First possible real
observation: 2026-09-01 03:17 UTC. The assistant recorded this as a persistent-memory note
(project_nightly_schedule_unverified.md) specifically so that a future session checking on #9
looks for a run whose "event" is "schedule" rather than mistaking a workflow_dispatch
success for proof the timer fires - a distinction easy to blur once the job itself is known to
work.
Outcome
| Artifact | Result |
|---|---|
| Workflow | .gitea/workflows/nightly.yml added: schedule (17 3 * * * UTC) + workflow_dispatch, no failure-reporting step (Torben's explicit choice) |
| Commits | 49bd7d4 (initial, bundled with #20/#22); 397d8af (bootstrap fix: git identity + instructions sync before doctor) |
| Runs observed | 83 (workflow_dispatch, failed at doctor - genuine bootstrap gap); 84 (push-triggered ci.yml, success); 85 (workflow_dispatch post-fix, all 7 steps success) |
| Acceptance criteria | Broken-corpus-turns-run-red: proven locally. Failure visibility without the Actions page: Gitea's own notification, as chosen. Green + job-executes: proven (run 85). Green + fires on schedule with no push: not yet proven |
| Issue | #9 left open; a project memory records exactly what to check and when (2026-09-01 03:17 UTC or later, look for "event":"schedule") |