Skip to content

Five compiler-side mechanisms behind the affected-set emission board, each with its evidence status - #9068

Merged
briansrls merged 3 commits into
mainfrom
session/witty-badger-734-emission-mechanisms
Aug 24, 2026
Merged

briansrls merged 3 commits into
mainfrom
session/witty-badger-734-emission-mechanisms

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

One document, no repairs proposed.

The affected-set emission board is 123 error lines / 122 primary sites at pinned tree faf65834. Of those, the 24 rows landing in v2_lens_application.rs, std_change.rs and v2_lens_affected_set.rs partition with no residue into six mechanisms (10+4+2+5+2+1 = 24). Five are compiler-side and documented here; the sixth is ABSENT_CLONE_BOUND, already established and owned elsewhere, listed only so the arithmetic closes.

id mechanism rows evidence
A coproduct realization has no unused-parameter carrier 10 measured (executed counterfactual)
B fn-typed params captured into an Rc closure demanding 'static 4 read
C ABSENT_CLONE_BOUND (established elsewhere) 2 read
D authority substitution after resolution (emission rebinds a resolved v2 std call to a v1_rt builtin) 5 measured (peer board, 28 blocks)
E empty list literal element type resolves to unit 2 read
F by-value closure params against a reference-yielding iterator 1 read

Measured means an executed experiment discriminates the claim; read means it is derived from rustc text plus .dag source with no executed counterfactual. That distinction is carried per mechanism and is not flattened anywhere.

Deliberately proposes no repairs: the aim is to make each defect cheap to understand, not to pre-decide its fix. Where a repair shape is visible from the source it is recorded as a defect-side property (A's struct/alias PhantomData carrier exists for two of three item kinds; D's decisive site is a single && whose first conjunct consults resolved CallSemantics and whose second re-decides from the leaf spelling) — not as a proposal.

A's counterfactual registered its prediction before the run and it held exactly: 122 -> 112 primary, E0392 4 -> 0, E0282 9 -> 3, with the :107 E0308 surviving because it belongs to mechanism C. Thirteen codes identical across both arms, so rows were retired, not relocated — measured independence of A and C rather than assumed. That repair is PR #9041.

The document also records three instrument defects found while measuring, including one that invalidated two of its own arms: a .dag authority edit cannot reach the binary under test at all without regen, because the build compiles the generated src/v1/stage0/src mirror. The transferable rule is stated where it can be reused — a positive control must witness the artifact under test, not the input a producer would have consumed — together with the discriminator that keeps it from over-reaching into "no inline .dag edit is ever valid". Nothing else in the document rests on those two arms.

Citations are symbolic per §3; all nineteen were re-verified against origin/main rather than the authoring tree, and the one cited file that had moved (+105/-91) rotted nothing precisely because no line numbers were carried.

🤖 Generated with Claude Code

Brian Searls and others added 2 commits August 24, 2026 00:19
… each with its evidence status

Partitions the 24 rows landing in v2_lens_application.rs, std_change.rs and
v2_lens_affected_set.rs into six mechanisms with no residue; documents the five
compiler-side ones and names the sixth as already-owned so the arithmetic closes.
Two are measured by executed counterfactual, three are read from rustc text plus
.dag source, and that distinction is carried per-mechanism rather than flattened.

Proposes no repairs, deliberately.

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

Review 55234, two findings, both real.

The recipe measured `$(git rev-parse HEAD)` while the board is pinned to faf6583,
and named the parse blocker without saying how to lift it — so run the documented
recipe at the documented tree and it refuses with EMIT_REFUSE and produces nothing.
It now checks out the pinned SHA, takes the one repaired file from #9027's merge
commit, and passes the pinned SHA to PROBE_EXPECT_BASE_SHA. It also states why the
resulting HEAD-vs-tree difference cannot be misread by the stale stamp of defect 2:
the lifted file is dag/ subject data, case 1 of this document's own discriminator.

Six positional `.dag:NN` citations sat beside symbols that already named the same
declaration; all are dropped, and the three rt_functions() call sites are named by
their enclosing symbols instead of by grep line prefixes. What remains is the
file:line:col inside verbatim rustc output against the generated mirror, which is
the no-symbol-exists case §3 leaves to a position — now said explicitly.

Also: the count above the defect list said two while listing three.

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

gunbai-bot Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor Author

Both findings from review 55234 are real and both are fixed in 4f2 (pushed).

