Skip to content

docs(game): close stale DD-009 via length dial; propose DD-014 information budget#70

Merged
hyperpolymath merged 1 commit into
mainfrom
docs/dd-014-information-budget
Jul 16, 2026
Merged

docs(game): close stale DD-009 via length dial; propose DD-014 information budget#70
hyperpolymath merged 1 commit into
mainfrom
docs/dd-014-information-budget

Conversation

@hyperpolymath

Copy link
Copy Markdown
Owner

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.adoc landed the three-preset length dial in #68, whose title even claims DD-009. The DD entry and tracker just never recorded it.

Preset Eras Turns Time target
Short — "Skirmish" 2 ~5–6 60–90 min
Standard — "Ascent" 3 ~9–10 120–180 min
Extended — "Legacy" 4 32 4–6 hr, multi-session

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

…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>
@sonarqubecloud

Copy link
Copy Markdown

@hyperpolymath
hyperpolymath marked this pull request as ready for review July 16, 2026 21:22
@hyperpolymath
hyperpolymath merged commit baa718a into main Jul 16, 2026
30 of 34 checks passed
@hyperpolymath
hyperpolymath deleted the docs/dd-014-information-budget branch 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant