Skip to content

Epic: nine gaps in the Kernel, found in review #29

Closed
14 of 14 issues completed
Closed

Description

@don-petry

Nine places where the Kernel on main decides wrongly or cannot decide, found by a review of the pull request "Context for the Factory's authors: lessons, standards, decisions and the checks that hold them". Five are pinned there as tests marked @pending in tests/test_decide.py, class NotYetHeld. Those tests exist only once that pull request has merged.

This epic is separate from "Epic: slice 0, foundations. The repo holds the line, its context is tested, and the platform facts are recorded": none of these is a condition of slice 0's exit, and all are needed before the Kernel gates anything real in slice 1.

How a pinned gap is closed

  1. Take @pending off its test. It now fails for real.
  2. Write the rule in kernel/. The test passes.
  3. Add the rule's mutant to tools/mutants.py. A rule that acts in two places gets a test and a mutant for each.
  4. In every document that says not held yet beside that test, remove those words. make verify fails until this is done, and says where.

A gap that is not pinned needs its boundary test written first.

The gaps

Gap State Story
1. A Pause does not stop approvals and merges Pinned; ready to build A Pause stops every act
3. An unknown mergeable converges Pinned; ready to build An unknown merge state defers
4. A dependency update waits for a model review Pinned; ready to build A dependency update needs no model review
2. A queued pull request that loses its approval stays queued Pinned; needs a ruling What takes a pull request out of the queue
5. A writer's request for changes does not gate Pinned; needs a ruling A request for changes from a person with write access
6. A neutral check is read as failed Needs a ruling What each check conclusion means
7. A Lens that never reports waits for ever Needs a ruling When waiting becomes the Maintainer's to see
8. Nothing counts acts Needs a ruling How an act is recorded and bounded
9. The Lifecycle check bounds only cycles made wholly by the Factory Needs a ruling Bounds in the Lifecycle data

Two smaller ones are one more story: the facts have no completeness flag for the list of Runs, and the configuration may name no deterministic Lens.

Rules

  • One story to a pull request, at most four acceptance criteria, the failing test first.
  • A story that needs a ruling starts by asking the Maintainer, with choices, the recommended one first. Nothing is built before the answer.
  • The Kernel does no I/O, keeps nothing between calls, and writes no number but 0 and 1: a limit is read from config/defaults.json.
  • A new fact goes into schemas/facts.schema.json, examples/facts.json, tests/support.py and sim/world.py in the same change, with a counter-example under examples/invalid/.
  • A change to the Kernel is read once by a second model family before its pull request is opened.

What was verified, and by whom

Gaps 1, 2, 3, 4 and 6 were reproduced by calling decide(). Gap 5 is confirmed by its pinned test failing as expected. Gaps 7, 8 and 9 were reported by a reviewing agent that ran them and were not run a second time.

Activity

  1. don-petry commented on Oct 14, 2026

    @don-petry
    ContributorAuthor

    #29 Build order for the eleven sub-issues

    #30, #31 and #32 go first, in that order. Then:

    1. Kernel: two smaller gaps in what it is given #39. The smallest story, and the first of six that add a fact; the others follow its pattern.
    2. Kernel: what each check conclusion means #35. It changes the check loop in kernel/derive.py and adds a map to the configuration. It produces the deferral that Kernel: when waiting becomes the Maintainer's to see #36 later makes visible.
    3. Kernel: a request for changes from a person with write access #34. It adds review facts, and gives Kernel: what takes a pull request out of the merge queue #33 a gate to dequeue on.
    4. Kernel: how an act is recorded and bounded #37. It adds acts_since_writer and max_acts_per_item. It comes after Kernel: a Pause stops every act, not only Runs #30, so every act already defers under a Pause.
    5. Lifecycle check: bounds in the data for every cycle with no person in it #38. It names its bounds, max_acts_per_item among them.
    6. Kernel: what takes a pull request out of the merge queue #33. It needs a gate (Kernel: a request for changes from a person with write access #34), a counted act (Kernel: how an act is recorded and bounded #37) and transitions that name a bound (Lifecycle check: bounds in the data for every cycle with no person in it #38).
    7. Kernel: when waiting becomes the Maintainer's to see #36. It reads the Lifecycle data after Lifecycle check: bounds in the data for every cycle with no person in it #38 and Kernel: what takes a pull request out of the merge queue #33 change it, and the review times from Kernel: a request for changes from a person with write access #34.
    8. Kernel: what happens to a Finding that does not gate #55. It waits on the Maintainer's word on FR-33. Nothing depends on it, so once ruled it can follow Kernel: a request for changes from a person with write access #34.

    These files are shared, so the stories that touch them must run one at a time. This is a source of merge conflicts, not a dependency:

  2. don-petry commented on Oct 16, 2026

    @don-petry
    ContributorAuthor

    Every story in this epic has merged. The last was "Kernel: every change of State that derive can make is declared" (#102). In order: #30, #31, #32, #39, #37, #38, #35, #34, #33 (#93), #36 (#94), #55 (#96), #60 (#98), #61 (#100), #81 (#102). Follow-ups filed from its reviews belong to the slice-0 epic: #95, #97, #99, #103.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions