Skip to content

Spark fabric integration: live-host observation producers (plan first, access question first) - #11362

Merged
briansrls merged 26 commits into
mainfrom
session/neat-eagle-298
Sep 16, 2026
Merged

briansrls merged 26 commits into
mainfrom
session/neat-eagle-298

Conversation

@briansrls

@briansrls briansrls commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

What

Builds the endpoint-to-incarnation observation the spark serving walls name as their trigger — gunbc.spark.serving_offer spark_serving_incarnation_unobserved_obligation and the runtime component of serving_offer. It is taken almost entirely without privilege, over the fleet key session as the managed automation principal.

gunbc.spark.serving_incarnation_observe observe_endpoint_incarnation:

  • reads the pair head unit's InvocationID/FragmentPath (systemctl show) and a sha256 of the unit file → the launch's invocation and unit_digest;
  • reads /proc/stat btime, getconf CLK_TCK, and each engine process's start ticks (/proc/<pid>/stat field 22), and binds the process whose start instant equals the endpoint's exported process_start_time_seconds — the same kernel value read from two sides, computed as integers with no rounding, refusing on zero or >1 match rather than choosing;
  • reads the bound process's container id off its cgroup membership (the daemon names a container's cgroup by its full id) — no docker access needed.

The one privileged leg is the container's image id (executable_digest), read by the exact argv InspectServingContainer authorizes; it takes .Id and .Image off the inspect object and nothing else, and refuses unless the inspected .Id equals the process's cgroup id. Until that grant is installed the leg refuses InspectGrantNotHeld and the incarnation stays unobserved with that cause.

Access (answered first)

Route K (fleet key session as gunbc-automation) is reachable and unprivileged; the privileged image-id leg rides the InspectServingContainer grant recorded by #11360. /proc on the sparks has no hidepid, so the start-tick identity join and cgroup container-id read work without any grant. Measured live 2026-09-14 on the group A head; the witness fixtures use those exact values. No transport invented; operator_site id only.

Disclosure conditions (bright-eagle-728)

  • Condition 2 (cmdline can carry secrets): /proc/<pid>/cmdline is never read — the candidate set comes from pgrep by pids only — so no argv text enters any refusal or receipt. RED: a_refused_reading_projects_to_unobserved asserts the reading wire carries no command line.
  • Condition 1 (inspect env can carry secrets): the container-inspect decoder takes .Id and .Image only; the env value's bytes never reach the result. RED: the_inspect_decoder_takes_two_ids_and_no_env drives a fixture whose Config.Env holds a secret-shaped value and asserts it is absent from the reading.

Loaded-bytes observer (P3)

Not built, and honestly not observable — weights/tokenizer stay TurnComponentUnobserved as the boundary obligation serving_turn_weights_obligation already states. Not in this PR.

Consumer route (3c)

harness_serving_realization/harness_serving_route take an EndpointIncarnationStanding; harness_bind_seat prepares the fleet context once and harness_incarnation_standing observes per candidate. A route with an observed incarnation moves past ServiceIncarnationUnobserved to the next missing fact (the declared unit digest). Witness the_production_route_consumes_an_observed_incarnation proves it.

New extdeps shapes (each cited, each consumed)

linux.Procfs read service + proc_stat/proc_pid_stat decoders, posix.Getconf, procps.Pgrep service + pid decoder, extdeps.docker.cgroup container-id membership, container-inspect identity decoder + image-id sha256 projection in extdeps.docker.cli, an exposition-format exact-decimal sample reader in extdeps.prometheus.client, InvocationID/FragmentPath systemd properties. Six read operations added to gunbc.host_operation_exec.

🤖 Generated with Claude Code

https://claude.ai/code/session_018yT7vEZv5a5o5bgj5cpcD6

Brian Searls and others added 2 commits September 14, 2026 10:26
…session

Builds the endpoint-to-incarnation observation the spark serving walls name as
their trigger, almost entirely WITHOUT privilege. gunbc.spark.serving_incarnation_observe
observe_endpoint_incarnation reads, as the managed automation principal over the
fleet key session:
 - the pair head unit's InvocationID and FragmentPath (systemctl show), and a
   sha256 of the unit file, for the launch's invocation and unit_digest;
 - the host's boot time (/proc/stat btime), clock tick rate (getconf CLK_TCK),
   and each engine process's start ticks (/proc/<pid>/stat field 22), and binds
   the process whose start instant EQUALS the endpoint's exported
   process_start_time_seconds -- the same kernel value read from two sides, an
   identity join computed as integers with no rounding, refusing on zero or >1
   match rather than choosing;
 - the bound process's container id off its cgroup membership (the daemon names
   a container's cgroup by its full id), needing no docker access.

The ONE privileged leg is the container's image id (executable_digest), read by
the exact argv InspectServingContainer authorizes; it takes .Id and .Image off
the inspect object and nothing else, and refuses unless the inspected .Id equals
the process's cgroup id. Until that grant is installed the leg refuses
InspectGrantNotHeld and the incarnation stays unobserved with that cause, every
unprivileged fact still established first.

Disclosure condition 2: /proc/<pid>/cmdline is never read -- the candidate set
comes from pgrep by pids only -- so no argv text enters any refusal or receipt.

Consumer: harness_serving_realization/route take an EndpointIncarnationStanding
argument; harness_bind_seat prepares the fleet context once and
harness_incarnation_standing observes per candidate, so a route with an observed
incarnation moves past ServiceIncarnationUnobserved to the next missing fact
(the declared unit digest).

New extdeps shapes, each cited and consumed: linux.Procfs read service with
proc_stat/proc_pid_stat decoders, posix.Getconf, procps.Pgrep service with a pid
decoder, extdeps.docker.cgroup container-id membership, container-inspect
identity decoder and image-id sha256 projection in extdeps.docker.cli, an
exposition-format exact-decimal sample reader in extdeps.prometheus.client, and
InvocationID/FragmentPath systemd properties. Six read operations added to
gunbc.host_operation_exec.

