Skip to content

Enroll extdeps.session_dashboard as a scope carrier (unreds main) - #7644

Closed
gunbai-bot[bot] wants to merge 3 commits into
mainfrom
session/nimble-seal-512
Closed

gunbai-bot[bot] wants to merge 3 commits into
mainfrom
session/nimble-seal-512

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Aug 2, 2026 •

Copy link
Copy Markdown
Contributor

What was red

extdeps_scope_placement_gate_passes (batch 1) refused on main for 10 consecutive ci runs, from #7573 through #7608. It was the sole failure in every one of those runs — the ci job carried no other FAIL, so nothing else was hiding behind it.

Because the required check is ci, this blocked every open PR in the fleet, not just the lane that caused it.

Root cause

dag/extdeps/session_dashboard.dag was added by #7573 and enrolled in none of the three frontier populations that gunbc.extdeps_scope_frontier extdeps_scope_frontier_law requires — not scope_carrier_paths, not scope_machinery_exempt_paths, and (correctly) not the frozen legacy manifest, which is not an admission channel for a new file.

tools.extdeps_scope_placement_gate scope_placement_gate_verdict therefore refused via scope_placement_refused_paths.

How it reached main without its own PR refusing it: the gate landed in #7571 at 8a4e43f62c3 (2026-08-01 17:09:02 -0400) and #7573 merged at ea1c781097e eleven seconds later (17:09:13 -0400). #7573's CI ran against a base where the gate did not yet exist, so the wall never evaluated it. The first run that could see the file was the merge commit's own — on main.

The fix

Exactly the landing state the law prescribes for a new extdeps file — become a scope carrier:

  • dag/extdeps/session_dashboard.dag declares extdeps_model_scope: ExternalModelScope, subject session_dashboard.Api (the service that is the modeled upstream interface), cited to the module's existing extdeps_external_authority_anchor.
  • dag/gunbc/extdeps_scope_frontier.dag scope_carrier_paths gains the row.

The authored shape matches extdeps.github.actions_environment, which #7623 landed independently and correctly — same imports, same ExternalSubjectRef/DeclarationRef structure. That module is not part of this defect; it declared its scope and took its roster row in its own PR.

Verified by execution, not inspection

Against the merged tree, each arm of scope_placement_gate_verdict:

arm result
scope_placement_refused_paths (added ∖ rostered) empty
manifest_freeze_holds (manifest row naming a post-freeze add) none
manifest_remove_only_exit (this change adds a manifest line) manifest untouched → ManifestUntouched
carrier content check (carrier_content_declares_scope) all 4 carriers byte-declare it
roster disjointness holds

Not fixed here — a real design wrinkle, reported separately

scope_placement_added_paths diffs legacy_manifest_freeze_sha..HEAD, not the merge base. So the placement arm judges every extdeps file added since the freeze anchor by anyone, not the files the change itself introduces — which is what extdeps_scope_frontier_law claims it does ("only paths the change itself introduces are judged"). Consequence: once one unrostered file merges, every branch inherits the refusal, and the party who learns is an unrelated lane.

The manifest-freeze arm genuinely needs freeze..HEAD (it must know the whole post-freeze added set). The placement arm does not. Splitting the two bases is the fix, but changing the base semantics of a merge-gating wall is a substantive change that deserves its own review rather than riding along with an urgent fleet unblock.

🤖 Generated with Claude Code

gunbc-ci-auto-heal added 2 commits August 2, 2026 00:10
@gunbai-bot gunbai-bot Bot changed the title main extdeps red Enroll extdeps.session_dashboard as a scope carrier (unreds main) Aug 2, 2026
@gunbai-bot
gunbai-bot Bot marked this pull request as ready for review August 2, 2026 00:14
# Conflicts:
#	dag/extdeps/session_dashboard.dag
#	dag/gunbc/extdeps_scope_frontier.dag
@gunbai-bot

gunbai-bot Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor Author

Superseded by #7556, which landed the same enrollment independently while this was in CI.

Main is green on extdeps_scope_placement_gate_passes again: #7556 added dag/extdeps/session_dashboard.dag to scope_carrier_paths along with its own four extdeps files, and all six files added since legacy_manifest_freeze_sha are now rostered — the refused set computed by scope_placement_refused_paths is empty.

