2026-07-31 01:57:13 +02:00
|
|
|
[workspace]
|
|
|
|
|
resolver = "2"
|
|
|
|
|
members = [
|
|
|
|
|
"crates/cb-kernel",
|
|
|
|
|
"crates/cb-events",
|
|
|
|
|
"crates/cb-game-runtime",
|
|
|
|
|
"games/ground",
|
|
|
|
|
"tools/cb-sim",
|
CB-WP-0008-T02: cb-play — INTENT stage 0's CLI player
A human seat is a Policy like any bot, so the CLI adds no second driver:
HumanPolicy renders the projection, lists the legal commands and reads an
index or `pass`. `make play` runs it; `--all-bots` watches one.
K13's Project trait gains its first implementor after six passes with
none. Hidden: other seats' face-down selections until Reveal, hands and
deck (counts only), a face-down Problem's suit and value, and the seed —
not secret content, but a seat holding it can compute the deck.
A played session becomes an artifact: --record writes it as a scenario
the runner executes, --replay writes a .cbreplay bundle. record.rs is the
inverse of parse_command and its warrant is a round-trip test over every
command shape.
The acceptance test for the projection passed vacuously twice. First it
asserted the text contained "face-down", which every render does because
of Problems. Counted, it then reported zero inspected entries: seats are
asked in order, so a human at P1 is prompted before anyone has selected.
Seated at P3 it inspects ten entries and dies when the projection is
mutated to reveal everything. Counting what the harness examined caught
both, which is the second time that remedy has worked where a stronger
predicate would not have.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-01 14:43:53 +02:00
|
|
|
"tools/cb-play",
|
2026-07-31 01:57:13 +02:00
|
|
|
]
|
|
|
|
|
|
|
|
|
|
[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" }
|
AM-4: gate scenario YAML, retarget on audited source, re-measure
Adopts both remediations from CB-EV-0001 §4 (maintainer decision).
Option A — serde_yaml is now optional behind cb-game-runtime's
`scenarios` feature. The scenario module, the ScenarioGame impl and the
string parsers behind it are cfg-gated; cb-sim opts in explicitly. Both
configurations compile and lint clean under -D warnings.
A trap worth recording: `default-features = false` on a *member*
dependency is silently ignored when the workspace dependency does not
specify it. The first attempt gated nothing while looking correct — the
build succeeded and cargo tree still showed all six YAML crates. Fixed
by setting it on the workspace dependency. This is the positive-control
failure mode in miniature: success was not evidence the change applied.
Retarget — AM-4 now measures third-party source under audit, split by
build configuration, replacing a crate count that was unreachable
without undoing K5/K7 and that does not compare across ecosystems.
Re-measured via the new `make dep-weight`, whose own positive control
refuses to report when any crate's source cannot be located:
shipped runtime 23 crates 246,250 lines target <=250,000 met
dev toolchain 29 crates 317,021 lines target <=350,000 met
own source 3,408 lines
Scenario tooling costs 70,771 lines a shipped game never compiles —
the split the single number was hiding.
Targets are set at current measurement plus headroom, so they bind on
future growth rather than retroactively passing what had failed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-31 03:35:41 +02:00
|
|
|
cb-game-runtime = { path = "crates/cb-game-runtime", default-features = false }
|
|
|
|
|
games-ground = { path = "games/ground", default-features = false }
|
2026-07-31 01:57:13 +02:00
|
|
|
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"
|