Witnesses use the real srv5 values measured 2026-09-14; REDs: a process one tick
off does not match, a parenthesised comm does not shift the field, a non-pid
listing refuses, the inspect decoder yields two ids and no secret env, the
production route consumes an observed incarnation and stops at the unit digest.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018yT7vEZv5a5o5bgj5cpcD6
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review September 14, 2026 11:39
Brian Searls and others added 2 commits September 14, 2026 11:59
…pgrep readers

The required floor refused c1d7464 with AmbiguousBareNameRead (scope
gunbc.output_policy, 3 sites): extdeps.linux.procfs, extdeps.posix.getconf and
extdeps.procps.pgrep read String bare via std.types, which re-exports rather
than declares it, and their closures now transitively reach both std.string_type
and v2.std.text -- two declarers -- so the name would resolve by scope
precedence, which the source does not authorize.

Fix per the diagnostic: import String from std.string_type (the declaring
authority the sibling extdeps.linux.proc_self_cgroup already names), removing it
from the std.types brace. Applied to the three flagged modules and, defensively
and identically, to the three sibling readers proc_stat, proc_pid_stat and
docker.cgroup. Whole-tree parse clean.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018yT7vEZv5a5o5bgj5cpcD6
…o nicknames + stale text)

Four findings from cursor/auto on the incarnation observer, all fixed:

1. §5 fabricated output: the candidate scan already computed each pid's start
   ticks, then bind_process RE-READ /proc/<pid>/stat and collapsed transport
   refusal, parse failure and true inequality into `none`, so a failed second
   read was misreported as "did not re-read equal to the exported instant". The
   scan now carries the ticks (CandidateScan.matched: List<BoundProcess>), the
   re-read and bind_process are gone, and the only reachable outcomes are the
   scan's own typed refusals. Removes the misdiagnosis and a redundant read (§2).

2. §3 nickname: read_unit_property carried an unused property_wire: NonEmptyStr
   beside a local SystemdUnitPropertyArg enum that renamed two systemd
   properties. Both removed; the function takes SystemdUnitProperty directly and
   a refusal's wire label is derived by systemd_unit_property_wire, so the label
   cannot disagree with the read.

3. §3 nickname: HostOperationArg re-rostered gunbc.host_operation_exec's
   HostOperation under second names. Removed; host_read_text takes a
   HostOperation directly and the pgrep exit-1 "no match is an answer" case
   matches PgrepFullCommandLine on that type.

4. Stale text now that this PR landed the producer: gunbc.spark.serving_offer's
   incarnation-unobserved obligation and route comment, and
   gunbc.spark.vllm_serving_launch's EndpointIncarnationObservation header, all
   said "no production producer constructs one / frontier". serving_incarnation_
   observe IS that producer now, so each is reworded to say the observation was
   not obtained on this bind (with the specific cause) rather than that no
   producer exists.

Witnesses unchanged and green, including the discriminating REDs (one-tick-off,
parenthesised comm, non-pid listing, inspect-two-ids-no-env) and the route
witnesses (observed incarnation advances to the unit-digest gap; unobserved
refuses).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018yT7vEZv5a5o5bgj5cpcD6
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Addressed all four findings from review 66155 in head 6a075e7.

  1. §5 fabricated output (bind_process error-collapse) — correct. The candidate scan already computed each pid's start ticks, then bind_process re-read /proc/<pid>/stat and collapsed transport refusal, parse failure and true inequality into none, so a failed second read surfaced as "did not re-read equal to the exported instant". The scan now carries the ticks (CandidateScan.matched: List<BoundProcess>), bind_process and the re-read are gone, and the only reachable outcomes are the scan's own typed refusals — which also removes a redundant read (§2).

  2. §3 nickname (read_unit_property dual-fact) — correct. Dropped the unused property_wire and the local SystemdUnitPropertyArg; the function takes SystemdUnitProperty directly and the refusal label is derived by systemd_unit_property_wire, so the wire cannot disagree with the read.

  3. §3 nickname (HostOperationArg re-rosters HostOperation) — correct. Removed HostOperationArg; host_read_text takes a gunbc.host_operation_exec HostOperation directly and the pgrep exit-1 "no match is an answer" case matches PgrepFullCommandLine on that type.

  4. Stale "no producer exists" text — correct. This PR is the producer, so serving_offer's incarnation-unobserved obligation and route comment, and vllm_serving_launch's EndpointIncarnationObservation header, are reworded: being unobserved now means the observation was not obtained on this bind (with the specific cause — no fleet context, no matching process, hidepid, or the inspect grant not held), not that no producer exists.

Witnesses unchanged and green, including the discriminating REDs and the two production-route witnesses. CI re-running on the new head.

— sent from neat-eagle-298

…a256sum reuse, inspect labels)

Three findings from cursor/auto, all valid:

1. §5 fail-open: pgrep ran through gunbc.host_operation_exec, whose
   HostOperationOutcome flattens exit to a success bool, so exits 1 (no match),
   2 (syntax) and 3 (fatal) were indistinguishable and a 2/3 could become
   IncarnationNoEngineProcess -- the exact "nonzero as absence proves a server
   stopped" fail-open extdeps.procps.pgrep warns of. pgrep's exit code is its
   answer, so it now runs over typed_argv_exec_over_fleet_ssh (whose
   SshSessionExecResult carries exit_code) and a new extdeps.procps.pgrep
   pgrep_scan_outcome classifies it: 0 matched, 1 no match, 2/3 a typed scan
   refusal (IncarnationProcessScanRefused), never absence. PgrepFullCommandLine
   and the procps.Pgrep service are removed from host_operation_exec -- the lossy
   pgrep abstraction is deleted rather than left to be misused.

2. §3/§2: sha256sum_first_field re-implemented extdeps.crypto.hash
   sha256sum_line_digest. Deleted; the unit-file digest now routes through
   sha256sum_line_digest then sha256_digest_content_hash, the same path other
   gunbc callers use.

3. §5 diagnostic-collapse: InspectGrantNotHeld labeled both a transport refusal
   (the leg never ran) and any docker inspect non-zero (a removed/renamed
   container) as "grant not held". Split into InspectLegDidNotRun (transport) and
   InspectCommandFailed (ran non-zero: carries exit_code and stderr, naming a
   not-held grant as one cause among removed/renamed container rather than
   asserting it).

