Lifecycle check: bounds in the data for every cycle with no person in it
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_caughtrevised for the Solution Architect's ruling.lifecycle/pull_request.jsonnames its bounds:max_runs_per_itemonaddressing → verifying
andconverged → verifying,max_roundson every exit fromadjudicating, and
max_acts_per_itemonconverged → queued. All 23 cycles with no person in them are bounded.- Who makes each transition, by the rulings on this issue:
addressing → convergedis a person's
re-run;held → verifyingishumanfor a label or a ceiling andplatformwhen the diff
changes;heldleavesperson_only_exits;not_servedis no longer terminal, and GitHub
serves it again by retargeting it. Every way intonot_servedis a person's. schemas/lifecycle.schema.jsonkeeps 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