Repository navigation
DESIGN §2 attributes StorageDevice to the wrong module, in the sentence whose point is citation - #8559
Merged
Conversation
…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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The defect
DESIGN §2's NVMe decomposition example says the row is
Neither declaration is in that module.
product.compute_fabricis 139 lines declaring exactly seven types —Fabric,HardRequirements,Shape,Program,ComputeNeed,Opportunity,Connection. Grep forStorageDeviceandNvmeDeviceinside it returns zero.StorageDeviceis declared inextdeps/storage/types.dag— the same file the sentence has already correctly named one clause earlier as the PCI Express citation — andgunbc.fleet_intentimports 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_resolutionrefuse 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 gapgunbc.documentary_refswas built for, one document over.How it was found
Censusing
product.compute_fabricfor 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
dag/gunbc/design_document.dag),DESIGN.mdregenerated viamain_wet.