Repository navigation
Share one acceptance argv rule and render check argvs as arrays - #2099
Merged
Merged
Conversation
ppXD
force-pushed
the
fix/share-one-argv-normaliser-and-measure-the-floor
branch
from
October 12, 2026 01:25
17bd099 to
fa80e93
Compare
ppXD
force-pushed
the
fix/share-one-argv-normaliser-and-measure-the-floor
branch
2 times, most recently
from
November 7, 2026 15:45
0c6f6fc to
e3d0e5c
Compare
The rule for which acceptance argvs can run (a blank first element or a NUL makes the whole argv unrunnable, later blanks are kept) was pasted into five readers plus two spec-preview validators that added a 256-token bound. AcceptanceArgv.NormalizeOrNull now holds it, and SupervisorTurnContext.AcceptanceChecks no longer claims blanks are dropped. An architecture test matches per file over all of backend/src: a file that tests a first element for blankness and a NUL states the rule, wherever the two clauses sit. Every reader pins how many sites ask the helper (the rehydrate has four), and PlannerAcceptanceDraft is named with its reason, since its re-ask needs one message per violated clause, and a count. The grader spawns every acceptance argv with no shell, so a joined line lost element boundaries: ["sh"," ","check.sh"] read as two arguments, [" ","dotnet","test"] as "dotnet test", and a pipe inside an argument as a pipeline. The supervisor prompt's operator-floor block, each per-subtask check line and the amendment card's proposed check now all render through AcceptanceArgv.AsLine: a JSON array on one line, cut with an ellipsis (the card keeps its own 200-char cap). Known exceptions, documented on AsLine: the grader's fenced "$ cmd" evidence line and two UI labels still join with spaces. clean-integration, whose only right answer is a stop, now declares the same ["dotnet","test"] floor as repeat-failure-under-a-declared-check, so the decision eval can see what the floor block does to stopping. The block tells the model to drive the work until the check passes before declaring success, over a verdict it cannot see before it stops; the other carrier accepts retry, stop and ask_human, so a retry caused by the block still passed. This tape was chosen over resolve-cap-spent because the floor cannot change its answer: every unit is green and integrated, where the cap-spent tape records a failing build and accepts ask_human beside stop. A test requires some floor carrier to accept nothing but a stop, and an eval test checks the floor and its argv line reach the model on it. GoldenPromptDigest is re-pinned on purpose, 6586d47c -> 8082603c. Four of the 29 prompts move and the other 25 are byte-identical: clean-integration gains the floor block, repeat-failure-under-a- declared-check shows its unit's check as an array, amended-oracle- awaiting-retry does both for its check line and its card, and amended-oracle-discarded-by-replan shows its two cards' proposed check as an array. The waive card proposes no check and does not move. The receipts derive the check-line set and the card set separately and require the corpus with both joined back and the new floor withheld to digest to 6586d47c. clean-integration is inside all four superseded anchors and the two co-sign tapes inside the roster anchor, so neither exclusion set changes: the moves are wound back in AsRenderedBeforeTheTurnRoster, and the fence and floor receipts unwind them first.
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.
Summary
clean-integration(only right answer: stop) now declares the same["dotnet","test"]floor asrepeat-failure-under-a-declared-check, so the decision eval can see what the floor block does to stopping. The block says "drive the work until it passes before declaring success" over a verdict the model cannot see before it stops; the old carrier accepts retry, stop and ask_human, so a retry caused by the block still passed. Chosen overresolve-cap-spentbecause the floor cannot change its answer: every unit is green and integrated, where the cap-spent tape records a failing build and accepts ask_human beside stop, so a miss there would not say whether the floor or the judgement was at fault.AcceptanceArgv.AsLine(JSON array of strings on one line, cut with an ellipsis; moved here from the decider) writes the floor block, a unit'sacceptance check (…)line and the amendment card'sProposed check:. The grader spawns every acceptance argv with no shell, so a joined line lost element boundaries ([" ","dotnet","test"]read asdotnet test,["sh"," ","check.sh"]as two arguments) and read a pipe inside an argument as a pipeline. The card sat a few words from the plan block'sAMENDED…: ["dotnet","test"]and still joined; it now quotes the array (own 200-char cap kept). For the non-TestsPass kinds the array holds paths, not an argv. Known exceptions, documented onAsLine: the grader's fenced$ cmdevidence line, andRoomNarrative.cs:452/SupervisorPhaseSource.cs:188, which still join with spaces.AcceptanceArgv.NormalizeOrNullnow holds it (Rehydratex4, both launch builders,InLoopAcceptanceHook,LocalAcceptanceVerifier.ValidArgv) and so do the two spec-preview validators, which restated it with a 256-token bound. No behaviour change. The architecture test matches per file over all ofbackend/src(a per-line match missedPlannerAcceptanceDraft, which writes the clauses on two lines, and anything outsideCore/Services);PlannerAcceptanceDraftis named with its reason (its re-ask needs one message per violated clause) and a count, and every reader pins how many sites ask the helper.Test plan
Digest.
GoldenPromptDigestre-pinned on purpose:6586d47c358c273cb04fe0b662473382a09fe4058916fb8c96e18c1bcc79a946(main, the agent-report fence) ->8082603c53395c055e885c1d03b81d363d768048c41bf5ed4c6759e4b0d9c53e. Four of the 29 prompts move, the other 25 are byte-identical:clean-integrationrepeat-failure-under-a-declared-check["dotnet","test"], wasdotnet testamended-oracle-awaiting-retryProposed check:amended-oracle-discarded-by-replanProposed check:(the amendments were discarded, so no check line)The waive card on
waived-unit-cleanly-integratedproposes no check and does not move. Receipts (derived, none restated):Only_the_tapes_that_carry_an_operator_floor_gain_the_floor_block;Only_the_tapes_that_show_a_check_argv_write_it_as_an_array_not_a_joined_linederives the check-line set and the card set separately and requires the corpus with both joined back and the new floor withheld to digest to6586d47c;A_tape_whose_only_right_answer_is_a_stop_carries_an_operator_floor.clean-integrationis inside all four superseded anchors and the two co-sign tapes inside the roster anchor, so neitherAddedSince…exclusion set changes; the moves are wound back inAsRenderedBeforeTheTurnRosterand the fence and floor receipts unwind them first. Chain:6586d47c<-6b9c621b(#2060) <-2dafcdc7(pre-floor) <- the older anchors, all reproduced.Counts (rebased on b64ca1c; solution builds with 0 errors):
AcceptanceArgvTests13,AcceptanceArgvInventoryTests3,SupervisorAmendAcceptanceTests23,SupervisorPriorDecisionLegibilityTests13,SupervisorDeciderTests219,SupervisorTurnServiceTests77,SupervisorDefinitionBuilderTests30,TaskSpecSourceBoundArgvTests15,TaskSpecAcceptanceEvidenceTests23,TaskSpecCompilerTests25SupervisorGoldenPromptFidelityTests32,SupervisorDecisionEvalDeciderTests6,SupervisorDecisionEvalTests6,SupervisorTrajectoryEvalTests49,LocalAcceptanceVerifierFlowTests25,TaskLaunchFlowTests50,TaskLaunchContractFlowTests10,SupervisorUnitAcceptanceFoldFlowTests65; every Supervisor-named class and namespace together: 858 passed / 46 skipped (RealModel lanes) / 0 failedCODESPACE_LLM_*here). A miss onclean-integrationunder the floor would mean the floor block suppresses a stop.Mutations (each applied, built, run, reverted by copy):
AcceptanceArgvTestsred.SupervisorDefinitionBuilder, theRehydratestop-gate floor,InLoopAcceptanceHook,LocalAcceptanceVerifier,SingleAgentDefinitionBuilder, and nowTaskSpecSourceArgv,TaskSpecAcceptanceAssessment) ->AcceptanceArgvTestsstays green andEvery_reader_that_decides_an_argv_can_run_asks_the_helper_at_every_sitegoes red.CodeSpace.Messagesand another inCodeSpace.Core/Persistence(clauses in both orders,ContainsandIndexOf) ->No_other_file_states_the_rule_againred; the previous commit's per-line guard stays green on the same plant.PlannerAcceptanceDraftwithout its entry, or pinned at the wrong count -> red.clean-integrationloses its floor or accepts retry beside stop; either wind-back step made a no-op -> the pairing guard, the eval-grain test, the anchors and the receipts red.Follow-ups, deliberately not in this PR (each changes behaviour or evidence bytes, so each gets its own PR):
$ cmdevidence line (TestsPassGrader.cs:69) and the two UI labels (RoomNarrative.cs:452,SupervisorPhaseSource.cs:188) throughAsLine. This moves evidence bytes, so it re-pins.ValidateAuthored(AgentAcceptanceContract.cs:250) only rejects an all-blank command, soSupervisorAcceptanceOverlay.cs:49accepts a blank-first TestsPass amendment such as[" ","dotnet","test"], whichRehydrate.cs:806-815later nulls and never grades.AgentCodeNode.cs:274has the same gap. Fix: askNormalizeOrNull, add the sites toAsksTheHelper, add overlay and rehydrate tests.TaskLaunchService.cs:427(the Delivery/Unattended mandate) only checksCount > 0.HarnessDescriptor.cs:188,NativeLaunchProtocol.cs:45/70) and missed spellings (\u0000,char.MinValue, list patterns).LaunchControlResolver.IsWellFormedFloor); whichever of the two lands second folds the other's copy, and this PR's guard will name it if Apply, clamp or refuse launch controls on every route #2064 lands first.