test(b-gate): the pin moves 8 -> 15, and names the two steps that still share a door
`_EXTERNAL_TODAY` and `_WITH_A_DOOR_TODAY` are the arm's own count, not the gate's, so the seven new doors have to be written down here before the suite agrees they exist. The two assertions that pinned `kjørekonfig`/`utboks`/`prepass-artefakt`/`parse-feil` as door-LESS are inverted rather than deleted: they were the arm's discriminator, and a door that silently went away must still turn this red. The manifest count moves 514 -> 515 for the one new probe file. Also a probe for the shape guard: the writers take `Mapping`/`Sequence` and would serialize whatever they were handed, so a list where an object belongs would become a valid file with the wrong shape and the run that reads it later would be the one to fail. The door refuses it as a 3 (the call parsed, so 2 is the wrong code) and leaves no directory behind. Carries its rc-0 control. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
6375ce5af3
commit
c5aa5fcfde
2 changed files with 48 additions and 5 deletions
|
|
@ -44,7 +44,7 @@ _NOW = datetime(2026, 9, 19, 12, 0, tzinfo=timezone.utc)
|
||||||
#: Repoets egne tall ved skriving (19.09.2026), talt av armene under mot KILDEN. De står her for
|
#: Repoets egne tall ved skriving (19.09.2026), talt av armene under mot KILDEN. De står her for
|
||||||
#: at en stille endring i kjørestien skal vise seg som en rød test og ikke som et nytt tall.
|
#: at en stille endring i kjørestien skal vise seg som en rød test og ikke som et nytt tall.
|
||||||
_STEPS_TODAY = 17
|
_STEPS_TODAY = 17
|
||||||
_EXTERNAL_TODAY = 8
|
_EXTERNAL_TODAY = 15
|
||||||
_ROLES_TODAY = ("proposer", "checker")
|
_ROLES_TODAY = ("proposer", "checker")
|
||||||
_PATTERNS_TODAY = 15
|
_PATTERNS_TODAY = 15
|
||||||
|
|
||||||
|
|
@ -111,12 +111,19 @@ def test_the_step_denominator_equals_an_independent_count_of_the_source() -> Non
|
||||||
#: v1-gatens egen kommando, som alltid var en ekte dørprobe og ble avvist på en navne-
|
#: v1-gatens egen kommando, som alltid var en ekte dørprobe og ble avvist på en navne-
|
||||||
#: teknikalitet til klasse-rettingen samme dag.
|
#: teknikalitet til klasse-rettingen samme dag.
|
||||||
_WITH_A_DOOR_TODAY = (
|
_WITH_A_DOOR_TODAY = (
|
||||||
|
"coverage",
|
||||||
|
"debatt-verktøy",
|
||||||
"dom",
|
"dom",
|
||||||
|
"forslagsvurderinger",
|
||||||
"gate",
|
"gate",
|
||||||
|
"kjørekonfig",
|
||||||
"kontekst",
|
"kontekst",
|
||||||
"kostnadsgrunnlag",
|
"kostnadsgrunnlag",
|
||||||
"pakke",
|
"pakke",
|
||||||
|
"parse-feil",
|
||||||
"prepass",
|
"prepass",
|
||||||
|
"prepass-artefakt",
|
||||||
|
"utboks",
|
||||||
"validering",
|
"validering",
|
||||||
"verdict-id",
|
"verdict-id",
|
||||||
)
|
)
|
||||||
|
|
@ -126,7 +133,12 @@ def test_row1_today_is_red_and_names_exactly_the_steps_that_have_a_door() -> Non
|
||||||
"""Var «3 av 17» til 19.09, så 0 av 17 da proben ble BUNDET til steget, 5 av 17 da verktøy-
|
"""Var «3 av 17» til 19.09, så 0 av 17 da proben ble BUNDET til steget, 5 av 17 da verktøy-
|
||||||
kassens fire første dører sto, og 8 av 17 da dommens tre kom gjennom den samme døren.
|
kassens fire første dører sto, og 8 av 17 da dommens tre kom gjennom den samme døren.
|
||||||
Armen teller ikke bare k — den navngir HVILKE, så en dør som flytter seg uten å bli bygd
|
Armen teller ikke bare k — den navngir HVILKE, så en dør som flytter seg uten å bli bygd
|
||||||
(eller en probe som slutter å drive sin dør) blir rød her og ikke bare et annet tall."""
|
(eller en probe som slutter å drive sin dør) blir rød her og ikke bare et annet tall.
|
||||||
|
|
||||||
|
20.09: 15 av 17 da de sju utboks-skriverne fikk hver sin underkommando. De TO som står igjen
|
||||||
|
er de to som deler `round_builder`-døren uten at kommandolinja kan skille dem — gaten krever
|
||||||
|
at argv NAVNGIR steget når mer enn ett steg står bak samme dør, og den CLI-en har ingen
|
||||||
|
underkommando å navngi dem med."""
|
||||||
passing = {n: "passed" for step in _CONFIG["steps"] for n in step.get("probe", ())}
|
passing = {n: "passed" for step in _CONFIG["steps"] for n in step.get("probe", ())}
|
||||||
row = gate.score_toolbox(_CONFIG["steps"], _SRC, _CONFIG["run_path"], passing, _REPO)
|
row = gate.score_toolbox(_CONFIG["steps"], _SRC, _CONFIG["run_path"], passing, _REPO)
|
||||||
assert (row.k, row.n, row.status) == (_EXTERNAL_TODAY, _STEPS_TODAY, gate.RED)
|
assert (row.k, row.n, row.status) == (_EXTERNAL_TODAY, _STEPS_TODAY, gate.RED)
|
||||||
|
|
@ -134,8 +146,8 @@ def test_row1_today_is_red_and_names_exactly_the_steps_that_have_a_door() -> Non
|
||||||
uten_doer = {x.split(":")[0] for x in row.exceptions}
|
uten_doer = {x.split(":")[0] for x in row.exceptions}
|
||||||
alle = {str(s["id"]) for s in _CONFIG["steps"]}
|
alle = {str(s["id"]) for s in _CONFIG["steps"]}
|
||||||
assert sorted(alle - uten_doer) == sorted(_WITH_A_DOOR_TODAY), row.exceptions
|
assert sorted(alle - uten_doer) == sorted(_WITH_A_DOOR_TODAY), row.exceptions
|
||||||
assert "kjørekonfig" in uten_doer and "utboks" in uten_doer
|
assert "kjørekonfig" not in uten_doer and "utboks" not in uten_doer
|
||||||
assert "prepass-artefakt" in uten_doer and "parse-feil" in uten_doer
|
assert "prepass-artefakt" not in uten_doer and "parse-feil" not in uten_doer
|
||||||
bound = {x.split(":")[0] for x in row.exceptions if "atferdsprobe" in x}
|
bound = {x.split(":")[0] for x in row.exceptions if "atferdsprobe" in x}
|
||||||
assert bound == {"rundebinding", "rapport"}, row.exceptions
|
assert bound == {"rundebinding", "rapport"}, row.exceptions
|
||||||
|
|
||||||
|
|
@ -589,7 +601,7 @@ _WRITERS_DEFINED = 10
|
||||||
_WRITERS_IN_RUN_PATH = 7
|
_WRITERS_IN_RUN_PATH = 7
|
||||||
#: publiserte filer i git-manifestet (uttrekk og arbeidstre gir SAMME tall — det var hele poenget
|
#: publiserte filer i git-manifestet (uttrekk og arbeidstre gir SAMME tall — det var hele poenget
|
||||||
#: med å slutte å telle filtreet: 435 i arbeidstreet var to gitignorerte .local.md-filer).
|
#: med å slutte å telle filtreet: 435 i arbeidstreet var to gitignorerte .local.md-filer).
|
||||||
_PUBLISHED_TODAY = 514
|
_PUBLISHED_TODAY = 515
|
||||||
_UNDECODABLE_TODAY = 1
|
_UNDECODABLE_TODAY = 1
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -391,3 +391,34 @@ def test_write_debate_tools_from_outside_writes_an_empty_trace_as_a_statement(
|
||||||
assert len(paa_disk["tool_calls"]) == len(kall)
|
assert len(paa_disk["tool_calls"]) == len(kall)
|
||||||
assert len(paa_disk["requirements"]) == len(krav)
|
assert len(paa_disk["requirements"]) == len(krav)
|
||||||
assert paa_disk["tool_calls"][1]["arguments"]["query"] == "varme"
|
assert paa_disk["tool_calls"][1]["arguments"]["query"] == "varme"
|
||||||
|
|
||||||
|
|
||||||
|
# --- formvakten -------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
def test_a_payload_of_the_wrong_shape_is_refused_rather_than_written(tmp_path: Path) -> None:
|
||||||
|
"""Skriverne tar `Mapping`/`Sequence` og ville serialisert hva som helst de fikk: en liste der
|
||||||
|
et objekt hører hjemme blir en gyldig fil med feil form, og kjøringen som leser den SENERE er
|
||||||
|
den som feiler. Døren feller formen med en gang, og gjør det som en avvisning (3) — kallet
|
||||||
|
parset, så 2 ville vært feil kode."""
|
||||||
|
ut = tmp_path / "ut"
|
||||||
|
feil = _json_arg(tmp_path / "feil.json", ["ikke", "et", "objekt"])
|
||||||
|
proc = _toolbox(
|
||||||
|
"write-proposal-reviews", "--outbox-dir", str(ut), "--run-id", _RUN, "--payload", feil
|
||||||
|
)
|
||||||
|
assert proc.returncode == 3, proc.stdout
|
||||||
|
assert json.loads(proc.stdout)["error"]["kind"] == "ValueError"
|
||||||
|
assert not ut.exists(), "en avvist form skal ikke ha lagt igjen en katalog eller en fil"
|
||||||
|
# rc-0-kontroll: SAMME dør, samme sti, riktig form. Uten den ville armen vært grønn mot en
|
||||||
|
# dør som avviste alt.
|
||||||
|
ok = _toolbox(
|
||||||
|
"write-proposal-reviews",
|
||||||
|
"--outbox-dir",
|
||||||
|
str(ut),
|
||||||
|
"--run-id",
|
||||||
|
_RUN,
|
||||||
|
"--payload",
|
||||||
|
_json_arg(tmp_path / "rett.json", {"reviews": []}),
|
||||||
|
)
|
||||||
|
assert ok.returncode == 0, ok.stderr
|
||||||
|
assert Path(json.loads(ok.stdout)["path"]).is_file()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue