Repository navigation
Sparks Pair (P0->P5) - #9856
Sparks Pair (P0->P5)#9856gunbai-bot[bot] wants to merge 110 commits into
Conversation
…e rows derived from them (P0-C3a, dry) SPARK-PAIR-0 P0-C3a, part of the dry observation-to-plan bridge. No host mutation. This does NOT claim the C3 exit receipt. TWO INDEPENDENT BREAKS make P0-WET unreachable: the CLI passes an unobserved Spark axis, AND the generic artifact set spark_serving_typed_actions to scheduled_rows_empty() unconditionally. Repairing either alone changes nothing. This closes the second and makes the first possible; the first is still open. ROWS ARE A FACT ABOUT AN OBSERVATION, NOT ABOUT AN ARTIFACT. Row production and artifact assembly were fused, so reaching Spark rows meant calling the Spark-specific artifact builder, which brings its own timers, caps, observed_slots: [] and an unobserved fabric population -- two subjects, two baselines, two leases and an arbitrary winner. spark_serving_scheduled_rows_for is extracted; both the slice helper and the generic artifact derive from it. All four unobserved guards are preserved verbatim: each names a probe whose silence would read as "the member is absent", and absence is what makes membership_reconcile plan an ADDITION. MEMBERS AND ROWS ARE ONE CARRIER. The artifact took observed_spark and the schedule as two independent parameters, so a caller could hand it members from one observation and rows planned from another. observed_spark feeds the observed BASELINE, and the baseline is what apply re-checks to decide the plan still applies -- so that disagreement would have been invisible at exactly the moment it mattered. SparkServingAxisProduct is sole_constructor and only the row producer mints it. THE MINT TAKES PROBES, NOT A FINISHED PROJECTION. A first version accepted the projection as a parameter, which reopened the class #9754 closed one field over: nothing stopped a caller pairing srv5's readback with a projection built for srv6. The mint now takes the four probe observations and builds the projection from readback.host, so the host is not a caller's to supply. THE SUBSTRATE REFUSED MY FIRST DESIGN AND IT WAS RIGHT. Having the artifact call the row producer closed an import cycle -- gunbc.fleet_converge_plan -> spark.serving_converge_apply -> spark.serving_converge_plan already runs the other way. Artifact assembly consumes already-planned axis products. THE ARTIFACT'S OPTIONAL CARRIED A FACT THAT CANNOT HAPPEN. It answered Absent when content_hash_of_value did not return the Fnv1a64 arm -- an absorbing arm in the narrowing direction, since an unrecognised hash became "there is no plan artifact", read by every caller as nothing to converge. content_hash_atom dissolves it. THE LINGER ARGV FORK IS CLOSED: it had two spellings, one per transport, free to drift the first time loginctl moves, and now has one home. The three-valued reader added beside it serves the unified observation producer. It is NOT a repair of serving_converge_slice_wet: an earlier version of this commit claimed the slice collapsed "unobserved" into "disabled", and that claim was FALSE. The slice refuses on all three unobserved cases -- transport refusal, nonzero exit, malformed stdout -- before reaching any boolean translation, setting LingerUnobserved with zero planned rows. The claim was inferred from a Bool? in a signature rather than from the control flow, and is retracted here rather than left standing in history. KNOWN NOT DONE, so this does not overstate its rung: the production path does not yet run ONE probe transaction. In spark_serving_observe_host_via_locus the readback uses the via-locus leg while the projection helpers use the other leg, and is-active and the runtime receipt are each probed twice. The honest wording is that readback and projection are constructed during one enclosing call, not that one transaction owns every capture. The axis carrier is also a pair rather than a disposition: it cannot distinguish a non-Spark subject from an unobserved one and has no refusal arm, which is why fleet_converge_plan_artifact's Refused arm currently has no producer. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018dHefbXnLiW1XNs2vVxhwj
…rd did not reach this path
…n by terminal health
…e its own wall reads
… cannot hold by emptiness
…1-p0-c3 # Conflicts: # dag/gunbc/recurring_failure_mode.dag
…1-p0-c3 # Conflicts: # DESIGN.md # docs/design-ledgers.md # src/v1/stage0/src/namespace_wave_admission.rs
…1-p0-c3 # Conflicts: # dag/gunbc/fleet/fleet_converge_plan.dag # dag/gunbc/fleet/fleet_converge_plan_cli.dag # src/v1/stage0/src/namespace_wave_admission.rs
…nal this branch dissolved
…1-p0-c3 # Conflicts: # DESIGN.md # docs/design-ledgers.md # src/v1/stage0/src/namespace_wave_admission.rs
…1-p0-c3 # Conflicts: # src/v1/stage0/src/namespace_wave_admission.rs
…1-p0-c3 # Conflicts: # docs/design-ledgers.md
…s imported Two repairs, both surfaced by composing with main rather than by any defect in either side alone. The merge with main brought #9824, which added a `target` field to AdmissionSubject::Binding: the module the admission's own PR moved the name TO, and the referent of the consumption proof. Our two SPARK-PAIR-0 P0-C3a rows predate that field, so git merged both sides cleanly and the tree did not compile. The value is verified rather than copied from our own label -- spark_serving_linger_probe_words is declared in dag/gunbc/spark/serving_observe.dag, whose module line is gunbc.spark.serving_observe. serving_execution_schedule.dag matched SparkServingUserUnitActivityAddress at four sites without naming it in its import block. Peer modules list it explicitly, so it is now listed here. This is import hygiene, not a resolution repair: the module resolved and typechecked before the change -- measured, by reaching evaluation and failing on a call-contract mismatch, which occurs after resolution.
…1-p0-c3 # Conflicts: # docs/design-ledgers.md
…1-p0-c3 # Conflicts: # DESIGN.md
…1-p0-c3 # Conflicts: # docs/design-ledgers.md
…rcuits Two cost-shape repairs from review 57946. The review named them as canonical- query violations; the defects are real but they are §6 bare-minimum-cost, and recording the mechanism correctly matters because the two readings send a reader to different remedies. spark_serving_acquisition_receipt_of built its three outcome counters as three `length(filter(...))` passes over one capture list, each filter calling its own Bool predicate that exhaustively matched the same closed outcome. Three traversals and three matches to answer one question -- the copied-accumulator shape DESIGN §6 says is always fixed regardless of the realized n, since n tracks the probe roster and is not time-stable. One fold now answers all three, bound once at the use site, and the match stays exhaustive so a fourth outcome arm still fails to compile rather than being silently counted as neither. The three predicates are deleted; they had one caller each. spark_serving_projection_linger_enabled asked an existence question as `length(filter(...)) > 0`, which builds the whole filtered list before comparing. It now uses `any`, which short-circuits. Behaviour preserved by execution, not by inspection: the observation transaction roster is 23/23 and the observe roster is 68/68, including changed_capture_outcomes_move_the_line_the_report_emits, which is the discriminating claim for outcome counting. Review 57946's third finding is NOT addressed here because it is wrong, and the roster's own gate is what settles it rather than an argument. See the PR reply.
…1-p0-c3 # Conflicts: # docs/design-ledgers.md
|
Closing this draft. It was auto-created from a branch whose work has ALREADY LANDED, and merging it would revert six landed PRs. Recording the measurement so nobody re-opens it on the assumption that a large diff means unmerged work. WHY THE THREE-DOT DIFF MISLEADS HERE. This PR reports 23 files, +4347/-673. That is measured from the merge-base, which predates the squash that landed this branch. The branch was merged as PR #9763, squash commit 37f4811, so its original commits are not ancestors of main even though their CONTENT is on main. Verified by symbol rather than ancestry, which is the only check a squash does not defeat: WHAT THE PR WOULD ACTUALLY DO. The two-dot diff, branch tree against main tree, is the honest measure: Four thousand deletions, because the branch predates six commits that landed on main after the squash: Spot-checked one deletion to confirm it is real rather than an artifact of the comparison: src/v1/tests/src/ambiguous_prefix_infix_newline_test.rs is ADDED by #9852, which is main current head. This PR would delete that file and the wall it tests. DISPOSITION. The branch has nothing main lacks; it is subsumed-then-moved-ahead, which is the shape where a stale branch silently reverts landed work while looking like ordinary unmerged progress. Nothing here should be merged, rebased, or force-pushed. The remaining SPARK-PAIR-0 work -- P0-WET, P1, P3 -- starts from a fresh branch off current main, not from this one. Closed rather than left as a draft, because a draft that reverts six PRs is a loaded gun on the board: the next person to flip it ready gets scheduled auto-merge coverage on a 4000-line revert. — sent from eager-pike-541 |
Auto-opened by session-dashboard for session
eager-pike-541.Pushing to
session/eager-pike-541-p0-c3advances this PR.Worker attestation
Before flipping this PR to ready for review, confirm each item:
npm test,cargo test) and the result.Closes #Ndirective.Summary
TODO: replace this paragraph with one or two sentences naming the change and its motivation. Reviewers read this first.
Test plan