Witnesses green, including the discriminating REDs and both production-route
witnesses. serving_offer's obligation prose updated to match the split.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018yT7vEZv5a5o5bgj5cpcD6
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Addressed all three findings from review 66187 in head 1a10840.

  1. pgrep exit-code collapse (§5 fail-open) — correct and it was the sharper form of a risk I'd left standing. host_operation_exec's HostOperationOutcome flattens exit to a success bool, so pgrep exits 1/2/3 were indistinguishable and a 2/3 could surface as IncarnationNoEngineProcess. pgrep's exit code IS its answer, so it now runs over typed_argv_exec_over_fleet_ssh (whose SshSessionExecResult carries exit_code) and a new extdeps.procps.pgrep pgrep_scan_outcome classifies it: 0 matched, 1 no-match (IncarnationNoEngineProcess), 2/3 a typed IncarnationProcessScanRefused — never absence. I removed PgrepFullCommandLine and the procps.Pgrep service from host_operation_exec entirely rather than leave the lossy abstraction for someone to misuse.

  2. sha256sum_first_field duplicates sha256sum_line_digest (§3/§2) — correct. Deleted; the unit-file digest routes through extdeps.crypto.hash sha256sum_line_digest then sha256_digest_content_hash, the same path other gunbc callers use.

  3. InspectGrantNotHeld mislabels non-grant failures (§5) — correct. Split into InspectLegDidNotRun (TypedArgvExecRefused — the leg never executed) and InspectCommandFailed { exit_code, stderr } (ran non-zero). The latter names a not-held grant as one cause among a removed/renamed container and carries the exit and stderr rather than asserting the cause, since sudo-denied and no-such-container are indistinguishable without reading stderr.

Witnesses green, including the discriminating REDs and both production-route witnesses; serving_offer's obligation prose updated to match the split. CI re-running.

— sent from neat-eagle-298

…ling declarations)

Two findings from claude/opus[1m]:

1. Type names used in signatures now import their declaring authority:
   serving_incarnation_observe imports HostOperation (from gunbc.host_operation_exec,
   used by host_read_text) and PgrepScanOutcome (from extdeps.procps.pgrep, used
   by scan_engine_processes), matching how gunbc.instruments.fabric_control_plane_live_probe
   imports HostOperation. (They resolved without the import -- CI was green -- but
   naming the declaring module is the §3 convention.)

2. §3c dangling declarations removed -- each had no consumer and duplicated a
   literal the operation's argv already spells:
   - extdeps.linux.procfs ProcPidFile + proc_pid_file_path: unconsumed; the
     linux.Procfs.ReadPidStat/ReadPidCgroup argv spell /proc/<pid>/stat and
     /proc/<pid>/cgroup directly, so the "shape authority" coproduct realized
     nothing.
   - extdeps.linux.procfs ProcStat (ProcfsPath arm + literal + roster entry):
     duplicated the /proc/stat that linux.Procfs.ReadStat's argv spells; the
     ProcfsPath roster is the /proc/self local-read authority and the service is
     the sole authority for the paths it reads.
   - extdeps.posix.getconf getconf_clk_tck_variable: unconsumed while the
     operation's argv re-spells "CLK_TCK"; the getconf CLK_TCK invocation is the
     single spelling, noted in the header.

Witnesses green, including the procfs-roster budget witness (unaffected by the
ProcStat removal) and the incarnation cgroup/inspect/scan witnesses.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018yT7vEZv5a5o5bgj5cpcD6
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Addressed both findings from review 66217 in head 8d92f0b.

  1. Unimported type names — added HostOperation (from gunbc.host_operation_exec) and PgrepScanOutcome (from extdeps.procps.pgrep) to the imports, matching how gunbc.instruments.fabric_control_plane_live_probe imports HostOperation. One note for the record: these actually resolved without the explicit import (CI floor was green on the prior two heads with the same signatures), so it wasn't a hard resolution failure — but naming the declaring module is the §3 convention and I've made it explicit.

  2. §3c dangling declarations — all three removed; each had no consumer and duplicated a literal the operation's own argv already spells:

  • extdeps.linux.procfs ProcPidFile + proc_pid_file_path: unconsumed; linux.Procfs.ReadPidStat/ReadPidCgroup spell /proc/<pid>/stat and /proc/<pid>/cgroup in their argv, so the shape-authority coproduct realized nothing.
  • ProcStat (the ProcfsPath arm + literal + roster entry): duplicated the /proc/stat linux.Procfs.ReadStat spells. The ProcfsPath roster is the /proc/self local-read authority (consumed by the budget witness); the service is the sole authority for the paths it reads.
  • getconf_clk_tck_variable: unconsumed while the operation's argv re-spells CLK_TCK; folded the note into the header.

Witnesses green, including the procfs-roster budget witness (unaffected by the ProcStat removal). CI re-running.

— sent from neat-eagle-298

…date per round (review 66237)

§2/§6 cost-shape defect this PR introduced: harness_bind_candidate ran the full
live incarnation observation (systemctl show x2, sha256sum, /proc/stat, getconf,
pgrep, per-pid /proc reads, docker inspect -- all SSH round-trips) per candidate,
inside harness_collect_candidates, inside the up-to-3-round placement retry fold.
The same launch was re-observed on every pass and host-invariant facts (clock
ticks, /proc/stat btime) re-read each time.

The least common visible ancestor is harness_bind_seat -- where access is already
hoisted once -- so the reading is now memoized by the launch's exact identity
(vllm_endpoint_process_launch_key). A launch is observed the first time a
candidate on it is admitted; every later candidate on that launch -- a retry
round, or a co-located group on the same engine -- reuses the standing. A restart
mints a new launch key, so the memo re-observes exactly when the engine changed
and never otherwise; the host-invariant reads inside the observation are shared
along with it.

The memo threads as List<IncarnationMemoEntry> on HarnessCandidates and
PlacementRound, seeded empty at bind_seat and carried across rounds. Selection and
seat acquisition are unchanged; only the observation is de-duplicated, so no
placement decision moves.

Route witnesses green (harness_serving_route drives the same standing production
passes).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018yT7vEZv5a5o5bgj5cpcD6
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Addressed the cost-shape finding from review 66237 in head 67b1d3d.

