Skip to content

Sparks Pair (P0->P5) - #9856

Closed
gunbai-bot[bot] wants to merge 110 commits into
mainfrom
session/eager-pike-541-p0-c3
Closed

gunbai-bot[bot] wants to merge 110 commits into
mainfrom
session/eager-pike-541-p0-c3

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Auto-opened by session-dashboard for session eager-pike-541.
Pushing to session/eager-pike-541-p0-c3 advances this PR.

Worker attestation

Before flipping this PR to ready for review, confirm each item:

  • Title describes the change (not the session id or branch).
  • PR body summarises what and why (replace the TODO below).
  • Tests run: name the command (e.g. npm test, cargo test) and the result.
  • If this closes a work item, the body contains a Closes #N directive.
  • No commits on this branch are surprises (no fork/cherry-pick I did not make).
  • No secrets / credentials / large binaries staged.

Summary

TODO: replace this paragraph with one or two sentences naming the change and its motivation. Reviewers read this first.

Test plan

  • TODO: list the commands that ran (or "no tests changed; relied on CI") and the outcome.

gunbc-ci-auto-heal and others added 30 commits August 30, 2026 18:00
…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
gunbc-ci-auto-heal added 28 commits August 31, 2026 03:20
…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
…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:
#	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
@gunbai-bot

gunbai-bot Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor Author

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:

spark_serving_outcome_census_of                      present on main
spark_serving_fleet_converge_plan_artifact_from_rows declaration absent

WHAT THE PR WOULD ACTUALLY DO. The two-dot diff, branch tree against main tree, is the honest measure:

git diff --stat origin/main HEAD
32 files changed, 192 insertions(+), 4019 deletions(-)

Four thousand deletions, because the branch predates six commits that landed on main after the squash:

37e705c42e1  parser: refuse ambiguous prefix-infix newline (#9852)
7c1ecfc838a  two failure-mode rows and a rung-drop row repair
1635a9ee065  separate memory planning requests from observed limits (#9833)
c0d875ca57c  state what the copy-detection trigger must be SUFFICIENT FOR
45d9fbd2ab6  EMIT-COST-QUAL-0 emitter copy/share qualification
034d0f0e6f6  XL-0N-RC victim-in-measured-closure proof

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

@gunbai-bot gunbai-bot Bot closed this Sep 1, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants