Skip to content

DESIGN §2 attributes StorageDevice to the wrong module, in the sentence whose point is citation - #8559

Merged
briansrls merged 2 commits into
mainfrom
fix/design-storage-citation
Aug 19, 2026
Merged

briansrls merged 2 commits into
mainfrom
fix/design-storage-citation

Conversation

@gunbai-bot

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

Copy link
Copy Markdown
Contributor

The defect

DESIGN §2's NVMe decomposition example says the row is

surfaced through product.compute_fabric's StorageDevice coproduct on its NvmeDevice.catalog variant

Neither declaration is in that module. product.compute_fabric is 139 lines declaring exactly seven types — Fabric, HardRequirements, Shape, Program, ComputeNeed, Opportunity, Connection. Grep for StorageDevice and NvmeDevice inside it returns zero.

StorageDevice is declared in extdeps/storage/types.dag — the same file the sentence has already correctly named one clause earlier as the PCI Express citation — and gunbc.fleet_intent imports it.

Why this one is worth its own PR

It is the §3 stale-citation class landing in the canonical authority, and it is self-contradicting in a way that inverts the paragraph's meaning: the example exists to show a decomposition grounded in a cited extdeps row, while attributing that row's carrier to a product module that never held it. It reads as evidence against the point it is making.

It also survives the mechanisms that exist for this class. HandAuthoredDocBind + cited_symbol_resolution refuse a missing or ambiguous reference — but only for the hand-authored document population, and this is prose inside a generated document's model, so no reference-level check can see it. That is the same gap gunbc.documentary_refs was built for, one document over.

How it was found