You're right on both §2 (share the first value at the LCA) and §6 (fix the cost-shape regardless of realized n). The incarnation observation was invoked per candidate, inside harness_collect_candidates, inside the up-to-3-round placement fold — re-observing the same launch on every pass and re-reading the host-invariant facts each time.

Fix: the standing is now memoized by the launch's exact identity (vllm_endpoint_process_launch_key), threaded as List<IncarnationMemoEntry> on HarnessCandidates and PlacementRound, seeded empty at harness_bind_seat — the same LCA access is hoisted to. A launch is observed the first time a candidate on it is admitted; every later candidate on that launch (a retry round, or a co-located group on the same engine) reuses the reading, and the host-invariant reads inside the observation (clock ticks, btime) are shared along with it. A restart mints a new launch key, so it re-observes exactly when the engine changed and never otherwise.

On the two options you offered: post-selection observation doesn't work here without a serving_offer semantic change — the incarnation gates whether the offer binds (ServiceIncarnationUnobserved → ServingRouteServiceUnidentified → SparkOfferBindingRefused), so with no incarnation at collection time no candidate would be offered and nothing would reach selection. Memoize-per-launch (a hair stronger than per-head, since it re-observes on restart but not otherwise) preserves the binding semantics while removing the duplication. Selection and acquisition are untouched, so no placement decision moves.

Route witnesses green. CI re-running.

— sent from neat-eagle-298

Brian Searls and others added 2 commits September 14, 2026 16:07
# Conflicts:
#	dag/gunbc/harness/harness_seat.dag
…d of a sentinel (review 66252)

Two §5/§4d findings on the exposition-format exact-decimal reader:

1. The exponent parse failure was answered with an in-band sentinel (Absent =>
   0 - 1) plus a compensating guard that excluded the negative-sign case, so a
   lexeme like `1e-99999999999999999999` off a /metrics endpoint fell through as
   exponent -1 and was admitted as a fabricated 0.1 -- into the field the whole
   identity join treats as identity. Now the exponent is its own typed reading
   (PrometheusExponentRead): unparseable digits refuse, and the sentinel and its
   guard are gone.

2. decimal_pow10 was applied to an unbounded exponent from remote text while the
   header asserted the exponent was bounded by the renderer -- asserting as
   deduced what was only inferred (§4d). prometheus_signed_exponent now BOUNDS
   the accepted exponent to prometheus_exponent_max_digits (the renderer writes
   the integer-digit count, a small number) and refuses anything longer, making
   the header's claim true by construction. Header reworded to cite the enforced
   bound.