#7556's version is also the better one and I took it wholesale rather than contest it: it declares a real data session_dashboard: SessionDashboard and points the DeclarationRef at that declaration, where this PR pointed decl_name at the session_dashboard.Api service. Naming an actual data declaration is the more faithful reading of the DESIGN section 3 cite-the-symbol rule.

This branch now carries an empty diff against main. The diagnosis in the description stands and is still worth reading — in particular the gate's base-selection wrinkle (it diffs legacy_manifest_freeze_sha..HEAD rather than the merge base, so one unrostered file reds every branch, not just the offending PR) and the fact that the gate returns a bare Bool(false) so its located diagnostic never reaches the CI ledger. Both are unfixed and belong in a follow-up.

@gunbai-bot gunbai-bot Bot closed this Aug 2, 2026
@gunbai-bot

gunbai-bot Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor Author

Correcting one thing I said when closing this, since the review (artifact /api/reviews/46893/artifacts/stdout.log) surfaced evidence against it.

I claimed #7556's version was "the more faithful reading of the DESIGN section 3 cite-the-symbol rule" because it points decl_name at a real data declaration rather than at the session_dashboard.Api service. That overstated it. A dotted service decl_name is an established convention in this corpus — extdeps.bmc.http uses decl_name: "redfish.Http" for exactly that shape, which I verified. Both spellings were conventional, so #7556's is not better on those grounds; it is simply the one that landed first.

The outcome is unchanged — this branch is empty against main and stays closed — but the reasoning in my close comment was wrong and I would rather the record say so.

— sent from nimble-seal-512

gunbai-bot Bot pushed a commit that referenced this pull request Aug 2, 2026
…uling 2026-08-02)

