Zorg Knowledge

Zorg's Dungeon Maker

Knowledge Base & Traceability Graph

Development Journal (Second Brain)

Archify diagram regenerated with Archify 3.2.0 (Documented aid)

apps/knowledge/archify/zorg-knowledge-workflow.architecture.{json,html} was generated by an Archify 2.x dev build (guided chapters). Archify 3.x retires meta.views, so the three chapter notes (Happy path, Two hosts, Honesty boundary) now live in the diagram's cards, and four boundary-membership layout violations were fixed by moving nodes only (the wraps lists are unchanged). Documented — not Live. build.mjs still requires archify/index.html to say "Documented" / "not Live"; that wording and the file names are unchanged. Receipts (.delivery.json, .browser-check.json) stay out of the published folder (root .gitignore). Local node apps/knowledge/scripts/build.mjs and pnpm governance scripts passed (Simulated: local run, not a Pages probe). Review-only PR; Pages stays Unknown until probed after merge. Do not invent C / Gunner duration / FR-4.

---

Archify same-origin on knowledge.zorg (Documented aid)

Sponsor/DSO: match Café Knowledge / ctos — serve Archify HTML under /archify/ same-origin on knowledge.zorg.artof.link. Documented — not Live. build.mjs copies apps/knowledge/archify/ → dist/archify/. Do not invent C / Gunner duration / FR-4.

---