Censusing product.compute_fabric for deletion (the fabric recut program's Cut B, #8550). Fixing it here rather than inside that deletion is deliberate: the defect is in the citation, not in the module. Folded into the deletion it would be repaired silently as a side effect of removing the thing wrongly named, losing the record that the sentence was already false while the module still stood.

Verification

  • Model edited (dag/gunbc/design_document.dag), DESIGN.md regenerated via main_wet.
  • The regeneration touched exactly these two files and exactly this line — which is simultaneously the check that the emission carried no unrelated drift from the regenerating binary.

…ce whose point is citation

The NVMe decomposition example says the row is "surfaced through
product.compute_fabric's StorageDevice coproduct on its NvmeDevice.catalog
variant". Neither declaration is in that module. product.compute_fabric is 139
lines declaring exactly seven types -- Fabric, HardRequirements, Shape, Program,
ComputeNeed, Opportunity, Connection -- and grep for StorageDevice and
NvmeDevice inside it returns zero.

StorageDevice is declared in extdeps/storage/types.dag, the same file the
sentence has already correctly named one clause earlier as the PCI Express
citation, and gunbc.fleet_intent imports it. So the sentence names the right
authority and then hands its type to a different module in the next breath.

This is the §3 stale-citation class in the canonical authority, and it is
self-contradicting: the example exists to show a decomposition grounded in a
cited extdeps row, while attributing that row's carrier to a product module that
never held it. It reads as evidence for the opposite of the point.

Found while censusing product.compute_fabric for deletion. Worth fixing on its
own rather than inside that deletion: the defect is in the citation, not in the
module, and it would otherwise be repaired silently as a side effect of removing
the thing wrongly named -- which loses the record that the sentence was already
false while the module still existed.

Model edited, DESIGN.md regenerated through main_wet. The regeneration touched
exactly these two files and exactly this line, which is also the check that the
emission was not carrying unrelated drift.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012q31BK3okLA8vG4kdTWtBf
gunbai-bot Bot pushed a commit that referenced this pull request Aug 19, 2026
…nt finding was wrong

Two corrections, one of which changes how Cut B has to be executed.

THE DELETION IS NOT THE CENSUS HERE. Every reference to product.compute_fabric
in the corpus is a string literal; there is no import of it anywhere. So
deleting the module refuses nothing, and the doctrine's "the deletion is the
census" does not apply. The census has to be read before the cut rather than
discovered by it, or a cut relying on compile refusals will find none and
conclude it is done.

The census is also larger than the first version said: five witnesses inside the
production module, a separate witness file, two host_standup prose strings, five
plan documents, and DESIGN section 2 (fixed separately in #8559). Several plan
docs cite types the module no longer has, which its own dissolution receipt
records as removed in #5904 -- the prose was stale before this cut.

AND MY ENDPOINT FINDING WAS WRONG. I recorded that grounding_lens_test cites
product.compute_fabric.Endpoint as a fabricated citation of the section 3 class.
It is a controlled fixture: two hand-built concept_decl rows testing that a
product.* namespace is not layer-excluded, and the sibling row names
product.network_topology.Url, which also does not exist. The test needs a string
shaped like a product qualified name, not one that resolves, and an
independently authored fixture is exactly what DESIGN section 5 endorses. I read
a fixture as a citation because the string looked like one.

Recorded rather than quietly removed. A plan that silently drops its own false
claims teaches nothing, and this is the same adjacent-question error the
document charges elsewhere.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012q31BK3okLA8vG4kdTWtBf
briansrls pushed a commit that referenced this pull request Aug 19, 2026
…rements move to product.fabric.work (#8560)

* Cut B (HELD): delete product.compute_fabric at the root; census, witnesses, and prose fixed forward

Held, not pushed: #8413 merged to main after this was authored and
product.fabric supply/work now import product.compute_fabric Shape, so the
deletion refuses inside a tree this session was told not to edit. Awaiting the
carrier decision before completing.

* Cut B: delete product.compute_fabric at the root; Shape and HardRequirements move to their owner

The dead root goes: Fabric, Program, ComputeNeed, Opportunity, Connection,
connect, shape_covers, derive_shape, the five example rows and the five
in-module witnesses. None of it had a decision consumer.

Shape and HardRequirements are NOT replaced — they MOVE, to product.fabric.work.
They are the module's only load-bearing content, and they are work-side facts:
Shape is what a WorkSpec requires and what an Offer offers, and work.dag's
shape_material already destructures the axis deliberately, so the axis wall now
sits beside the carrier instead of one module away. supply.dag already imported
work, so the edge exists and no cycle is introduced. (Operator ruling: move the
surviving authority to its owner rather than hunt a substitute so the old file
can die with its contents intact. ExecutionClassRef / ResourceSupplyRef were
considered and do not exist on main.)

THE DELETION IS PARTLY A CENSUS, contrary to the plan it was briefed from: the
"every reference is a string literal, nothing refuses" measurement grepped the
qualified module name only, and a .dag reference can be a bare name. Two real
structural dependents were invisible to it -- host_standup_spine_witness_test
called witness_fabric_binds_need_to_opportunity() bare, and #8413 landed three
imports of Shape while the cut was being authored. Both refuse loudly and both
are handled here.

Dispositions, each decided rather than swept:
- The five in-module witnesses die with their subject; they assert properties of
  the deleted types. One consequence is recorded rather than dropped: the
  module's own #5904 dissolution receipt named witness_hard_requirement_unmet_is_unmet
  as the THREAD-FLOOR COVERAGE for that earlier dissolution, and deleting the
  receipt alongside the coverage is how a guarantee disappears with nobody
  deciding to drop it. The successor obligation is now stated in the plan prose
  as unhomed.
- compute_fabric_resource_witness_test split: its connector test dies, its four
  fleet_container demand-envelope witnesses survive and move to
  test.claim.fleet_container_demand_envelope_witness, because a file named for
  compute_fabric holding only fleet_container claims is a stale name.
- host_standup_spine_witness_test's claim SURVIVES with a retarget: the shape
  authority is still referenced rather than redeclared, and now points at
  product.fabric.work. The witness checks the refusal string names it.
- host_standup's two prose strings become true again: the shape carrier is
  referenced; what the deletion removed and nothing replaced is the
  need/opportunity MATCH, so the enroll decision has no authority. Its gap-ledger
  row moves gap-shape-only -> gap, which made a third string false (it enumerated
  five modeling values, and only four now occur) -- corrected too.

Prose: five plan modules and four hand-authored docs carried claims that a
deleted thing is live; corrected. Several were ALREADY false before this cut
(#5904 had moved ResourceEnvelope and PerformanceReceipt out years of commits
ago) and now name their live homes. The dated 2026-06-21 inert-layer measurement
is left AS MEASURED with a note, not rewritten -- a measurement is a fact about a
moment. phase_profile.rs's dissolution trigger stops naming a path that never
existed in this repo. The three generated plan .md are regenerated through
dag/tools/generated_artifact_gate.dag main_wet with a tree-built binary, not
hand-edited.

DESIGN.md and src/v2/test/claim/grounding_lens_test.dag are deliberately
untouched: the first is #8559's, and the second needs a string SHAPED like a
product qualified name, not one that resolves.

---------

Co-authored-by: gunbc-ci-auto-heal <searlsbrian@gmail.com>
Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
briansrls pushed a commit that referenced this pull request Aug 19, 2026
…is replaced (#8550)

* Fabric recut program: the carriers survive, the layer underneath is replaced

Signed off by external review with candidate (b) for the lease
decomposition. Records the program, the verified fork census, the measured
blast radii, and the fourteen controls that gate merge.

The verdict: #8413 does not land in its current carrier shape. The six
product concepts (Demand, Work, Attempt, Offer, ExecutionGrant, Receipt)
survive; the layer beneath them forks nine existing authorities. Each fork
verified by execution against branch 66dc3aa and main a2b33f5 rather
than accepted from the review.

Two corrections are recorded rather than quietly absorbed:

The review's stated support for recutting -- that the PR is stale at
ed2d375 and non-mergeable -- is FALSE. The branch is at 66dc3aa,
MERGEABLE/CLEAN and CI-green; its earlier 44 failures were entirely main's.
The recut stands on the fork census alone, and a conclusion carried by a
false premise decays the moment someone checks it.

And my own claim that owner_fingerprint's absence CAUSED the unchecked
attester is refuted. Lease owner and receipt attester are independent
identities that coincide only in the first vertical -- a worker attests
execution, a meter attests usage, a billing observer attests spend. So the
lease decomposition and attester authorization are parallel repairs, not a
chain, and the attester goes through std.access rather than a branch in the
epoch comparator. Controls 7 and 8 exist precisely to stop the conflation
returning: testing only "foreign attester refuses" passes under it.

Verified while writing: std.effect_grant Envelope and envelope_bounded_by
are present on main and are the authority envelope, so product.fabric
duplicates no Verb or child-boundedness. And extdeps/accounting/encumbrance
is NEW on the branch and absent from main -- a generic cited kernel that is
endorsed unchanged, not part of the layer being replaced.

Doc registered as a HandAuthoredDocBind on std.temporal_effect HeldLease
with ComputationIdentity and ComputeOffer as additional works; all three
symbols verified to resolve, and the three doc_graph bind witnesses return
true.

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

* Cut order: two roots, not one — and two defects found while verifying it

Sequencing signed off. My framing of 'the old market vocabulary' as one
root was wrong: it bundles a dead root, a live supply authority, and a
wrong product-interface dependency into one migration.

X1 product.compute_fabric is dead — verified, its only non-plan mentions on
main are inside string literals in gunbc.host_standup (a refusal: message
and an authority_or_interim: field), so there is no production decision
consumer and it deletes outright.

X2 gunbc.ci_fleet.ComputeOffer is live and is the real migration. The
finding that reorders everything: the workflow edge ComputeOffer ->
runner_spec_from_offer -> RunnerSpec -> witnesses.yml is itself wrong,
because it derives GitHub labels from the physical host, so the
customer-facing execution class depends on physical supply and every supply
migration is a workflow migration. gunbc.ci_runner_target is a smaller
interception point (verified present with consumers).

Order: A canonical LeaseEpoch, B delete the dead root, C sever physical
supply from the public CI interface, D replace live ComputeOffer. C is what
makes D safe.

Two defects found while verifying rather than assumed, both recorded so the
deletion does not silently leave them: src/v2/test/claim/grounding_lens_test
cites product.compute_fabric.Endpoint, which has ZERO occurrences in that
module — a fabricated citation in a lens test that will not surface as a
compile refusal on deletion because it is a qualified-name string. And five
witnesses live inside the production module, so the deletion is not a single
file removal.

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

* Resolve the last two open questions: WorkContentKey survives, and six modules are not the present six

The two items §5 left undecided came back with answers that both refuse the
author's proposal, in opposite directions.

I proposed deleting the Work key as a rename of ComputationIdentity's
structural member. Refused: a qualification result is a verdict about two
things, a content address answers for one. Collapsing them erases addressing
rather than deduplicating it. The carrier survives as WorkContentKey wrapping
ContentHash — not a branded string, because brands are unenforced here, so a
brand would be a name standing where a distinct carrier was available. Derived
canonical-contract → hash → key, never caller-supplied.

On module boundaries, both extremes were refused. One module fuses eight
concerns into one file; the present six have backward imports (supply borrows a
receipt ref from demand, budget borrows an account id from demand and a
reservation ref from execution) and a central freely-constructible identity
record. The answer is an acyclic authority graph — the count is incidental. The
identity module is deleted and each owner defines its own key, projected through
std.key_relation.ScopedKey.

Also records Cut E (module recut) and the market allocation fold that follows
it, and the merge constraint on #8413: it may not merge while ComputeOffer and
Offer are both authoritative. #8413 is preserved, not closed — A–D merge into
its branch so its final diff is the product protocol.

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

* Correct two things Cut A found wrong by touching them: LeaseKey does not exist, and the census was stale

Cut A landed on #8553 and returned two corrections against this doc, both of
which are the doc's fault rather than the implementation's.

Section 7 spelled lease_key: LeaseKey. There is no such type on main and I had
not checked. Cut A refused to mint it, and the refusal is right: an unenforced
alias is the hollow-alias mode, and minting one inside the authority a
consolidation cut exists to establish is where it does the most damage. The
field is NonEmptyStr; a branded key lands with its validating mint or not at
all.

The HeldLease census read 8 against an older base and is 10 at 8687f2a --
two witness consumers landed between. Corrected with the base named, because a
census with no base is not a measurement.

Also records that the per-witness gunbc run route is narrower than the brief
claimed. I verified it does work on a zero-import claim file, so the flat "it
does not work" is wrong too; what is established is that cross-module type
reach fails through it and the boundary is not yet known. Until it is, the
required-floor run is the only receipt covering every witness.

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

* The run-recipe boundary is the binary: bare gunbc in a gunbc checkout reaches the baked pin

Two explanations were proposed for why the per-witness route failed and both
are now refuted by execution. Cut A's discriminating pair killed the closure
candidate (three --function selections from one file yield identical file-wide
diagnostics naming unselected functions, so --function selects nothing about
resolution) and the base candidate (identical across five main commits spanning
129).

The variable is which binary the invocation reaches. The ctrl-build shim has an
explicit gunbc-checkout guard that execs the baked /usr/local/bin/gunbc when
cwd's origin is this repo. Confirmed on one specimen: the baked binary reports
"resolved 1 sources" and then unresolved NonEmptyStr/ContentHash/Timestamp,
while the tree-built binary evaluates and returns the value. It never walks the
source roots, so the corpus is invisible and the diagnostics land on whatever
line first mentions a type.

That failure mode matters more than the inconvenience: a stale binary produces
a plausible located diagnostic in the file under test, which is the fabricated
plausible output shape pointed at the author's own instrument. The doc now
requires an explicit ./target/release/gunbc path for every cut.

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

* Re-measure the Cut B census: zero structural consumers, and my Endpoint finding was wrong

Two corrections, one of which changes how Cut B has to be executed.

THE DELETION IS NOT THE CENSUS HERE. Every reference to product.compute_fabric
in the corpus is a string literal; there is no import of it anywhere. So
deleting the module refuses nothing, and the doctrine's "the deletion is the
census" does not apply. The census has to be read before the cut rather than
discovered by it, or a cut relying on compile refusals will find none and
conclude it is done.

The census is also larger than the first version said: five witnesses inside the
production module, a separate witness file, two host_standup prose strings, five
plan documents, and DESIGN section 2 (fixed separately in #8559). Several plan
docs cite types the module no longer has, which its own dissolution receipt
records as removed in #5904 -- the prose was stale before this cut.

AND MY ENDPOINT FINDING WAS WRONG. I recorded that grounding_lens_test cites
product.compute_fabric.Endpoint as a fabricated citation of the section 3 class.
It is a controlled fixture: two hand-built concept_decl rows testing that a
product.* namespace is not layer-excluded, and the sibling row names
product.network_topology.Url, which also does not exist. The test needs a string
shaped like a product qualified name, not one that resolves, and an
independently authored fixture is exactly what DESIGN section 5 endorses. I read
a fixture as a citation because the string looked like one.

Recorded rather than quietly removed. A plan that silently drops its own false
claims teaches nothing, and this is the same adjacent-question error the
document charges elsewhere.

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

* Cut B: the census claim was false, the method is the finding, and Shape moves to product.fabric.work

I asserted that every reference to product.compute_fabric is a string literal,
so the deletion refuses nothing. False. host_standup_spine_witness_test calls
the module's own witness_fabric_binds_need_to_opportunity by bare name, and so
does compute_fabric_resource_witness_test; both predate the base I measured.

The method is the real finding. I grepped the module name, and a bare call
carries no module name, so that grep could never have found it. A .dag
reference takes at least three forms and I checked one, then reported the
output as a structural fact. Caught by the implementer, not by me.

#8413 also merged mid-cut, adding three real imports of Shape from
product.fabric. Ruling: Shape and HardRequirements move into
product.fabric.work and the rest of compute_fabric is deleted. The dead
module's only load-bearing content is Shape, and a replacement migration moves
the surviving authority to its owner rather than finding a substitute so the
old file can die intact. supply.dag already imports work, so the edge exists
and nothing is minted -- which matters because my earlier brief named
ExecutionClassRef and ResourceSupplyRef as the alternatives and neither exists
on main. Naming unavailable carriers is how a brief pushes someone into minting
one inside a deletion.

Also records the thread-floor coverage obligation that must outlive the cut,
and keeps the earlier Endpoint correction. Two false findings in one section,
both about whether a string was a reference.

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

* Cut C rewritten after measurement: the seam exists, and the live workflow emitter bypasses it

I specified Cut C as severing a wrong edge -- the customer-facing execution
class depending on physical supply -- and said the seam needed building. Both
halves were wrong.

gunbc.ci_runner_target already exists, already is the authority, and already
projects the runs-on spec and the memory regime from one selection. Its
FleetSelfHosted arm delegating to runner_spec_from_offer is correct and
deliberate: a self-hosted fleet runner's labels genuinely are facts about the
physical fleet.

The real defect is narrower. witness_floor_workflow reads gunbc_ci_runner_spec()
-- the un-seamed function -- while the seam's own projection
gunbc_ci_selected_runner_spec() has no workflow consumer at all. The module's
note says "ci_workflow reads the spec projection now", but ci_workflow was
deleted in the floor cut, so the bypass is most likely collateral of that cut
rather than an original decision.

It is a provably safe change: ci_runner_target_witness_test already asserts the
two specs are equal, so the emission is byte-identical and that witness is the
control. What it buys is that runner selection becomes a one-row edit again --
the whole reason the seam was built -- and one of three direct
runner_spec_from_offer call sites disappears ahead of Cut D. The other two are
legitimately about physical placement and stay.

Also records the stale present-tense note inside ci_runner_target itself, and
the Cut D census measured by declaration name rather than module name.

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

* Cut D is not a type swap: Offer deliberately carries no physical facts, and the label derivation reads them

Measured the two carriers rather than assuming they were the same shape, since
the last three specifications here were wrong from under-measuring.

ComputeOffer carries ComputeSupplyFacts -- a ComputeHost, an ExecutionSurface,
observed performance. Offer<P> carries none of that: id, executor, a one-axis
Shape, capabilities, trust domain, quantity bound, quote, evidence. The absence
is deliberate and consistent with the module's own reasoning about
remaining_capacity: an offer states what is offered and on what terms, and the
physical realization behind it belongs to another layer.

So runner_spec_from_offer's reads of offer.supply.physical and
offer.supply.execution.os have no counterpart in the replacement, and "migrate
the consumers to Offer" is under-specified in the way that pushes an
implementer into either widening Offer with physical fields -- fusing
realization into the offer, exactly what its shape avoids -- or quietly
dropping the derivation.

Records the three honest options and picks none unilaterally. Also strengthens
the ordering argument: Cut C removes the CI interface from Cut D's population,
so the physical-facts question gets answered once at the runner-target seam
rather than once per consumer mid-migration. Cut D is not dispatchable until
one option is signed off.

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

* Cut D signed off: decompose the fused carrier rather than replace it, and all three of my options were wrong as stated

The fork came back refusing every option in the form I put it. The construction
is a combination: option 1's severance but with ExecutionClass rather than
ComputeHost as the destination, option 3's relation as a provider-owned
OfferBacking rather than a field on Offer, and option 2 rejected outright.

Option 1 was right that runner_spec_from_offer reads no market fact, and wrong
about where the labels come from: runner labels describe the environment
presented to the job, not the bare-metal host, so ComputeHost -> RunnerSpec
still points the wrong way. Option 2 would collapse selected execution class
into selected physical backing, making the customer-facing target change
whenever placement changes. Option 3's relation is necessary but is not
one-to-one, so a single field would make quoted supply unrepresentable.

Severing does not lose the offered-versus-ran link: it is proven at offer
publication, grant issuance and realization readback, and the severance removes
the relation from the wrong consumer rather than removing the relation.

Verified the observed_performance ruling rather than taking it, and it is
stronger than stated: one declaration, five row initializers all empty, one
plan mention. No consumer and no data.

Records Cut D as a five-way consumer classification in four steps, and adds a
fourth acceptance condition to Cut C -- the old direct projection is marked for
deletion with D rather than surviving as a permanent equal path, which is what
keeps C from creating the interval it exists to close.

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

* Cut C's carve-out gives Cut D a precondition: D4 cannot delete runner_spec_from_offer yet

Condition 2 is ruled to read "no CI workflow emitter", not "no production
emitter". fleet_converge_workflow calls gunbc_ci_runner_spec directly and must
not be routed through the CI seam: selected_ci_runner_target is a one-row
function built to be flipped to a cloud runner, and fleet convergence must run
on the fleet, so a flip would send the converger to a machine that cannot reach
the hosts it converges. Which machine runs CI and which machine converges the
fleet are two questions with the same answer today and not the same question --
FleetSelfHosted there is a coincidence of value, and merging the authorities
would be nicknaming in reverse.

That carve-out has a consequence neither the sign-off nor I had seen: D4's
deletion list includes runner_spec_from_offer, gunbc_ci_runner_spec lives in it,
and fleet_converge_workflow still consumes it. So D4 cannot execute as written.
Fleet convergence needs its own fleet-derived runner authority first, and the
deletion is conditional on it.

Recorded now rather than at D4, because a deletion list that cannot execute
surfaces as an implementer improvising a merge of two authorities to make the
cut compile -- the arm this program has already had to stop twice.

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

---------

Co-authored-by: Brian Searls <briansearls1@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
@briansrls
briansrls merged commit 594753a into main Aug 19, 2026
1 check failed
@briansrls
briansrls deleted the fix/design-storage-citation branch August 19, 2026 21:02
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