CB-WP-0018 T03/T04: explanations, and window 1's verdict
Some checks failed
ci / check (push) Failing after 3s
Some checks failed
ci / check (push) Failing after 3s
T03: input::describe writes a sentence per legal command; data-descs carries them in step with data-targets; the ghost already following the pointer shows the one for whatever legal target is under it, so the explanation lands beside the target with no overlay layer to keep aligned. ADR-0010 D1 binds -- the page renders it, never composes it. Both mutations INITIALLY SURVIVED because the fixture's Attack card had exactly one target, where an off-by-one shift and a truncation are both no-ops. CB-EV-0014's lesson one level in: a fixture too thin to express a failure is how the failure survives. Two attack targets now, both red. T04: chaos rate d4 -> d8, window 2 open at 12 declarations, retiring if an override changes nothing twice running. Window 1's condition was NOT met -- both overrides changed the outcome -- so the mechanism is kept. The weakest part of the decision is that it is a rate change argued from n=2, so window 2 carries a falsifier: no override at all is evidence the rate went too far, not that the mechanism is healthy. InnerLoop.md hit 401 lines and the loadability gate fired; the rationale moved to InnerLoopReference.md, structurally, per the standing precedent that limits are not raised. CB-WP-0017 settled at $9.48/40 against $5.19/23 reported mid-flight, 83% higher. Six for six, always low -- read by re-running the instrument at the moment of quoting, which is CB-EV-0015's correction applied for the first time. make all exits 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
7a78c58404
commit
a733826d95
9 changed files with 424 additions and 30 deletions
|
|
@ -96,6 +96,40 @@ pub fn affordance(command: &GroundCommand, seat: cb_kernel::PlayerId) -> Option<
|
|||
}
|
||||
}
|
||||
|
||||
/// What a drop would mean, in a sentence.
|
||||
///
|
||||
/// **ADR-0010 Decision 1 puts this in Rust.** The page may render it; it
|
||||
/// may not compose it. A script that assembled "Attack P2" from an id and
|
||||
/// a seat name would be deriving a game fact, and would be wrong the
|
||||
/// moment a command meant something the ids do not say.
|
||||
pub fn describe(command: &GroundCommand, seat: cb_kernel::PlayerId) -> String {
|
||||
let who = |p: cb_kernel::PlayerId| format!("P{}", p.0 + 1);
|
||||
match command {
|
||||
GroundCommand::SelectAction {
|
||||
action,
|
||||
target,
|
||||
problem,
|
||||
} => {
|
||||
let head = match action {
|
||||
Action::Attack => "Attack",
|
||||
Action::Support => "Support",
|
||||
Action::Solve => "Solve",
|
||||
Action::Investigate => "Investigate",
|
||||
Action::Ground => "Ground",
|
||||
};
|
||||
match (target, problem) {
|
||||
(Some(t), _) => format!("commit {head} against {}", who(*t)),
|
||||
(_, Some(n)) => format!("commit {head} on problem {n}"),
|
||||
_ => format!("commit {head}, untargeted"),
|
||||
}
|
||||
}
|
||||
GroundCommand::SpendFreedom => {
|
||||
format!("{} spends freedom to act again", who(seat))
|
||||
}
|
||||
other => format!("{other:?}"),
|
||||
}
|
||||
}
|
||||
|
||||
/// Resolve a pointer fact to an index into the legal list.
|
||||
///
|
||||
/// Returns `Err` rather than a default when nothing matches: a drag that
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue