Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 17 additions & 2 deletions manifests/evidence.json
Original file line number Diff line number Diff line change
Expand Up @@ -38331,6 +38331,11 @@
"sha256": "0b5d0b94d14aad9db95a31f2f7bd015515fb26f2abe74a60254dbdd6244a8808",
"bytes": 146176
},
{
"path": "tests/test_lane_packets.py",
"sha256": "940485c85045360783b344debc7bc92caf74ea203c739108a3b0a2800174011b",
"bytes": 98784
},
{
"path": "tests/test_layer_verdicts.py",
"sha256": "ee85d714bdd00edcc217e20441d0e59a2b3382c0533496428558d75b764c9267",
Expand Down Expand Up @@ -38636,6 +38641,11 @@
"sha256": "a4236a158789418581150b454b996df3ae2d17826e89728e56f1cffbfa019b60",
"bytes": 29398
},
{
"path": "tests/test_verdict_lane_vendoring.py",
"sha256": "02465e7ca09a3d4ee72e3855084cc5b54ee223b209bb6169cb9deea1c5d9fdab",
"bytes": 12669
},
{
"path": "tests/test_worker_recovery.py",
"sha256": "9360d522838325f232d6f1d7a02dcefa36a9865a0fa02c22bec42db606a8dc0a",
Expand Down Expand Up @@ -38851,10 +38861,15 @@
"sha256": "de2377990fa015fe8666b8ebb9176968c5600a3f3f2c85c2a9f927c0af7d1cae",
"bytes": 8214
},
{
"path": "tools/sota-convergence/lane-prompt.md",
"sha256": "d3ef2cc0c06d33d6a4a058f5e74a1cf5be8a3760cc2b0b5572598f0e0e4288e4",
"bytes": 2220
},
{
"path": "tools/sota-convergence/lane-provenance.json",
"sha256": "ca747c9808c723822c5ef970967ff885d33b2834f37bc5ff5ff07301ec7f2176",
"bytes": 8231
"sha256": "8281bcc79f76dcaf7427b76429613cd45597d990e747f49a917d3dae9c93d261",
"bytes": 9569
},
{
"path": "tools/sota-convergence/reconciliations-20260922.json",
Expand Down
26 changes: 26 additions & 0 deletions tests/test_lane_packets.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import importlib.util
import io
import json
import re
import shutil
import tempfile
import unittest
Expand Down Expand Up @@ -47,6 +48,12 @@ def load_module(name, filename):

# Seeded order of the manifest-mode fixture (seed 20260922, layer-b); newcomers have no component id.
EXPECTED_SEEDED_COMPONENT_ORDER = [None, None, 'data-two', 'data-one', 'data-three']
# Rule 2's merit sentence (2026-09-26 user directives, verdict-wave runbook D1): a winner earns it on what its
# evidence shows was run, never on its status, license or popularity. Generic by design: the shared prompt names no
# repository or product.
MERIT_SENTENCE = ("Adoption, incumbency, installation, retained-control status, receipt count, packet position, "
"license, stars and popularity are not evidence of fit; choose among adopted candidates on what "
"their evidence shows was run.")


class LanePacketsFixture(unittest.TestCase):
Expand Down Expand Up @@ -165,6 +172,8 @@ def test_rules_are_the_five_lane_prompt_rules(self):
self.assertEqual(len(packet["rules"]), 5)
self.assertEqual(packet["rules"], lane_packets.load_rules())
self.assertIn("Judge from retained evidence.", packet["rules"][0])
# Every packet carries the merit rule, so the refuters and judges who read the packet see it too.
self.assertIn(MERIT_SENTENCE, packet["rules"][1])

def test_group_is_present_for_us_equities_and_null_for_foundation(self):
self.assertIsNone(self.packet("foundation", "layer-a")["group"])
Expand All @@ -191,6 +200,23 @@ def test_wrong_rule_count_raises(self):
lane_packets.load_rules(prompt)


class LanePromptMeritRuleTests(unittest.TestCase):
"""The shared prompt's Rules section (2026-09-26, verdict-wave runbook D1): Rule 2 carries the merit sentence,
and the file numbers exactly five rules, 1 to 5, counted here apart from load_rules (which only counts them), so
dropping the sentence, moving it out of Rule 2, or adding, removing or renumbering a rule fails."""

def test_rule_2_states_the_merit_sentence(self):
rules = lane_packets.load_rules()
self.assertTrue(rules[1].startswith("The winner set is 1-3 adopted candidates (adopted == true)"), rules[1])
self.assertIn(MERIT_SENTENCE, rules[1])

def test_the_rules_section_numbers_exactly_five_rules(self):
text = (TOOL_DIR / "lane-prompt.md").read_text(encoding="utf-8")
_, separator, section = text.partition("\nRules\n")
self.assertTrue(separator, "lane-prompt.md must keep its Rules section")
self.assertEqual(re.findall(r"(?m)^(\d+)\.\s", section), ["1", "2", "3", "4", "5"])


class ShuffleTests(LanePacketsFixture):
def test_shuffle_is_seeded_and_stable_across_repeated_builds(self):
first = self.packet("foundation", "layer-a")
Expand Down
34 changes: 29 additions & 5 deletions tests/test_verdict_lane_vendoring.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,29 @@ def test_the_current_transcript_audit_code_is_registered_for_the_claude_lane(sel
"register the current transcript_audit.py hash in tools/sota-convergence/"
"lane-provenance.json's claude entries")

def test_the_current_claude_lane_key_is_registered_under_both_workflow_paths(self):
"""2026-09-26 merit rule: claude_lane.py binds a Claude return's prompt_sha256 to this checkout's
lane-prompt.md, and record_verdicts.py and scripts/landscape.py refuse a return whose full key
(LANE_PROVENANCE_KEYS["claude"]) is not listed, so a lane-prompt.md edit needs Claude appends as well as the
Codex one test_the_current_codex_lane_code_is_registered checks."""
from scripts.landscape import LANE_PROVENANCE_KEYS, registered_provenance_entry
pin = json.loads((WORKFLOWS / "vendored-lanes.json").read_text(encoding="utf-8"))
item = next(entry for entry in pin["files"] if entry["path"] == "layer-verdict-lane.js")
vendored = f"examples/claude-native/workflows/{item['path']}"
current = {"workflow_sha256": sums()[item["path"]],
"agent_sha256": sha256(ROOT / "examples" / "claude-native" / "agents" / "blind-lane-reviewer.md"),
"prompt_sha256": sha256(TOOLS / "lane-prompt.md"),
"transcript_audit_py_sha256": sha256(TOOLS / "transcript_audit.py")}
registry = {"claude": self.registry()["claude"]}
for workflow_path in (item["source_path"], vendored):
with self.subTest(workflow_path=workflow_path):
provenance = {"workflow_path": workflow_path, **current}
self.assertEqual(set(provenance), set(LANE_PROVENANCE_KEYS["claude"]))
entry = registered_provenance_entry("claude", provenance, registry)
self.assertIsNotNone(entry, "append the current Claude lane key, the lane-prompt.md hash included, to "
"tools/sota-convergence/lane-provenance.json under both workflow paths")
self.assertEqual(entry.get("vendored_path"), vendored)

def test_the_lane_return_schema_admits_every_provenance_field(self):
"""Round 10, BR10-4: the provenance object sets additionalProperties false, so it must list every field a
new-wave return carries."""
Expand Down Expand Up @@ -143,11 +166,12 @@ def test_registry_entries_are_well_formed_and_unique(self):
registry = self.registry()
# agent_sha256 (the blind-lane-reviewer role hash) is part of the Claude key from 2026-09-23; entries
# registered before it simply lack it (the registry is append-only).
# An appended registration that changes only the audit code is a new key (round 11, RR11-2).
from scripts.landscape import ADJUDICATION_PROVENANCE_KEYS
for lane, fields in (("claude", ("workflow_path", "workflow_sha256", "agent_sha256",
"transcript_audit_py_sha256")),
("codex", ("codex_lane_py_sha256", "prompt_sha256")),
# An appended registration that changes only the audit code is a new key (round 11, RR11-2), and so is one
# that changes only lane-prompt.md (2026-09-26 merit rule): each lane's key is the one record time matches
# on, scripts/landscape.py's LANE_PROVENANCE_KEYS.
from scripts.landscape import ADJUDICATION_PROVENANCE_KEYS, LANE_PROVENANCE_KEYS
for lane, fields in (("claude", LANE_PROVENANCE_KEYS["claude"]),
("codex", LANE_PROVENANCE_KEYS["codex"]),
("adjudication", ADJUDICATION_PROVENANCE_KEYS)):
keys = [tuple(entry.get(field) for field in fields) for entry in registry[lane]]
self.assertEqual(len(keys), len(set(keys)), lane)
Expand Down
2 changes: 2 additions & 0 deletions tools/sota-convergence/lane-prompt.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ Rules
Read only the packet and files under the repository root: no memory stores, code indexes, MCP tools, web
search, git history, or other checkouts or work directories, which can carry the verdict you must reach.
2. The winner set is 1-3 adopted candidates (adopted == true) that best satisfy the requirement on the evidence.
Adoption, incumbency, installation, retained-control status, receipt count, packet position, license, stars and
popularity are not evidence of fit; choose among adopted candidates on what their evidence shows was run.
why_selected must cite at least one evidence path and state what was actually observed (native execution,
measured comparison, local integration, synthetic fixture or source review), not what the project claims.
3. Every adopted non-winner candidate appears in alternatives with a why_not_default that states the concrete
Expand Down
23 changes: 23 additions & 0 deletions tools/sota-convergence/lane-provenance.json
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,24 @@
"workflow_path": "examples/claude-native/workflows/layer-verdict-lane.js",
"workflow_sha256": "fd77b74945e9d2bd0b26b7822aabcde00e7e650c327da16d852fdbfd5984c0d6",
"transcript_audit_py_sha256": "5ed7a1b58d2046a8b7c788026769d4a8a340e1ae92e2acf7ed06f03f12736b92"
},
{
"agent_sha256": "a87a9883618b320c8b97a442a43c471c0994fb70ea9bb64ce0b5f513ba31500c",
"prompt_sha256": "d3ef2cc0c06d33d6a4a058f5e74a1cf5be8a3760cc2b0b5572598f0e0e4288e4",
"registered_at": "2026-09-26",
"vendored_path": "examples/claude-native/workflows/layer-verdict-lane.js",
"workflow_path": ".claude/workflows/layer-verdict-lane.js",
"workflow_sha256": "fd77b74945e9d2bd0b26b7822aabcde00e7e650c327da16d852fdbfd5984c0d6",
"transcript_audit_py_sha256": "5ed7a1b58d2046a8b7c788026769d4a8a340e1ae92e2acf7ed06f03f12736b92"
},
{
"agent_sha256": "a87a9883618b320c8b97a442a43c471c0994fb70ea9bb64ce0b5f513ba31500c",
"prompt_sha256": "d3ef2cc0c06d33d6a4a058f5e74a1cf5be8a3760cc2b0b5572598f0e0e4288e4",
"registered_at": "2026-09-26",
"vendored_path": "examples/claude-native/workflows/layer-verdict-lane.js",
"workflow_path": "examples/claude-native/workflows/layer-verdict-lane.js",
"workflow_sha256": "fd77b74945e9d2bd0b26b7822aabcde00e7e650c327da16d852fdbfd5984c0d6",
"transcript_audit_py_sha256": "5ed7a1b58d2046a8b7c788026769d4a8a340e1ae92e2acf7ed06f03f12736b92"
}
],
"codex": [
Expand Down Expand Up @@ -130,6 +148,11 @@
"codex_lane_py_sha256": "a4bd8f47138448ee80b3fbde6c4bdbf0a22185643efedcdf1573a8b3c596069e",
"prompt_sha256": "9b8a8364f13ff3fcb9fc690198c4ca8849c29cc12b81e8526121a46114517f54",
"registered_at": "2026-09-24"
},
{
"codex_lane_py_sha256": "a4bd8f47138448ee80b3fbde6c4bdbf0a22185643efedcdf1573a8b3c596069e",
"prompt_sha256": "d3ef2cc0c06d33d6a4a058f5e74a1cf5be8a3760cc2b0b5572598f0e0e4288e4",
"registered_at": "2026-09-26"
}
],
"schema_version": 1,
Expand Down
Loading