Skip to content

R3 Substrate Mgr — lane through R3 close - #2758

Closed
briansrls wants to merge 36 commits into
mainfrom
session/warm-wolf-698-expr-substrate-canvas
Closed

briansrls wants to merge 36 commits into
mainfrom
session/warm-wolf-698-expr-substrate-canvas

Conversation

@briansrls

Copy link
Copy Markdown
Contributor

Auto-opened by session-dashboard for session warm-wolf-698.
Pushing to session/warm-wolf-698-expr-substrate-canvas 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.

briansrls and others added 30 commits May 12, 2026 03:35
Director (zesty-bear-812) ratified option (c) at 2026-05-12T07:39:44Z
per PR #2751 comment (session msg_168005e1 to PM deep-wolf-155).

- Status header updated to RATIFIED
- §7 added with 4 ratification points + cascade implications:
  1. Expression sum-type at dsl/extdeps/github/actions.dag: RATIFIED
  2. Single OpaqueString variant + 🟡 YELLOW: RATIFIED
  3. Three-condition dissolution trigger: RATIFIED
  4. 5-site uniform migration: RATIFIED
- Cascade documented: cool-carp-720 (WI-2) Expression wrapping;
  stern-stag-854 (Slice 4-5) emit logic stays trivial; PR #2746 can
  reference ratified Expression substrate

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Operator BLOCKING inline review on PR #2751 at :34 (briansrls
2026-05-12T07:45:24Z) flagged that actions.dag has Job.if_condition
+ RunStep.if_condition + UsesStep.if_condition (3 if_condition sites),
not 1. Same expansion applies to env: RunStep.env + UsesStep.env (2
sites), not 1.

Finding accepted. Actual migration scope is 7 sites total:
- Job.if_condition (:117)
- RunStep.if_condition (:154)
- UsesStep.if_condition (:163)
- RunnerSpec (new ExpressionRunner variant)
- ConcurrencySpec.group (:?)
- Step.with[k] (UsesStep:160)
- RunStep.env (:151) + UsesStep.env (:162)

Updates:
- §1 table: if_condition row shows 3 sites; env row shows 2 sites
- §1 narrative: "seven expression sites" with enumeration
- §2 (a/b/c) code samples: all 7 sites in option (c) sketch; Step
  carrier modeled with RunStep/UsesStep variants properly
- §3 reasoning point #1: explicit P2/P5 framing — leaving any
  if_condition/env site un-migrated creates hidden parallel authority
  (typed at one site, opaque at others) blocking P5 dissolution at
  un-migrated sites
- §5 / §6 / §7 site-count refs updated
- §7 site-count correction note: framing the expansion as
  site-count correction, NOT substrate-shape correction — ratification
  point #4's "single-authority for expression substrate" already covered
  ALL expression sites in actions.dag uniformly; 7-site scope is
  implementing-PR responsibility

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Operator BLOCKING #2 on PR #2751 at :214 (briansrls 2026-05-12T07:45:24Z):
the §4 dissolution target sketched a pure Expression AST, but GH Actions
expression-bearing scalars are template strings with alternating literal-
text and ${{...}} segments (e.g., concurrency.group:
${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}).
A pure-AST terminal shape under-models what the platform actually parses,
violating INVARIANTS.md P1 (modeling faithfulness).

Finding accepted. §4 dissolution target corrected to two-layer shape:

  Expression
    = OpaqueString(String)
    | Template(List<TemplateSegment>)

  TemplateSegment
    = TextSegment(String)
    | ExpressionSegment(ExpressionAst)

  ExpressionAst = Literal | Var | BinOp | Func | Index (etc.)

This is extdeps-faithful: mirrors the platform's actual parse structure
(template-string layer over expression-AST layer). Pure-literal /
pure-expression / mixed scalars all collapse cleanly into the segment
list.

Original sketch preserved as authoring-evolution record; corrected shape
supersedes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Operator BLOCKING #3 on PR #2751 at :258 (briansrls 2026-05-12T07:45:24Z):
§6 open question #1 incorrectly treated record form and one-arm sum as
equivalent. A record form (type Expression { value: String }) does NOT
preserve:
- Single-arm pattern-match property on consumers (record access
  projects to .value as String; no tag to match)
- Single-edit second-variant dissolution path (record → sum is a
  carrier-shape change, not a one-line declaration edit; every
  consumer must be rewritten to switch from .value access to
  pattern-match)

This breaks Practice 4 (coproduct dissolution) and P5 (Progress Is
Dissolution) — the dissolution receipt the YELLOW classification
relies on assumes the dissolution is cheap; record form makes it
expensive.

Q#1 resolved inline: Expression lands as a one-arm sum
(type Expression = OpaqueString(String)), NOT a record. This was
implied by §3 reasoning point #4 ("Pre-empts the type-alias trap")
which applies equally to record-form aliases, but the §6 framing
treated both as admissible — corrected.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* docs: add CI workflow emitter-dispatch canvas

