Lifecycle check: bounds in the data for every cycle with no person in it

Merged
DO
5d ago
+167-52

Based on main. It was built on "Kernel: an act is recorded and bounded" (#80), which adds max_acts_per_item, and rebased once that merged.

The check now takes away the transitions marked human and fails on any cycle left with no
bounded transition, whoever makes it: the Factory, a Lens or the platform (I-14, L-04). It names
the cycle it found. A bound must be a limit the Kernel counts for each item, listed once in
tools/check_lifecycle.py, and a key of limits in config/defaults.json: max_diff_lines
and org_max_active_runs are refused. The Factory makes no transition out of a Hold (L-02).

  • tests/test_tools.py, written first and seen to fail:
    test_a_cycle_through_a_lens_with_no_bound_is_caught,
    test_a_cycle_through_the_platform_with_no_bound_is_caught,
    test_a_bound_the_kernel_does_not_count_for_each_item_is_caught,
    test_a_pull_request_not_served_can_be_served_again_but_not_by_a_loop, and
    test_a_hold_the_factory_could_end_is_caught revised for the Solution Architect's ruling.
  • lifecycle/pull_request.json names its bounds: max_runs_per_item on addressing → verifying
    and converged → verifying, max_rounds on every exit from adjudicating, and
    max_acts_per_item on converged → queued. All 23 cycles with no person in them are bounded.
  • Who makes each transition, by the rulings on this issue: addressing → converged is a person's
    re-run; held → verifying is human for a label or a ceiling and platform when the diff
    changes; held leaves person_only_exits; not_served is no longer terminal, and GitHub
    serves it again by retargeting it. Every way into not_served is a person's.
  • schemas/lifecycle.schema.json keeps no list of bounds; the check holds the one list.
  • lifecycle/AGENTS.md, L-04, design §4.1 and §4.5, and the boundary rows of decisions 0002 and
    0008 say what the check now holds.

The issue Lifecycle needed no change. The Kernel still counts not_served as terminal; that is
for "Kernel: every change of State that derive can make is declared".

make verify and python3 -m tools.mutants pass on a fresh export (53 of 53 mutants killed).
It merges once it is clean and green, under the Maintainer's standing approval.

Reviewed by: a fresh-context review and a separate security pass. Their two majors are answered here with the Solution Architect's ruling on this issue: a Hold the Kernel ends with no person, and a bound the Kernel does not count per item. A read by a second model family (AGY, Gemini) approved it.

Closes #38

🤖 Generated with Claude Code