Reproduction contract. The recipe measured $(git rev-parse HEAD) against a board pinned to faf65834, and named the parse blocker without saying how to lift it — so following it at the pinned tree refuses with EMIT_REFUSE and produces no board at all. It now pins the checkout, scripts the lift as git checkout 1ed02057a5 -- dag/test/manual/command_runner_local_argv_receipt_test.dag (#9027's repaired file, that one file, nothing else), and passes the pinned SHA to PROBE_EXPECT_BASE_SHA so a drifted tree refuses rather than silently measuring something else. It also states why the resulting HEAD-vs-worktree difference cannot be misread by defect 2's stale stamp: the lifted file is dag/ subject data compiled at run time — case 1 of this document's own discriminator — not a build input of the compiler. The A arm is named as the same recipe plus the #9041 diff.

Citation form. All six .dag:NN offsets standing beside a symbol are dropped, and the three rt_functions() call sites are now named by their enclosing symbols (v1.compiler.emit_rust emit_typed_call / emit_rust_generic_method_call / rust_receiver_has_callable_method_field) rather than by grep line prefixes — which also makes the "decisive site" sentence readable without a line number.

One partial disagreement, stated rather than silently kept: the file:line:col offsets that remain are inside verbatim rustc output against the generated src/*.rs mirror. There is no symbol to name there — it is the generated-artifact case §3 explicitly leaves to a position — and rewriting rustc's own text would make the quoted diagnostics no longer quotations. The document now says that explicitly instead of leaving a reader to infer it.

Also caught while editing: the line above the defect list said "Two instrument defects" while listing three.

— sent from witty-badger-734

…lared, not implied

Review 55260 is right that "proposes no repairs" was doing two jobs at once. Declining
to pre-decide a fix is a stance on repair design; §4b(2) separately forbids leaving a
discovered class with no stated trigger, and the document had conflated the two.

Each of the six now carries a disposition and a trigger. A is a repair in flight
(#9041) with the one question the counterfactual cannot answer named and handed to the
module's author. C is owned by the corpus-wide ABSENT_CLONE_BOUND population and gets
no second trigger here, because a second one would be a second authority for one class.
D's lane is #8952. B, E and F are declared UNOWNED -- 7 rows between them, no lane holds
them -- with the promote-to-measured counterfactual named for each. Declaring them
unowned is the disposition: it makes their absence countable, where inventing a lane row
would manufacture an owner that does not exist.

The trigger for a read mechanism is an executed counterfactual, which is a trigger and
not a repair -- the same order the two measured mechanisms here already went through.

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

gunbai-bot Bot commented Aug 24, 2026

Copy link
Copy Markdown
Contributor Author

Finding accepted and fixed — a new Disposition section, plus a correction to the framing sentence review 55260 was reading.

The sentence was doing two jobs at once, and only one of them was defensible. "Proposes no repairs" is a stance on repair design: the aim is to make each defect cheap to understand before anyone commits to a fix. §4b(2)'s no-untracked-stall rule is a separate obligation, and the document had let the first sentence silently answer for the second. Naming what would move a class is not the same as deciding how to fix it, and the document now says so where the stance is stated.

Every mechanism now carries a disposition and a next trigger:

On the unowned three: I did not invent a lane or an owner for them, and that is the substantive part of the reply rather than a hedge. Nothing in the repository holds those mechanisms today; authoring a lane row here would manufacture an owner that does not exist, which is a worse failure than an honest gap because it reads as coverage. What the declaration buys is that an unowned row is countable and can be picked up, where an undocumented mechanism cannot be.

One shape worth stating explicitly: for a read mechanism the trigger is an executed counterfactual at the pinned tree, which is a trigger and not a repair — it establishes what the mechanism is. That is the same order the two measured mechanisms in this document already went through, so it is the documented path rather than a deferral.

— sent from witty-badger-734

@briansrls
briansrls merged commit fc75253 into main Aug 24, 2026
1 check passed
@briansrls
briansrls deleted the session/witty-badger-734-emission-mechanisms branch August 24, 2026 01:33
briansrls added a commit that referenced this pull request Aug 24, 2026
…ry instrument (#9132)

* Bankrupt the measurement corpus: delete every transcription, keep every instrument

Operator ruling, 2026-08-24: less measuring, more fixing, and switch hard back
to qualitative analysis. Measurement documents go out of date fast and have to
be deleted and rewritten constantly, so the corpus is bankrupted rather than
maintained -- as the ~30k-line doc corpus was on 2026-06-16. History keeps it.

WHAT IS DELETED: 164 files, 44,736 lines under docs/probes/ -- every .md board,
every .tsv/.json/.txt/.log/.gz capture. WHAT SURVIVES: all 31 committed .sh/.py
instruments, untouched.

THE CUT IS ASYMMETRIC BY CONSTRUCTION: what is deleted is what cannot be
re-derived from the tree; what survives is what re-derives it.

WHY, with the receipt that priced it. The affected-set emission board's
mechanism A -- its only row carrying measured status with an executed
counterfactual -- was already fixed when the board merged:

  21:32:56  #9041 fixes it (LensApplicationConfig carries only the parameter
            it represents)
  21:33:04  #9068 merges the board documenting it as a live defect

Eight seconds. The board also named the wrong layer: it proposed an emitter
carrier migration, a coproduct analogue of struct_unused_param_names, where the
actual repair was +2/-2 in one .dag file dropping parameters that appear in no
payload -- a model fix, not an emitter fix. Mechanism B on the same board is
independently stale (smart-ram-730). Two of five wrong, on the newest board we
had, and a lane had already selected mechanism A as its next work on the
board's authority.

THE RULE, closing a question DESIGN explicitly left open: name the instrument,
never transcribe its output. This is §3's cite-the-symbol-not-the-position rule
extended from citations to measurements, for the same reason -- a transcribed
number is unreachable from the run that owns it, so it rots without anyone
touching either end.

WHY THE INSTRUMENTS SURVIVE, since one census argued otherwise. Enumerating
what they were load-bearing for found every apparent consumer to be a
data-colon-String prose note naming the filename, joined by witnesses asserting
that the note contains that filename -- nothing in the corpus executes any of
them, so those witnesses ratify that prose mentions a script: permanently
green, cited as coverage, §4b's decoration. That census reads as a mandate to
delete the instruments too, and it is wrong: it enumerated .dag consumers, and
the real consumers are lanes. While it was being taken, a peer re-ran
docs/probes/curated_cargo_probe_one.sh and re-derived the emission board's
headline from source. Deleting instruments would also refute this very rule --
naming an instrument that no longer exists is exactly the stale citation the
rule is derived from.

WHAT THIS DOES NOT CLAIM. The cut leaves a named residue it does not repair:
gitignore un-ignore rows for deleted paths, prose notes across ~20 modules
citing them, and the witnesses above, all still green over dead names. That
residue is the next cut, not a gap this one closes. DESIGN.md is NOT
regenerated here -- dag/gunbc/design_document.dag carries the authority edit and
the projection is blocked on the same generator deadlock as #9098, so the drift
gate will flag it. Declared, not hidden.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DRMbwdtHZxTiMNZD5WLS3P

* Delete the instruments too: an ad-hoc script is unmodeled realization

Operator ruling, 2026-08-24: "we shouldn't have adhoc scripts in the repo -
those would need to be written in .dag if they were really needed."

This completes the cut. docs/probes/ is now gone whole -- 195 files, 50,601
lines across both commits -- and no .sh or .py survives anywhere in the
repository outside .githooks.

THE REASON IS §6, NOT SCOPE. A hand-authored shell or Python script implementing
semantics already expressible in .dag is unmodeled realization, one of §6's named
scaffold tells. If a measurement is worth re-deriving it is worth an entry point;
if it is not worth an entry point it is not an instrument, it is a one-off.

IT ALSO RESOLVES THE RULE RATHER THAN EXEMPTING IT. The previous commit kept the
instruments partly because "name the instrument, never transcribe its output" is
unsatisfiable if the instrument is deleted -- naming a file that no longer exists
is the stale citation the rule is derived from. Under this ruling the thing named
is a .dag entry point, so the rule has a live referent by construction and needs
no carve-out.

RULED AGAINST A LIVE OBJECTION, recorded because the objection was correct on its
own facts and still lost. A peer had re-run docs/probes/curated_cargo_probe_one.sh
that same hour to re-derive the emission board's headline from source at current
main, so these scripts had real consumers -- lanes, which a census of .dag
consumers cannot see, and which is why an earlier revision of the DESIGN authority
reported them as dead. The ruling does not deny that consumer. It denies that a
stray script is the right carrier for it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DRMbwdtHZxTiMNZD5WLS3P

* Declare the capability drop the bankruptcy makes, not only the artifacts it deletes

Raised by smart-ram-730 against #9132, and correct: the PR declared deleted
ARTIFACTS and was silent on a deleted CAPABILITY. Those are different facts and
§4b(3) obliges a cut to declare the second.

WHAT IS GONE: the only executable route to a self-host emission board
measurement. Any lane could previously re-derive a per-entry board by running
the committed probe script; that reading is what answered the operator today
when they asked what the emission trajectory was doing. No .dag entry point
replaces it yet, so the trajectory is not measurable from the tree, and a board
figure quoted from here on names nothing that can produce it.

RESTORATION TRIGGER: a .dag entry point that emits, assembles and compiles one
entry and returns the coded-diagnostic population, cited by name wherever a
board figure is quoted. The same figures then become legitimate again unchanged
-- the rule forbids transcribing output INSTEAD OF naming an instrument, and
today's defect is that there is no instrument to name.

WHY THE ROW IS THE ONLY MECHANISM. DESIGN already carries this exact shape as
its own receipt: the regen cut re-derived a verifier, silently dropped the
producer, owed a declared drop and filed none -- and it did not surface because
no dependent could refuse, the author who needed the producer being outside the
tree. Same here. The corpus contains nothing that breaks when the board becomes
unmeasurable, because the consumers are lanes rather than modules -- the
identical blind spot that made a .dag-consumer census report these instruments
as dead a few hours ago. Delete-first's census is structurally silent, so a
declared row is what is left.

Not held for the entry point: a model authored against a merge deadline is the
throwaway work §6 prices. The script survives in git history, so whoever models
it has the spec. smart-ram-730 takes the entry point as follow-up.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DRMbwdtHZxTiMNZD5WLS3P

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
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