* WIP: T-WAD FULL R3 emitter-dispatch architecture canvas (PR #2744 brief; outp

* WIP: T-WAD FULL R3 emitter-dispatch architecture canvas (PR #2744 brief; outp

* WIP: T-WAD FULL R3 emitter-dispatch architecture canvas (PR #2744 brief; outp

* docs: align workflow emitter canvas with substrate comparison

* WIP: T-WAD FULL R3 emitter-dispatch architecture canvas (PR #2744 brief; outp

* WIP: T-WAD FULL R3 emitter-dispatch architecture canvas (PR #2744 brief; outp

* docs: keep InlineGunbc out of initial target enum

* WIP: T-WAD FULL R3 emitter-dispatch architecture canvas (PR #2744 brief; outp

* WIP: T-WAD FULL R3 emitter-dispatch architecture canvas (PR #2744 brief; outp

* WIP: T-WAD FULL R3 emitter-dispatch architecture canvas (PR #2744 brief; outp

* WIP: T-WAD FULL R3 emitter-dispatch architecture canvas (PR #2744 brief; outp
* docs(r3): expand R3 lanes to 12 + lens-framework invariant + analysis findings

User directive 2026-04-30: "nothing can be deferred past R3 - we have to
readjust R3 if something is missing." PM-driven audit + Director ratification.

R3 lane expansion (10 → 12):
- T-V2-Retirement (NEW; PB Manager continuation): src/v2/ retirement
  cascades from T-FixedPoint + T-LensProducer-Retirement; structurally
  cheap to pull in. Gates: v2_oracle_no_remaining_test_consumers +
  v2_directory_deleted.
- T-Free-Consequences-Demonstration (NEW; Verification Manager): 10-gate
  TestClaim suite operationalizing thesis "free consequences" framing.
  Auto-parallelism + auto-memoization + cross-target opt + space-bound CX.
  Loop-iteration parallelism: sequential default + opt-in via
  Lens<Iteration-Independence> (zero-heuristic; same shape as
  Lens<Bind-Independence>).

Priority corrections folded into existing lanes (no new lanes):
- C1 (T-Tier3-Dissolution sub-gate): tier3_mirror_dissolution_perf_within_budget
  with thresholds <=2x median, <=5x p99 (cargo bench fixtures per retired
  mirror).
- C2 (Substrate continuation, T-Anthropic-Wire scope expansion):
  ProviderTypedWire<P> carrier extracted IN R3 (path (a) commit; drops the
  prior 6-month elapsed-time check exactly per user directive).

design-lens-framework.md amendment:
- Lens.read MUST depend only on (Node, Behavior) pair, not external state.
- Locks memoizable shape; runtime memoization becomes auto-memoization free
  consequence instance (T-Free-Consequences-Demonstration).

ROADMAP.md additions (### Post-merge debt (2026-04-30 analyses)):
- 4 novel findings from paired exploratory + reflective analyses
  (gpt-5-5-pro 991114f / gpt-5-5-thinking ad016c5):
  * Duplicate record-literal fields silently dropped (highest-value bug)
  * ValueBody Rust<->.dag mirror drift; no isomorphism gate
  * FieldMap duplicate-free invariant lost in .dag mirror
  * Operator inference fabricates (T,T)->T for non-algebra LHS
- 8 reflective-analysis priority corrections folded into R3 trajectory
- 2 stale rows marked RESOLVED (repeat_string + lower_fn_body re-derive)

Routed to R3 Mgrs via inbox dispatches (#1130 / #1131 / #1133 / #1276 / #846).

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

* docs(roadmap): reframe Rust<->.dag isomorphism as producer-first

cool-crab-614 PR #1324 research reframed the proposal: missing substrate
is a reflected-Dag query/report PRODUCER (Lens<DagShapeReport>), not a
new predicate variant. RustDagIsomorphism becomes a CONSUMER (TestClaim
comparing two DagShapeReport outputs via BinaryDimensionReportEquals),
eliminating parallel-authority risk.

Reflection-aware modifiers for unified BinaryDimensionReportEquals now
cover 4 surfaces: TC1 eta-equivalence + TC2 strategy-order + TC3
evaluation-step + shape-report (reflected-Dag query).

Single substrate-introduction; multiple consumers via reflection-aware
modifiers.

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

* docs(roadmap): fix lower_fn_body row citation per #1319 review

PR #1319 review (cursor 9d2dffb) flagged that the RESOLVED note cited
`src/v3/compiler/src/lower.rs:61670-61688` but lower.rs is only 7919
lines. Original line citations referenced the analysis snapshot's
aggregate-numbering scheme, not live file.

Verified live state: `lower_fn_body_into_existing_decl` symbol does NOT
exist in current lower.rs; equivalent path is `lower_fn_item_expr_body`
(:4410+); non-Arrow arm at :4433-4451 reports
`Diagnostic::ResolveError` with explicit invariant-violation message
("violated lowering invariant: seed_function_signatures_phase did not
produce an Arrow connective for this Fn") and returns outer_scope.
That IS the fail-closed shape the original row asked for; resolution
note now correctly cites live behavior.

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

* docs(r3): resolve v2-retirement contradiction per #1319 review

PR #1319 review (codex a9a9894) flagged contradiction: T-V2-Retirement
added as R3 lane (line 100) but Compromises table (line 165) still
listed v2 retirement as Post-R3 operational cleanup. INVARIANTS P1
"Documentation Describes Live State" violation.

Fix: strikethrough the post-R3 entry; explicitly note migration into
R3 as T-V2-Retirement lane per 2026-04-30 user directive "nothing can
be deferred past R3." Single authoritative placement; cross-link to
Lane structure §11.

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

* WIP: gunbc Director

* WIP: gunbc Director

* docs(r3): aggregator pattern — coercion table + precondition + exclusion rules

Addresses BLOCKING #2748 (briansrls inline at L71): live §1.8 uses 7 status
values, not 3 (PASSING, SATISFIED-BY-CONSTRUCTION, CONSUMER_LANDED, DECLARED,
R3-LOAD-BEARING, HELD-CANVAS-DEFERRED, DEFERRED). The 3-value lattice meet
was not machine-checkable as written.

- Coercion table: SATISFIED-BY-CONSTRUCTION → PASSING; INTEGRATION_RECEIPT
  partial-slice → CONSUMER_LANDED; identity for the 3 lattice values.
- Precondition rule: bare R3-LOAD-BEARING is scope-metadata, not closure
  progress; constituents with that status are not aggregator-ready until
  cell inlines closure-progress (e.g., 'R3-LOAD-BEARING — DECLARED').
- Exclusion rule: DEFERRED + HELD-CANVAS-DEFERRED MUST NOT appear in any
  aggregator's depends_on: per §1.5 honest-close arithmetic.
- Cluster F candidate reframed: NOT aggregator-ready at HEAD because rows
  #81/#82/#83/#95 carry bare R3-LOAD-BEARING; precondition fix required
  before pilot. Cluster M / K / V2-Retirement candidates similarly subject
  to precondition check at pilot time.
- Invariants P2 cleanliness note: coercion table + precondition + exclusion
  are themselves a single derivation authority; no parallel authority for
  closure progress.

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

* docs(r3): cascade ci_yml_deleted → ci_yml_hand_authority_dissolved rename

Per PM cascade (PR #2744 commit 19a1d8d absorbing briansrls BLOCKING
on line 32): file artifact presence is orthogonal to hand-authority
dissolution. YamlStatic / BinaryShim / PythonShim all require some
.github/workflows/ci.yml for GH Actions trigger discovery; P5 / Pure
Bootstrap dissolves authority, not file presence.

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

* docs(r3): relocate aggregator pattern from §1.8 to §1.9 per codex P2 finding

Addresses codex REQUEST_CHANGES /api/reviews/9982 on PR #2748: putting
aggregator rows directly in §1.8 alongside their constituents violated
INVARIANTS P2 single-authority — even with "derived not hand-set" prose,
the row shape didn't structurally prevent treatment as a closure
obligation, and the side-taxonomy of "does not participate in §1.7
corpus rules" was a P2 boundary-discipline violation inside the
canonical ledger.

Restructured:
- Aggregators relocated to a NEW §1.9 section (separate table)
- Distinct ID namespace: V1, V2, ... (NOT numeric §1.8 row IDs)
- Different table columns (View ID / View Name / Cluster Lane /
  depends_on: / Derived Status / Notes) to make visual distinction
  obvious
- depends_on: references §1.8 row #s by foreign-key style
- Derived Status rendered as <DERIVED> in committed text; never stored
  as snapshot (per feedback_no_snapshot_integers_in_briefs)
- §1.8 "97 enumerated / 96 R3-load-bearing" arithmetic preserved
  unchanged; §1.9 entries do not appear in that arithmetic
- Coercion table + precondition + exclusion rules carried forward
- Cluster F precondition catch (rows #81/#82/#83/#95 carry bare
  R3-LOAD-BEARING) preserved

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

* docs(r3): annotate R4-carve citation with supersession marker

Fixes CI failure on PR #2748: scripts/check-r4-carve-dissolution-discipline.sh
flagged the coercion-table row for R3-LOAD-BEARING which mentioned 'R4-carved'
without a supersession annotation. Reframed to cite carve-promotion-IN-R3
2026-05-09 + DISSOLVED status per Director ratification gunbc#846.

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

* docs(r3): correct #83 characterization + add filename note

Per cursor APPROVE_WITH_COMMENTS /api/reviews/10000 on PR #2748:

- Row #83 (lens_capability_register_zero_proxy_zero_stub) was incorrectly
  listed alongside #81/#82/#95 as carrying "bare R3-LOAD-BEARING". The
  authoritative ledger has #83 reading "DECLARED — full scope IN R3
  (carve-promotion-IN-R3 2026-05-09)", which inlines closure-progress
  alongside scope-metadata and already coerces to DECLARED under the
  precondition rule. Reframed #83 as a positive counter-example showing
  the inline-pattern #81/#82/#95 still need to adopt.

- Added top-of-doc filename note explaining the §1.8 vs §1.9 mismatch:
  filename retained for review-thread anchor stability; substantive
  section is §1.9.

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

* docs(r3): add sunset condition for aggregator pattern pilot doc

Per cursor /api/reviews/10013 optional tighten: PILOT scaffold needs a
single checkable sunset to satisfy P5 scaffold-posture discipline.
Sunset: doc retires when docs/r3-program-plan.md contains §1.9 per the
specified table shape AND at least one §1.9 view entry is live in the
ledger.

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

* docs(r3): add composite-status coercion rule (CONSUMER_LANDED + PASSING)

Addresses briansrls BLOCKING inline at L66 on PR #2748: coercion table
omitted live §1.8 composite forms like 'CONSUMER_LANDED + PASSING'
(~25 instances in the ledger, including candidate Cluster M constituent
#86 program_generator_carrier_landed).

Added:
- Explicit row for 'CONSUMER_LANDED + PASSING' → PASSING
- General composite rule '<earlier> + <later>' → coerce to <later>
  (rightmost component; conjunction-of-progression-stages semantics);
  covers future composite forms not enumerated.

This makes #86 view-ready under the precondition rule (coerces cleanly
to PASSING).

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

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* WIP: T-WAD FULL R3 ci.dag scaffold first-draft (PR #2744 brief; output dsl/ex

* WIP: T-WAD FULL R3 ci.dag scaffold first-draft (PR #2744 brief; output dsl/ex

* WIP: T-WAD FULL R3 ci.dag scaffold first-draft (PR #2744 brief; output dsl/ex

* WIP: T-WAD FULL R3 ci.dag scaffold first-draft (PR #2744 brief; output dsl/ex

* WIP: T-WAD FULL R3 ci.dag scaffold first-draft (PR #2744 brief; output dsl/ex

* WIP: T-WAD FULL R3 ci.dag scaffold first-draft (PR #2744 brief; output dsl/ex

* docs: add CI workflow emitter-dispatch canvas

* WIP: T-WAD FULL R3 ci.dag scaffold first-draft (PR #2744 brief; output dsl/ex

* WIP: T-WAD FULL R3 emitter-dispatch architecture canvas (PR #2744 brief; outp

* WIP: T-WAD FULL R3 ci.dag scaffold first-draft (PR #2744 brief; output dsl/ex

* WIP: T-WAD FULL R3-close — Slices 4/5/8 (T-CI-WAD program-tag)

* WIP: T-WAD FULL R3-close — Slices 4/5/8 (T-CI-WAD program-tag)

* WIP: T-WAD FULL R3-close — Slices 4/5/8 (T-CI-WAD program-tag)

* docs: add T-CI-WAD slice 4 skeleton

* WIP: T-WAD FULL R3-close — Slices 4/5/8 (T-CI-WAD program-tag)

* docs: clarify T-CI-WAD projection sketch

* docs: align T-CI-WAD prep with c-refined shape

* WIP: T-WAD FULL R3-close — Slices 4/5/8 (T-CI-WAD program-tag)
* docs(r3): flip §1.8 #85 forall_exists_quantifier_substrate_landed to CONSUMER_LANDED + PASSING

PR #2647 (vivid-dove-106 / Cluster M Phase 1a) merged carriers into src/v3/std/verification.dag at HEAD; ledger row was drifted DECLARED. Per post-merge ledger-receipt sync discipline (Director-ratified at gunbc#828 c#4415884211).

Caught by Debt-Paydown PM ledger-sync check — thanks silent-ram-834.

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

* docs(r3): downgrade §1.8 #85 to DECLARED per codex BLOCKING + row #17 precedent

Prior CONSUMER_LANDED + PASSING flip overstated the gate per INVARIANTS §P2 strict reading: carriers + hand-written ratchet ≠ generated consumer proof. Mirrors row #17 (numeric_abstract_carriers_landed) shape: carrier substrate landed, hand-written ratchet noted, CONSUMER_LANDED deferred to generated consumer + SuiteClaim wrapper migration + V Mgr #87 runner consumer.

Sibling row #86 carries same overclaim risk via PR #2645 precedent — separate amendment if Director rules.

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

* docs: T-WAD substrate-shape comparison canvas (gate #56)

Mgr-tier comparison canvas surfacing three substrate-shape options for
gate #56 ci_workflow_modeled_as_dag under FULL R3-close elevation:

- (a) PR #2736 provider-neutral CIWorkflowDag (semantic-only)
- (b) WI-1 PR #2746 actions.dag-concrete + EmissionTarget? (transport-only)
- (c) Hybrid — CIWorkflowDag as semantic source + Workflow.emission_target
  as transport-artifact selector + projection function project_github_actions:
  CIWorkflowDag -> Workflow as the structural fold connecting them

§0 grep-verifies PR #2736 body claim ("hand-authored GitHub Actions transport
copy was removed") against actual diff: actions.dag Workflow/Job/Step
carriers at :21/:110/:147 intact; PR adds CIWorkflowDag without removing
actions.dag carriers, leaving dual-authority unresolved at HEAD.

§5 recommends option (c) for Director ratification on:
- single-authority per concept layer (gate-dependency at gunbc.ci;
  transport at extdeps.github.actions) per MODELING.md M9
- decoupled cost-of-change axes (new provider vs new emission target)
- preserves both already-authored PRs' substrate contributions
- aligns with docs/design-emission-model.md single-emitter discipline

Authority: PM relay msg_a945b141 (deep-wolf-155) routing Director
msg_34e9a381 substrate-shape question per
feedback_substrate_shape_belongs_in_mgr_canvas.

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

* docs: §7 addendum — INVARIANTS P1 reframes (c) to (c-refined)

BLOCKING inline review on PR #2746 (briansrls c#4427988541) flagged
that adding EmissionTarget to dsl/extdeps/github/actions.dag puts a
gunbc emission-policy fact into the GitHub Actions platform model,
violating extdeps fidelity and INVARIANTS P1.

§7 accepts the finding (structurally correct per actions.dag header
:1-12 platform-vs-CI-logic discriminator), disqualifies §1 option (b)
as-authored, partially invalidates §1 option (c) as-authored (the
two-layer concept-layering argument STILL holds; only the EmissionTarget
placement on extdeps fails P1).

§7.3 surfaces option (c-refined): EmissionTarget lives in gunbc/ci.dag
as a sum type + parameter to project_github_actions(ci_workflow_dag,
target) -> Workflow. extdeps.github.actions.Workflow is unmodified.
Pinned Workflow values for emission validation live in gunbc namespace.

§7.5 revises ratification asks: PR #2746 disposition shifts from
"framing-narrowing" to substantive substrate retraction on the field-
placement decision (sum-type shape stands; placement relocates).

§7.6 distinguishes (c-refined) from PM-proposed alternatives:
- not PM(b) [EmissionTarget on CIPipeline] — same M9 join-cost as
  PR #2746 §3 Option B
- not PM(c) [WorkflowEmission wrapper] — same sibling-decision cost
  PR #2746 §3 Option C already rejected
(c-refined) expresses emission-target choice at the projection
invocation (per docs/design-emission-model.md: emission is structural
projection, choice is property of the call not the value).

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

* docs: §8 retraction — derive Workflow from projection, not separate authority

codex REQUEST_CHANGES on PR #2749 (review 9970) flagged that option (c)
as authored proposed both a projection function CIWorkflowDag -> Workflow
AND a separately hand-declared Workflow value the emitter "validates
against" as a pinned target — INVARIANTS P2 / modeling-discipline.md
Practice 5 dual-authority condition.

Finding accepted. §8 retracts the pinned-Workflow-as-modeled-authority
framing; in-place edits applied to §1 (option (c) intro), §4 (S0
sequencing), §5 (ratification ask #5), §7.3 (WI-2 placement), §7.5
(revised recommendation).

Replacement framing: the only Workflow value in modeled authority is
the projection function output, structurally derived from a single
source. WI-2's gunbc_ci_yml_workflow becomes a name binding to the
derived result (data gunbc_ci_yml_workflow: Workflow =
project_github_actions(ci_workflow_dag, YamlStatic)), not an
independent declaration. Byte-level regression fixtures live in
tests/, not dsl/, and are not part of modeled authority.

Layering argument unchanged: gate-dependency at gunbc.ci.CIWorkflowDag;
platform transport at extdeps.github.actions.Workflow (unmodified);
emission policy in gunbc namespace; artifact derived from single source.

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

* docs: cite feedback_extdeps_header_discriminator_before_field_placement

Per PM relay msg_72e2ab50: Director memorialized actions.dag:1-12
discriminator rule as feedback_extdeps_header_discriminator_before_field_placement.
Add citation in §7's discriminator block for audit trail.

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

* WIP: R3 Substrate Mgr — lane through R3 close

* docs: cite P2 (Boundary Discipline) not P1 for single-authority

gpt-5.5-pro APPROVE_WITH_COMMENTS review 9972 caught that the
single-authority / "every fact lives in exactly one place" principle
is INVARIANTS.md P2 Boundary Discipline, not P1. P1 is Modeling
Faithfulness.

Operator BLOCKING quote at §7 invoked "P1" verbatim; both principles
are in play:
- P2 because emission-policy authority must live in exactly one place
  (gunbc/ci.dag), not split across extdeps and gunbc
- P1 because placing gunbc-policy state on an extdeps carrier makes
  the carrier no longer faithful to its header's "platform facts
  only" claim

§7.1 prose updated to explicitly distinguish the two principles and
note that subsequent single-authority references cite P2.
§7.4 table row relabeled "INVARIANTS P2 (Boundary Discipline / single
authority)".
§7.5 ratification ask #2 cites P2 + P1.
§7 heading updated to "INVARIANTS P2/P1 BLOCKING reframes (c)".

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

* docs: classify EmissionTarget coproduct per Practice 4 (§7.3.1)

BLOCKING inline review on PR #2749 at line :573 (briansrls
2026-05-12T07:04:15Z): proposed EmissionTarget 4-variant coproduct
landed without 🟢/🟡/🔴 dissolution classification, violating
modeling-discipline.md Practice 4 (coproduct dissolution).

Finding accepted. §7.3.1 added classifying EmissionTarget as
🟡 YELLOW (scaffold) with full reasoning across all four dissolution
patterns:
- Pattern 1 (fact placement): N/A — empty payloads
- Pattern 2 (variant-is-data): blocked by closed-set guardrail
- Pattern 3 (algebraic form): N/A — not std/ algebraic operations
- Pattern 4 (dimensional): live dissolution path; ~2-3 axes
  (target_language, requires_shim, runtime_executes) plausible but
  not yet forced at four variants

YELLOW not GREEN: Pattern 4 plausibly works; closing the door would
be wrong. YELLOW not RED: dissolving prematurely without consumer-
side pressure risks landing wrong axes (requires_shim partially
redundant with target_language at current variants).

Named dissolution trigger (per YELLOW requirements): (a) fifth
target landing that breaks the four-way axis, OR (b) consumer needing
single-dimension pattern-match, OR (c) Slice 4/5 implementation
surfacing an unpredicted axis. Any forces dimensional record shape.

Ledger note: classification is canvas-level; implementing PR (WI-2
re-brief per §5/§7.5 ask #4) MUST carry the same classification +
trigger as a // 🟡 YELLOW (scaffold) comment on the type declaration
citing this canvas §7.3.1.

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

* docs: canvas RATIFIED — §9 ratification dispositions

Director (zesty-bear-812) ratified option (c-refined) at
2026-05-12T07:04:18Z per PR #2749 comment (session msg_4f7f536d
to PM deep-wolf-155). Updates:

- Status header changed to RATIFIED with ratification authority
  citation
- §9 added with all 5 ratification asks dispositioned:
  - (c-refined) substrate-shape: RATIFIED
  - PR #2746: AMEND (4 specific changes for still-heron-763)
  - PR #2736 body: SATISFIED prior
  - PR #2745 WI-2: SCOPE EXPANSION APPROVED, PM authors re-brief
  - S1 projection function: NEW §1.8 GATE (project_github_actions_landed,
    substrate-shape family); aggregator pilot row #56+4→#56+5
- Downstream cascade documented per Director directive

Director attributed feedback_extdeps_header_discriminator_before_field_placement
discipline rule to the §7+§8 self-correction trajectory.

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

* docs: inline SUPERSEDED banners on §1(c)/§2.3/§3/§4/§5

codex BLOCKING review 9986 at sha 38c28cd flagged that §2.3/§3/§5
still contain the now-overturned option-(c)-as-authored framing
(EmissionTarget on extdeps.Workflow + hand-declared pinned Workflow).
For a RATIFIED canvas, leaving those sections unmarked materially
states the wrong substrate shape — readers would have to read through
to §7/§8/§9 to discover the supersession.

Finding accepted. Inline SUPERSEDED banners added at the top of:
- §1 Option (c) sub-section: points to §7.3/§7.4/§8/§9 for current shape
- §2.3 Option (c) evaluation: flags the "emission validates declared
  Workflow against projection" sentence as the dual-authority condition
  §8 retracts
- §3 WI-1 assumption-breakage: OVERTURNED bullets explicitly listed
  (placement, "Workflow chooses target" framing, framing-narrowing
  disposition)
- §4 Slice sequencing under (c): SUPERSEDED in part — structure
  remains valid under (c-refined); placement-specific descriptions
  overturned by §7/§8; WI-2 scope larger than §5.4 implied per §9 ask #4
- §5 Recommendation: all three positions (extdeps placement,
  framing-narrowing PR #2746 disposition, pinned-Workflow validation
  target) OVERTURNED; current recommendation is (c-refined) per §7.5+§9

Earlier framings preserved as canvas-evolution record (showing
self-correction trajectory through §7+§8), but each affected section
now flags its own superseded status without requiring a full-doc read.

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

* docs: §6 Q#2 RESOLVED banner — overturned superseded Workflow framing

cursor APPROVE_WITH_COMMENTS review 10001 (non-blocking) noted that §6
open question #2 still partly explained the projected signature via
"PR #2746 places the field on Workflow", which contradicts §7.3
(c-refined) where extdeps.github.actions.Workflow is frozen unmodified.

Fix: add inline RESOLVED banner at §6 head pointing to §7.3 + §9; rewrite
Q#2 entry to flag the superseded framing inline — the parametric
signature was the right answer regardless of placement, but the rationale
over-attributed to a placement that no longer stands.

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

* docs: inline 🟡 YELLOW checkpoint at §7.3 EmissionTarget declaration

Operator BLOCKING inline review on PR #2749 at :657 (briansrls
2026-05-12T07:58:34Z): the §7.3 code block declaring type
EmissionTarget lacked the inline 🟢/🟡/🔴 classification annotation
required by modeling-discipline.md Practice 4 "any new enum with
N ≥ 2 variants must have a checkpoint comment naming its classification."

The classification reasoning exists in §7.3.1 prose section, but the
declaration site itself was missing the checkpoint comment, which is
the form Practice 4 requires.

Fix: add inline 🟡 YELLOW (scaffold) comment block above the type
declaration citing §7.3.1 for full reasoning + the three-condition
dissolution trigger + likely Pattern 4 dissolution path.

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

* docs: §7.3.2 Shape A/B clarification — EmissionTarget names realization modes

Operator BLOCKING inline review on PR #2749 at :657 (briansrls
2026-05-12T07:58:35Z): YamlStatic variant of EmissionTarget would
"make a Shape B CI YAML artifact mode an emission target despite
THESIS Shape A/B requiring YAML artifacts to be generated by .dag
user programs, not compiler emission targets."

Per THESIS:215-216, Shape A = compiler language targets (compiler
emits directly); Shape B = user-program artifacts (YAML, Terraform,
K8s, etc. — emitted by .dag programs walking typed values, NOT
compiler render targets). YAML for ci.yml is Shape B; gunbc
doesn't have a YAML emission target.

Finding accepted as naming-and-framing concern, not substrate-shape
concern. Added §7.3.2 clarifying:

- EmissionTarget names a REALIZATION MODE selector, not a parallel
  compiler emission target
- YamlStatic = Shape B (.dag program renders YAML from Workflow)
- BinaryShim = Shape A binary + Shape B YAML shim wrapper
- PythonShim = Shape A Python + Shape B YAML shim wrapper
- InlineGunbc = Shape A (gunbc runtime as host)

No substrate retraction: variants, YELLOW classification, dissolution
trigger, gunbc-namespace placement, parametric signature all stand.
Naming consideration noted (WorkflowRealizationMode would carry less
Shape-A baggage), but renaming forces re-ratification without
corresponding substrate change — keep name, document the mapping at
declaration site per §7.5 ask #4 implementation PR.

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

* docs: fix §9 ask #5 slice/gate name — Slice 8 ci_yml_dissolved, not Slice 5 ci_yml_deleted

gpt-5.5-pro REQUEST_CHANGES on PR #2749 sha f5b57e7 (review 10037)
caught that §9 ratification ask #5 wrote the projection-function gate
as "discrete from Slice 5 (ci_yml_deleted, state-check)", but per the
canvas's own §1 (Director-ratified gate-set) and §4 Slice sequencing:
- Slice 5 = BinaryShim emitter (workflow_emission_target_toggle_proven)
- Slice 8 = ci.yml dissolution (gate name: ci_yml_dissolved)

The conflation could mislead workers updating PR #2748 to wire the new
project_github_actions_landed gate against the wrong slice/gate.

Fix: §9 ask #5 now reads "discrete from Slice 8 ci_yml_dissolved",
matching the canvas's earlier authoritative gate-set + §4 sequencing.

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

---------

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
codex BLOCKING (review on sha 4f41aeb) + operator BLOCKING inline at
:315 (2026-05-12 ~09:12Z): site inventory was keyed to ci.yml examples
not actions.dag schema + GH Actions context-availability docs.
Under-modeling the platform expression-capable surface by ~15 sites.

Finding accepted as substantive scope correction. Added §5.5 with
full audit table against actions.dag HEAD + GH Actions docs:

Total expression-capable surface: 22 fields across Workflow / Job /
RunStep / UsesStep / ConcurrencySpec / RunnerSpec. The 7-site
enumeration was the ci.yml-keyed minimum subset; the
actions.dag-keyed audit extends to 22.

§5.5.1 sets migration rule: ALL expression-capable fields migrate
uniformly under (c). Per-field opt-in produces hidden parallel
authority (P2/P5 violation). Implementing PR audits against actions.dag
HEAD + GH Actions context-availability docs and migrates any
additional sites surfaced.

§5.5.2 surfaces typed-field expression semantics as new substantive
question (§6 Q#4) — timeout_minutes/continue_on_error/cancel_in_progress
are typed fields where GH Actions string-coerces expressions. Three
candidate shapes (wrap / TypedOrExpression sum / defer); Director-tier
choice.

§5.5.3 retains §1/§2 7-site framing as ci.yml-keyed reference;
substrate-shape ratification covers expanded 22-site scope per §5.5.1
migration rule.

§6 Q#2 sequencing updated to "22 expression-capable fields"; new Q#4
adds typed-field semantics question.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Per PR #2749 commit 575eb7e (rename EmissionTarget → WorkflowRuntime
to resolve P2 name-collision with src/v3/SELF_HOSTING.md:609 Shape-A
EmissionTarget), update the single cross-reference in §7 here to match
the new name. Substantive content unchanged — orthogonal-axes argument
still holds.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…-ext

codex REQUEST_CHANGES on PR #2751 review 10083 (sha presumably 0cc2c28e
or 28d503c): §5.5.1 said "ALL 22 expression-capable fields migrate to
Expression" but §5.5.2 / §6 Q#4 left typed-field shape (Int?/Bool sites)
as an open Director-tier question. Implementer following §5.5.1 would
author the wrap-to-Expression shape immediately while §5.5.2 says hold.

Finding accepted. §5.5.1 split into three classes:

- 13 string-typed sites — uniform String→Expression migration, in scope
  for §7.5 ask #4 prereq PR
- 7 typed-field sites (timeout_minutes/continue_on_error/
  cancel_in_progress) — HOLD until §6 Q#4 ratifies wrap/sum/defer
- 2 enum-extension sites (RunnerSpec, UsesStep.uses) — new variant
  added to existing sum/struct, in scope for §7.5 ask #4 prereq PR

In-scope for substrate-prereq PR: 13 + 2 = 15 sites. Out-of-scope
(deferred): 7 typed-field sites.

§5.5.1 now non-contradictory with §5.5.2 / §6 Q#4: implementer reading
§5.5.1 migrates 15 sites; the 7 typed-field sites explicitly HOLD with
a named trigger (§6 Q#4 ratification).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…sites)

Operator BLOCKING on PR #2751 at :365 (briansrls 2026-05-12T10:12:15Z):
the string-typed migration class omitted Job.name: String?; GH Actions
context-availability table lists jobs.<job_id>.name as expression-capable.
Same applies to Workflow.name (workflow name supports expressions).

Audit gap fixed. §5.5 table adds:
- Workflow.name: String (:22) — string-typed expression-capable
- Job.name: String? (:112) — string-typed expression-capable

Counts updated:
- Total expression-capable: 22 → 24 sites
- String-typed class: 13 → 15 sites
- In-scope for prereq PR: 15 → 17 sites (15 string + 2 enum-extension)
- Out-of-scope (typed-field HOLD): 7 sites (unchanged)
- Under-modeling delta: 15 → 17 sites (ci.yml-keyed 7-site enumeration
  missed 17 sites in actions.dag schema)

§5.5.1 enumerated list of string-typed sites adds Workflow.name + Job.name.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Operator BLOCKING on PR #2751 at :381 (briansrls 2026-05-12T10:12:15Z):
classifying UsesStep.uses as expression-capable invents platform
capability — GH Actions workflow-syntax treats uses: as a literal
action location; the context-availability table does NOT list
jobs.<job_id>.steps.uses. Modeling it as expression-capable would
violate INVARIANTS.md P1 modeling faithfulness.

Verified against GH Actions docs (workflow-syntax + context-availability):
uses: is a literal action ref resolved before workflow expressions
evaluate.

Finding accepted. Removed UsesStep.uses from §5.5 inventory + struck out
the row + removed planned ExpressionActionRef variant from
enum-extension class.

Counts updated:
- Total: 24 → 23 sites
- Enum-extension class: 2 → 1 site (RunnerSpec only)
- In-scope for prereq PR: 17 → 16 sites (15 string + 1 enum-ext)
- Under-modeling delta: 17 → 16 sites
- Typed-field HOLD class: 7 sites (unchanged)

§5.5.1 enum-extension block now explains why UsesStep.uses was
removed for audit trail.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…pe, 7 HOLD)

Operator BLOCKING on PR #2751 at :543 (briansrls 2026-05-12T10:12:15Z):
§7 ratification dispositions still referenced the 7-site enumeration from
the original ratification framing, while §5.5 expanded the audit to
23 sites. Downstream implementation reading only §7 would preserve
opaque-string authorities at the non-§7-enumerated sites — P2/P5
violation by structural drift.

Fix: §7 ratification point #4 rewritten to cite §5.5 audit set + 16
in-scope sites + 7 typed-field HOLD class with named trigger.

Site-count correction note expanded from single-event to cumulative
correction sequence documenting all 4 BLOCKING-driven expansions
(5→7→22→24→23). Audit trail preserved; the (c) substrate-shape
ratification covers all 23 expression-capable sites uniformly per
"single-authority for expression substrate" principle — implementing
PR migrates 16 immediately, 7 typed-field sequenced post §6 Q#4
ratification.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…methodology note per codex review 10128)

Cross-product of GH context-availability table × actions.dag carriers adds
MatrixStrategy.{dimensions,include,exclude,fail_fast,max_parallel}.
Updated counts: 28 total / 18 string-typed / 9 typed-field / 1 enum-ext;
19 in-scope for prereq PR, 9 HOLD for §6 Q#4.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…lability; run-name is expression-capable key and not currently a Workflow field) — operator BLOCKING :274

28→27 total, 18→17 string-typed, 19→18 in-scope.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…orkflow_call/workflow_dispatch input defaults per GH context-availability

27→28 total, 17→18 string-typed, 18→19 in-scope. MatrixStrategy already present per commit 9c1f0a1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
… sites uniform') — operator BLOCKING :7

Aligns top-of-file status with §5.5 / §7 ratified scope: 28 total / 18 string-typed + 1 enum-ext = 19 in-scope for prereq PR / 9 typed-field HOLD on §6 Q#4.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ursor review 10134

Sweep stale internal counts: 23→28 site totals, 15→17 string-typed in audit blockquote, 5→9 typed-field, 16+7→19+9 deferred. Added correction step 5 to audit trail covering MatrixStrategy + DispatchInput.default additions and Workflow.name removal. Aligns §5.5.1, §5.5 audit-trail blockquote, §7.5 ask #4 with §5.5 audit totals.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ipline citation drift — cursor review 10145

:146 + :231-233: dissolution-cost wording updated from pre-§5.5 '7 sites' to post-audit '19 sites + 9 typed-field once §6 Q#4 resolves'.
:289-291: scaffold-arm sunset-milestone citation moved from INVARIANTS P5 (which mandates checkable dissolution trigger) to modeling-discipline.md Practice 4 (home of the scaffold-comment convention).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
briansrls and others added 6 commits May 12, 2026 12:38
…to class lists; §6 Q#5 (DispatchInput carrier-split) + Q#6 (RunnerSpec runs-on grammar) — codex BLOCKING 10150

(1) §5.5.1 lists now explicitly enumerate MatrixStrategy carriers per class: dimensions/include/exclude in string-container (18 total), fail_fast/max_parallel in typed-field HOLD (9 total). Added explicit derivation-from-§5.5-table discipline note. Cross-check 18+9+1=28 ✓.

(2) §6 Q#5: shared DispatchInput collapses workflow_call vs workflow_dispatch expression-context-availability axes; carrier-split question surfaced (Director-tier sequencing relative to Slice 4 prereq PR).

(3) §6 Q#6: RunnerSpec under-models runs-on grammar (scalar/array/object + expressions at multiple positions); §2 (c) ExpressionRunner only covers scalar case. Carrier-split question surfaced.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ow_dispatch is literal-only per GH context table) — operator BLOCKING :369

GH context-availability marks only on.workflow_call.inputs.<id>.default as expression-capable; on.workflow_dispatch.inputs.<id>.default is literal-only. Migrating the shared DispatchInput.default to Expression would invent workflow_dispatch capability (P1 violation).

§5.5 table row updated: ✗ split capability; §5.5.1 adds new 'carrier-split-blocked sites (1)' class; counts now 17 string-container + 9 typed-field-HOLD + 1 enum-extension + 1 carrier-split-blocked = 28 ✓. In-scope for prereq PR: 19→18. §6 Q#5 sharpened from 'sequencing question' to 'BLOCKED until carrier-split lands'.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…g partial-coverage (array/object/label-element expressions unmodeled) — operator BLOCKING :345

§2 (c) ExpressionRunner covers only whole-runs-on scalar-expression case. Array form (mixed literal/expression elements) and object form (group/labels expressions) require §6 Q#6 RunsOn carrier-split. Scalar-only case stays in §7.5 ask #4 prereq PR; array/object defer to §6 Q#6 resolution.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@briansrls

Copy link
Copy Markdown
Contributor Author

Auto-opened draft on the branch that just merged via PR #2751 — no diff vs main. Closing.

@briansrls briansrls closed this May 12, 2026
@briansrls
briansrls deleted the session/warm-wolf-698-expr-substrate-canvas branch May 12, 2026 12:59
@briansrls
briansrls restored the session/warm-wolf-698-expr-substrate-canvas branch May 12, 2026 13:00
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