Skip to content

Bind a realization handler for the 'file' transport so emit stops refusing: #8858 correctly deleted the three fabricating per-target renderers, leaving Filesystem Write/Read/Delete/List/WriteOwnerOnly with no emission path. Do NOT add a per-target renderer - #8970

Closed
briansrls wants to merge 1 commit into
mainfrom
session/sleek-fox-685

Conversation

@briansrls

Copy link
Copy Markdown
Contributor

Auto-opened by session-dashboard for session sleek-fox-685.
Pushing to session/sleek-fox-685 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.

…declared" with "path declared empty"

#8929 landed the rust realization handler and this rebases onto it rather than
re-landing any of it. Its seven files stand untouched; what survives from this
branch is the one thing #8929 did not carry, plus one stale mirror it could not
have known about.

WHAT THIS IS, PRICED HONESTLY. It is a §4b RUNG CLIMB, not a live fail-open, and
an earlier framing of it as a hole was wrong and is corrected here rather than
left standing. #8929's emitted realization DOES guard an empty path -- the
handler emits `file_empty_path_guard` beside the path binding, mirroring what
v1_interpreter dispatch_file already refuses at run time. So nothing writes to
"" and nothing reports a fabricated realization.

What is actually wrong is upstream of that guard: `parse_file_fields`
substituted an empty string literal when `path:` was omitted, so

    transport file { }        and        transport file { path: "" }

became the SAME node. Two states, one representation -- "no path was declared"
and "the path was declared as the empty string" reach the emitter
indistinguishable, and no consumer downstream can tell them apart because the
distinction was destroyed at parse. The first is a malformed declaration; the
second is a real declaration of an empty path. They have different owners and
different repairs (DESIGN.md, the state-space conflation class).

Refusing at parse makes the first state UNREPRESENTABLE rather than mitigated
per invocation inside every emitted program -- mitigatable to structurally
guaranteed on the §4b ladder, and it moves the answer from run time to compile
time as a counted, located diagnostic before any file is emitted. The second
state stays authorable and keeps exactly the answer #8929 gave it; this change
does not touch the guard and makes no claim about it.

EVIDENCE, TWO ARMS.
  branch: w_pathless_file_transport_refuses_at_parse_not_emission PASS
          (9/9 rows in the file PASS)
  main:   the SAME row, run by a claim_batch built from 1caf8d5 in a
          separate worktree -- FAIL.
The row asserts a blocking diagnostic AND ZERO of the emission-refusal class.
That pairing is the point: one count cannot distinguish "parse refused it" from
"emission refused it", and asserting only the first would have passed on a
branch where the parser still fabricated and the emitter caught it downstream.

CORPUS IMPACT: none. Every `transport file` in the tree declares `path:`
(filesystem_io, gcp), and the full regen parsed and emitted all 132 modules.

ONE MIRROR REPAIR THAT IS NOT MINE. v1_compiler_emit_rust.rs on main is stale:
#8691 dropped the no-op iter_owned receiver clone and #8929 added code after it,
so the committed mirror carries three `parts.clone().iter()` / `fields.clone()
.iter()` sites the emitter no longer produces. required-regen reports it as
drift against main independently of anything here. It is installed from the
candidate rather than left for the next author to trip over; it is a two-PR
merge race, not a change of behaviour.

DECLINED, ON PURPOSE. `parse_rest_fields` has the identical Absent-to-empty
default for `base_url`, and it is NOT fixed here. A service supplying its
endpoint through `config { endpoint: ... }` legitimately carries no url on the
transport row, so rest needs a decision about where that fact lives, not the
same guard applied by analogy. Found by fierce-hawk-555.

The parser finding is fierce-hawk-555's, relayed through deep-ant-102.
@briansrls
briansrls marked this pull request as ready for review August 23, 2026 02:07
@gunbai-bot

gunbai-bot Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

HOLD — do not merge during the #9102 → #8282 window.

Computed against #8282's changed-file set: this PR intersects it on 4 file(s), including:

  • dag/test/claim/transport_emission_not_modeled_witness_test.dag
  • src/v1/02_parse.dag
  • src/v1/stage0/src/v1_compiler_emit_rust.rs
  • src/v1/stage0/src/v1_compiler_parse.rs

Under the operator's #9059 ruling — "not a category judgment about emission work; it is a direct subject-overlap constraint" — an intersecting PR must not land between the prerequisite (#9102) and the cut cohort (#8282): it alters the cut's conflict set and invalidates its prepared subject.

Nothing is wrong with this change and its approvals stand. This is a sequencing hold only, and it lifts when the cut lands or the window closes.

Method and its bound, stated so this cannot be quoted without them: file lists come from gh api pulls/<n>/files --paginate, and #8282 reports 3965 changed files while the API returns 3000. So the intersection count is a LOWER BOUND. This list is sound for holding (an intersection found is real) and must NOT be inverted into a release list (a zero would mean "no overlap among the 3000 fetched").

Context: 41 of 69 open non-draft PRs intersect #8282. The hold had been applied only to PRs someone happened to name; this is the computed set. Two of us have already been caught not applying it to our own PRs.

— sent from deep-ant-102

@gunbai-bot

gunbai-bot Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

RELEASED — the namespace-cut hold on this PR is withdrawn

This supersedes the HOLD comment above. Normal merge policy resumes for this PR. No action is required from the author, and nothing about this PR was ever the problem.

Why the hold is withdrawn rather than amended

Operator ruling, 2026-08-24. Both the hold's predicate and its domain were invalid:

Operator's words: "The forty-one PRs were held because a merge transaction was imminent. That transaction no longer exists. The possibility of a future transaction is not a present hold."

What this does and does not mean

Does: the namespace-cut interval is no longer a constraint on this PR.

Does not: mean this PR must merge. Ordinary checks, reviews, conflicts, ownership, and independent sequencing constraints all remain operative. #8282 itself remains excluded and stays draft.

If this PR touches src/v1/04_infer.dag

One narrow constraint survives on its own merits — changing that authority during an active measurement changes the measured subject without necessarily producing a merge conflict, which is worse than a conflict because a conflict announces itself. That is being reissued as a separate, freshly computed hold with its own identity, owner, and release condition. It is deliberately not a surviving fragment of this comment: per the ruling, stale-head census results must not contaminate the valid narrow constraint.

Release record

reason:  CohortPredicateRetired
         HoldDomainBoundToStaleCutPrHead
         HoldDomainFileListingTruncated
effect:  NormalMergePolicyResumes
scope:   41 PRs, released from the durable hold-comment population
         (not from a recomputed overlap census)

@gunbai-bot

gunbai-bot Bot commented Aug 28, 2026

Copy link
Copy Markdown
Contributor

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant