Repository navigation
Conversation
The planner's acceptance object listed argv, oraclePaths and artifactPaths before kind. The gateway compiles the wire schema into a decoding grammar, and a grammar-constrained decoder is expected to write properties in declared order: it has to decide on a payload before it has chosen the oracle that says which one is owed. Both payloads are optional, so it skips them, then writes kind and cannot go back. Every acceptance on every main real-model run since the combinator-free wire schema landed was dropped with "requires a non-empty argv|artifactPaths array" while formatVersion was present, so the subtasks ran ungraded. Reorder to formatVersion, kind, argv, artifactPaths, rubric, schema, oraclePaths, description. Each property definition is byte-identical and the wire schema inherits the order through Strip. The cassette key and the planner schema digest both canonicalize with sorted keys, so neither moves. The decoder behaviour is a hypothesis; the live planner arm is what measures it. That arm could not pass as written: a planner-authored ArtifactPresent is promoted to the content oracle it is paired with, or dropped as self-certifying, so a bare ArtifactPresent never survives to be asserted. It now asks for a JSON deliverable paired with a schema, asserts the promoted ArtifactSchema, and reports a payload omitted by the model separately from a drop by the self-certifying policy.
ppXD
force-pushed
the
fix/order-planner-acceptance-kind-first
branch
from
November 7, 2026 14:59
6bfed17 to
2dea61a
Compare
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
kindahead ofargv,artifactPaths,rubric,schemaandoraclePaths(order is nowformatVersion, kind, argv, artifactPaths, rubric, schema, oraclePaths, description). Every planner-authored acceptance on main's real-model runs was dropped withPlanner acceptance requires a non-empty argv|artifactPaths arraywhileformatVersionwas present (32 of 32 drops across the 16 main runs since ac484f2). The wire schema is compiled into a decoding grammar, and a decoder that writes properties in declared order has to commit to an optional payload before it has written thekindthat says which one is owed. The decoder's ordering is a hypothesis, not something the repo proves; the live planner arm is the measurement.WireSchemainherits the order throughJsonSchemaCombinators.Strip, which round-trips throughJsonNodeand keeps property order (the new wire-side test pins that).ArtifactPresentis promoted to the content oracle it is paired with or dropped as self-certifying (PlannerAcceptanceDraft.ReconcileArtifactPresent), soSingle(Kind == ArtifactPresent)could never hold. The arm now asks for a JSON deliverable paired with a schema, asserts the promotedArtifactSchema, and reports "payload omitted" separately from "dropped by the self-certifying policy". Stale class doc ("noformatVersion") corrected.Ordering side effects checked:
RecordReplayStructuredLLMClient.CassetteKey) canonicalizes the schema with ordinal-sorted object keys, and the planner schema digest (QualificationRuntimeManifestObserver, viaToolCallKey.Canonicalize) does the same, so neither moves. Receipts:PlannerCassetteDriftTests(2 tests) pass unchanged, and the digest is5b8f21da89fcba01def8151fcf44dc4bdeefdf92cbfc8531e1e9b8509227a688both before and after while the raw schema text differs. Neither is re-pinned.acceptanceobjects (SupervisorDecisionSchema: plan subtask, stop, amend) also listcommandbeforekind, butcommandisrequiredthere, so the decoder cannot omit it; unchanged. The supervisor, arbiter and coordinator roots already lead with their discriminator. Only the planner acceptance changed.Real-model runs
gh workflow run real-model.yml --ref fix/order-planner-acceptance-kind-first; counts are occurrences in the full run logs.Live_planner_keeps…is the[realmodel]census line ofRealModelPlannerAcceptanceE2ETests.requires a non-emptyplan.author droppedLive_planner_keeps…Reading: only branch run 1 shows a planner-authored plan on this branch. In runs 2 and 3 the planner call returned an empty body on every attempt (
structured completion produced no JSON ... Content preview: (empty)), so no acceptance was emitted at all; that is a gateway or model output failure upstream of the acceptance schema and says nothing for or against the ordering hypothesis. Neither run dropped a payload. The evidence for the fix is therefore one clean run out of three; the other two are inconclusive. Those runs also failed unrelated jobs (delivery gate, supervisor whole-loop, trajectory), which are untouched by this change.Test plan
On_the_wire_acceptance_kind_precedes_every_kind_dependent_propertyon both the validation schema andWireSchema, with a fixture check that all 8 properties are declared. Red on main's order (2 failed), green after (40/40 inTypedModelSchemaBranchTests).PlannerCassetteDriftTestsunchanged and green.requires a non-emptyand 0plan.author droppedin all three branch runs; only one of them reached a planner-authored plan (see table).