The merge-freshness program the conflict-policy charter named out of
scope: three verified defects (freeze-anchored placement subject with
false law text, missing landing-candidate validation, ProcessExit
evidence collapsed to Bool before FullLedger), the three-subject
observation split, the typed accumulated verdict, the
RunnableProcessExitClaim migration, the MergeQueueOnly/ALLGREEN landing
policy absorbing the existing GatingEnforced trigger, acceptance set
A-F, landing sequence with the queue-first sequencing bar, and the
coordinator's verification receipts and sharpenings. Step 0 recorded as
already discharged (session_dashboard enrolled; #7644 closed unmerged).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
briansrls pushed a commit that referenced this pull request Aug 2, 2026
…uling 2026-08-02) (#7651)

* Generated-file conflict policy: lane charter recording the 2026-08-01 operator ruling

Four-case integration policy (deterministic projection / hand-authored
authority / keyed set-map / roster-naming-outputs), derivation chain with
.gitattributes and git config as projections never authority, commit-writer
admission with the 218dea6 reproduction as lane 1, landing order, and the
hard-reject bars.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: what is our conflict policy for generated files?

* Address review 46546: state the interim status of the invert-hand-maintained row explicitly

The amendment rides with lane 2's implementation by operator sequencing:
amending the row before the modeled policy lands would make the planning
authority assert an emitted .gitattributes while the tree's file is still
hand-authored. The charter now states the interim so no two-instructions
reading exists.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Address review 46572: anchor lane 3's carrier in the charter's typed work set

Adds gunbc.stage0_emit_model generated_stage0_files to additional_works —
it exists on main today and is lane 3's subject. Lane 4's keyed-roster
carrier is deliberately NOT cited: it does not exist on main yet, and its
on-main admission surface (commit_gate_roster) is already anchored.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Address review 46587: cite the invert-hand-maintained row symbolically

gunbc.plans.invert_hand_maintained invert_hand_maintained_body, not a
line number in the projected markdown — the charter's own §3 rule.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Encode the operator second-pass acceptance walls per lane and the corrected merge sequence

Lane 1: complete staged-index observation (population equality, observed
classification, bound provenance receipt, forgery REDs), writer bindings
as countable carriers. Lane 2: converge before the first Git consumer;
named countable clone-rollout carrier; typed read-back refusals; derived
stage0 paths feed merge attributes. Lane 3: refusal preserved through
supply->plan->generation->writer; located output-path collision refusal.
Lane 4: a live path-keyed carrier consumes keyed construction end-to-end;
canonical verdict never collapsed to Bool; coordinator sequencing note on
the deleted incident carrier.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Charter candidate-scoped gates + atomic landing admission (operator ruling 2026-08-02)

The merge-freshness program the conflict-policy charter named out of
scope: three verified defects (freeze-anchored placement subject with
false law text, missing landing-candidate validation, ProcessExit
evidence collapsed to Bool before FullLedger), the three-subject
observation split, the typed accumulated verdict, the
RunnableProcessExitClaim migration, the MergeQueueOnly/ALLGREEN landing
policy absorbing the existing GatingEnforced trigger, acceptance set
A-F, landing sequence with the queue-first sequencing bar, and the
coordinator's verification receipts and sharpenings. Step 0 recorded as
already discharged (session_dashboard enrolled; #7644 closed unmerged).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Address review 46971 (commit vs tree subjects) and repair main's stale ContentHash import

IntegrationCandidate now carries base_commit/candidate_commit as the
ancestry subjects merge-base actually computes over, with candidate_tree
retained separately as the exact-tree admission subject; freeze-law
carriers follow. Also repoints dag/extdeps/transports/rest.dag's
ContentHash import to std.content_hash — main's #7480 re-home left this
module importing from std.types, which breaks main_wet's closure on any
branch (the heal job's failure here); fix identical to #7609's.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* WIP: what is our conflict policy for generated files?

* Complete the fleet heal: seed mints the grounded ContentHash, digest.dag enrolls, regen converges

Three coupled repairs riding the charter PR because main is red without
them: (1) v1_interpreter rest_bound_invocation_value minted a bare Str
input_digest while #7480's model requires the Fnv1a64(Fnv1a64Structural)
coproduct arm — every fixture-match replay witness silently failed
(model/realization fork, hidden behind main's compile error); the seed
now mints the coproduct shape (probed empirically: positional field 0).
(2) dag/extdeps/container/oci/digest.dag gains its ExternalModelScope and
scope_carrier_paths enrollment — the unenrolled-file case the operator's
verdict named live; placement gate now ExitSuccess. (3) regenerated
extdeps_container_oci_digest.rs for the new declaration; fixed point
converges. EMITTER DEFECT FLAGGED, not fixed here: the fully-qualified
module-local reference extdeps.container.oci.digest.extdeps_external_authority_anchor
emitted as crate::extdeps_cargo::... (wrong module, E0308) — first
enrolled carrier in the emitted set exposed the dotted-path resolution
class; the declaration uses the module-local spelling and the defect
belongs to the dotted-path emitter bucket.

Local receipts: replay witnesses 9/9 PASS, placement gate ExitSuccess,
dry artifact gate ExitSuccess, regen second pass clean, build 0 errors.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Address review 47056: tree-kind carrier + HAND-RUST receipt

candidate_tree is now GitTreeObjectId — a kind-refined carrier the
implementation lane introduces in extdeps.git.object_store (which today
types even GitCommitObject.tree as generic GitObjectId; the lane
re-grounds every kind-fixed position, not a charter-local special) so a
blob or tag is unrepresentable as a landing subject. Added the HAND-RUST
GATE receipt for the v1_interpreter rest replay bridge hunk: a
model-conformance repair to an existing seed mint (no new decision
surface; dissolves with the seed's rest transport bridge), checkable by
the 6-red-then-9-green replay witness split.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Address review 47071: DefaultBranchAudit subject is GitTreeObjectId too

Same class as the IntegrationCandidate fix — every audit/admission
subject in the charter is a tree by construction. Swept the doc for
remaining generic GitObjectId type positions; the three other mentions
are prose about the generic carrier itself.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Address review 47097: verdict total over both surfaces, subject on the wrapper, receipt names lane + ROADMAP row

ExtdepsScopeVerdict gains DefaultBranchAuditCovered (the audit surface
had no faithful success result) and ExtdepsScopeRefused carries the run's
ExtdepsScopeEvaluation subject once at the wrapper — refusal arms keep
only law-local facts, the six duplicated per-arm candidate fields delete,
and the rendering law now names identities that flow forward rather than
demanding base/tree on arms that never carried them. HAND-RUST receipt
gains the explicit-deferral header naming the v1-exit lane (zero
hand-maintained Rust finish line) and the witness-realization rest-bridge
trigger, matching the compile-clean-forcecheck receipt form.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

* Receipt records its landing vehicle: the interpreter hunk merged via #7665

The HAND-RUST receipt opened with 'This PR touches v1_interpreter.rs',
which stopped being true when main's piecemeal heal chain (#7656/#7663/
#7665) landed the same repair and the merge dissolved this branch's
inline copy into main's factored helper. The receipt stays as the
program record of the repair's class and triggers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

---------

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

0 participants