docs(game): close stale DD-009 via length dial; propose DD-014 information budget#70
Merged
Merged
Conversation
…ation budget DD-009 was marked OPEN pending playtesting, but the ruling had already been made: CANONICAL-MODEL.adoc landed the three-preset length dial in #68 (whose title claims DD-009). The DD log and tracker were never updated. Record it — no new decision is taken here. Keep the half of the risk that survives: the 25-35 min figure is a full-weight Industrial turn, so Short's 60-90 min target needs the leaner-turn levers to deliver a ~2-3x cut. That is assumed, not measured, and is now flagged as the first job of the first playtest. Reconcile WAY-FORWARD with the canonical model: Phase 0 is DONE, and its Short Game figure (~12 turns) contradicted CANONICAL-MODEL (~5-6). Canonical wins. Propose DD-014 (information budget, OPEN — ruling pending): DD-013 spends the hidden-information budget on characters, so DD-011/DD-012 should lean public. Enough hidden info to make types uncertain; enough public info to update from. Also logs the unresolved DD-006/DD-012 overlap — private objectives and speculative research may be one subsystem wearing two hats. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
hyperpolymath
marked this pull request as ready for review
July 16, 2026 21:22
hyperpolymath
added a commit
that referenced
this pull request
Jul 16, 2026
Found while verifying #70. Two toolchain defects, both pre-existing on `main`. ## 1. `just` is completely broken on main `build/contractile.just:136` writes a literal grep pattern unescaped: ```just ! grep -rl '{{[A-Z_]*}}' --include='*.a2ml' ... ``` `just` parses `{{` as an interpolation, hits `[A-Z_]*`, and **aborts before running anything**. Not just that recipe — *every* recipe. `just --list`, `just docs`, `just quality`, all 124 of them: ``` error: expected '&&', '!=', ... but found '*' ——▶ build/contractile.just:136:25 ``` `{{{{` is just's escape for a literal `{{`. The file header says it's hand-maintained ("hand-expanded to match Xfile.a2ml checks"), so the fix won't be clobbered by regeneration. After: **124 recipes list and run.** Unbreaking it also revealed that `dust-no-placeholder-tokens` **fails** — it was never able to run. Six files carry unfilled `{{PLACEHOLDER}}` tokens (`container/README.adoc`, `container/0.1-AI-MANIFEST.a2ml`, `.machine_readable/agent_instructions/methodology.a2ml`, `docs/status/TEST-NEEDS.adoc`; two more — `PLACEHOLDERS.adoc`, `Dustfile.a2ml` — contain the pattern legitimately). **Not fixed here** — pre-existing, needs your judgement on the values. `openssf-compliance.yml` misses them because it only scans a curated `REQUIRED_FILES` list. ## 2. Nothing checked that `.adoc` files actually parse `check-no-md-in-docs.sh` enforces AsciiDoc by **extension**. CI's `docs` job only checked files **exist**. Nothing checked they **render** — an unterminated block or malformed table produces mangled output and ships silently. That gap is why #69 shipped on my hand-counted delimiters rather than a real check. Adds `scripts/check-docs-render.sh` (house style, matching `check-no-md-in-docs.sh`), renders every `.adoc` at `--failure-level=WARN`. Wired into `just docs-check`, `just quality`, and CI's docs job. Also `just docs-html` for local reading. Verified it fails correctly, not just passes: | | result | |---|---| | repo as-is | `PASS: 125 .adoc render cleanly (6 quarantined)` → exit 0 | | with a deliberately broken file | `FAIL: unterminated table block` → exit 1 | ## The 6 quarantined files — a real finding They're **Markdown wearing an `.adoc` extension**: a `= Title` line bolted onto a Markdown body (`#` headings, `<!-- -->` comments, `|` pipe tables). They satisfy `check-no-md-in-docs.sh` by extension while still being Markdown — the estate rule met in letter, not substance. They're in an `ALLOWED` list rather than silently skipped, so the list is visible and meant to shrink. **All 6 are RSR boilerplate — no game-design doc is affected.** Worth knowing: the render gate only catches the *tip*. Asciidoctor accepts `##`+ as Markdown-compat headings, so a file can be wholly Markdown and still render "clean" — `docs/governance/MAINTENANCE-CHECKLIST.adoc` has 53 Markdown headings and passes. At least ten files are affected. A proper conversion is a separate job. ## CI impact None beyond the new gate. No workflow invokes `just quality` or the `dust-*` recipes, so unbreaking `just` cannot turn anything red. (Note `main` is already partly red independently: Governance = failure, Secret Scanner = startup_failure.) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.



Follow-on to #69. Two bookkeeping fixes and one genuinely new proposal for you and Joshua to rule on.
DD-009 was stale, not open
I reported to Jonathan that DD-009 (game length) was the unruled blocker on Phase 1. That was wrong, and this PR corrects it. The ruling had already been made —
CANONICAL-MODEL.adoclanded the three-preset length dial in #68, whose title even claims DD-009. The DD entry and tracker just never recorded it.The original entry asked "how many turns?" as if one number had to serve every table. Length is a dial, like complexity (DD-008). 32 turns was never wrong — it was the Extended preset, mislabelled as the only one. No new decision is taken here; this is the log catching up with the model.
The half of the risk that survives
The 25–35 min/turn figure (
gameplay-storyboard.adoc:463) is a full-weight Industrial turn. Short targets 60–90 min over ~5–6 turns = 10–15 min/turn, i.e. a ~2–3× reduction, expected from Core-only weight plus the leaner-turn levers.That ~2–3× is assumed, not measured — the most load-bearing untested number in the design. If the levers only deliver 1.5×, Short lands at 100–140 min and the target is gone. So: time a Core-weight turn first, before balance, before content. Now flagged in DD-009 and WAY-FORWARD.
Contradiction fixed
WAY-FORWARD said Short = "2 eras / ~12 turns"; CANONICAL-MODEL says "~5–6". Canonical is the declared single source of truth, so it wins. Phase 0 also marked DONE — its bullets were pending recommendations that #68/#69 have since executed.
DD-014 — The Information Budget (OPEN, ruling pending)
The one new idea, deliberately logged as proposed, not decided.
Hidden information is a budget, not a free good. DD-013 spent most of it on characters (hidden aspects + private objective). So DD-011 ("agreements public or private?") and DD-012 ("research public or private?") should lean public — each further hidden layer is charged to the same account.
Bayes–Nash needs both: enough hidden information to make types uncertain, and enough public information to update from. Hide everything and an opponent watching you defect cannot tell thin-skinned from research failed from private objective paid. Priors never move; inference becomes guesswork. More hidden information does not mean more Bayes–Nash — past a point it means less.
player-roles.adoc§8 already says hidden aspects must create inference, not confusion; DD-014 generalises that from characters to the whole design.If adopted, it constrains DD-011/DD-012 rather than resolving them — binding duration, defection penalty, and randomness model all stay open.
Also logged: do private objectives (DD-006) and eXperiment (DD-012) collapse into one subsystem? Both are hidden, asymmetric-payoff machinery existing to obscure your payoff function. Unresolved — worth settling before either is drafted in Phase 1.
Verification
Installed
asciidoctor(it was missing, which is why #69 shipped without a render check) and rendered all four docs — zero warnings. Confirmed the DD-009 table, DD-014 section, 9 tracker rows, and that the WAY-FORWARD NOTE renders as a real admonition without swallowing the following bullet. This also retroactively validates the #69 files.🤖 Generated with Claude Code