Research: main-red-test-premise-repair

R-1: Is #6240 a stale test or a product regression?

  • Decision: stale test; re-pin it.
  • Rationale: c0f455d068 added the required mission_type argument, and every production caller passes it (lint.py:147, design/validation.py:144, mission_setup_plan.py:562 and :595). Reproduced at dcbabeb3ff: 5 failed, 40 passed.
  • Alternatives: giving mission_type a default. Rejected: that changes the production signature to suit a test, and hides the Mission-type scoping.

R-2: Why does the full-corpus audit drift under events 10.4.6 (#6238)?

  • Decision: the drift is on 079-post-555-release-hardening, not 078. The cause is the #6061 rule: a rollback-shaped seed keeps lane authority only against its bare sibling approval. Under that rule, WP03 and WP07 reduce to planned, but the pinned snapshot says in_progress. The live tree was corrected and sanctioned in 2ff2f1deb5. The pinned fixture still exports the uncorrected bytes.
  • Evidence: a standalone clone at dcbabeb3ff fails ([defect-only]). git diff c0054153b9 2ff2f1deb5 -- kitty-specs/079-post-555-release-hardening/status.json shows exactly the 10 drifting lines. Overlaying the 2ff2f1deb5 bytes makes the audit exit 0, with 0 teamspace blockers.
  • Alternatives: (a) add a classifier tolerance. Rejected: the #6205 sanction text says the audit stays strict. (b) re-pin the fixture to a newer corpus commit. Rejected: it changes what the recovery test proves. (c) hard-code the 079 path. Rejected: it duplicates the sanctioned list (C-002).
  • Amendment (post-tasks review): the overlay applies to 25 sanctioned paths present in the export, not 1: 079 status.json, the 025 WP01 .md, and 23 status files of 12 missions from the #5579 backfill. Bytes are read from pinned 2ff2f1deb5, not HEAD, so the fixture stays deterministic. The count is asserted.

R-3: Which routing shape for the lock-file fan-out?

  • Decision: a new non-src router group containing only uv.lock, fanned out to upgrade and status through a NEW DEPENDENCY_MODULE_FANOUT map (not GROUP_MODULE_FANOUT: that map is validated against the pack consumer census, which cannot derive a lock file).
  • Cost (accepted by ruling): every uv.lock edit, Dependabot bumps included, now runs the upgrade and status shards.
  • Rationale: operator ruling (decision 01M4XV6HM7WHEB2B8QG67N29HT): a rename or other non-version edit to pyproject.toml must not trigger the upgrade shards. The existing mission_state group already lists uv.lock and pyproject.toml, but it gates only the audit job, not module shards.
  • Alternatives: adding modules to mission_state. Rejected: that group is non-fan-out by design, and it includes pyproject.toml.

Out of scope (follow-ups)

  • tests/conftest.py builds the shared subprocess venv from pyproject.toml ranges and not from uv.lock. It installed events 10.5.0 while the pin is 10.4.6. To be filed as its own issue.