2026-09-14 — UX laptop + mobile gaps (Maker + knowledge)

  • Started from main @ d1fb25b (i18n PR #62).
  • Producer does not merge (S7) — PR opened for sponsor review.
  • Machine: (Grok box) — Shell has no machineId; preferred EVO-X2
  • f074e48c-ff1d-4a00-945c-74838a5b1550 at C:\projects\code\zorg-dungeon

    unavailable to this executor. Clone + work on the shared Grok box.

    Shipped

    Laptop + mobile UX gap pass on Maker (apps/web) and knowledge

    (apps/knowledge). CSS/HTML only plus small sensors — no game-rule inventing,

    no Phase C honesty/skills i18n expansion beyond existing lang attributes.

    Fixed

    1. Knowledge viewport — viewport-fit=cover on HTML shell (was

    device-width + initial-scale only).

    2. Tap targets — locale switcher EN|FR ≥ --tap / 2.75rem on ≤480px

    (Maker buttons + knowledge links); primary CTAs / filters already on

    --tap at narrow breakpoints.

    3. Focus-visible — knowledge gains :focus-visible rings; Maker already

    had them; no bare outline: none.

    4. Locale switcher overflow — flex-shrink: 0, larger hit area, sits in

    existing scrollable .header-tools on knowledge narrow.

    5. Safe-area — knowledge header/body/footer padding uses

    env(safe-area-inset-*); Maker .app already did.

    6. Skip-to-content — Maker #main-content + i18n chrome.skipToContent;

    knowledge #content + EN/FR skip link in pageShell.

    7. lang="fr" — already set by build for FR companions; build now

    asserts it (plus viewport-fit + skip) on fr/*.html.

    8. prefers-reduced-motion — both stylesheets; knowledge card hover lift

    disabled under reduce.

    9. Touch-action — knowledge nav / external / locale links get

    manipulation (Maker mostly already had it).

    10. Laptop measure — knowledge prose (p / .lead / learn|guide|journeys)

    capped at 72ch; Maker lede/honesty already 70ch.

    Sensors

  • Knowledge build assertions: viewport-fit, skip link, #content, FR
  • lang="fr".

  • Vitest apps/web/src/ux-smoke.test.ts: viewport meta, focus-visible, no
  • bare outline:none, reduced-motion, locale --tap.

    Deferred

  • Live visual probe at 390 / 768 / 1280 of FR nav EN↔FR (tables/mermaid wrap
  • already present; no code change beyond CSS). Simulated CSS + build sensors

    only here.

  • Sticky Maker .topbar height vs board — already sticky with board-wrap
  • scroll; no change.

  • Phase C honesty/skills/spec bilingual; Room C / Gunner duration / FR-4.
  • Honesty

  • Simulated CSS/HTML + unit/build sensors. Not Live & Probed. No
  • STATUS_LEDGER promotion. Does not invent C, Gunner duration, or

    FR-4.

    See 0007-i18n-fr-en, PLAYER_JOURNEYS, AGENTS.

    ---

    2026-09-13 — Journey browser probes (#46)

  • Started from main @ 7109bb3 (kid UX PR #57).
  • Producer does not merge (S7) — PR opened for sponsor review.
  • Machine: (Grok box) — EVO-X2 machineId Shell unavailable to this
  • executor; clone + probes on the shared Grok box (same pattern as prior

    kid-UX work).

    Shipped

  • Playwright suite apps/web/e2e/journeys.spec.ts probes the persona
  • journeys in PLAYER_JOURNEYS / #46:

    landing How to play + both Start here labels; kid-facing blob free of

    FR-4 / C room / Gunner duration / ledger; Start here Difficulty 1 →

    authored band 1; Start here Generate → pack === generated band 1;

    authored catalog default + unfinished toggle off; honesty disclosure

    still names Simulated / FR-4 / C / Gunner. Optional: Maker title +

    Place rooms in a line / Start fight enable after legal layout.

  • Labels reuse apps/web/src/first-run.ts strings. Maker exposes data-pack /
  • data-difficulty-band for honest pack/band asserts (presentation only).

  • CI wiring: intended ci.yml steps are in the PR (Install Playwright
  • Chromium + Journey probes). This agent’s OAuth token lacks the GitHub

    workflow scope, so the workflow file was not pushed — sponsor can

    paste the two steps. Local: pnpm probe:journeys (builds, then probes).

  • Light cite: Keep Learning and Apply
  • (AEA #434)

    — write the journey checklist into a browser sensor before the next

    first-play loop.

    Honesty

  • Simulated browser evidence only. Not Live & Probed. Not a
  • STATUS_LEDGER promotion. Does not invent C, Gunner duration, or

    FR-4 gating.

    See PLAYER_JOURNEYS, FINDINGS CF-009, and AGENTS.

    Web — illustrated Maker room tiles (#37)

  • Started from main @ journey-probes merge (PR #58 / #46 on main).
  • Producer does not merge (S7) — PR opened for sponsor review.
  • Machine: (Grok box) — Shell has no machineId; work + push via gh
  • as artofdream on the shared Grok box (EVO-X2 preferred path unavailable).

    Shipped

  • Kid-friendly SVG room tiles under apps/web/public/rooms/ for
  • A / Z / D / E / P / O / T (door/start, exit, danger, element, portal,

    gold, toll) matching hero figurine warm palette + stroke style.

  • Maker board cells show the tile illustration + kid word; raw coordinates
  • stay in aria-label / data-coords and a de-emphasized empty-cell meta.

  • Empty cells orthogonally adjacent to placed rooms get .legal-next
  • highlight while a tray room is selected (placement hint only — does not

    change engine legality / FR-5–FR-8 validation).

  • Modest --cell upsize (72 / 64 / 56) so tiles read near ~390px width;
  • hero icons remain overlaid. Tray buttons show a small tile thumb.

  • No C tile — C stays label-only (Special); no FR-4 / Gunner duration
  • invented. App.tsx has no separate board (MakerPlay only).

    Evidence

  • Unit: apps/web/src/room-icons.test.ts (assets + legal-next helper).
  • Intended: pnpm test / typecheck / governance / build /
  • probe:journeys on the PR branch.

    See #37.

    Findings — close CF-005 + CF-010 (quarantine sensor / Keep Learning probe)

  • Started from main @ 40dd049 (illustrated tiles PR #60).
  • Producer does not merge (S7) — PR opened for sponsor review.
  • Machine: (Grok box) — Shell has no machineId; preferred EVO-X2
  • f074e48c-ff1d-4a00-945c-74838a5b1550 at C:\projects\code\zorg-dungeon

    unavailable to this executor. Clone + work on the shared Grok box.

    Shipped

  • CF-005 → Resolved. Named sensor
  • packages/engine/src/quarantine-index.test.ts asserts

    fixtures/quarantine-index.json paths exist, green globs exclude them,

    expected ids (base-classic 11/18/23, deluxe 8.2 / 10.7). Does not invent

    Dream Trap author fixes. Recurrence stays 1. Cite:

    corpus-quarantine-honesty / Keep Learning and Apply lightly.

  • CF-010 → Resolved. Sensors: AGENTS Keep Learning section +
  • SKILL_MATRIX + knowledge skills page build. Apply evidence: post-finding

    PRs (#58 / #59 / #60). zorg knowledge Pages Probed this session

    (HTTP 200): skills.html, aea.html, findings.html on

    knowledge.zorg.artof.link. AEA Pages stay Unknown. Not Live & Probed

    for game FRs; no STATUS_LEDGER promotion.

    Honesty

  • No inventing C / Gunner duration / FR-4. No FR row promotions.
  • i18n FR/EN — Maker + knowledge companions (ADR-0007)

  • Started from main @ 13d971b.
  • Producer does not merge (S7) — PR opened for sponsor review.
  • Machine: (Grok box) — Shell has no machineId; preferred EVO-X2
  • f074e48c-ff1d-4a00-945c-74838a5b1550 at C:\projects\code\zorg-dungeon

    unavailable to this executor. Work on the shared Grok box clone.

    Shipped

  • 0007-i18n-fr-en: message catalogs; display-only translation; GAME_SPEC
  • English IDs win; URL strategy ?lang=fr (+ document.documentElement.lang

    + localStorage); EN keys SoT; FR complete catalog; CI missing-key gate.

  • Phase A (apps/web): locales/en.ts + fr.ts, tiny t() + LocaleProvider,
  • EN|FR switcher on landing/Maker chrome; first-run / event-copy / kid labels

    read catalogs; Learn-the-rules href follows locale → fr/learn.html.

  • Phase B (docs/fr/ + knowledge build): FR LEARN / PLAYER_GUIDE /
  • PLAYER_JOURNEYS → fr/learn.html, fr/guide.html, fr/journeys.html with

    EN↔FR nav. Same FR/NFR IDs; French prose; spec wins callout.

  • Tests: catalog coverage both ways; first-run / event-copy FR cases; journey
  • FR smoke ?lang=fr. PLAYER_JOURNEYS notes optional FR validation.

    Explicitly deferred

  • Phase C: honesty.html / skills.html / full GAME_SPEC bilingual.
  • Path-prefix /fr/ Maker routing (no React Router this slice).
  • Room C, Gunner duration, FR-4 — still not invented (NFR-8).
  • Honesty

  • No STATUS_LEDGER FR promotions. Journey / catalog evidence is Simulated
  • only. No inventing C / Gunner duration / FR-4.

    ---

    2026-09-12 — Difficulté level generator

  • Started from main @ 11032fd (knowledge companion refresh PR #20).
  • Producer does not merge (S7) — PR opened for sponsor review.
  • Shipped

  • generateLevel in @zorg/engine: seed-stable, parseable DSL, legal
  • Maker line layout (FR-5–FR-8), intended FR-46 solvable within

    NFR-4 caps. Evidence: packages/engine/src/generator.ts,

    packages/engine/src/generator.test.ts. See 0005-level-generator.

  • Difficulté model is the authored numeric bands 1–4, with knobs checked
  • against playable fixture envelopes (not a 1–10 fantasy scale). Harder bands

    add rooms / a second hero / spells / E+O flavour. Band 4 matches the only

    authored Difficulté 4 board (9 rooms). Band 3 does not jump the board size

    vs band 2 — that matches the corpus.

  • Construction guarantee: A, then a lethal D, then flavour rooms, then Z.
  • First D damage ≥ every hero's HP. No mirrors (no intentional not_solvable

    worlds in this slice).

  • Does not invent: C (FR-18 / S2), Gunner duration (S3 — Gunner is
  • not generated), FR-4 earn/spend (S6), contracts 11–15 (S4), quarantine

    N11/N18 (CF-005). Mechanic / Princess / P / T skipped so the corridor proof

    stays a construction, not a hope.

  • Web: campaign browser stays the authored default. A Generate panel
  • (Difficulté 1–4) and Maker Regenerate are additive. Honesty copy:

    generated = Simulated engine, not Live & Probed; FR-4 still not gating.

  • Docs: 0005-level-generator, this journal, PLAYER_GUIDE note.
  • STATUS_LEDGER rows are not promoted. FINDINGS unchanged — no new

    CF. GAME_SPEC FRs not rewritten.

    Assumptions a reviewer can check

  • Omitted seed is 1, not Date.now().
  • Suggested layout is orientation 0, A-first / Z-last, default 4-hatch tiles.
  • checkSolvability on that layout is Simulated proof, not a live probe.
  • Generated campaign cards have pack: "generated" and no contract cost.
  • See GAME_SPEC, STATUS_LEDGER, PLAYER_GUIDE, and 0005-level-generator.

    Ops — CF-006 closed

  • FINDINGS CF-006 (production web image had no CD and went stale) is Resolved.
  • CD privilege fix: PR #19 (sudo git on Lightsail /opt/zorg).
  • Post-merge evidence: deploy-web on the PR #21 merge to main (4111d82) succeeded — Actions run 34687483872.
  • Ops only. Green CD is not a production content probe — STATUS_LEDGER FR/NFR rows are unchanged.
  • See FINDINGS CF-006 and 0004-deployment-and-observability.

    Honesty — FR-19 / NFR-1 / NFR-10 Simulated

  • Started from main @ f625437 (CF-006 resolve PR #22).
  • Producer does not merge (S7) — PR opened for coordinator review.
  • Shipped

  • Investigated Warrior / Elf / Mechanic / Gunner / Princess / pathing / scheduler: no Math.random, no wall-clock seed, no outcome-affecting unordered object iteration. Sorts used in choosers are key-stable. Generator mulberry32 is authoring-only and is not a hero agent.
  • FR-19 / NFR-1 replay evidence: same seedless layout + heroes + castScript → identical fingerprints. Covers Warrior, Elf, Mechanic, Gunner (2-arg; duration unused per S3), Princess, mixed pull, and Attack-after-spawn. Room-array shuffle does not change Warrior first-step. Evidence: packages/engine/src/determinism.test.ts.
  • NFR-10 per-layer chooser tests, isolated from simulate(): Warrior shortest + tie; Elf HP / length / tie / immunity; Mechanic shortest / shove / unjustified / power-tie / Mechanic tie order; Gunner fire-soonest / shot-factored path / 0-shot Warrior tie on a real 2-path square; Princess weight target / HP among equals / tie. Evidence: packages/engine/src/hero-layers.test.ts.
  • Ledger only: FR-19, NFR-1, NFR-10 → Simulated. No FR-4 / FR-18 / FR-43 / FR-44 / Gunner duration / contracts 11–15.
  • FINDINGS CF-008: Mechanic shove search split A:0:x,y on the first
  • :, so post-shove planning used the pre-shove graph. Codec is now A:0@x,y.

    Sensor: packages/engine/src/mechanic.test.ts. Recurrence 1.

    See GAME_SPEC, STATUS_LEDGER, and 0002-typescript-monorepo-2d-to-3d.

    FR-43 / FR-44 — grounded win/loss and bonuses (this PR)

    Started from main @ f625437; rebased onto 86664b4 (PR #23 honesty slice).

    Producer does not merge (S7).

  • FR-43 scoreLevel aggregates after FR-45 sequential resolve:
  • loss on any world's Z entry; win only if every hero across every world is

    dead and every blocking constraint holds. Evidence:

    packages/engine/src/constraints.test.ts.

  • FR-44 blocking constraints vs separately-tracked bonuses
  • (variants stay non-blocking). A failed or unsupported bonus does not

    prevent a win.

  • Evaluators are only those grounded in GAME_SPEC + existing sensors:
  • named-world solvability via FR-46 (NFR-4 budget is unsupported, not

    a proof), dist / exists forms via FR-10, HP floor, gold-at-death,

    reverse death order. Opaque authored prose (Le donjon doit être carré,

    spell-usage, distinct death rooms, immunity counterfactuals, setup

    “Remplacer…”) is UnsupportedConstraint — a blocking unsupported line

    refuses a win claim. See 0006-grounded-constraint-evaluation.

  • Ledger: FR-43 / FR-44 → Simulated for that subset. Keeps PR #23
  • promotions of FR-19 / NFR-1 / NFR-10. Per-world simulate is

    still scheduler-only. Maker playback is still heroes dead / Z / stalemate

    — not a live probe. FR-18 C, Gunner duration, FR-4 unchanged.

    Assumptions a reviewer can check

  • Worlds still run to completion in FR-45 order even after a Z; the
  • aggregate then marks the level a loss.

  • not_solvable is exhaustion of the bounded candidate model, same as
  • FR-46. A budget stop is unsupported, not “failed”.

  • Ambiguous dist(D, …) with two D rooms is unsupported (no guess which
  • instance).

    NFR-6 Maker wall-hatch / orientation clarity

  • Started from main @ 86664b4 (honesty FR-19 / NFR-1 / NFR-10 PR #23); rebased onto e8444c2 (PR #25 FR-43 / FR-44).
  • Producer does not merge (S7) — PR opened for sponsor review.
  • Shipped

  • Maker UI only. Wall-hatch direction is now a wall-anchored arrow plus the four-side hatch notches on every placed room, the selected tray room, and a hover placement ghost. Compass + plain-English helper name the spawn-room (FR-7) anchor. Engine stays pure — presentation mapping lives in apps/web/src/orientation-ui.ts.
  • NFR-6 → Simulated. Evidence: apps/web/src/orientation-ui.test.ts (unique side/glyph per orientation, same words on selected + preview, helper cites FR-7). Not a live browser probe; not Live & Probed.
  • NFR-8 → Simulated. Evidence: packages/engine/src/nfr8-deferrals.test.ts — C stays opaque and has no invented entry effect; Gunner duration is stored and unread; campaign marks both unplayable. Does not close FR-18, Gunner duration semantics, or FR-4.
  • NFR-3 stays Unknown. Room/hero/spell dispatch is still closed switch / if chains, not a plug-in registry. No invented extension API.
  • NFR-7: copy touched in the Maker uses the spec pair wall-hatch direction / orientation. No i18n rewrite.
  • See GAME_SPEC, STATUS_LEDGER, PLAYER_GUIDE, and 0002-typescript-monorepo-2d-to-3d.

    Knowledge — AEA diagrams (cosmetic)

  • Converted the two ASCII box drawings on the AEA knowledge page (core formula layers + 5 concentric floors) to mermaid flowcharts so they match the guide and architecture pages.
  • Tuned .mermaid-wrap CSS so SVGs stay readable and scroll on small viewports instead of wrapping like broken <pre> art.
  • Knowledge build still requires mermaid on the AEA page (now at least 3 diagrams; leftover ASCII box art fails the build).
  • No STATUS_LEDGER promotions. Cosmetic / clarity only — AEA doctrine unchanged.
  • See AGENTS and 0003-multi-agent-collaboration.

    Knowledge — mobile / narrow viewports (cosmetic)

  • Sponsor note (via ctos): knowledge.* pages from apps/knowledge/ must stay
  • usable on ~375px / ~480px (viewport, type, nav). Same build as guide,

    architecture, AEA, observability.

  • CSS plus a .header-tools wrapper (nav + external links) and one AEA
  • formula class (removed a fixed inline 1.25rem so type can shrink). Under

    720px the tools row scrolls locally; cards / .is-wide main collapse;

    tables, <pre>, mermaid keep in-box overflow.

  • No STATUS_LEDGER promotions. Doctrine and FR/NFR rows unchanged.
  • See AGENTS and 0003-multi-agent-collaboration.

    Knowledge — skill matrix (this PR)

  • Started from main @ 2450b6c (web mobile PR #28).
  • Producer does not merge (S7) — PR opened for sponsor review.
  • Open UX work at start: hero figurines PR #29 (draft). Kid-rules /
  • persona-journey issues #30–#43 exist from the 2026-09-12 live first-play

    audit. This slice does not edit Maker UX or PLAYER_GUIDE kid copy

    so those can land beside it.

    Shipped

  • SKILL_MATRIX (docs/SKILL_MATRIX.md → skills.html): OOTB skills
  • (code-changes, routines, box-desktop, skill-authoring), shared

    Grok recipes saved 2026-09-12 (pr-train-rebase, honesty-ledger-gate,

    companion-plain-docs, persona-journey-validation), and project

    playbooks (AGENTS, GAME_SPEC, STATUS_LEDGER, FINDINGS,

    journal, ADRs). Columns: kind, when to load, why selected from this

    repo's 2026-09 history (phases 0–7, generator, AFK PR train #23/#24/#25,

    first-timer audit).

  • Knowledge nav + home card. Architecture overview and AEA Procedure
  • Memory point at the page. Build fails if the matrix file drops a named

    skill or its mermaid / table.

  • No STATUS_LEDGER promotions. Does not invent C, Gunner duration,
  • or FR-4 gating.

    See AGENTS, 0003-multi-agent-collaboration, and SKILL_MATRIX.

    AEA — keep learning and apply (this PR)

  • Composed on skill-matrix branch cursor/skill-matrix-551b (PR #49,
  • bc-53cc542e) rather than duplicating the matrix. Rebase onto that PR

    if it moves.

  • Producer does not merge (S7) — PR opened for sponsor review.
  • Tracks #53.
  • Links shared skills and #50–#52.

  • Does not edit Maker UX or the in-flight persona-journeys / kid learn
  • page (journeys PR #44; docs/PLAYER_JOURNEYS.md is not on this branch).

    Those gaps stay follow-ups, not this diff.

  • GitHub issues: write returned 403 from this agent token, so
  • #53 could not

    be patched here. Replacement body (official #434 wording) is in PR

    #54 for a reviewer to paste. Journeys/learn-page gap stays drafted

    there too. Formal AEA ID is now cited in-repo (work item #434).

    Shipped (docs only)

  • AGENTS: Keep Learning and Apply
  • (AEA #434

    / open !513)

    next to Honesty and Knowledge First. Official wording: write the

    lesson into the harness before the next loop. Complements Honesty +

    Knowledge First; not Antifragility (§3). AEA skill matrix:

    merged !512

    (closes #433),

    file research/random-thoughts/2026-09-12-session-memory-log-aea-grok-skill-matrix.md.

    Do not treat !513 as merged. GitLab pages redirected to sign-in from

    this agent — not a content probe.

  • SKILL_MATRIX: section + table mapping each skill as an
  • apply-artifact of historical pain. Planned candidates for #51 / #52.

    Status Documented / Planned. Knowledge Pages: Unknown until

    AEA probes.

  • Knowledge aea.html + home Skills card cite #434. Build fails if
  • the matrix or AEA page drops the name or the work-item URL.

  • FINDINGS CF-010 (skills written only after AFK rebase pain) —
  • Open, Recurrence 1. CF-009 left for journeys PR #44.

    Honesty

  • No STATUS_LEDGER promotions. No invented C, Gunner duration, or
  • FR-4 gating. Naming a principle is not a production probe.

    See AGENTS, SKILL_MATRIX, FINDINGS CF-010, and

    0003-multi-agent-collaboration.

    Knowledge — skill matrix rebase onto #54 / main

  • Started from main @ 6d108ec (Keep Learning and Apply PR #54).
  • PR #54 was composed on this matrix and merged first; this rebase keeps
  • the AEA cites (#434,

    !512,

    !513,

    session-memory log) and only adds compose notes for journeys PR #44.

  • Producer does not merge (S7).
  • See AGENTS, SKILL_MATRIX, and FINDINGS CF-010.

    Knowledge — cross-project skill fit (Café App received)

  • Folded the Café Fausse App assessment into SKILL_MATRIX
  • (Cross-project fit). Shared skills: pr-train-rebase Yes;

    honesty-ledger-gate Yes (no invented Café FR-19);

    companion-plain-docs Partial (App SoT = SRS + freeze.json; Knowledge

    owns companion); persona-journey-validation Yes/partial.

  • App-only candidates listed as other-project recipes (freeze-first,
  • fail-closed missing-DB, probe-before-status-words, SES fail-soft,

    official-image allowlist, staging keep/tear honesty). Not loaded here.

  • AEA agent stays a waiting placeholder. Do not invent that fit row.
  • No STATUS_LEDGER promotions. Not a live probe of cafe.artof.link.
  • See SKILL_MATRIX and AGENTS.

    Knowledge — Café Fausse Knowledge fit (received)

  • Filled SKILL_MATRIX Cross-project fit for Café Knowledge
  • (knowledge.cafe.artof.link):

    pr-train-rebase Yes (#108→#111→#115→#116, then #201 after #202);

    honesty-ledger-gate Yes (NFR-1/2 until A36 stopwatches; SES store-only

    after probe); companion-plain-docs Yes late (#191–#199);

    persona-journey-validation Partial (J1–J8 + NFR matrix; named personas

    would catch Gallery / PIP / Operator-as-not-FR-19 earlier).

  • Knowledge-only candidate: freeze-first + fail-closed Pages probe (one
  • finding → one issue → one PR; author does not merge; MRC COMMENT; New

    Bot squash; HTTPS Pages probe before claiming live).

  • AEA agent still waiting. No STATUS_LEDGER promotions.
  • See SKILL_MATRIX and AGENTS.

    Knowledge — skill matrix raised bar (Skill / Scope / Why / What)

  • Rewrote SKILL_MATRIX to one column set: Skill | Scope | Why?
  • (historical evidence) | What (recipe / responsibility).

  • OOTB + four shared Grok skills with sand-workflow slugs (URLs to paste
  • later — not invented). Adoption tracked as #50.

  • Cross-project Café App + Knowledge verdicts kept; AEA agent still
  • waiting. Café candidates stay Proposed / other-repo — do not claim

    those teams created the skills. Not Live.

  • Zorg Planned: kid learn #51,
  • corpus quarantine #52,

    spec-phased engine slice (issue not filed — issues: write 403;

    paste-ready body is on the matrix page).

  • No STATUS_LEDGER promotions.
  • See SKILL_MATRIX, AGENTS, and #50.

    Knowledge — corpus-quarantine-honesty created

  • Shared skill corpus-quarantine-honesty is created in the Grok
  • library (zorg-evidenced). Promoted out of Planned on SKILL_MATRIX.

    Issue: #52.

  • Linked #50
  • (adopt matrix), #51

    (kid learn — still Planned), and first-play / journey UX

    #36–#48.

  • No STATUS_LEDGER promotions.
  • See SKILL_MATRIX and FINDINGS CF-005.

    Knowledge — cross-project ack (MRC agrees; URLs pending)

  • Café Fausse MRC agrees: skills belong on the Café train; MRC
  • COMMENT; no self-merge on one-issue PRs.

  • Café App, Café Knowledge, and AEA stay pending until issue/PR
  • URLs arrive. Knowledge is in progress (aea-interactive-design

    issues + honesty matrix PR) — no URLs invented.

  • ctos: N/A (no skill gap; docker smoke is a repo script).
  • No STATUS_LEDGER promotions.
  • See SKILL_MATRIX and AGENTS.

    Web Maker — mobile / narrow viewports (cosmetic)

  • Sponsor: zorg.artof.link (apps/web — campaign + Maker + extermination)
  • should stay usable at ~375px / ~480px. Viewport meta was already present.

    This is layout / tap-target / overflow work, not new game rules.

  • CSS tokens (--cell, --tap) plus light classes (section-label,
  • toggle, play-title, panel roles). 3-column Maker still collapses at

    900px; phones get 56px then 48px cells (scroll the board, no pinch),

    44px primary controls, wrapping filters, honesty/lede wrap, no page-wide

    horizontal scroll. Cell inner markup left alone so a parallel hero-icon

    PR can share .cell / --cell.

  • No STATUS_LEDGER promotions (cosmetics). No C / Gunner duration /
  • FR-4 behavior.

    See AGENTS, 0002-typescript-monorepo-2d-to-3d, and NFR-6.

    Web — hero figurines (cosmetic)

  • Started from main @ ac3d0ff (knowledge mobile-responsive PR #27); rebased onto main @ 6d108ec (Keep Learning and Apply PR #54) so this sits on the mobile --cell Maker plus the docs slice.
  • Producer does not merge (S7) — PR opened for review.
  • Shipped

  • Hand-authored 32×32 SVGs for every engine HeroType (Warrior, Elf, Gunner, Mechanic, Princess) under apps/web/public/heroes/. Same dark / gold / accent palette as the favicon. Style reference only — not a raster sheet and not a rules change.
  • Maker roster, choix hero picks, .cell.hero occupants, extermination playback, and campaign cards show the figurines next to existing text labels. Optional Maker legend names the five types. Cell icons scale with --cell so the mobile Maker (PR #28) stays usable.
  • Engine stays pure. No FR-18 C room, no Gunner duration, no STATUS_LEDGER promotions. Evidence that the assets exist and map 1:1 is apps/web/src/hero-icons.test.ts (UI mapping only — not a live probe).
  • See GAME_SPEC, PLAYER_GUIDE, and 0002-typescript-monorepo-2d-to-3d.

    Persona journeys + first-timer landing

  • Rebased onto main after mobile #28, docs #54/#49, and hero figurines #29.
  • Producer does not merge (S7) — PR opened for sponsor review.
  • Keeps #29 hooks: HeroTypeRow on campaign cards, HeroIcon on the
  • Maker board / roster. Journeys copy does not replace those hunks.

    Shipped

  • PLAYER_JOURNEYS — five personas used as UX validation cases
  • (J-KID, J-HELPER, J-CAMPAIGN, J-PRACTICE, J-HONESTY). Happy path,

    success criteria, manual checklist, optional future automated probes.

    GAME_SPEC still wins on rules. Knowledge page journeys.html.

  • LEARN — kid rules page (learn.html, nav Learn the rules).
  • Short sentences + mermaid pictures (A → rooms → Z, two jobs, win/lose).

    Implemented rooms / heroes / spells only. FR ids live in a grown-up

    note. Linked from the Maker How to play panel.

  • Maker landing: kid-facing How to play, helper one-liner, **Learn the
  • rules + guide + journeys links, Start here — Difficulty 1** and

    Start here — Generate Difficulty 1. Difficulty is the English

    word; Difficulté stays as the source / bilingual hint. FR / C / Gunner /

    ledger honesty sits in a <details> disclosure (J-HONESTY).

  • Maker play: Start fight label, A-toward-Z reminder, softer gate/outcome
  • words; honesty still available in a disclosure.

  • FINDINGS CF-009 (first-timer landing was engineer-first) →
  • Resolved. Sensor: apps/web/src/first-run.test.ts. Recurrence 1.

  • Follow-up GitHub issues for leftovers that this PR does not fix:
  • #46 automated

    journey probes, #47

    kid-readable board names, #48

    Maker-play engineer jargon. (#45 is a stub create — use #48.)

    Labels ux / journeys could not be created (403); titles carry

    [ux][journeys] and issues use enhancement + accessibility /

    documentation.

    Honesty

  • No STATUS_LEDGER promotions. No invented C, Gunner duration, or
  • FR-4 earn/spend. Generated play remains Simulated engine output.

    See LEARN, PLAYER_GUIDE, PLAYER_JOURNEYS, FINDINGS CF-009, and

    0005-level-generator.

    Knowledge — LEARN.md mermaid 11.4.1 syntax (this PR)

  • Started from main @ f404faf (persona journeys / learn page PR #44).
  • Producer does not merge (S7) — PR opened for coordinator review.
  • Live learn.html showed mermaid 11.4.1 “Syntax error in text”. Rendered

    with mermaid-cli 11.4.1: the Two jobs diagram used reserved node id end.

    Comma labels and chained --- rendered; quoted/split as belt-and-braces.

    Kid sentences unchanged. GAME_SPEC still wins. No invented C /

    Gunner duration / FR-4.

    Knowledge build now rejects those mermaid pitfalls on every shipped

    <pre class="mermaid">. FINDINGS CF-011 → Resolved, Recurrence 1.

    #51 stays open

    (not Live & Probed). No STATUS_LEDGER promotions.

    See LEARN, FINDINGS CF-011, and PLAYER_JOURNEYS.

    Knowledge — 3DX Lab in-flight (not Live)

  • After the broadcast clarification, three 3DX Lab skill candidates
  • stay pending issue open: honesty (no invented 3DX status / FR),

    infra-apply (sponsor-laptop Terraform only; CI does not apply),

    lab-vs-factory (lab vs factory environment honesty). Shared

    pr-train-rebase, companion-plain-docs, and

    persona-journey-validation are N/A for 3DX. In-flight, not

    Live & Probed; no STATUS_LEDGER promotion. See SKILL_MATRIX

    and AGENTS.

    Knowledge — AEA #433 + logify #22/#23 folded (Documented, not Live)

  • AEA agent row is Documented, not pending. Work item
  • #433.

    Shared four referenced (no dup). Created AEA skills:

    one-finding-one-mr, coordinator-merge-hats,

    deploy-schema-honesty, committed-vault-memory,

    process-coherence-mr-body. Matrix vault MR Documented, not Live.

    Café-specific deferred. Keep Learning stays #434 / !513.

  • logify creating after agree clarification:
  • #22

    pr-train-parallel-merge,

    #23

    tagged-release-cut. Companion / personas N/A.

  • Other-lane skills Documented until probed. No STATUS_LEDGER
  • promotion. See SKILL_MATRIX and AGENTS.

    Knowledge — Café App #205–#212 + Knowledge #203/#204 (Documented / Simulated)

  • Café App is no longer pending. Shared four adopted via
  • #206.

    Created: freeze-first-generation

    #207,

    fail-closed-missing-db

    #208,

    probe-before-status-words

    #209,

    optional-mail-after-store

    #210,

    official-image-allowlist

    #211,

    staging-keep-tear-honesty

    #212.

    Matrix #205

    → knowledge/skills-matrix.md / skills-matrix.html

    (PR #215,

    run bc-b919b061).

  • Café Knowledge: knowledge-pages-ratchet +
  • #203

    / #204.

  • New Bot squash-merges Café skill PRs when MRC is CLEAN.
  • logify skills are created (#22 / #23), not merely creating.
  • Honesty: Documented / Simulated, not Live. No STATUS_LEDGER
  • promotion. See SKILL_MATRIX and AGENTS.

    Knowledge — Keep Learning umbrella (Documented pending formal AEA ID)

  • Folded sponsor AEA core principle Keep Learning and Apply onto
  • SKILL_MATRIX / skills.html as the umbrella: historical pain →

    skill / matrix row / finding sensor.

  • Status: Documented pending a formal AEA ID. #434
  • / !513 stay cites; do not invent the number. Not Live.

  • Sibling bc-054efe6b already adopted the playbook into AGENTS
  • (PR #54). This PR composes: pointer only, no duplicate rewrite.

    One PR (#55) absorbs the matrix umbrella. See SKILL_MATRIX and

    AGENTS.

    Knowledge — umbrella cites GitLab #434 official one-liner

  • SKILL_MATRIX umbrella quotes the AEA-agent one-liner and cites
  • GitLab #434

    as the stable formal principle. Café App is folding into

    #205.

    ctos stays N/A. Honesty: Documented / Planned. Not Live.

    Knowledge — cross-project adopt links (Documented / Planned)

  • Adopt: AEA #434
  • (formal, stable), Café Knowledge

    #213

    (+ #203

    / #204),

    logify #24, zorg

    #53.

  • Café MRC is COMMENT-only. No STATUS_LEDGER promotion. See
  • SKILL_MATRIX and AGENTS.

    Knowledge — Café App #214 + Knowledge #213 cite AEA #434

  • Café App cites GitLab #434
  • and filed

    #214

    for Grok skill keep-learning-and-apply (folds into #205).

  • Café Knowledge cites #434 on
  • #213

    / the Honesty matrix PR.

  • Honesty: Documented until probed. Not Live. See SKILL_MATRIX
  • and AGENTS.

    Knowledge — logify #25 Documented; AEA !513 / 3DX #7–#11

  • logify Keep Learning is Documented on logify main:
  • #24 closed;

    PR #25 merged; cites

    AEA #434.

    Skills #22 / #23 stay Documented / Simulated. Not Live.

  • AEA skill matrix remains merged !512.
  • Sponsor reports !513

    merged and #434 closed — principle Documented on AEA main.

    GitLab sign-in from this agent is not a merge probe. Pages stay

    Unknown until AEA probes.

  • 3DX Lab column filled from sponsor report:
  • #7 3dx-lab-honesty,

    #8 3dx-lab-infra-apply,

    #9 3dx-lab-lab-vs-factory,

    #10 Keep Learning gap;

    draft PR #11 awaiting

    sponsor merge. This agent got 404 on artofdream/3dx-lab — not a

    probe. Shared PR-train / companion / personas still N/A.

    Documented until probed. Not Live. No STATUS_LEDGER promotion.

    Knowledge — AEA !512 / !513 linked in cross-project adopt

  • Cross-project adopt row now names both artifacts: matrix
  • !512

    (merged, Documented) and principle

    !513

    / #434.

  • This note said !513 was still open. A later sponsor note on this PR
  • said !513 merged / #434 closed. GitLab sign-in from this agent is not

    a probe. Pages stay Unknown. Not Live.

    Web — kid UX win copy, fight log, room labels (this PR)

  • Started from main @ dc9c648 (skill-matrix #55).
  • Producer does not merge (S7) — PR opened for sponsor review.
  • Machine note: implemented on Cursor box when EVO-X2 machineId Shell was unavailable to this executor; same repo checks locally.
  • Tracks UX leftovers after journeys #44: win headline (#41), sentence fight feed (#40), Fight rename (#39), room/setup/spell plain words (#35/#47/#48), place-in-a-line + Start-here assist (#36), card titles (#34), More filters + practice copy (#33/#42), doors-face orientation (#38), light cell colors (#37 light only), minor 390px wrap (#43). Leaves automated probes (#46) open. Corpus quarantine (#52) already Documented on SKILL_MATRIX (corpus-quarantine-honesty).
  • Light cite: Keep Learning and Apply (AEA #434) — write the first-play lesson into the Maker copy harness (first-run.ts / event-copy.ts) before the next kid loop.
  • No STATUS_LEDGER promotions. No invented C, Gunner duration, or FR-4 gating. Illustrated tiles deferred on #37.
  • See PLAYER_JOURNEYS, LEARN, FINDINGS CF-009, and AGENTS.

    ---

    2026-09-11 — Phase 2: Elements & Elf

  • Started from main @ 6876f3c (favicons PR #6 + Phase 1 PR #7).
  • Producer does not merge (S7) — PR opened for sponsor review.
  • Shipped

  • FR-14 Elemental room E(elem) in @zorg/engine: green-cell fire / water / ice / poison, plus immunity bypass. Evidence: packages/engine/src/elements.test.ts.
  • FR-21 Elf(x, elems) : HP-preserving shortest path to Z, then Warrior tie order (right → up → left → down, orientation-relative). Evidence: packages/engine/src/elf.test.ts.
  • Default E-room tile: same 4-hatch cross as Phase 1, interior 3×3 green. Official per-type art is still not in the extract — tests that need a precise cell use paintGreen. Green ≡ open for FR-6 seams.
  • Scheduler still owns A / Z / D, Warrior, and single-active-hero order. Elf and E rooms plug into that run, they do not fork it.
  • Ledger: only FR-14 and FR-21 → Simulated. NFR-1 / NFR-10 stay Unknown (no live probe; not every hero’s layers).
  • Thin Maker copy only. No portals / gold / tolls, spells, Mechanic / Gunner / Princess, mirrors, FR-4 / C, or N11/N18 un-quarantine.
  • Assumptions a reviewer can check

  • Ice slides through walkable cells until a wall, forced water, or Z — the spec says “until a wall stops the hero.”
  • Poison visit memory is global per cell (the cell’s first visit), visible to later heroes as map state, not as another hero’s body.
  • Planning still ignores death (FR-28): an Elf scores hypothetical HP at Z even if that HP is ≤0; water stays impassable terrain.
  • See GAME_SPEC Phase 2, STATUS_LEDGER, 0002-typescript-monorepo-2d-to-3d, and 2026-09-10.

    Ops — production web CD (not a game-FR probe)

  • 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 (then-current main). Knowledge already auto-deploys via Pages (.github/workflows/knowledge.yml); the game web image did not.
  • Added .github/workflows/deploy-web.yml: on main pushes that touch apps/web/, packages/engine/, deploy/**, or the workflow itself (plus workflow_dispatch), SSH to the host and run the same web redeploy as 0004-deployment-and-observability / deploy/setup-host.sh: cd /opt/zorg && git fetch && git reset --hard origin/main && sudo docker compose -f deploy/compose.prod.yaml up -d --build web.
  • CF-006 follow-up: first CD run failed on Docker socket permissions; remote command now uses sudo docker compose (git fetch/reset stayed non-sudo).
  • CF-006 follow-up: deploy-web path filters now include the workspace manifests apps/web/Dockerfile copies (package.json, pnpm-lock.yaml, pnpm-workspace.yaml, tsconfig.base.json) so a lockfile-only merge still redeploys.
  • CF-006 follow-up: /opt/zorg fixtures are root-owned after docker builds, so remote git reset --hard now runs under sudo (sudo git fetch && sudo git reset --hard origin/main && sudo docker compose -f deploy/compose.prod.yaml up -d --build web).
  • Repo secrets: required LIGHTSAIL_SSH_KEY; optional LIGHTSAIL_HOST / LIGHTSAIL_USER. See CONTRIBUTING.
  • Ops only. A redeploy is not a production content probe — do not mark game FRs Live & Probed from this. See STATUS_LEDGER and FINDINGS CF-006.
  • Phase 3 — Portals, gold & tolls (this PR)

    Started from main @ 2217dd5 (Phase 2 PR #8); later merged current main so the journal keeps the ops CD notes above. Producer does not merge (S7).

  • FR-15 Portal P(n,f) in @zorg/engine: i-th entry into that P (i ≤ n) teleports to the first cell of the f(i)-th-most-recent visit; overshoot → waiting room + respawn. f accepts a constant, i->…, or corpus maps like x↦7x-6. History used by f(i) is visits before this portal entry. Evidence: packages/engine/src/portals.test.ts.
  • FR-16 Gold O(x): first entrant takes the pile; death reattaches the FIFO purse to the death room (that room now holds an O pile). Pickup runs before D / Z / P / cell effects. Evidence: packages/engine/src/gold.test.ts.
  • FR-17 Toll T(x,elem): dark cells use the same fire/water/ice/poison tick as FR-14; light cells charge the oldest x gold (refunded to source rooms). Unpaid light is not a voluntary step; an ice slide onto one is instant death. Default T tile: interior 3×3 dark, hatches light (official art still not in the extract — tests paint cells). Dark/light ≡ open for FR-6. Evidence: packages/engine/src/tolls.test.ts.
  • Warrior / Elf still own pathing. When O/T gold is on the map, Warrior's shortest path can pick up a pile so a later light cell is payable. Portals stay entry effects (not a planned shortcut graph). Scheduler still owns A / Z / D / E, Warrior, Elf, and single-active-hero order.
  • Ledger: only FR-15, FR-16, FR-17 → Simulated. NFR-1 / NFR-10 stay Unknown. FR-18 C, Gunner duration, FR-4, N11/N18 quarantine, spells, Mechanic / Gunner / Princess, mirrors unchanged.
  • Thin Maker copy only (gold count in the playback line).
  • Assumptions a reviewer can check

  • Portal f(i) looks up history excluding the current P entry (so P(1, 1) bounces to the previous room, matching “1st-most-recent visit”).
  • A visit's first cell is the cell the hero occupied when that visit began (spawn = room center).
  • Pickup pre-empts other entry effects as ordering (gold first, then D/Z/P), not as skipping them.
  • Warrior planning ignores death on a later unpaid light the same way it ignores lethal D; voluntary unpaid lights stay blocked like water.
  • Knowledge companion — plain English + diagrams (merged as PR #13)

    Started from main @ 96e19e7. Producer does not merge (S7).

  • Added PLAYER_GUIDE (docs/PLAYER_GUIDE.md → guide.html): a companion layer, not a rewrite of GAME_SPEC. Formal IDs stay frozen. If English or a diagram disagrees with the spec, the spec wins.
  • Knowledge builder (apps/knowledge/scripts/build.mjs) now turns fenced `mermaid blocks into <pre class="mermaid"> and loads pinned mermaid.js 11.4.1 from jsDelivr in pageShell. Each diagram is mermaid.render'd with a unique id so later charts are not empty. Dark-theme CSS lives in apps/knowledge/style.css.
  • Nav on every knowledge page gained a Guide link. Home has a card. Diagrams cover level flow (FR-5–FR-8, FR-12, FR-43), single-active-hero order (FR-26), room placement (FR-5–FR-7), and the monorepo split (NFR-1, NFR-10, 0002-typescript-monorepo-2d-to-3d).
  • Does not: change GAME_SPEC rules, invent C / Gunner duration / FR-4, start Phase 4 engine work, or promote any STATUS_LEDGER row. Companion prose is not proof.
  • Phase 4 — Spellbook (this PR)

    Started from main @ 96e19e7 (Phase 3 PR #11); rebased onto main after knowledge-guide PR #13. Producer does not merge (S7).

  • FR-32–FR-42 in @zorg/engine: one-time spells, cast only between completed hero actions, Attack / Teleport / Move / Swap / Selection / Sleep / Wake / Banality. Selection meta-dispatches only the four spells that have a documented variant. Evidence: packages/engine/src/spells.test.ts.
  • Scheduler still owns A / Z / D / E / P / O / T, Warrior, Elf, and single-active-hero order. Casts plug into that run via castSpell / simulate({ castScript }); they do not fork it. Sleep leaves the hero active (not stuck) so later heroes stay blocked until FR-41 Wake or an HP change.
  • Move / Swap re-check FR-6 edges (FR-38) and reject the cast (no consume) on mismatch. Contents (heroes, visit first-cells, poison marks) travel with the room. Spell Teleport reuses portal visit lookup; it relocates, it does not invent a new room-entry.
  • Ledger: only FR-32–FR-42 → Simulated. NFR-1 / NFR-10 stay Unknown. Mechanic / Gunner / Princess, mirrors, FR-18 C, Gunner duration, FR-4, N11/N18 quarantine unchanged.
  • Thin Maker copy: Phase 4 demo is A / Z / D + Attack(3) with a spell tray during playback.
  • Assumptions a reviewer can check

  • A cast window opens only after stepCount > 0 and never while midAction is set (one stepRun is one completed action, including an in-step portal hop).
  • Unselected Attack hits every living hero, including those still in the waiting room; Selection is how you hit a subset.
  • Teleport(n) uses the full visit list (n=1 is the current room). Overshoot → waiting room, same as FR-15.
  • Sleep / Wake / Banality have no Selection variant in the spec — wrapping them is illegal and consumes nothing.
  • Move destinations must be empty now; simultaneous Selection Move does not treat a vacated cell as empty.
  • See GAME_SPEC Phase 4, STATUS_LEDGER, 0002-typescript-monorepo-2d-to-3d, and 2026-09-10.

    Phase 5 — Mechanic, Gunner + Shell, Princess (this PR)

    Started from main @ 6dc0191 (Phase 4 Spellbook PR #14). Producer does not merge (S7).

  • FR-24 Mechanic(x, dict) in @zorg/engine: shortest path to the weight target (usually Z), ignoring HP, using shove power; then fewest unjustified shoves; then prefer using power; then up → right → down → left. From a listed room it shoves that room (contents travel) one adjacent empty cell; dict[roomType] is that instance's remaining budget. FR-6 is not a shove gate. Evidence: packages/engine/src/mechanic.test.ts.
  • FR-22 Gunner(x, c[, dur]) 2-arg path/fire: fire a useful Shell soonest, then HP-preserving shortest path factoring shots, up to c shots (inf = no cap), Warrior tie order. S3: duration is parse-accepted and stored; it is never read. No shot-lifetime, fire-rate, or "infinite duration cannot fire" rule is encoded. Evidence: packages/engine/src/gunner.test.ts.
  • FR-23 Shell: instant cardinal projectile; stops at a wall or the dungeon edge; clears elemental cells; clears D-room monsters (that D no longer deals damage); 2 damage to every hero crossed; other action pauses for the Gunner's fire action. Z-monster clear is deferred — FR-12 still holds after a Shell crosses Z (NFR-8: do not invent "kill Zorg"). Evidence: packages/engine/src/gunner.test.ts.
  • FR-25 Princess weight-pull: perceived weight = average of the viewer's default (own dict, else {Z:1}) and every other princess's pull b standing in that room. Every hero is subject to this pull; then HP-preserving shortest path to the highest-weight reachable room (Warrior still ignores HP). Evidence: packages/engine/src/princess.test.ts.
  • Scheduler still owns A / Z / D / E / P / O / T, spells, and single-active-hero order. New heroes plug into chooseStep / stepRun; they do not fork it.
  • Ledger: only FR-22–FR-25 → Simulated. NFR-1 / NFR-10 stay Unknown. FR-18 C, Gunner duration, FR-4, N11/N18 quarantine, mirrors unchanged.
  • Thin Maker copy: lede mentions Phase 5; demo stays A / Z / D + Warrior + Attack(3).
  • Assumptions a reviewer can check

  • A Mechanic shove is one adjacent empty grid cell; budget is per placed room, initialized from dict[type] (or dict[roomId] if authored that way). "Unjustified" = a shove that does not strictly decrease remaining walk-distance to the target.
  • Gunner "useful" fire = a Shell that would clear at least one elemental cell or a still-live D monster. Duration, including inf, does not change that.
  • Shell does not neutralize Z. Entering Z is still an instant loss.
  • Princess pull uses living, spawned princesses only. A waiting-room or dead princess does not add pull. The viewer does not count their own pull.
  • When no princess is on the board and defaults stay {Z:1}, Warrior / Elf pathing is unchanged.
  • Phase 6 — Mirror worlds & solvability search (this PR)

    Started from main @ 7d3cba6 (Phase 5 PR #15). Producer does not merge (S7).

  • FR-9 Mirror substitution in @zorg/engine: one shared constructed room graph; the Nth declaration-order room is swapped 1:1 for each mirror world's own list. Positions / orientations / authored tiles stay; ids and defs are reminted from the mirror list. Each world keeps its own heroes and spells. Loader accepts Mirror: / M': / Monde miroir: blocks; validateLevel rejects a length mismatch. Evidence: packages/engine/src/mirrors.test.ts.
  • FR-45 Sequential resolve : worlds run normal → M′ → M″. Each world retires once idle (stalemate / nothing changes) or once its Z is reached, then the next world starts. A world whose heroes all die is recorded as cleared (terminal, not a FR-43 claim). Evidence: packages/engine/src/mirrors.test.ts.
  • FR-46 Solvability : checkSolvability(level, layout) searches for a spell-cast sequence that lets that world's heroes all die before Z. Empty Φ is allowed (heroes dying on the map). Evidence: packages/engine/src/solvability.test.ts.
  • NFR-4 Bounded search : BFS over FR-33 windows; each spell still one-time (FR-32). Hard caps (maxNodes 512, maxBranch 8, maxSteps 256). Candidates are linear in unused spells × (heroes + rooms). Selection subsets and an infinite empty grid are not enumerated. budget means the cap fired before exhaustion — that is not a proof of impossibility. Evidence: packages/engine/src/solvability.test.ts.
  • Ledger: only FR-9, FR-45, FR-46, NFR-4 → Simulated. FR-43 / FR-44 stay Unknown (no cross-world win evaluator, no constraint/bonus interpreter). NFR-1 / NFR-10 stay Unknown. FR-18 C, Gunner duration, FR-4, N11/N18 quarantine unchanged.
  • Thin Maker copy: lede mentions Phase 6; demo stays A / Z / D + Warrior + Attack(3).
  • Assumptions a reviewer can check

  • Declaration order is flattenRooms / enumerateSuppliedRooms order, not type-name order. A mirror that lists D, A, Z against a base A, Z, D moves those defs onto the constructed cells in that Nth-slot pairing.
  • Worlds are resolved sequentially, not in lockstep. A Z entry retires that world (FR-45); it is not promoted to a whole-level loss (FR-43).
  • not_solvable is exhaustion of the bounded candidate model (NFR-4), complete for Attack/Teleport-only bags, not a proof over Selection subsets or arbitrary Move destinations.
  • Move auto-candidates are cardinal empty cells touching current occupancy. Selection is never an auto-candidate.
  • See GAME_SPEC Phase 6, STATUS_LEDGER, 0002-typescript-monorepo-2d-to-3d, and 2026-09-10.

    Phase 7 — Content & regression (this PR)

    Started from cursor/phase-7-level-pack-seed (sponsor extract: 124 levels). Producer does not merge (S7).

  • Imported the authored pack as per-level fixtures: base-classic 1–24, base-extras (10), contracts/ deluxe 1.1–10.7. Source extract stays under packages/engine/fixtures/sponsor-extract/.
  • NFR-5 parse-regression suite: every non-quarantined fixture parses as structured data. Evidence: packages/engine/src/level-pack-corpus.test.ts. Does not claim win/loss outcomes — the extract has no expected solutions.
  • Contract catalog (fixtures/contracts/catalog.json, src/contracts.ts): id, name, source Coût, level ids. Contracts 11–15 are Blabla stubs with empty levelIds (S4). FR-4 stays Unknown (S6: earning/spending unspecified). Cost for Elements is stored as 5 plus the author note, not rewritten to 7.
  • S5 quarantine: N11 Dream Trap, N18 Math Bath, deluxe 10.7 Artilleur(_), plus clearly malformed N23 and deluxe 8.2. Green suite must not run them. See FINDINGS CF-005.
  • Loader accepts extract notation without new rules: decimal Niveau, inline (M’) lines, 2Guerrier, λA, parenthesized choix lists, opaque non-choix assignments, trailing periods. C stays opaque (S2). Gunner 3rd arg is stored, not interpreted (S3).
  • Ledger: only NFR-5 → Simulated. FR-4 / FR-18 / NFR-8 unchanged.
  • See GAME_SPEC Phase 7, STATUS_LEDGER, and 2026-09-10.

    Campaign slice — authored pack by Difficulté (this PR)

    Started from main @ ce47956 (Phase 7 PR #17). Producer does not merge (S7).

  • Web flow is now campaign → Maker → extermination over the authored fixture pack (base-classic, base-extras, contracts). Vite glob-imports the .txt files; @zorg/engine stays Node-free and exposes buildCampaignCatalog / Difficulté banding / playability.
  • Group / filter by source Difficulté. Deluxe contracts have no Difficulté line — they land in an unspecified band and can be filtered by the Phase 7 contract catalogue. Costs show as flavour text only. FR-4 stays Unknown (S6). Blabla 11–15 (empty levelIds) and quarantine folders are omitted.
  • Playable levels: place that fixture's rooms (FR-5–FR-8) and run its heroes/spells through the existing Simulated scheduler. Honesty copy: Simulated, not Live & Probed. Constraints / bonuses / mirrors are not evaluated here (FR-43 / FR-44 stay Unknown).
  • Unavailable (listed, not selectable): opaque C rooms (FR-18 / S2), Gunner third-arg duration (S3), unresolved authored tokens. No invented C / duration / unlock rules.
  • Evidence: packages/engine/src/campaign.test.ts (catalog + Difficulté + playability). Ledger rows are not promoted.
  • Thin web only. Not a procedural generator.
  • See GAME_SPEC, STATUS_LEDGER, FINDINGS CF-005, and Phase 7 above.

    Knowledge companion refresh — plain English + diagrams (this PR)

    Started from main after campaign PR #18 (and deploy-web sudo-git PR #19). Producer does not merge (S7).

  • PLAYER_GUIDE no longer says only Warrior/Elf are encoded. Companion now matches the engine: spells FR-32–FR-42, Mechanic / Gunner / Shell / Princess FR-22–FR-25, portals / gold / tolls, mirrors / solvability, level-pack NFR-5, campaign by Difficulté on https://zorg.artof.link.
  • New How to play the campaign section (open Maker → pick Difficulté → place rooms → start extermination). Unavailable levels stay honest: C, Gunner duration, unresolved tokens; quarantine / Blabla omitted.
  • New mermaid: campaign flow; FR-33 cast window; hero types now in the engine (duration still dashed / deferred). Construction and extermination diagrams kept.
  • Knowledge home: shorter lead; cards for Guide, Play Maker, Spec, Honesty first. spec.html gets a build-injected banner only — GAME_SPEC body is not rewritten. Architecture / AEA pages get a monorepo vs Maker mermaid with a plain-English caption.
  • Maker lede/help: plainer English. Status stays Simulated, not Live. Unavailable reasons unchanged.
  • FINDINGS CF-007. Knowledge build fails if the guide regresses to “two types” or drops the current IDs. No STATUS_LEDGER promotions.
  • See GAME_SPEC, STATUS_LEDGER, 0002-typescript-monorepo-2d-to-3d, and PLAYER_GUIDE.

    ---

    2026-09-10 — Multi-agent collaboration setup

  • Shipped:
  • - Configured entrypoints for multiple AI agents: Anthropic Claude (CLAUDE.md), Google Antigravity / Gemini (GEMINI.md), OpenAI/Codex (CODEX.md, OPENAI.md), xAI Grok (GROK.md), Moonshot Kimi (KIMI.md), DeepSeek (DEEPSEEK.md), GitHub Copilot (.github/copilot-instructions.md), and Cursor (.cursorrules).

    - Added .gitattributes to enforce consistent LF line endings across Windows, Linux, and macOS platforms.

    - Recorded 0003-multi-agent-collaboration outlining shared memory discipline, branch isolation, peer review gates, and tool entrypoints.

    - Recorded 0004-deployment-and-observability establishing AWS Lightsail compute, GitHub Pages for knowledge, and Prometheus/Grafana observability.

    - Updated AGENTS §5 with multi-agent coordination ground rules.

    - Provisioned AWS Lightsail instance zorg-dungeon-prod (small_3_0, Ubuntu 24.04 in us-east-1a) with attached static IP <LIGHTSAIL_STATIC_IP>.

    - Configured Route 53 DNS records in zone artof.link: zorg.artof.link (A -> <LIGHTSAIL_STATIC_IP>) and knowledge.zorg.artof.link (CNAME -> artofdream.github.io.).

    - Built @zorg/knowledge static generator, styling, and automated GitHub Pages deployment workflow (.github/workflows/knowledge.yml).

    - Created production Docker Compose observability stack (deploy/compose.prod.yaml) with Caddy auto-TLS, Prometheus, Grafana at /grafana/, and Node Exporter.

  • Phase 0 — Data Model & Level Loader (FR-1, FR-2, FR-3, NFR-2, NFR-9):
  • - Shipped level data structures (RoomDef, RoomMultiplicity, HeroDef, SpellDef, ChoixVariableDef, PlayerChoice, LevelDef) in packages/engine/src/level.ts.

    - Implemented textual DSL level parser, multiplicity flattener, variable evaluator, and canonical serializer in packages/engine/src/loader.ts.

    - Authored comprehensive test suite in packages/engine/src/loader.test.ts proving room parsing/flattening (FR-1), choix(n, E) domain validation and substitution (FR-2), and selection order/orientation capture (FR-3).

    - Updated docs/STATUS_LEDGER.md promoting FR-1, FR-2, and FR-3 to Simulated with test evidence.

    - Verification: all 18 Vitest unit tests passing; all 4 governance scripts passing.

    Cloud / agent handover (sponsor's local machine offline)

    This section is the handoff for cloud-only agents. Chat is not shared memory

    (AGENTS §1 / 0003-multi-agent-collaboration): if it matters, it is

    in this journal, GAME_SPEC.md, docs/adr/, docs/STATUS_LEDGER.md, or

    docs/FINDINGS.md — or it did not happen.

    Current main

  • Tip at handoff write-up: 066dfac (Merge pull request #2).
  • PR #3 (ci: let packageManager pin pnpm version) merged @ d1f352a (2026-09-10). ci + governance green on that merge push.
  • PR #2 (Phase 0 loader FR-1/FR-2/FR-3) merged @ 066dfac (2026-09-10). ci + governance green on that merge push.
  • Ledger on main (do not invent upgrades): FR-1, FR-2, FR-3, FR-10 = Simulated. Every other FR/NFR, including NFR-2 and NFR-9, remains Unknown.
  • Findings on main before this PR: CF-001 / CF-002 / CF-003 = Resolved. This PR (#4) adds FINDINGS CF-004 (Pages site was missing).
  • No open GitHub issues. No other open PRs at handoff start.
  • Stale remotes (leave unless a later agent confirms they are fully merged and unused): agent/gemini/multi-agent-framework, copilot/board-game-zorg-dungeon. agent/gemini/phase-0-data-model-loader is the merged PR #2 head — leftover only.
  • Knowledge / GitHub Pages (ops)

  • First deploy-knowledge runs failed at actions/configure-pages@v5: Get Pages site failed / Not Found. The repo Pages API endpoint 404'd — the site did not exist yet. DNS already had knowledge.zorg.artof.link CNAME → artofdream.github.io (see shipped notes above and 0004-deployment-and-observability).
  • What changed (parent / ops, not this PR): Pages was enabled via the GitHub API with build_type=workflow. API now reports html_url https://artofdream.github.io/zorg-dungeon/ and custom domain knowledge.zorg.artof.link. deploy-knowledge was re-triggered on main after enablement; Actions run 34530132314 completed success.
  • Honesty: a green deploy workflow is not Live & Probed. Do not promote any ledger row for the knowledge site until a reviewer records a real HTTP probe of the published pages (custom domain + https://artofdream.github.io/zorg-dungeon/). As of the Pages API read during this handoff: build_type=workflow, cname=knowledge.zorg.artof.link, certificate approved, https_enforced=false.
  • Sensor / hardening in this PR: .github/workflows/knowledge.yml sets enablement: true on configure-pages@v5. That helps when a privileged token is present; the default GITHUB_TOKEN cannot create a Pages site. Recurrence prevention is the documented rule: repo Pages must already exist with build_type=workflow. See CF-004.
  • USER ACTION (human / repo admin)

    Pages does not need a first-time Settings toggle anymore — enablement already happened via API. Remaining human checks, if the next agent cannot complete them:

    1. Confirm knowledge.zorg.artof.link serves the generated site (CNAME + custom domain already set; HTTPS enforce is still off).

    2. If deploy-knowledge ever 404s again on configure-pages, check Settings → Pages: source must be GitHub Actions (build_type=workflow). Do not assume enablement: true alone can recreate the site with GITHUB_TOKEN.

    3. Optional: turn on “Enforce HTTPS” once the custom-domain certificate is trusted in the browser.

    Open actionable items (not started in this PR)

    1. Next game work = Phase 1 (GAME_SPEC.md build plan): Maker MVP + Warrior — grid placement, adjacency/orientation validation, rooms A/Z/D. Covers FR-5–FR-8, FR-11–FR-13, FR-20, FR-26–FR-31. Do not start Phase 1 in a handover/ops PR.

    2. Phase 0 residual (honesty): Phase 0’s stated bar is “parse every base-edition level without error” and lists NFR-2 / NFR-9. What shipped is a DSL + synthetic loader.test.ts (18 tests). There is no imported ~130-level corpus as fixtures. Journal/PR #2 mention NFR-2/NFR-9; the ledger correctly left them Unknown. Do not flip those rows to Simulated without an agreed evidence bar (corpus parse and/or authoring-ergonomics tests a reviewer can check).

    3. Open GAME_SPEC.md questions (do not silently guess — NFR-8):

    - Undefined C room (blocks FR-18): used in Artillery (C(1), C(2), C(∞,2)); no chapter defines behavior. Loader currently stores opaque args.

    - Gunner duration (affects FR-22): manual says Gunner(x, c); Artillery uses a third argument (Gunner(1, 3, 2), Gunner(2, ∞, ∞)). Loader accepts an optional duration / inf; semantics are still unspecified.

    4. Optional branch hygiene: delete merged leftover agent/gemini/phase-0-data-model-loader after confirming no in-flight use; leave the other stale remotes.

    What this PR does / does not do

  • Does: journal handoff (this section), CF-004, knowledge workflow enablement: true.
  • Does not: Phase 1 gameplay, corpus import, ledger promotions, claiming the knowledge site is Live & Probed.
  • Phase 0 honesty residual — base-classic corpus (this PR)

    Sponsor resolutions (committed intent, 2026-09-10):

  • S1: Phase 0 honesty before Phase 1. This PR does not start Maker / Warrior gameplay.
  • S2 Room C: DEFER FR-18 — rooms chapter has no C rules; Artillery uses C(…); loader keeps opaque args; do not invent.
  • S3 Gunner 3rd arg: Parse-accept; semantics DEFERRED — rules say Artilleur(x,c); Artillery uses 3-arg duration-like forms; do not encode duration behavior yet.
  • S4 Contracts 11–15: DEFER — source is literally Blabla.
  • S5 Quarantine: Base N11 Dream Trap (author-flagged bug); Base N18 Math Bath (malformed choix/heroes); Deluxe 10.7 Artilleur(_) when/if imported. Quarantined fixtures live under packages/engine/fixtures/base-classic/quarantine/ and are describe.skip’d so they cannot fail the green corpus suite.
  • S6 FR-4 gating: STILL OPEN — costs exist, earning/spending undefined. Leave Unknown.
  • S7: Producer doesn’t merge — PR opened for sponsor review.
  • Corpus status:

  • Committed exact UTF-8 extract for Niveau 1–20 under packages/engine/fixtures/base-classic/.
  • Green suite parses 18 levels (1–10, 12–17, 19–20) via the existing loader DSL plus French aliases (Guerrier/Elfe/Artilleur/Mécanicien/Princesse, feu/eau/glace, Sortilège(s), 2x/2, inline choix, λ repeats).
  • N11 and N18 are quarantined (S5). See FINDINGS CF-005 (Recurrence 1, Open).
  • Residual: Niveau 21–24 were not in the extract available to this agent. Do not invent them. Parent has the rest of the manual on hand.
  • Ledger: NFR-2 → Simulated (data-driven parse of real base-classic fixtures in packages/engine/src/base-classic-corpus.test.ts). NFR-9 → Simulated (validateLevel + serialize/parse round-trip on those same fixtures; dense notation Π / dist / choix / variables preserved). FR-4 stays Unknown (S6). FR-18 stays Unknown (S2).
  • Ops hitchhike: .github/workflows/knowledge.yml now has workflow_dispatch so knowledge deploys can be re-run without a docs push.
  • Phase 1 not started.
  • Phase 1 — Maker MVP + Warrior (this PR)

    Started from main @ afe3e8f (Phase 0 corpus PR #5). Producer does not merge (S7).

  • Engine (@zorg/engine): grid placement + FR-5–FR-8 validator (placement.ts, default 5×5 4-hatch tile in tiles.ts); A / Z / D entry effects + Warrior-only run (simulation.ts, pathing.ts). Cell-level BFS; HP / other heroes are not pathing inputs.
  • Default tile assumption: official per-type 5×5 art was not in the committed extract. Phase 1 uses a symmetric 4-hatch cross so FR-6 matching is real without inventing FR-14 elemental cells. Hatch direction is orientation metadata (FR-7, visual only in the web shell — NFR-6 stays Unknown).
  • Tests (Simulated evidence): placement.test.ts FR-5 FR-6 FR-7 FR-8; rooms.test.ts FR-11 FR-12 FR-13; warrior.test.ts FR-20 FR-31; scheduler.test.ts FR-26 FR-27 FR-28 FR-29 FR-30.
  • Web: thin Maker grid + playback stub calling the engine. Honesty copy: engine-simulated, not Probed / not Live.
  • Out of scope (unchanged): FR-18 C (S2), Gunner duration (S3), contracts 11–15 (S4), FR-4 gating (S6), N11/N18 quarantine (S5 / FINDINGS CF-005), Elf/elements/portals/spells/mirrors.
  • Ledger: only the Phase 1 FR rows above → Simulated. NFR-1 / NFR-6 / NFR-10 left Unknown (no live probe; no per-layer NFR-10 claim beyond Warrior tests).
  • See 0002-typescript-monorepo-2d-to-3d (engine vs UI split) and STATUS_LEDGER.
  • Continued in 2026-09-11 (Phase 2 Elements & Elf).
  • ---