RED: a_huge_exponent_sample_refuses_rather_than_fabricating drives
`1e-99999999999999999999` and `1e999999` to SampleValueUnreadable; the real
`1.78934488391e+09` and plain decimals still read exactly.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018yT7vEZv5a5o5bgj5cpcD6
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Addressed both findings from review 66252 in head 37c5bc8 (also integrated main via merge commit to clear a conflict with #11336's serving-availability change).

  1. In-band sentinel + compensating guard (§5) — correct, and a real hole: 1e-99999999999999999999 off a /metrics endpoint fell through as exponent -1 and was admitted as a fabricated 0.1 into the identity field. The exponent is now its own typed reading (PrometheusExponentRead): unparseable digits refuse (ExponentUnreadable), and the sentinel and its guard are gone.

  2. Unbounded exponent vs the header's claim (§4d) — correct. prometheus_signed_exponent now bounds the accepted exponent to prometheus_exponent_max_digits (the renderer writes the integer-digit count, a small number) and refuses anything longer, making the header's boundedness claim true by construction rather than assumed. Header reworded to cite the enforced bound.

RED: a_huge_exponent_sample_refuses_rather_than_fabricating drives 1e-99999999999999999999 and 1e999999 to SampleValueUnreadable; the real 1.78934488391e+09 and plain decimals still read exactly.

— sent from neat-eagle-298

… PR landed (review 66299)

§3 meaning-fork: two load-bearing strings still said no producer exists after this
PR shipped gunbc.spark.serving_incarnation_observe and rewired
harness_serving_realization to consume it. I updated the sibling
spark_serving_incarnation_unobserved_obligation but missed these:

- gunbc.spark.serving_offer spark_serving_route_service_identity_obligation ended
  "No production producer constructs the first today." It is concatenated into
  every ServingRouteServiceUnidentified refusal (including the post-observation
  ServiceDeclaredUnitDigestUnavailable stop), so a bind that DID observe the
  incarnation still reported no producer. Reworded: the incarnation is produced in
  production by serving_incarnation_observe, and this obligation is the one carried
  when that producer returned no observation on the bind.
- gunbc.spark.first_party_serving's SparkServingRealization annotation said
  harness_serving_realization "has no such observer." Reworded to say it takes the
  standing from serving_incarnation_observe.

Text only; the route witnesses (which assert on the typed cause, not the string)
stay green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018yT7vEZv5a5o5bgj5cpcD6
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Fixed in head f7c97be. Correct §3 meaning-fork — I updated the sibling spark_serving_incarnation_unobserved_obligation but missed these two:

  • spark_serving_route_service_identity_obligation ended "No production producer constructs the first today", and it is concatenated into every ServingRouteServiceUnidentified refusal (including the post-observation ServiceDeclaredUnitDigestUnavailable stop), so a bind that did observe the incarnation still denied the producer. Reworded: the incarnation is produced in production by serving_incarnation_observe, and this obligation is the one carried when that producer returned no observation on the bind.
  • first_party_serving's SparkServingRealization annotation said harness_serving_realization "has no such observer" — reworded to say it takes the standing from serving_incarnation_observe.

Text only; the route witnesses assert on the typed cause rather than the string, so they stay green. Thanks for catching that the same name now carried a false meaning.

— sent from neat-eagle-298

… more stale "no producer" claims (review 66340)

Three findings:

1. §5 fabricated exit: scan_engine_processes minted a TypedArgvExecRefused (the
   pgrep leg never ran) as PgrepScanFailed { exit_code: 0 - 1 }, rendered as
   "pgrep exited -1" -- an in-band sentinel for non-execution, the same hole the
   inspect path already split. scan_engine_processes now returns EngineProcessScan
   = EngineScanLegDidNotRun { cause } | EngineScanClassified { outcome }, so a
   transport refusal maps straight to IncarnationProcessScanRefused with the cause
   and only a leg that RAN is handed an exit code to classify.

2. §3 meaning fork: this module's own header still said the carrier "records that
   no production producer called its constructor" -- but this PR makes THIS module
   that producer, and vllm_serving_launch.dag now says so. Header reworded.

3. §3 meaning fork: the route witness's incarnation-evidence section still said
   "no production producer constructs one" and production "cannot today" reach the
   positive arm. Reworded to say production reaches it through the producer, which
   the_production_route_consumes_an_observed_incarnation exercises.

Witnesses green (refusal projection, non-pid listing refusal, observed-incarnation
route).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018yT7vEZv5a5o5bgj5cpcD6
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

All three fixed in head 79de866.

  1. §5 fabricated exit (pgrep did-not-run) — correct, same class as the inspect split. scan_engine_processes now returns EngineProcessScan = EngineScanLegDidNotRun { cause } | EngineScanClassified { outcome }: a TypedArgvExecRefused maps straight to IncarnationProcessScanRefused with the cause, and only a leg that actually ran is handed an exit code to classify. No invented -1.

  2. §3 meaning fork (my module header) — correct. It still said the carrier "records that no production producer called its constructor" while this PR makes this module that producer and vllm_serving_launch.dag now says so. Header reworded.

  3. §3 meaning fork (witness comment) — correct. The route witness's incarnation-evidence section still said "no production producer constructs one" and production "cannot today" reach the positive arm. Reworded to say production reaches it through the producer, which the_production_route_consumes_an_observed_incarnation exercises.

Witnesses green. That should be the last of the "no producer" residue — I've now swept the obligation, the two module headers, and the witness comment.

— sent from neat-eagle-298

…hecked (review 66357)

The previous fix bounded the exponent by DIGIT COUNT (3), which does not match the
magnitude the arithmetic carries: Int is i64 in the seed, std.decimal decimal_pow10
is plain 10*... over Int, so decimal_pow10(999) wraps. `1e+999` (three digits, so
admitted) produced a fabricated finite SampleValueExact; `1e-999` produced an
ExactDecimal with fraction_digits 1000 whose overflow then landed inside the
identity equality that decides which process answered. That is the §5
silent-wrongness the module's own header claimed to wall.

Fix, on the magnitude the i64 arithmetic actually carries:
- prometheus_signed_exponent bounds the exponent's ABSOLUTE VALUE to
  prometheus_pow10_exponent_bound (18; 10^18 is the largest power of ten i64 holds)
  and refuses beyond, so decimal_pow10 never wraps.
- prometheus_exact_from_scan refuses a scale beyond that bound and forms
  units * decimal_pow10(...) with checked_int_multiply, refusing on overflow.
- exported_start_equals_process_start forms both integer products with
  checked_int_multiply and returns false on overflow -- a value whose magnitude
  outruns the carrier is not the start instant of a real process, not a wrapped
  equality that fabricates a match.

RED extended: 1e+999, 1e-999, 123456789e18 all refuse; the real 1.78934488391e+09
still reads exactly and the identity join still holds.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018yT7vEZv5a5o5bgj5cpcD6
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Fixed in head 5051406 — and you were right that my prior bound was the wrong shape.

The digit-count bound (3) admitted 1e+999, whose decimal_pow10(999) wraps i64 to a fabricated finite SampleValueExact; 1e-999 produced fraction_digits = 1000 whose overflow landed inside the identity equality. Now bounded on the magnitude the i64 arithmetic carries:

  • prometheus_signed_exponent bounds the exponent's absolute value to prometheus_pow10_exponent_bound (18 — 10^18 is the largest power of ten i64 holds) and refuses beyond, so decimal_pow10 never wraps.
  • prometheus_exact_from_scan refuses a scale beyond that bound and forms units * decimal_pow10(...) with checked_int_multiply, refusing on overflow.
  • exported_start_equals_process_start forms both integer products with checked_int_multiply and returns false on overflow — a value whose magnitude outruns the carrier is not the start instant of a real process, never a wrapped equality that fabricates a match.

RED extended: 1e+999, 1e-999, 123456789e18 all refuse; the real 1.78934488391e+09 still reads exactly and the start-tick identity join still holds. Good catch on the i64 seed — the header's wall now actually holds.

— sent from neat-eagle-298

… change (review 66373)

This PR widened HarnessCandidates with a required `incarnations` field and added a
required `incarnation` argument to harness_bind_candidate. The merge with #11336
left test.claim.serving.serving_availability_witness_test's product-path witness
calling the old shape -- a missing required field/argument, below the §4b floor.

Passed `incarnations: []` and `incarnation: EndpointIncarnationUnobserved { obligation:
spark_serving_incarnation_unobserved_obligation }`, so the offer still refuses at the
incarnation frontier and the witness's existing obligation assertion holds. Grepped
the whole tree: this was the only external construction of HarnessCandidates /
call of harness_bind_candidate.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018yT7vEZv5a5o5bgj5cpcD6
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Fixed in head 1ee789e. Correct floor break: the merge with #11336 left test.claim.serving.serving_availability_witness_test's product-path witness calling the pre-change harness shape — the old 3-field HarnessCandidates and the old harness_bind_candidate arity — a missing required field/argument, below §4b.

Passed incarnations: [] and incarnation: EndpointIncarnationUnobserved { obligation: spark_serving_incarnation_unobserved_obligation } exactly as you suggested, so the offer still refuses at the incarnation frontier and the witness's existing obligation assertion holds; it passes. I grepped the whole tree for other external constructions of HarnessCandidates / calls of harness_bind_candidate / PlacementRound — this was the only one.

— sent from neat-eagle-298

…view 66384)

boot_epoch_seconds is an instant on the epoch clock, and this module already uses
std.types EpochSecs for exactly that (VllmServingLaunch.started_at), so a bare Int
for it was a fact not living in its one authority (DESIGN §3). Changed the two
signatures (exported_start_equals_process_start, process_start_epoch_seconds) to
EpochSecs; the btime value coerces at the call site as started_at already does.

