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)
main @ d1fb25b (i18n PR #62).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
#content, FR lang="fr".
apps/web/src/ux-smoke.test.ts: viewport meta, focus-visible, no bare outline:none, reduced-motion, locale --tap.
Deferred
already present; no code change beyond CSS). Simulated CSS + build sensors
only here.
.topbar height vs board — already sticky with board-wrapscroll; no change.
C / Gunner duration / FR-4.Honesty
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)
main @ 7109bb3 (kid UX PR #57).machineId Shell unavailable to thisexecutor; clone + probes on the shared Grok box (same pattern as prior
kid-UX work).
Shipped
apps/web/e2e/journeys.spec.ts probes the personajourneys 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.
apps/web/src/first-run.ts strings. Maker exposes data-pack / data-difficulty-band for honest pack/band asserts (presentation only).
ci.yml steps are in the PR (Install PlaywrightChromium + 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).
(AEA #434)
— write the journey checklist into a browser sensor before the next
first-play loop.
Honesty
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)
main @ journey-probes merge (PR #58 / #46 on main).machineId; work + push via gh as artofdream on the shared Grok box (EVO-X2 preferred path unavailable).
Shipped
apps/web/public/rooms/ forA / Z / D / E / P / O / T (door/start, exit, danger, element, portal,
gold, toll) matching hero figurine warm palette + stroke style.
stay in aria-label / data-coords and a de-emphasized empty-cell meta.
.legal-nexthighlight while a tray room is selected (placement hint only — does not
change engine legality / FR-5–FR-8 validation).
--cell upsize (72 / 64 / 56) so tiles read near ~390px width;hero icons remain overlaid. Tray buttons show a small tile thumb.
Special); no FR-4 / Gunner durationinvented. App.tsx has no separate board (MakerPlay only).
Evidence
apps/web/src/room-icons.test.ts (assets + legal-next helper).pnpm test / typecheck / governance / build / probe:journeys on the PR branch.
See #37.
Findings — close CF-005 + CF-010 (quarantine sensor / Keep Learning probe)
main @ 40dd049 (illustrated tiles PR #60).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
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.
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
C / Gunner duration / FR-4. No FR row promotions.i18n FR/EN — Maker + knowledge companions (ADR-0007)
main @ 13d971b.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
English IDs win; URL strategy ?lang=fr (+ document.documentElement.lang
+ localStorage); EN keys SoT; FR complete catalog; CI missing-key gate.
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.
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.
FR smoke ?lang=fr. PLAYER_JOURNEYS notes optional FR validation.
Explicitly deferred
/fr/ Maker routing (no React Router this slice).C, Gunner duration, FR-4 — still not invented (NFR-8).Honesty
only. No inventing C / Gunner duration / FR-4.
---
2026-09-12 — Difficulté level generator
main @ 11032fd (knowledge companion refresh PR #20).Shipped
generateLevel in @zorg/engine: seed-stable, parseable DSL, legalMaker 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.
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.
D, then flavour rooms, then Z.First D damage ≥ every hero's HP. No mirrors (no intentional not_solvable
worlds in this slice).
C (FR-18 / S2), Gunner duration (S3 — Gunner isnot 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.
(Difficulté 1–4) and Maker Regenerate are additive. Honesty copy:
generated = Simulated engine, not Live & Probed; FR-4 still not gating.
STATUS_LEDGER rows are not promoted. FINDINGS unchanged — no new
CF. GAME_SPEC FRs not rewritten.
Assumptions a reviewer can check
seed is 1, not Date.now().checkSolvability on that layout is Simulated proof, not a live probe.pack: "generated" and no contract cost.See GAME_SPEC, STATUS_LEDGER, PLAYER_GUIDE, and 0005-level-generator.
Ops — CF-006 closed
sudo git on Lightsail /opt/zorg).deploy-web on the PR #21 merge to main (4111d82) succeeded — Actions run 34687483872.See FINDINGS CF-006 and 0004-deployment-and-observability.
Honesty — FR-19 / NFR-1 / NFR-10 Simulated
main @ f625437 (CF-006 resolve PR #22).Shipped
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.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.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.Simulated. No FR-4 / FR-18 / FR-43 / FR-44 / Gunner duration / contracts 11–15.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).
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.
constraints vs separately-tracked bonuses(variants stay non-blocking). A failed or unsupported bonus does not
prevent a win.
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.
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
aggregate then marks the level a loss.
not_solvable is exhaustion of the bounded candidate model, same asFR-46. A budget stop is unsupported, not “failed”.
dist(D, …) with two D rooms is unsupported (no guess whichinstance).
NFR-6 Maker wall-hatch / orientation clarity
main @ 86664b4 (honesty FR-19 / NFR-1 / NFR-10 PR #23); rebased onto e8444c2 (PR #25 FR-43 / FR-44).Shipped
apps/web/src/orientation-ui.ts.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.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.switch / if chains, not a plug-in registry. No invented extension API.See GAME_SPEC, STATUS_LEDGER, PLAYER_GUIDE, and 0002-typescript-monorepo-2d-to-3d.
Knowledge — AEA diagrams (cosmetic)
.mermaid-wrap CSS so SVGs stay readable and scroll on small viewports instead of wrapping like broken <pre> art.See AGENTS and 0003-multi-agent-collaboration.
Knowledge — mobile / narrow viewports (cosmetic)
knowledge.* pages from apps/knowledge/ must stayusable on ~375px / ~480px (viewport, type, nav). Same build as guide,
architecture, AEA, observability.
.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.
See AGENTS and 0003-multi-agent-collaboration.
Knowledge — skill matrix (this PR)
main @ 2450b6c (web mobile PR #28).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
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).
Memory point at the page. Build fails if the matrix file drops a named
skill or its mermaid / table.
C, Gunner duration,or FR-4 gating.
See AGENTS, 0003-multi-agent-collaboration, and SKILL_MATRIX.
AEA — keep learning and apply (this PR)
cursor/skill-matrix-551b (PR #49,bc-53cc542e) rather than duplicating the matrix. Rebase onto that PR
if it moves.
Links shared skills and #50–#52.
page (journeys PR #44; docs/PLAYER_JOURNEYS.md is not on this branch).
Those gaps stay follow-ups, not this diff.
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)
/ 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.
apply-artifact of historical pain. Planned candidates for #51 / #52.
Status Documented / Planned. Knowledge Pages: Unknown until
AEA probes.
aea.html + home Skills card cite #434. Build fails ifthe matrix or AEA page drops the name or the work-item URL.
Open, Recurrence 1. CF-009 left for journeys PR #44.
Honesty
C, Gunner duration, orFR-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
main @ 6d108ec (Keep Learning and Apply PR #54).the AEA cites (#434,
!512,
!513,
session-memory log) and only adds compose notes for journeys PR #44.
See AGENTS, SKILL_MATRIX, and FINDINGS CF-010.
Knowledge — cross-project skill fit (Café App received)
(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.
freeze-first,fail-closed missing-DB, probe-before-status-words, SES fail-soft,
official-image allowlist, staging keep/tear honesty). Not loaded here.
See SKILL_MATRIX and AGENTS.
Knowledge — Café Fausse Knowledge fit (received)
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).
finding → one issue → one PR; author does not merge; MRC COMMENT; New
Bot squash; HTTPS Pages probe before claiming live).
See SKILL_MATRIX and AGENTS.
Knowledge — skill matrix raised bar (Skill / Scope / Why / What)
(historical evidence) | What (recipe / responsibility).
later — not invented). Adoption tracked as #50.
waiting. Café candidates stay Proposed / other-repo — do not claim
those teams created the skills. Not Live.
corpus quarantine #52,
spec-phased engine slice (issue not filed — issues: write 403;
paste-ready body is on the matrix page).
See SKILL_MATRIX, AGENTS, and #50.
Knowledge — corpus-quarantine-honesty created
corpus-quarantine-honesty is created in the Groklibrary (zorg-evidenced). Promoted out of Planned on SKILL_MATRIX.
Issue: #52.
(adopt matrix), #51
(kid learn — still Planned), and first-play / journey UX
See SKILL_MATRIX and FINDINGS CF-005.
Knowledge — cross-project ack (MRC agrees; URLs pending)
COMMENT; no self-merge on one-issue PRs.
URLs arrive. Knowledge is in progress (aea-interactive-design
issues + honesty matrix PR) — no URLs invented.
See SKILL_MATRIX and AGENTS.
Web Maker — mobile / narrow viewports (cosmetic)
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.
--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.
FR-4 behavior.
See AGENTS, 0002-typescript-monorepo-2d-to-3d, and NFR-6.
Web — hero figurines (cosmetic)
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.Shipped
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..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.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
main after mobile #28, docs #54/#49, and hero figurines #29.HeroTypeRow on campaign cards, HeroIcon on theMaker board / roster. Journeys copy does not replace those hunks.
Shipped
(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.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.
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).
words; honesty still available in a disclosure.
Resolved. Sensor: apps/web/src/first-run.test.ts. Recurrence 1.
#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
C, Gunner duration, orFR-4 earn/spend. Generated play remains Simulated engine output.
See LEARN, PLAYER_GUIDE, PLAYER_JOURNEYS, FINDINGS CF-009, and
Knowledge — LEARN.md mermaid 11.4.1 syntax (this PR)
main @ f404faf (persona journeys / learn page PR #44).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)
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)
#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.
pr-train-parallel-merge,
tagged-release-cut. Companion / personas N/A.
promotion. See SKILL_MATRIX and AGENTS.
Knowledge — Café App #205–#212 + Knowledge #203/#204 (Documented / Simulated)
#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).
knowledge-pages-ratchet +/ #204.
promotion. See SKILL_MATRIX and AGENTS.
Knowledge — Keep Learning umbrella (Documented pending formal AEA ID)
SKILL_MATRIX / skills.html as the umbrella: historical pain →
skill / matrix row / finding sensor.
/ !513 stay cites; do not invent the number. Not Live.
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
Knowledge — umbrella cites GitLab #434 official one-liner
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)
(formal, stable), Café Knowledge
(+ #203
/ #204),
logify #24, zorg
#53.
SKILL_MATRIX and AGENTS.
Knowledge — Café App #214 + Knowledge #213 cite AEA #434
and filed
for Grok skill keep-learning-and-apply (folds into #205).
/ the Honesty matrix PR.
and AGENTS.
Knowledge — logify #25 Documented; AEA !513 / 3DX #7–#11
main:#24 closed;
PR #25 merged; cites
AEA #434.
Skills #22 / #23 stay Documented / Simulated. Not Live.
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.
#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
(merged, Documented) and principle
/ #434.
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)
main @ dc9c648 (skill-matrix #55).machineId Shell was unavailable to this executor; same repo checks locally.corpus-quarantine-honesty).first-run.ts / event-copy.ts) before the next kid loop.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
main @ 6876f3c (favicons PR #6 + Phase 1 PR #7).Shipped
E(elem) in @zorg/engine: green-cell fire / water / ice / poison, plus immunity bypass. Evidence: packages/engine/src/elements.test.ts.packages/engine/src/elf.test.ts.paintGreen. Green ≡ open for FR-6 seams.Simulated. NFR-1 / NFR-10 stay Unknown (no live probe; not every hero’s layers).C, or N11/N18 un-quarantine.Assumptions a reviewer can check
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)
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..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.sudo docker compose (git fetch/reset stayed non-sudo).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./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).LIGHTSAIL_SSH_KEY; optional LIGHTSAIL_HOST / LIGHTSAIL_USER. See CONTRIBUTING.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).
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.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.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.Simulated. NFR-1 / NFR-10 stay Unknown. FR-18 C, Gunner duration, FR-4, N11/N18 quarantine, spells, Mechanic / Gunner / Princess, mirrors unchanged.Assumptions a reviewer can check
f(i) looks up history excluding the current P entry (so P(1, 1) bounces to the previous room, matching “1st-most-recent visit”).Knowledge companion — plain English + diagrams (merged as PR #13)
Started from main @ 96e19e7. Producer does not merge (S7).
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.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.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).
@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.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.Teleport reuses portal visit lookup; it relocates, it does not invent a new room-entry.Simulated. NFR-1 / NFR-10 stay Unknown. Mechanic / Gunner / Princess, mirrors, FR-18 C, Gunner duration, FR-4, N11/N18 quarantine unchanged.Attack(3) with a spell tray during playback.Assumptions a reviewer can check
stepCount > 0 and never while midAction is set (one stepRun is one completed action, including an in-step portal hop).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.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).
@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.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.packages/engine/src/gunner.test.ts.{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.chooseStep / stepRun; they do not fork it.Simulated. NFR-1 / NFR-10 stay Unknown. FR-18 C, Gunner duration, FR-4, N11/N18 quarantine, mirrors unchanged.Attack(3).Assumptions a reviewer can check
dict[type] (or dict[roomId] if authored that way). "Unjustified" = a shove that does not strictly decrease remaining walk-distance to the target.inf, does not change that.{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).
@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.cleared (terminal, not a FR-43 claim). Evidence: packages/engine/src/mirrors.test.ts.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.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.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.Attack(3).Assumptions a reviewer can check
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.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.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).
base-classic 1–24, base-extras (10), contracts/ deluxe 1.1–10.7. Source extract stays under packages/engine/fixtures/sponsor-extract/.packages/engine/src/level-pack-corpus.test.ts. Does not claim win/loss outcomes — the extract has no expected solutions.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.Artilleur(_), plus clearly malformed N23 and deluxe 8.2. Green suite must not run them. See FINDINGS CF-005.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).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).
base-classic, base-extras, contracts). Vite glob-imports the .txt files; @zorg/engine stays Node-free and exposes buildCampaignCatalog / Difficulté banding / playability.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.C rooms (FR-18 / S2), Gunner third-arg duration (S3), unresolved authored tokens. No invented C / duration / unlock rules.packages/engine/src/campaign.test.ts (catalog + Difficulté + playability). Ledger rows are not promoted.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).
C, Gunner duration, unresolved tokens; quarantine / Blabla omitted.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.See GAME_SPEC, STATUS_LEDGER, 0002-typescript-monorepo-2d-to-3d, and PLAYER_GUIDE.
---
2026-09-10 — Multi-agent collaboration setup
- 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.
- 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
066dfac (Merge pull request #2).d1f352a (2026-09-10). ci + governance green on that merge push.066dfac (2026-09-10). ci + governance green on that merge push.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.main before this PR: CF-001 / CF-002 / CF-003 = Resolved. This PR (#4) adds FINDINGS CF-004 (Pages site was missing).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)
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).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.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..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
enablement: true.Live & Probed.Phase 0 honesty residual — base-classic corpus (this PR)
Sponsor resolutions (committed intent, 2026-09-10):
C(…); loader keeps opaque args; do not invent.Artilleur(x,c); Artillery uses 3-arg duration-like forms; do not encode duration behavior yet.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.Corpus status:
packages/engine/fixtures/base-classic/.Guerrier/Elfe/Artilleur/Mécanicien/Princesse, feu/eau/glace, Sortilège(s), 2x/2, inline choix, λ repeats).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)..github/workflows/knowledge.yml now has workflow_dispatch so knowledge deploys can be re-run without a docs push.Phase 1 — Maker MVP + Warrior (this PR)
Started from main @ afe3e8f (Phase 0 corpus PR #5). Producer does not merge (S7).
@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.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.Simulated. NFR-1 / NFR-6 / NFR-10 left Unknown (no live probe; no per-layer NFR-10 claim beyond Warrior tests).---