Repository navigation
Conversation
Adds Step.target_param (dropped from serialization when None, so existing bundle digests and contract hashes are unchanged) and runtime.target_param: a click that selects a record looks for the run's value instead of the demonstrated label, drops the demonstrated crop, and halts before acting when the value is empty or the identity evidence does not embed the parameter. Loop induction (search-process-return, row-varying bodies) is not written yet. Untested. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…l from it A target_param click now halts on an unreadable or abstained identity even when the step is reversible, skips the hover shortcut, and never heals its anchor from another record's row. Adds loop_shapes helpers (not wired yet). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r row Loop induction now finds worklists whose rows are not back-to-back repeats: search a record, open it, work it, return to the list (the last row may skip the return, which then runs only when the list is not on screen), and rows that differ (a field some rows lack, a write some rows get behind a screen check a person accepts). A click whose label holds a typed row value selects that row's record (Step.target_param); identity text that changes by row becomes a required identity column. A body that writes is emitted only when every write has a record check bound to the row's values and either an identity-checked selection precedes it or the check counts a new record. Every loop carries a LoopCertificate. The sealed-leaf integrity check compares the program's own step for a rebound click. Recordings compile with identity bands readable and induction hashes them once the row columns are known. Tests run held-out rows through the interpreter against an in-memory app and check its records. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Qualification's fault driver cannot qualify a target_param click yet (it needs the recorded crop of the row). Until it can, certification under any identity-requiring policy (clinical-write), the run gate's identity gate (Standard, Regulated, governed, whatever --policy) and qualify readiness refuse such a bundle with a plain reason. Demo replay still runs it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
abrichr
marked this pull request as ready for review
October 20, 2026 18:29
Member
Author
|
Coordinator safety review: approve at d71cd96.
🤖 Generated with Claude Code |
abrichr
enabled auto-merge
October 20, 2026 18:30
# Conflicts: # packages/flow/tests/test_qualify_declarative.py
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Loop induction learns worklists that aren't back-to-back repeats, and each pass works on its own row's record.
Why
An external review found that loop induction only recognized back-to-back repeats. A body that wrote was always refused. The runtime also had no way to point a click at a different record:
entity_refwas a declared slot with no behavior behind it. So a loop that searches a record, opens it, works it and goes back to the list couldn't open the second record.What changes
Runtime:
Step.target_paramA click that selects a record (a search result or a worklist row) names the parameter whose value identifies the row.
None, so existing bundle digests and contract hashes don't change.Compiler: loop induction (
compiler/loop_shapes.py,compiler/induction.py)accepted_loop_guards).LoopCertificate. Every emitted loop states its bound (finite worklist,max_iterations), the selections and what they verify, and the writes and the row values they're checked against.compile(..., phi_free_identity=False)). Induction hashes the bands before returning, with the row columns indexed.Evidence
tests/test_target_param.py(18): binding rules, refusals, serialization stability, and replay through the interpreter. Covers the right row verified, a wrong row halted, an unreadable row halted, and no healing.tests/test_loop_shapes.py(17): induced programs run held-out rows through the real interpreter against an in-memory chart app, and the test reads the app's records afterwards.Not covered yet
target_paramstep is refused with a plain reason by certification under any identity-requiring policy (clinical-write), by the run gate's identity gate for Standard, Regulated and governed runs (whatever--policy), and byqualifyreadiness. Demo replay still runs it. This was the coordinator's review condition.Safety review requested from the coordinator: this changes which record a click acts on, and when induction emits a loop that writes.
🤖 Generated with Claude Code