Skip to content

Kernel: a change to a model Lens's own inputs needs a person (#140) - #293

Merged
don-petry merged 6 commits into
mainfrom
kernel/model-lens-inputs
Oct 22, 2026
Merged

don-petry merged 6 commits into
mainfrom
kernel/model-lens-inputs

Conversation

@don-petry

@don-petry don-petry commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Closes #140.

What this is. With one model family, the only judge of a change to a model Lens's own inputs that is not the Lens is a person. A pull request that changes one now converges only once every model Lens has reviewed its head, as before, and an account with write access other than its author has approved that head, by the Maintainer's ruling on ruling 3. Decision 0046, numbered at enqueue.

What it holds.

Rule Where
config/hooks.json lists pr-review's own inputs as a model Lens's inputs: roles/pr-review.*, roles/pr-review/, its rubric, harness/ whole, the gate, coverage and the authority table, and the files that make the list (config/hooks.json, config/defaults.json, tools/hooks/protected.py) config/hooks.json
The Kernel is given their patterns as model_lens_inputs, from the same reading as protected_paths tools/hooks/protected.py::model_lens_inputs
A change to one waits in verifying, model_lens_input_needs_person, naming each pattern, the Maintainer's to see; a queued item leaves the queue kernel/derive.py
The judgment is a standing approval of this content by a person with write access or the machine user, never an App or a Lens, who is neither author nor last pusher, as that account's latest verdict. Only a person's dismissal ends it (L-17) a_judge, judged_by_a_person
The Factory's own approving act never supplies it: no approval is issued for such a change until a qualifying approval stands the wait's place in reading, held by test_the_factorys_own_approval_never_supplies_the_judgment
A list that cannot be read defers as protected_paths_unreadable readable_rules
The feed asks the Maintainer a_lens_input_needs_you: approve, or close config/feed.json

The Maintainer's ruling on ruling 3 (2026-10-21, through the orchestrator): "an APPROVAL of the current head by donpetry-bot or any other account with write access, other than the PR's author", and not the last pusher. His own changes converge once he approves as donpetry-bot in the browser, or a colleague approves. Posted on #140. The orchestrator added the gating files to the list.

Not here. The base-branch read of config/hooks.json waits on adapters/settings.py, as 0020's rows do.

Verify. make verify on a git archive export, SIM_SEEDS=40. The simulator's Maintainer world now touches config/authority.json, since config/defaults.json is on the list and no world gives a person's approval. Mutants: 18 for this rule, plus three older ones that follow the text they break, each killed by hand the CI way. The capped run cannot take kernel/derive.py, which has more than 40.

Reviews and the fix round.

Reader Finding Done
Claude review The Maintainer's-own-change clause let any session pushing as the Maintainer through Removed; the Maintainer then ruled that his approval as donpetry-bot is the judgment
Claude review, security pass The list could be emptied a row at a time by changes the Lens alone judged, or the model Lens renamed The files that make the list are on it
Security pass harness/__init__.py and roles/pr-review/prompt.md were not covered harness/ whole, and roles/pr-review/
Claude review A Lens's dismissal ended a person's approval, against L-17 Only a person's dismissal does; the Lifecycle transition it needed is gone
Argon, Claude review, Muse The author's half of the rule had no test A case and a mutant each for the author and the last pusher
Muse An approval a later request for changes superseded still counted That person's latest verdict counts
Muse A rename out of a listed path had no test in this rule A case and a mutant

🤖 Generated with Claude Code

View guided diff Turn on auto-fix

don-petry and others added 6 commits October 21, 2026 16:10
config/hooks.json lists pr-review's own inputs as Lens inputs of a model Lens: its manifest and the prompt beside it, its rubric, and the Harness's task and engine. tools/hooks/protected.py gives the Kernel their patterns as model_lens_inputs, from the same reading as protected_paths. A pull request that changes one converges only once every model Lens has reviewed its head and a person has judged it: a person with write access, neither author nor last pusher, approving this content, or the Maintainer's own change, which the Maintainer opened and pushed, since GitHub counts no author's approval of their own pull request. It waits in verifying, model_lens_input_needs_person, naming each pattern, the Maintainer's to see, and a queued item leaves the queue. A list that cannot be read defers as protected_paths_unreadable.

