Findings ledger (antifragility)
"The same miss twice is a missing sensor or gate, not a missing paragraph."
— AEA's antifragility principle (architecture.artof.link/schema.html).
A Coherence Finding (CF-NNN) is any discrepancy between what the docs
claim and what the system actually does — a bug, a spec/code mismatch, a
broken promise in STATUS_LEDGER.md, anything a reviewer or a user catches.
Discipline: 1 finding → 1 issue → 1 branch, until resolved. File one here
before opening the GitHub issue (use the coherence_finding issue template,
which links back to the CF-NNN ID).
The rule that makes this antifragile rather than just a bug tracker:
**once a finding's Recurrence reaches 2, the PR that resolves it must also
add or change something in .github/workflows/* or a .test. file* —
a sensor or a gate, not just a fix. scripts/check-findings-ledger.mjs
enforces this on the closing PR's diff.
Format
## CF-NNN: <short title>
- Status: Open | Resolved
- Recurrence: <how many times this exact class of miss has happened>
- Linked: <issue/PR link>
- Sensor added: <path touched to prevent recurrence> (required once Recurrence >= 2)
Ledger
CF-001: Example — seed the format
CF-002: Unix placeholder commands in package scripts fail on Windows
CF-003: pnpm/action-setup duplicate version specification in CI workflow
CF-004: GitHub Pages site missing / configure-pages Not Found
deploy-knowledge failed on main after PR #2: actions/configure-pages@v5
returned Get Pages site failed / Not Found because GET /repos/.../pages
404'd — the Pages site had never been created. DNS already pointed
knowledge.zorg.artof.link at artofdream.github.io.
Resolution: a repo admin enabled Pages via the GitHub API with
build_type=workflow (site https://artofdream.github.io/zorg-dungeon/,
custom domain set to match the journal). deploy-knowledge was re-triggered
on main and completed success (Actions run 34530132314). This PR hardens
Setup Pages with enablement: true and records the sensor rule: **the repo
Pages site must exist with build_type=workflow**. Default GITHUB_TOKEN
cannot create a Pages site; enablement: true is not a substitute for that
admin enablement.
Do not mark the knowledge site Live & Probed from this finding. A green
deploy job is not a production content probe.
CF-005: Base-classic N11 Dream Trap and N18 Math Bath are not green-corpus targets
Sponsor resolution S5: Base N11 “Dream Trap” is author-flagged in the source
(euh y a un problème dans celui-ci à mon grand regret). Base N18 “Math Bath”
has a malformed heroes line (Guerrier(choix(1, {1,3,5}), Guerrier(2) —
unbalanced choix). Deluxe 10.7 Artilleur(_) is now imported under
packages/engine/fixtures/contracts/quarantine/. Phase 7 also quarantines
two clearly malformed authored lines that cannot parse: Base N23 Equilibrium
Atrium (broken Princesse/choix close) and Deluxe 8.2 (unbalanced choix).
N11, N18, and N23 live under
packages/engine/fixtures/base-classic/quarantine/. Green corpus suites
(base-classic-corpus.test.ts, level-pack-corpus.test.ts) assert these
paths are excluded and describe.skip the quarantine folder so they cannot
fail CI.
Resolution: S5 quarantine + quarantine-index.json honesty sensor
(quarantine-index.test.ts) — index paths exist on disk, green globs never
include them, expected ids stay base-classic 11/18/23 and contracts 8.2 /
10.7. Does not invent author fixes for Dream Trap. Recurrence stays 1 —
quarantine + skip + index sensor is documentation / first sensor, not a
second-miss gate. Cite: corpus-quarantine-honesty / Keep Learning and Apply.
CF-006: Production web image has no CD and went stale
Lightsail zorg.artof.link (<LIGHTSAIL_STATIC_IP>) was still serving a
pre–Phase-1 bundle until a manual SSH redeploy on 2026-09-11 to 2217dd5.
The knowledge site auto-deploys via Pages; the game web image did not.
This PR adds .github/workflows/deploy-web.yml so main pushes that
touch the web/engine/deploy paths (or workflow_dispatch) SSH and rebuild
the web service. Recurrence 1 — the workflow is the first sensor, not a
second-miss gate. Do not mark game FRs Live & Probed from a redeploy.
First CD run failed with `permission denied while trying to connect to the
Docker daemon socket. git fetch / git reset` succeeded without sudo;
ubuntu is not in an effective docker group for that SSH session.
deploy/setup-host.sh already uses sudo docker compose. The remote
command now matches: `sudo docker compose -f deploy/compose.prod.yaml
up -d --build web`.
Path filters originally omitted workspace manifests that
apps/web/Dockerfile copies (package.json, pnpm-lock.yaml,
pnpm-workspace.yaml, tsconfig.base.json). A lockfile-only merge
would skip CD and leave prod stale again. Follow-up adds those paths
to the sensor. Recurrence stays 1 — this is tightening the first
sensor, not a second miss.
Docker builds leave /opt/zorg files (especially fixtures) root-owned.
Non-sudo git reset --hard then fails with Permission denied unlinking
those files (CD and manual redeploy). Remote command now uses
sudo git fetch and sudo git reset --hard origin/main before
sudo docker compose. Recurrence stays 1 — same sensor, privilege
alignment, not a second-miss gate.
Resolution: PR #19 landed the sudo git privilege alignment on the
Lightsail host command. After PR #21 merged to main (4111d82,
2026-09-12), deploy-web ran on that push and completed success
(Actions run
That is CD evidence, not a production content probe — do not mark
game FRs Live & Probed from this close.
CF-007: Player guide still said only Warrior/Elf were encoded
After phases 4–7 and the Difficulté campaign landed, docs/PLAYER_GUIDE.md
still said only Warrior and Elf had rules encoded, and that the spellbook
was “when Phase 4 starts.” The companion was stale vs @zorg/engine and
the Maker at zorg.artof.link.
This PR rewrites the guide as a companion (cite IDs; spec wins; no invented
C / Gunner duration / FR-4 gating) and adds a knowledge-build check that
the guide cites FR-22–25 / FR-32–33 / NFR-5 and does not claim “two types
have rules encoded.” Recurrence 1 — first sensor, not a second-miss gate.
Do not promote ledger rows from companion prose.
CF-008: Mechanic shove search dropped colon-bearing room ids
layoutKeyOf / layoutFromKey encoded positions as A:0:x,y and split on
the first :. Room ids are already Type:n, so a shove snapshot restored
nothing and later search steps planned on the pre-shove graph. From spawn
center the equal-length shove-first path was invisible; the run lucked into
walk-then-shove because Z had not moved.
Fix: encode A:0@x,y. Recurrence 1 — first sensor, not a second-miss gate.
Does not invent Gunner duration or new shove rules.
CF-009: First-timer landing is engineer-first
Sponsor: the game should be reachable from about age 8. The live Maker
lede led with Difficulté / FR-4 / C rooms / Gunner duration / Simulated
ledger language before a first-timer could see “pick a level.” That is a
docs-vs-audience miss (companion claims a playable campaign; the first
screen spoke engineer).
This PR adds PLAYER_JOURNEYS (J-KID, J-HELPER, J-CAMPAIGN, J-PRACTICE,
J-HONESTY) as UX validation cases — GAME_SPEC still wins on rules —
and rewrites the landing to How to play + Start here (Difficulty 1 or
Generate Difficulty 1). Honesty / FR notes stay in a disclosure.
Recurrence 1 — first-run.test.ts is the first sensor (kid-facing copy
must stay free of FR-4 / C / Gunner / ledger jargon), not a second-miss
gate. Maker-play leftovers (JSON log, Φ, choix setup) are filed as
follow-up issues, not this CF.
Do not promote STATUS_LEDGER rows from landing copy. Do not invent
C, Gunner duration, or FR-4 gating.
CF-010: Skills written only after AFK rebase pain
Keep Learning and Apply
(AEA #434)
lagged in practice. Shared Grok skills
(pr-train-rebase, honesty-ledger-gate, companion-plain-docs,
persona-journey-validation) and the in-repo SKILL_MATRIX were
written after the 2026-09 AFK PR train
(#23 /
#24 /
#25 CONFLICTING)
and the first-timer audit, not into the harness before the next loop.
That is a process discrepancy: Honesty and Knowledge First were already
named; the apply write waited for a retrospective. This is not an
Antifragility miss (Recurrence stays 1).
Resolution: Harness apply landed — AGENTS Keep Learning section,
SKILL_MATRIX, and knowledge skills.html build gate. #50
/ #53 closed; later
cuts applied skills (#58
journeys, #59 CI,
#60 tiles). **zorg
knowledge Pages Probed** this session (2026-09-13): HTTP 200 for
https://knowledge.zorg.artof.link/skills.html,
https://knowledge.zorg.artof.link/aea.html, and
https://knowledge.zorg.artof.link/findings.html. **AEA Pages remain
Unknown** (not independently probed here). Not Live & Probed for game
FRs; not a STATUS_LEDGER promotion.
CF-009 is reserved for in-flight journeys PR #44 (first-timer landing)
so this entry skips that ID. Recurrence 1 — documenting + probing zorg
knowledge Pages is not a second-miss gate. Do not invent C, Gunner
duration, or FR-4 gating.
CF-011: LEARN.md mermaid reserved node id end
LEARN (learn.html on knowledge.zorg.artof.link) showed mermaid 11.4.1
“Syntax error in text” (red bomb). Rendered with @mermaid-js/mermaid-cli@11.4.1:
the Two jobs diagram failed because spell --> end["…"] uses the reserved
flowchart token end. The comma edge label and chained A --- D --- Z
both rendered under 11.4.1; they are quoted/split anyway.
Recurrence 1 — the knowledge build now rejects reserved end node ids,
unquoted comma edge labels, and one-line chained undirected links in every
shipped <pre class="mermaid">. Not a second-miss gate. Do not promote
STATUS_LEDGER rows. Do not invent C, Gunner duration, or FR-4
gating. #51 stays
open until the learn page is live and probed.