Repository navigation
Show the plan-map synth what the integration actually landed - #2063
Merged
Merged
Conversation
ppXD
force-pushed
the
fix/show-the-synth-what-landed
branch
2 times, most recently
from
October 12, 2026 01:24
1d9214e to
6825b42
Compare
ppXD
force-pushed
the
fix/show-the-synth-what-landed
branch
3 times, most recently
from
November 7, 2026 15:45
8114eb1 to
ebf4a28
Compare
The plan-map synth reduces the per-subtask results into the run's combined answer, but it never saw the integration outcome. The integrate step's outputs reached only the done terminal, appliedCount, conflicts and reason were bound nowhere, and a unit withheld before integration (its acceptance Failed or was Waived, or its output review did not approve it) is dropped from the candidate and appears in no output at all. A conflicted, partial or incomplete candidate was narrated as a finished deliverable whatever was actually on the branch. git.integrate_run now owns the narrative. Every pass (clean, conflicted, empty, skipped, resumed) emits summary, one account of what happened, bounded at 2,000 characters, and withheld, the units the head gate kept off the candidate, each with a fixed-words reason: the acceptance grade, the supervisor's waive, or the output review's verdict. The reviewer's critique is model-authored text and never reaches the account. A Clean account names which contributions landed, each as "subtask N (label)" so the reduce can place it among its results, and flags the ones that landed although their own agent run did not succeed: such a subtask is not withheld by its own grade, so its diff rides the candidate while its results entry reads as an error. How the run ended is read from its agent-run row's status, which is where that error entry comes from; a worker the reconciler abandoned after its push has no result at all. A run whose acceptance check passed is flagged "failed (its acceptance check passed)", with no claim about order (the supervisor lane grades every staged unit whatever its row says, so a Failed row beside a Passed grade can be an under-claim), and any other "partial, unverified". A conflicted set says nothing landed (the integrator publishes no branch on any non-Clean status, so its applied count is a trial count) and where each held-back contribution's work stays. A set that applied cleanly but was not pushed says that instead of claiming a conflict. A resumed pass states whether a reviewer approved or rejected the retry in a fixed sentence, after the clauses describing what landed; the free-text comment never reaches the prompt. The account holds its bound by cutting its lists, never its prose, and the withheld clause is the last thing cut. The resumed pass's review keys are now declared in the OutputSchema, which the validator requires in order to bind them. A repo-bound graph's synth prompt carries the account under "Integration outcome:", and its system prompt says to state what landed, to name anything conflicted or withheld as not delivered, how to read a label, and to report each subtask once. A repo-less graph keeps both prompt halves byte-for-byte. Integration now reduces each unit to its latest attempt before applying the verdict gate. A unit whose latest attempt was rejected contributes nothing and is reported as withheld even if an earlier attempt passed; previously the gate ran first, so the superseded attempt's bytes could land on the candidate in place of the retry that replaced it.
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
appliedCount,conflictsandreasonwere bound nowhere), and a unit withheld before integration (its acceptance Failed or was Waived, or its output review did not approve it) is dropped from the candidate and appears in no output.git.integrate_runnow emits, on every pass (clean, conflicted, empty, skipped, resumed),summary(one account of what happened, at most 2,000 chars) andwithheld([{label, reason}], each reason in fixed words). The resumed pass'sreviewApproved/reviewComment/reviewedByare now declared in its OutputSchema, becauseDefinitionValidatorrejects a reference to an undeclared output.\n\nIntegration outcome:\n{{nodes.integrate.outputs.summary}}; its system prompt gains an instruction to state what landed, to name anything conflicted or withheld as NOT delivered, how to read a label (<node>#map#<i>,ithe 0-based position in the results, "subtask N" isi+1), and to report each subtask once. A repo-less graph keeps both halves byte-for-byte (the existing pins are untouched and green). On a clean run the summary is a factual sentence, not the failure furniture the "no failure furniture" pin forbids (that pin is on a repo-less graph). It sits outside the 120kpromptBudgetChars; its 2,000-char bound is under 2% of that budget.<...>is a per-run id):Integration: 2 contribution(s) landed on codespace/integration/<runId>: subtask 1 (agent#map#0), subtask 2 (agent#map#1).{"error": ...}. How the run ended is read from its agent-run row's status, the column that error entry comes from; a worker the reconciler abandoned after its push is marked Failed with no result at all, and a result-keyed reading would call it whole. Acceptance is graded only for a run that reported its own outcome, so the account separates two shapes, each its own clause appended to the Clean text:Landed although its subtask failed (partial, unverified): subtask 2 (agent#map#1).for a diff nothing checked;Landed although its subtask failed afterwards (acceptance passed): subtask 2 (agent#map#1).for a run whose acceptance passed and which then failed (an executor fault past the grade).Withheld before integration: subtask 2 (agent#map#1) — acceptance Failed.The reason isacceptance Failed,acceptance waived by the supervisor (not delivered),output review flagged itoroutput review did not approve it. The critic's critique and unreviewed reason are model-authored text and never reach the prompt. The descriptions ofwithheld(the node's OutputSchema, theWithheldContributionrecord, the renderer and node docs) now name both gates; they described acceptance verdicts only.Integration conflicted: no integrated branch was published, so none of this run's work landed on one (1 of 2 contribution(s) applied cleanly, but integration is all-or-nothing); the work stays on the agents' own branches and patches. Conflicted or held back: subtask 2 (agent#map#1) → codespace/agent/<id>. A reviewer rejected the retry.Integration applied every contribution cleanly but published no branch (<the integrator's reason>), so none of this run's work landed on one; ...— it does not say "conflicted".Integration skipped: the run produced no integrable work for this repository.; with no base revision,... Nothing landed on an integrated branch; the produced work stays on the agents' own branches and patches.A reviewer approved the retry./A reviewer rejected the retry.— a fixed sentence placed after the clauses that describe what landed (so a "Landed although..." clause stays beside the list it qualifies) and before the withheld clause; the reviewer's free-text comment stays on the outputs.… and N more — see conflicts[]. The withheld clause is the last thing cut.Build,Withheldand the failed-landing view alike (it was the other way round). A unit whose first attempt passed and whose retry flunked used to integrate the first attempt's superseded bytes in place of the retry; now it contributes nothing and is reported as withheld at its latest verdict. This is whatRunIntegrationContributions' own doc asks for: one attempt per unit, the abandoned attempts dropped at the input, the verdict a separate gate. "Latest attempt" means the latest attempt that left a manifest row in this repository: a retry that captured nothing writes no row, and the reduction runs per repository, so a multi-repo unit keeps an abandoned attempt's bytes for a repository the surviving attempt never touched. A unit with one attempt, or whose latest attempt passes, integrates exactly as before.IsWithheldFromHead(manifest, work)also withholds a unit its output review did not approve. Both verdicts are in the gate forBuild,Withheldand the failed-landing view, and a unit the review withholds is named in the withheld clause (it was otherwise exactly the "dropped and mentioned nowhere" case).RunAgentWorkgains a trailing optionalStatus(null claims nothing about how the run ended), loaded from the agent-run row byGitIntegrateRunNode.IntegratedBranchis null on every non-Clean status and the integrator resets its clone on abort (IntegrationResult.cs), so a Conflicted account says nothing landed. The instruction is a sibling constant,SynthIntegrationInstruction, appended only when the graph has an integrate node; its label sentence says a subtask named as withheld, or as landed although it failed, is "usually" one of the results'{"error": ...}entries and a conflicted one an ordinary result (in the real conflicted run both items wereSucceededresults). The conflicted E2E reads the conflicted unit from the ledger because the two parallel items are applied in no fixed order. The review keys still carry noWaitOutputsSpec(noted in the node's doc). The shared "real failure before bystander" order is one method,GitIntegrateNode.NotApplied. The synth prompt of repo-bound Standard-lane runs changes, so the TaskLaunchStandard qualification arm measures the new prompt; no digest covers it.Test plan
Counts are main (
b64ca1c17, before this change) → this branch, all green on the pushed tip:RunIntegrationSummaryTests(new)RunIntegrationContributionsTestsPlanMapSynthDefinitionBuilderTestsPlanMapDynamicDefinitionBuilderTestsGitIntegrateRunNodeManifestTests(new)GitIntegrateNodeTestsGitIntegrateRunNodeFlowTestsPlanMapIntegrateWholeLoopE2ETestsThe failed-landing cases seed the rows production writes: an abandoned worker as the reconciler leaves it (row Failed, its error stamped, no result), a run that failed after its acceptance passed as
UnapprovedUnitShapes.ExecutorFaultover a Passed row, and a retried unit as a faulted first attempt followed by a retry that flunked its acceptance. The supervisor's waive is pinned with a supervisor-lane label.A_unit_whose_latest_attempt_flunked_contributes_nothing_although_an_earlier_attempt_passed, nodeA_unit_whose_latest_attempt_flunked_is_withheld_not_integrated_from_an_earlier_attemptTwo_withheld_agents_of_one_supervisor_turn_are_two_entries_not_oneThe_alias_rows_of_one_withheld_attempt_are_one_entryUnapprovedUnitShapes), E2E flagged-item armWithheldignores the output-review verdict (a unit neither landed nor withheld)86ab15579): the wholeCodeSpace.UnitTestsproject is 13,273 tests, 13,272 passed, 1 skipped (pre-existing), 0 failed. Integration classes that touch the integrate door, plan-map graphs or the output-review flows, all green:GitIntegrateRunNodeFlowTests34,GitIntegrateRunNodeRealGitFlowTests5,OutputReviewIntegrityFlowTests14,SupervisorMergeWithholdFlowTests15,SupervisorLedgerDirectTerminalOutputFlowTests10,SupervisorDependencyStagingFlowTests23,CompletionTerminalAuthorityFlowTests25,MapPromptBudgetFlowTests4,TaskLaunchFlowTests50,TaskLaunchContractFlowTests10. E2E, all green:PlanMapIntegrateWholeLoopE2ETests5,PlanMapSynthFanoutFlowTests2,PlanMapDynamicFanoutFlowTests1,StandardPlanConfirmFanoutFlowTests1,ReviseLoopFanoutE2ETests1,RubricReviseFanoutE2ETests1,RunPhaseProjectorFlowTests6. A full non-incremental build has the same 1,406 warnings as main and none in the touched files.PartialWorkFakeClisatisfies the fake-CLI convention tests (marker 8, harness 3, collection 2). Its E2E arm zeroes the retry BACKOFF in the built definition and nothing else, because the engine waits the 30 s backoff for real, twice per dying subtask; the retry policy itself still runs.