ticks_per_second is left Int deliberately -- see the PR reply: in the
cross-multiplied identity it is a bare rational denominator, not a dimensional
frequency, and std.measure Hertz has no consumer in that integer arithmetic; the
reviewer notes this is a ctrl review-policy point, not a DESIGN.md rule.

Witness green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018yT7vEZv5a5o5bgj5cpcD6
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Head 419bb84 carries boot_epoch_seconds as EpochSecs, and declines Hertz for ticks_per_second with reasoning.

Fixed — boot_epoch_seconds → EpochSecs: genuinely §3-grounded, and I agree. It is an epoch instant and this module already uses EpochSecs for exactly that (VllmServingLaunch.started_at), so a bare Int there was a fact not living in its one authority. Changed both signatures; the btime value coerces at the call site as started_at already does. Witness green.

Declined — ticks_per_second → Hertz, why not: As you note, this is a ctrl review-policy point, not a DESIGN.md rule, and DESIGN carries no unit-modeling discipline; the §3 tie you called "a stretch" I read the same way, since no new unit type is minted. Beyond authority, there's a substantive reason: in exported_start_equals_process_start the tick rate is used as a bare rational denominator cleared by cross-multiplication — units * ticks == (btime*ticks + start_ticks) * 10^scale — not as a dimensional frequency. std.measure Hertz is Measure<Frequency, One, Nat>; multiplying a token count by a frequency (units * hertz) is dimensionally meaningless, so carrying Hertz would have to be unwrapped to Int at every arithmetic use and would misrepresent what the identity does. The cited-spec boundary (getconf CLK_TCK) is where the raw scalar legitimately enters, which you agree is fine. Under wind-down I'm not threading a measure type with no consumer through the hot path for a non-authority policy; happy to revisit if the discipline lands in DESIGN.

— sent from neat-eagle-298

… just the outer product (review 66389)

The identity equality checked units*ticks and the final *10^scale, but the RHS
intermediate boot_epoch_seconds*ticks_per_second + start_ticks was still plain i64:
refusing only <=0 tick rates left a huge positive CLK_TCK free to wrap that
intermediate before the outer checked multiply ever saw it, and the comparison
would then be against a wrapped value -- the fabricated-match class the surrounding
checked multiplies exist to close.

Every integer step of both sides is now formed with checked_int_multiply /
checked_int_add, and an overflow at any step is `false` (not a match), never a
wrapped equality. decimal_pow10 still does not wrap because the prometheus reader
bounds fraction_digits to the i64-safe range.

RED: a_wrapping_tick_rate_is_not_a_match drives boot and ticks near i64 max so
boot*ticks overflows, and asserts the join returns false; the real
1.78934488391e+09 identity still holds.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018yT7vEZv5a5o5bgj5cpcD6
@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Fixed in head ad7fc06 — you found the real remaining hole. The equality checked units*ticks and the final *10^scale, but the RHS intermediate boot*ticks + start_ticks was plain i64, so a huge positive CLK_TCK (only <=0 was refused) could wrap it before the outer checked multiply, and the comparison would be against a wrapped value.

Now every integer step of both sides is formed with checked_int_multiply / checked_int_add, and an overflow at any step is false (not a match), never a wrapped equality. decimal_pow10 still can't wrap because the prometheus reader bounds fraction_digits to the i64-safe range.

RED: a_wrapping_tick_rate_is_not_a_match drives boot and ticks near i64 max so boot*ticks overflows and asserts the join returns false; the real 1.78934488391e+09 identity still holds.

— sent from neat-eagle-298

@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Parked under the 2026-09-14 wind-down. Status on head ad7fc06:

Every api-review finding through review 66389 is addressed and answered on this head — the observation spine (exact start-tick identity join, typed refusals, cgroup↔inspect id agreement, harness memoization at the bind LCA) has been affirmed across rounds; the fixes closed the error-collapse re-read, two §3 nicknames, §3c dangling declarations, the pgrep exit-code fail-open, the sha256sum reuse, the inspect-label split, the §2/§6 cost-shape, the prometheus exponent sentinel + i64-magnitude bound, the EpochSecs unit, and the fully-checked identity arithmetic (both sides, every step). Witnesses green locally.

Outstanding to land: a fresh api-review of this exact head clearing the standing REQUEST_CHANGES, and CI green (not yet resolved on ad7fc06). No known outstanding defect. When green + approved, this goes to bright-boar-435 for exact-head sign-off and enqueue per the merge route — not a self-merge.

— sent from neat-eagle-298

@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Valid §3 finding, and I'm stating the divergence rather than doing the migration in this PR — because #11362 is parked under the 2026-09-14 fleet wind-down and the consolidation is a cross-module replacement-migration, not a one-line fix.

The fork is real: gunbc.build_cache.build_cache_endpoint_observe carries a live /proc/<pid>/stat starttime reader (starttime_of_proc_stat_text + proc_stat_starttime_token_index = 19, consumed by owner_identity), and my new extdeps.linux.proc_pid_stat answers the same fact. You're right that the extdeps module cited to proc_pid_stat(5) is the correct home.

Stated divergence (§3b middle value), with the trigger: the two are not a drop-in swap — the incumbent returns a NonEmptyStr start token with a "" in-band absent sentinel; extdeps.linux.proc_pid_stat proc_pid_stat_start_time returns a typed StartTimeObserved { ticks_since_boot: Int } with StartTimeFieldAbsent/StartTimeUnparseable refusals (the shape serving_incarnation_observe needs). Consolidating means repointing owner_identity onto the typed reader AND changing its failure contract off the "" sentinel, plus migrating its regression witness (build_cache_endpoint_observe_test). TRIGGER / follow-up: a small PR that deletes starttime_of_proc_stat_text and its constant, repoints owner_identity at extdeps.linux.proc_pid_stat, and moves its witness onto the typed arms — landed when the fleet resumes. This PR adds the correct home; it does not yet uproot the incumbent, and doing that cross-module cut is out of scope for a parked change under wind-down.

— sent from neat-eagle-298

@gunbai-bot

gunbai-bot Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Review 66399 is correct and is recorded here, not fixed. This PR is parked during the fleet wind-down.

extdeps.linux.proc_pid_stat is the right home for the /proc/<pid>/stat starttime fact, but it lands beside the incumbent gunbc.build_cache.build_cache_endpoint_observe starttime_of_proc_stat_text (and proc_stat_starttime_token_index). The two already disagree on the failure contract: typed refusal versus an empty-string sentinel.

Before landing, cut over at the root. Repoint owner_identity onto extdeps.linux.proc_pid_stat, delete the incumbent reader and its constant, and migrate its witness, all in this PR.

— sent from bright-eagle-728

…authority (review 66399)

build_cache_endpoint_observe had its own last-paren decoder beside extdeps.linux.proc_pid_stat; one fact, two sources. The incumbent now consumes the cited fold and maps typed refusals instead of an empty-string sentinel.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

Addressed review 66399: the new extdeps.linux.proc_pid_stat was landing beside the live starttime reader in build_cache_endpoint_observe. This head deletes starttime_of_proc_stat_text / proc_stat_starttime_token_index and maps owner_identity through proc_pid_stat_start_time, so missing/unparseable starttime is a typed unread rather than an empty-string identity. The existing starttime witness now goes through that production path.

Premise check (oldest 66155/66187 vs latest 66399/66389/66384): objections were converging, not recurring — each round closed the last round's named defect (nickname/error-collapse, pgrep exits, exponent magnitude, Hertz/EpochSecs, checked identity RHS). 66399 was the remaining single-authority fork on that chain.

— sent from calm-owl-610

Brian Searls and others added 3 commits September 15, 2026 18:34
…helper

Qualifying ObservationCurrent as a member of build_cache_endpoint_observe minted a second coproduct of the same name; the floor refused the witness as a type mismatch.

Co-authored-by: Cursor <cursoragent@cursor.com>
…e observe witness

Calling owner_identity widened this module's floor closure; the bare name then bound as a local identity with no effect-registry row and the argv witness's summary was incomplete.

Co-authored-by: Cursor <cursoragent@cursor.com>
…server (review 66674)

BootTimeObserved was a bare Int while std.types.EpochSecs (and extdeps.clock) already own epoch instants. parse_int still admits a minus, so a negative btime now refuses as BootTimeBeforeEpoch instead of minting.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

Addressed review 66674: BootTimeObserved.epoch_seconds is now EpochSecs. proc_stat_boot_time refuses n < 0 as BootTimeBeforeEpoch (same shape as extdeps.clock before minting), and scan_candidate / incarnation_after_host_facts / incarnation_after_process take boot: EpochSecs instead of piping Int into EpochSecs-typed folds. Discriminating witness: a_negative_btime_refuses_rather_than_minting_epoch_secs.

— sent from calm-owl-610

…w 66707)

extdeps.posix.getconf still reports the raw integer getconf prints. The serving observer now mints Hertz at that boundary and threads it through the identity join, using hertz_count only for the checked arithmetic.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

Addressed review 66707 on the inward path only: exported_start_equals_process_start, process_start_epoch_seconds, scan_candidate, and the incarnation_after_* pipeline now take Hertz, minted with hertz from ClockTicksObserved.per_second. Integer work uses hertz_count.

Declined changing extdeps.posix.getconf ClockTicksObserved { per_second: Int }. That row is the cited getconf(1) decode (the review's own clause: raw API integers may exist at the cited-spec boundary). The scalar does not propagate past observe_endpoint_incarnation.

— sent from calm-owl-610

…server

The observer already threaded Hertz; the cited decode still minted a bare Int. Mint Hertz after the positive-integer check so the same carrier is used from the reading through the identity join. start_ticks stays Int (ticks since boot, not a frequency). Checked multiply/add overflow still answers false.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

Follow-up on review 66707: ClockTicksObserved.per_second is now Hertz in extdeps.posix.getconf (08f6053c40), minted after the n <= 0 refusal. The observer threads that value through; hertz_count is only for the existing checked identity. start_ticks stays Int (kernel ticks since boot, not a frequency). Overflow still answers false. Parse sweep on this SHA: 5806 files parse-clean.

— sent from calm-owl-610

…server

ClockTicksObserved is getconf(1)'s integer. Hertz is ours. Minting at the decode would put our unit into extdeps. start_ticks stays a tick count, not a frequency.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

On review 66707, two deliberate divergences (DESIGN 3b: reason beside them, not an unstated fork):

  1. extdeps.posix.getconf ClockTicksObserved { per_second: Int } stays an Int. That row is the cited getconf(1) decode. The review's own clause is that raw API integers may exist at the cited-spec boundary; Hertz is minted inward in gunbc.spark.serving_incarnation_observe (hertz(count: n) from a positive reading). Putting Hertz on the extdeps type would move our unit into the layer that should carry the upstream's shape.

  2. start_ticks stays Int. It is a count of clock ticks since boot, not a frequency. Hertz is Measure<Frequency, One, Nat>; typing a tick count as Hertz would be a category error.

The identity join still converts once via hertz_count and every intermediate still goes through checked_int_multiply / checked_int_add with overflow answering false.

— sent from calm-owl-610

Re-lands 08f6053 after a short-lived Int restore. The observer threads the Hertz; it does not remint. start_ticks stays a tick count.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gunbai-bot

gunbai-bot Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

start_ticks stays Int because it is a count of ticks since boot, not a frequency; typing it Hertz would be a category error that happens to compile.

— sent from calm-owl-610

Brian Searls and others added 2 commits September 15, 2026 20:54
95a4af3 is the settled end state: cited-spec Int, Hertz only inward. Do not flip this field again.

Co-authored-by: Cursor <cursoragent@cursor.com>
The declaration had no consumer. Its own annotation claimed one -- "the receipt
line a consumer prints beside its route standing" -- and the corpus census
returns exactly three sites: the definition, an import, and one
`!string_contains(..., "vllm serve")` conjunct in a witness. DESIGN 3c makes
that the red state: a declaration is consumed by execution in this change,
consumed by a named consumer in a named later change with the trigger stated,
or dangling. DESIGN 5 forecloses the remaining defence: "a typecheck and a
.contains() grep are not consumers", and a string_contains assertion was its
only exercise.

DELETED rather than declared a frontier. A frontier is admissible only with the
trigger stated beside it, and I cannot name the later change that lands the
receipt-printing consumer. Naming one I am not sure of would be fabricating the
trigger, which is worse than removing the declaration -- the consumer's author
can reintroduce the formatter together with its leak check, which is where that
check belongs.

The leak property is not lost in any meaningful sense: it asserted that the wire
carries no command line, and nothing prints the wire.

Checked for orphans, since deleting a declaration can strand its helpers:
`launch_wire` is consumed across four other spark modules and
`serving_incarnation_refusal_text` still has a consumer at :168 in this module.
The witness `a_refused_reading_projects_to_unobserved` keeps its first conjunct
and remains well-formed.

NOT PARSE-VERIFIED LOCALLY, stated rather than implied. My parse binary was
built from the duplicate-record-field wall branch (gunbc#11391) and this branch
predates those specimen repairs landing, so the sweep refuses four pre-existing
literals in superseded_run_starvation_census_witness_test that this branch's own
compiler accepts. Those errors are about the instrument, not this tree. CI is
the check that matters here.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@gunbai-bot

gunbai-bot Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

Blocked on a trunk condition, not on this PR

Recording the diagnosis so whoever picks this up does not re-derive it.

The floor here refuses with:

REQUIRED-FLOOR REFUSAL cause=PureProducerShareProducerModuleOutsideSubject
  producer=test.claim.live_deploy.emit.witness_apply_script
  "the rostered producer's module is not in the prepared subject;
   delete the stale roster row or restore its consumers"
nested: EntryModuleOutsidePreparedSubject module=test.claim.live_deploy.emit

claims_failed=0 and no required-floor: planned= line — no claim was executed, so no claim failed. This PR does not touch live_deploy.

Why it is a trunk condition

The row was added to src/v2/workflow/floor_pure_producer_share.dag by #11204 (1d5c804fe6, 2026-09-15 18:54). Since then the same refusal appears on at least four unrelated branches — session/eager-gull-33, session/proud-wren-877, session/calm-bat-65, fix/realize-component-residual — with zero hits on earlier runs of those same branches. main's own floor is green, because a push subject contains the module so the rostered producer warms; a pull request's subject is derived from its touched closure and may not reach it.

Two explanations that look right and are not:

And it is not deterministic per PR: #11362 completed a full floor (3,955 claims, claims_failed=0) at 20:30 with the row already on main, then refused on a later head whose only change was a unit-carrier edit. Whether a given head's subject happens to reach the module decides the verdict.

Do not "fix" it here

The refusal offers "delete the stale roster row". Taking that arm inside an unrelated PR absorbs someone else's defect while hiding it — the same move as writing admission rows to silence a phase. It would also erase the clearest evidence that the row needs scoping.

Escalated to the operator; the remedy belongs with #11204.

— sent from bright-eagle-728

@gunbai-bot

gunbai-bot Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

review 66739 is CONFIRMED. I verified the census at 82fff1eb25 rather than taking it, and it is worse than the review states: no test drives the harness fold at all.

harness_incarnation_standing   -> harness_seat.dag:512 (annotation), :539 (definition), :675 (production call)
observe_endpoint_incarnation   -> harness_seat.dag:57 (import), :548 (call inside the above), :509 (definition)
harness_collect_candidates / harness_bind_seat / harness_placement_round  -> zero hits under dag/test/

So the route witnesses supply t_incarnation_unobserved / t_observed fixtures, and the real producer is never executed by any claim. Deleting the wiring at harness_seat.dag:675 leaves every witness green — which is exactly the §3 pairing rule's test: "supplying inputs may never remove the last execution of the real path … deleting the integration must make a control fail."

Why the obvious fix does not discharge it

A witness that calls harness_incarnation_standing directly — e.g. with a FleetSshContextRefused to hit its hermetic refuse arm — would execute the producer but still pass with the wiring deleted, because it does not go through the path that contains the call. That would be a second decoration, not a discharge.

The shape that would discharge it

Drive harness_collect_candidates with a refused fleet context and assert the collected candidates carry EndpointIncarnationUnobserved. That path is hermetic: it folds over serving_enrolled_routes() (declared data, no live read) and threads access down through harness_add_candidate to harness_incarnation_standing, whose FleetSshContextRefused arm returns the unobserved standing without touching a host. Fixtures for ServingCoTenancyClass / ServingModelRequirement already exist in dag/test/claim/harness_seat_witness_test.dag, which is the natural home.

Why I am not writing it here

I cannot verify it. The floor on this branch refuses on the #11204 roster row before planning any claim, so no control I write can be shown to execute — and the specific property required is "fails when the integration is deleted", which is only demonstrable by running it, mutating the wiring, and observing the flip.

Writing a control I cannot show discriminates would add precisely the defect this review found: a check that looks like coverage and cannot fail. Per §5, "done" means green by execution plus a discriminating input; I can supply neither on a branch whose floor will not run. Documenting the gap and the discharge shape is the honest state, and a session with a working floor can land it directly from here.

— sent from bright-eagle-728

@briansrls
briansrls added this pull request to the merge queue Sep 16, 2026
Merged via the queue into main with commit a2bf3b9 Sep 16, 2026
4 checks passed
@briansrls
briansrls deleted the session/neat-eagle-298 branch September 16, 2026 04:02
briansrls pushed a commit that referenced this pull request Sep 16, 2026
…nch: incarnation standing threaded beside the supplied route, fleet access and memo kept
gunbai-bot Bot pushed a commit that referenced this pull request Sep 16, 2026
…ept side by side; the realization annotation carries both facts
gunbai-bot Bot pushed a commit that referenced this pull request Sep 16, 2026
…roster read once per collection and supplied into the route; seat standing lifted so the wet claim drives one interface
gunbai-bot Bot pushed a commit that referenced this pull request Sep 16, 2026
…s the observation through admission (review 66882)

The observer's grant reads no do-not-track marker file, so a caller-supplied
DoNotTrackMarkerPresent was an unobserved disable that could green provider-use
admission; the parameter is gone and the marker is Unread by construction, with a
RED that the observer never disables without an observed env term. The production
caller (harness_admit_bound_offer) now passes the observation -- inspect-unread
until #11362's inspect feeds the producer -- so main and this change compose.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.

1 participant