Decision 0045, numbered at enqueue. Eleven mutants, each killed by hand the CI way; two older ones follow the text they break.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…val (#140)

A converged change to a model Lens's input goes back to verifying when a Lens's App dismisses the person's approval. The Lifecycle declares the transition, bounded by the Run ceiling, as the Lens's other moves out of converged are, and the transitions test has facts that reach the new wait.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pass, Argon and Muse

The Maintainer's own change is no person's judgment of a head: a session may push as the Maintainer (L-44), so the clause that read it as one is gone, and such a change waits for another person's approval, as ruling 3 says. A person's approval counts as that person's latest verdict, so a later request for changes supersedes it, and only a person's dismissal ends it (L-17); the Lifecycle's converged-to-verifying by a Lens goes with that. The list now holds what makes it, config/hooks.json, config/defaults.json and tools/hooks/protected.py, so no change the Lens alone judges can take a row off it or rename the model Lens; harness/ is matched whole, and roles/pr-review/ beside roles/pr-review.*. The author's and the last pusher's approvals, a rename out of a listed path and the latest-verdict reading each have a case and a mutant. Decision 0045 says so, and names kernel/gate.py, kernel/coverage.py and config/authority.json as not covered, for the orchestrator.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… model Lens's input (#140)

config/defaults.json joined pr-review's own inputs in the fix round, and a change to one waits for a person's approval, which no world gives, so the Maintainer's worlds waited for ever. The Maintainer now touches config/authority.json, a protected path that needs the model review alone, and every world rests as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… on the list

The Maintainer's ruling of 2026-10-21 on ruling 3: a change to a model Lens's own inputs converges on an approval of its current head by donpetry-bot or any other account with write access other than its author, the last pusher excluded too; never an App's or a Lens's. His own changes converge once he approves as the machine user in the browser. The Factory's own approving act never supplies it: no Decision issues an approval for such a change until a qualifying approval stands, with a boundary test for that loop. kernel/gate.py, kernel/coverage.py and config/authority.json join pr-review's inputs (the orchestrator, 2026-10-21). The record takes 0046, since 0045 is on main. The simulator's Maintainer touches the feed's table, which is no model Lens's input. Three mutants for the judge, each killed by hand the CI way.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@don-petry
don-petry requested a review from a team as a code owner October 21, 2026 22:49
@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ⚠️ Failed 2026-10-21T22:49:08.054015Z
We couldn’t complete this review. Comment @codex review to try again.
442a2d7 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@coderabbitai

coderabbitai Bot commented Oct 21, 2026

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 23 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Repository: combsmith/software-factory/.coderabbit.yaml
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 6061f66b-6d64-46cf-b934-362bbbac28d6
📥 Commits

Reviewing files that changed from the base of the PR and between b3a3fe3 and 442a2d7.

📒 Files selected for processing: 13
  • config/feed.json
  • config/hooks.json
  • docs/decisions/0046-a-change-to-a-model-lenss-own-inputs-needs-a-person.md
  • kernel/decide.py
  • kernel/derive.py
  • schemas/hooks.schema.json
  • sim/world.py
  • tests/support.py
  • tests/test_decide.py
  • tests/test_tools.py
  • tests/test_transitions.py
  • tools/hooks/protected.py
  • tools/mutants.py
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, you can upgrade your account or add credits to your account and enable them for code reviews in your settings.

@sonarqubecloud

Copy link
Copy Markdown

@don-petry
don-petry added this pull request to the merge queue Oct 21, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Oct 21, 2026
don-petry added a commit that referenced this pull request Oct 21, 2026
…ts (#290)

#293 keeps 0046, this takes 0047, #298 takes 0048 (the orchestrator, 2026-10-21).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@don-petry
don-petry added this pull request to the merge queue Oct 21, 2026
Merged via the queue into main with commit 5607377 Oct 22, 2026
19 checks passed
@don-petry
don-petry deleted the kernel/model-lens-inputs branch October 22, 2026 00:12
don-petry added a commit that referenced this pull request Oct 22, 2026
…t's 0047

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
don-petry added a commit that referenced this pull request Oct 22, 2026
…no clock; the mint, the scratch folder and the schema walk fail closed

The record takes 0048, by the order the Factory Builder set: #293 keeps 0046 and
#296 takes 0047.

CI's shard 2 said the signal mutant SURVIVED: its one test was marked as timed by the
wall clock, which the mutation check skips. The stand-in now says on a pipe that a read
has begun and holds it until the script is signalled, so no clock is read and the test
runs under the mutation check; dash kills the mutant.

Codex on PR 298:
- A mint curl says failed is never trusted, however whole its answer reads: the token
  is revoked and the run stops.
- The raw answers' scratch directory is held outside the repo, as OUT is, through a
  link too; the template names TMPDIR, which macOS's mktemp -d alone ignores here.
- check_apps reads a facts schema whose properties or $defs are not objects as
  unreadable instead of raising.
- The grounding says what P-47 recorded: admin and write, a maintainer's role read as
  write, and read; triage was not tried.
- The Controller's metadata grant names read:facts.actor.can_write, as the reader's
  does.
- A permission is a repo's: read and kept by repo and login, and its cost counted per
  repo, never "one request an item".

Each new guard has a test and a mutant.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
don-petry added a commit that referenced this pull request Oct 22, 2026
…n by its id beside P-45's rule

#293 landed after the last merge; main's P-45 row is kept, and #270's reading of an unnamed Run as {run, created_at, status}.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

A model Lens's inputs: its manifest and its prompt

1 participant