CB-WP-0006 T04: withdraw AM-4c; and fix where AM-6 is measured
AM-4c is withdrawn from the acceptance table and retained as a reported diagnostic. GameKernel §5a carries the argument. The ratio has no monotone better direction. INTENT's rule is "own the semantics, assimilate the implementation": rising can mean owning semantics properly or reimplementing what should have been assimilated; falling can mean leverage or dependency bloat. A target requires knowing which way is better. It is also redundant — AM-4a/AM-4b bound the denominator and AM-2 bounds own-source density, so AM-4c is a ratio of two already-targeted quantities. Measured at withdrawal: 1,426 own lines per 100k third-party (shipped), 1,107 (dev). make dep-weight now prints both, labelled diagnostic — the row was never actually reported before. M-D1-MUT keeps AM-4c in its denominator on purpose and says so in the output. Dropping it would move the score 7/14 -> 7/13 without enforcing anything: a score improved by deleting the question. Decided before Phase B deliberately, since ADR-0005 predicts own-source growth that will move this ratio; deciding after would be the retarget §Step 4 forbids. A T01 correction found here. The AM-6 gate failed inside `make all` at 38,753 ev/s against 341,280 in isolation — a 9x drop, because cargo test runs binaries and threads concurrently. A throughput assertion inside a parallel harness measures contention, not throughput. T01's measurement was valid; its gate placement was not. Fixed by running it only where valid — #[ignore] plus `make am6` in release with --test-threads=1, now 2.0M ev/s at 20.2x headroom — and not by lowering the target, which T01 forbade. My first attempt did drift that way, adding a debug "sanity floor" of 50,000, and was backed out: a second threshold is still a second chance to tune. The mutation then went SURVIVED on the first run after the move. 4,000 black_box iterations were calibrated against debug's 3.4x headroom and are invisible against release's 20x. Raised to 100,000; back to red. A weak mutation is not a fixed property of a row — it can become weak when the row's measurement conditions change. Tier S (amends one row, creates no capability), chaos d4=2, no override. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
83db14f2e2
commit
db6445ae37
10 changed files with 145 additions and 17 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -186,6 +186,14 @@ def main():
|
|||
f"{r['third_party_loc']:>9,} lines third-party "
|
||||
f"[{mark} target {limit:,}]"
|
||||
)
|
||||
# AM-4c: own source per 100k third-party lines. A DIAGNOSTIC, not a
|
||||
# target — see specs/GameKernel.md §5 and CB-WP-0006 T04. The ratio
|
||||
# has no monotone better direction, so it cannot carry a threshold.
|
||||
for label in CONFIGS:
|
||||
tp = report[label]["third_party_loc"]
|
||||
if tp:
|
||||
print(f" AM-4c {label:<18}{own / (tp / 100_000):>9,.0f} own "
|
||||
f"lines per 100k third-party (diagnostic, not targeted)")
|
||||
delta = (
|
||||
report["dev-toolchain"]["third_party_loc"]
|
||||
- report["shipped-runtime"]["third_party_loc"]
|
||||
|
|
|
|||
|
|
@ -125,12 +125,22 @@ def rows():
|
|||
mutate=("tools/dep-weight.py",
|
||||
'"dev-toolchain": 350_000,', '"dev-toolchain": 1_000,')),
|
||||
|
||||
# Deliberately RETAINED in this denominator after its withdrawal
|
||||
# from the acceptance table. Dropping it would move M-D1-MUT from
|
||||
# 7/14 to 7/13 without enforcing anything — a score improved by
|
||||
# deleting the question.
|
||||
Row("AM-4c", "own source per third-party 100k lines",
|
||||
unmutatable="declared `reported, not targeted` in the spec. "
|
||||
"There is no threshold, so there is no property to "
|
||||
"invert. Counts against the metric by ADR-0005 §1, "
|
||||
"which is the honest treatment: an untargeted number "
|
||||
"cannot fail."),
|
||||
unmutatable="WITHDRAWN from the acceptance table 2026-08-01 "
|
||||
"(CB-WP-0006 T04, GameKernel §5a) and retained here "
|
||||
"as a diagnostic. The ratio has no monotone better "
|
||||
"direction — rising can mean owning semantics or "
|
||||
"reimplementing what should be assimilated; falling "
|
||||
"can mean leverage or dependency bloat — so it "
|
||||
"cannot carry a threshold. It is also redundant: "
|
||||
"AM-4a/AM-4b bound the denominator and AM-2 bounds "
|
||||
"own-source density. Kept in this denominator on "
|
||||
"purpose, so the metric cannot be improved by "
|
||||
"deleting rows."),
|
||||
|
||||
Row("AM-5", "clean release build <= 60 s",
|
||||
unmutatable="now RECORDED (`make build-time`) and **breaching**: "
|
||||
|
|
@ -144,8 +154,12 @@ def rows():
|
|||
"itself."),
|
||||
|
||||
Row("AM-6", ">= 100,000 applied events/s",
|
||||
verify=CARGO + ["test", "-p", "games-ground", "--all-features",
|
||||
"am6_throughput"],
|
||||
# Release: the gate runs where headroom is ~24x. In debug the
|
||||
# test only asserts a sanity floor, so a debug mutation run
|
||||
# would need a far larger slowdown to register.
|
||||
verify=CARGO + ["test", "--release", "-p", "games-ground",
|
||||
"--all-features", "am6_throughput", "--",
|
||||
"--ignored", "--test-threads=1"],
|
||||
# A PROPERTY mutation, not a threshold tweak: slow the fold hot
|
||||
# path and require the gate to notice. Raising the target
|
||||
# instead would only prove the comparison runs.
|
||||
|
|
@ -153,7 +167,7 @@ def rows():
|
|||
" fn fold(&mut self, event: &Self::Event) {\n"
|
||||
" match event {",
|
||||
" fn fold(&mut self, event: &Self::Event) {\n"
|
||||
" for _ in 0..4000 { std::hint::black_box(0u8); }\n"
|
||||
" for _ in 0..100_000 { std::hint::black_box(0u8); }\n"
|
||||
" match event {"),
|
||||
expect="AM-6 UNMET"),
|
||||
|
||||
|
|
@ -339,7 +353,12 @@ def report(only=None):
|
|||
|
||||
red = tally.get("red", 0)
|
||||
total = len(rs)
|
||||
withdrawn = sum(1 for r in rs if "WITHDRAWN" in (r.unmutatable or ""))
|
||||
print(f"\n M-D1-MUT: {red}/{total} rows enforced")
|
||||
if withdrawn:
|
||||
print(f" ({withdrawn} withdrawn row(s) retained in the denominator "
|
||||
f"on purpose — a score\n improved by deleting the question "
|
||||
f"is not an improvement)")
|
||||
for k in ("PARTIAL", "SURVIVED", "WRONG-REASON", "unmutatable",
|
||||
"inconclusive"):
|
||||
if tally.get(k):
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue