Skip to content

The harness roster is derived from the pair heads through the fleet topology; no address is authored - #10627

Merged
briansrls merged 2 commits into
mainfrom
harness-roster-from-spark
Sep 6, 2026
Merged

briansrls merged 2 commits into
mainfrom
harness-roster-from-spark

Conversation

@briansrls

@briansrls briansrls commented Sep 6, 2026 •

Copy link
Copy Markdown
Contributor

Why

The Spark pair heads moved. harness_engine_replica_addresses carried "192.168.1.232" (srv7, the first pair's old front door) as a bare literal. Measured from srv1 on 2026-09-05: .225 (srv6) and .236 (srv9) advertise deepseek-v4-flash:iq3s-split on :30000; .232 does not. Nothing observed the literal until a dispatch refused against it.

What (rebased onto main after #10540)

  • gunbc.harness.harness_wire: harness_engine_replica_roster() = for each group in spark_pair_serving_groups, spark_pair_serving_head(group) → host_lan_address(host). Result is HarnessReplicasResolved { addresses } or HarnessReplicasUnresolved { hosts } when a head has no LAN endpoint row. The authored list and the seed helpers over it (harness_engine_replica_index/_address, harness_engine_backend_url) are deleted; harness_replica_pick(seed, replicas) is the one pick.
  • gunbc.fleet_intent_network: host_lan_address(host) -> NonEmptyStr? reads the topology's endpoints (HostOperatingSystem role, Lan locality), enumerated arms, no wildcard.
  • gunbc.harness.harness_backend: HarnessRosterUnresolved { hosts } arm; the backend observer, harness_serving_backend_url, dispatch selection (roadmap_dispatch_actuator) and the belt provider preflight (roadmap_belt_actuate) refuse on it naming the host.
  • Witnesses: the_replica_roster_derives_from_the_pair_heads (two heads, .225 and .236, seeds spread; RED on Unresolved or a collapsed list); review-guidance spread test uses harness_replica_pick over a fixture roster.

Annotated next move (not here)

The LAN locality is still chosen by the harness. The fabric owes a locus-to-locus resolution (dispatching host → head front door), the same relation fleet_locus_ssh_target computes for ssh; when it exists the roster asks it and stops naming Lan. Brief handed to the operator separately.

Verified

  • gunbc compile --target dag: 0 blocking on harness_cli, roadmap_serve, roadmap_belt_tick_cli.
  • claim_batch --hermetic: harness_chat_shape_test 11/11, harness_review_guidance_test 3/3.

🤖 Generated with Claude Code

https://claude.ai/code/session_019iXPtAqzPaNBZbaaM5rxrY

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 6, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-06T00:18:42.579657Z ac81a2e PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

gunbc-ci-auto-heal and others added 2 commits September 6, 2026 00:18
…srv6 and srv9, not .232

The heads moved. .232 (srv7) was the first pair's front door and stayed in harness_engine_replica_addresses
as a bare literal after Group B's head became srv9 (.236); nothing observed it until a dispatch on srv1
refused against it on 2026-09-05 while .225 and .236 both advertised the model. The roster now names
both heads through gunbc.fleet_intent_network endpoint rows, and its annotation cites the authority it
derives from once that module is on main: gunbc.spark.pair_serving_desired spark_pair_serving_head
(spark-pair-serving, #10540). The srv9/srv10/srv11 identity slots and the srv7..srv11 LAN endpoint rows
are ported from that branch verbatim so it merges onto them unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019iXPtAqzPaNBZbaaM5rxrY
…opology; no address is authored

#10540 put gunbc.spark.pair_serving_desired on main, so the roster stops naming endpoint rows and asks
spark_pair_serving_head for each serving group, then gunbc.fleet_intent_network host_lan_address for
that host's LAN endpoint. A head with no endpoint row makes the roster HarnessReplicasUnresolved, which
the backend observer, dispatch selection, the belt preflight and every harness entry refuse on naming
the host -- never a shorter list. The seed helpers over the authored list (replica_index / address /
engine_backend_url) are deleted; the pick is harness_replica_pick over whatever roster is handed in.

The LAN locality is still this module's choice and is annotated as the next move: the fabric owes a
locus-to-locus resolution (dispatching host -> head front door), the relation fleet_locus_ssh_target
already computes for ssh.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019iXPtAqzPaNBZbaaM5rxrY
@briansrls briansrls changed the title The harness roster names the pair heads (srv6, srv9) through fleet endpoint rows, not a bare .232 The harness roster is derived from the pair heads through the fleet topology; no address is authored Sep 6, 2026
@briansrls
briansrls force-pushed the harness-roster-from-spark branch from ac81a2e to ba25e0a Compare September 6, 2026 00:27
@briansrls
briansrls merged commit 597a56f into main Sep 6, 2026
4 checks passed
@briansrls
briansrls deleted the harness-roster-from-spark branch September 6, 2026 03:01
briansrls added a commit that referenced this pull request Sep 6, 2026
… the CI cost re-cut (#10631)

* The harness roster names the pair heads through fleet endpoint rows: srv6 and srv9, not .232

The heads moved. .232 (srv7) was the first pair's front door and stayed in harness_engine_replica_addresses
as a bare literal after Group B's head became srv9 (.236); nothing observed it until a dispatch on srv1
refused against it on 2026-09-05 while .225 and .236 both advertised the model. The roster now names
both heads through gunbc.fleet_intent_network endpoint rows, and its annotation cites the authority it
derives from once that module is on main: gunbc.spark.pair_serving_desired spark_pair_serving_head
(spark-pair-serving, #10540). The srv9/srv10/srv11 identity slots and the srv7..srv11 LAN endpoint rows
are ported from that branch verbatim so it merges onto them unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019iXPtAqzPaNBZbaaM5rxrY

* The harness roster is derived from the pair heads through the fleet topology; no address is authored

#10540 put gunbc.spark.pair_serving_desired on main, so the roster stops naming endpoint rows and asks
spark_pair_serving_head for each serving group, then gunbc.fleet_intent_network host_lan_address for
that host's LAN endpoint. A head with no endpoint row makes the roster HarnessReplicasUnresolved, which
the backend observer, dispatch selection, the belt preflight and every harness entry refuse on naming
the host -- never a shorter list. The seed helpers over the authored list (replica_index / address /
engine_backend_url) are deleted; the pick is harness_replica_pick over whatever roster is handed in.

The LAN locality is still this module's choice and is annotated as the next move: the fabric owes a
locus-to-locus resolution (dispatching host -> head front door), the relation fleet_locus_ssh_target
already computes for ssh.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019iXPtAqzPaNBZbaaM5rxrY

* Roadmap curation: thirty stale rows superseded with their successors named, five landed rows signed off, the CI cost re-cut

The dispatch view showed 15 ready, 49 upcoming, 0 done: nothing had ever been signed off, and most of the
ready set was either work merged this week or rows whose subject the 2026-08-15 floor cut deleted.

Superseded (identity and id kept so edges still resolve; SupersededLine names what answers now):
- ci-cost x15 (five-minute gate, warm admission, materialization, phased process, scoped worker, discovery
  snapshot, streaming, witness bundle, lens suite, arc ledger, ...) -> DESIGN Building & checks floor cut,
  re-cut as ci-required-run-cost against the live four-phase --required-ci run, measured on its own rows.
- ci-placement x5 -> the 48-job ci.yml and two-host placement no longer exist.
- ci-observation x2 (event grouping, collapse watchdog) -> the deleted job log; honest progress stays on
  observation-scoped-run-consumer.
- roadmap-runtime x5 -> the harness replaced Codex (dispatch_harness_selection, operator ruling 2026-09-04);
  identity-join -> launch identity + roadmap event log; ready-override -> ManualReady + operator cause.
- judgment x2 -> criterion reviewers + goal auditor on the fixed engine.
- fleet-spark-host-enrollment -> #10512/#10517 rows and pair_serving_desired (#10540); serving stays open.

Signed off with executed evidence (witness module/fn, run) and handback PRs: harness-thinking-and-write-briefs,
roadmap-verify-to-publish-phase, roadmap-round-strip-pulse-follows-the-worker, roadmap-continuation-turn-label,
roadmap-round-strip-percolator. The harness row's contract is re-pointed at the roster witness #10627 renamed.

Not touched, deliberately: self-host (v1 delete half is parked by the v1 maintenance standing), namespace,
compute, ci-control, toolchain, shell, source-intent. Those are the operator's call or are the work itself.
The nine "closing-contract" ready rows are derived from nodes lacking a closing validation and follow.

ROADMAP.md regenerated by generated_artifact_gate main_wet.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019iXPtAqzPaNBZbaaM5rxrY

---------

Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
Co-authored-by: Claude Fable 5.1 <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