Delivers ADR-0007 Decision 1: visualization, drag-to-propose and hot-seat
play, at a measured marginal AM-4a cost of zero.
games-ground shipped: 23 third-party crates
cb-render-html: 23 third-party crates
new crates introduced: 0
Measured, not asserted — the survey's own lesson. AM-4a is unmoved at
246,250; own source is 7,636 -> 9,652.
What shipped:
crates/cb-render-html doc.rs (HTML/SVG emission, incl. the relationship
graph), input.rs (pointer facts -> commands),
serve.rs (Guard, Request, loopback bind)
tools/cb-play hotseat.rs + `--serve PORT`
Per ADR-0007 Decision 2 there is NO cb-render-api and NO cb-render-null.
The renderer targets the existing Project trait; the port waits for
stage 2's wgpu implementation to be its second use.
The six controls, all live, all mutation-checked (8 mutations, each red
for its stated reason):
1-3 token / Origin+Sec-Fetch-Site / explicit 127.0.0.1 bind
4 a token-less request is refused, in the unit AND over a real socket
5 JS may not construct commands — the page reports pointer facts, Rust
resolves them against the legal list the aggregate already offered,
and a test asserts the emitted script contains no game vocabulary
6 the coverage gate crosses the language boundary: it walks the
serialized view for leaf paths and requires each token to appear in
the PARSED emitted document, with a test that the parse really is a
parse (script/style contents must not count as rendered)
The gate fired on its author again, on its first run: ground_choices.*.
choice, ground_choices.*.problem and players.*.blame_from were in neither
list. The last is the one worth keeping — an EMPTY vector is a leaf path
of its own, and it now renders as an explicit absence.
Also, a mutation that did not go red: removing the Sec-Fetch-Site arm
alone left the cross-site test green, because the Origin check caught it
independently. Both had to be removed before the control bit. Recorded
because a control that passes for a reason you did not intend has not
been demonstrated.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
38 lines
1,015 B
TOML
38 lines
1,015 B
TOML
[workspace]
|
|
resolver = "2"
|
|
members = [
|
|
"crates/cb-kernel",
|
|
"crates/cb-events",
|
|
"crates/cb-game-runtime",
|
|
"crates/cb-render-html",
|
|
"games/ground",
|
|
"tools/cb-sim",
|
|
"tools/cb-play",
|
|
]
|
|
|
|
[workspace.package]
|
|
edition = "2021"
|
|
version = "0.1.0"
|
|
license-file = "LICENSE"
|
|
|
|
[workspace.dependencies]
|
|
cb-kernel = { path = "crates/cb-kernel" }
|
|
cb-events = { path = "crates/cb-events" }
|
|
cb-game-runtime = { path = "crates/cb-game-runtime", default-features = false }
|
|
games-ground = { path = "games/ground", default-features = false }
|
|
cb-render-html = { path = "crates/cb-render-html" }
|
|
serde = { version = "1", features = ["derive"] }
|
|
serde_json = "1"
|
|
serde_yaml = "0.9"
|
|
sha2 = "0.10"
|
|
rand_core = "0.6"
|
|
rand_chacha = "0.3"
|
|
criterion = { version = "0.5", default-features = false }
|
|
|
|
# Determinism discipline (GameKernel K6): HashMap/HashSet are deny-linted
|
|
# workspace-wide; semantic state must use ordered collections.
|
|
[workspace.lints.clippy]
|
|
disallowed_types = "deny"
|
|
|
|
[profile.release]
|
|
lto = "thin"
|