<?xml version="1.0" encoding="UTF-8"?>
<spec xmlns="https://vibevm.org/spec/1">
  <title>Design rationale: Deterministic loading — qualified anchors and aliases (B-011)</title>
  <status stage="spec" state="done" comment="B-011 design APPROVED by the owner 2026-08-04 («Принимаю дизайн B-011») with every fork&apos;s recommended option — A1 full slug, B1 both label kinds, C1 full address, D1 hard error + lenient flag, E1 layer-4 as a follow-up entry — plus one owner addition the same message: the resolution rules must be priority-placed for the executing agent (§5.1). Normative landing: the §7 PROP edits; implementation: the §10 worker cut"/>
  <p p="1"><fact id="companion-line" status="spec/work">**Companion to:** BACKLOG.md B-011 (closed by `c9cdf39d`) (the commissioning entry — the owner's directions verbatim), [PROP-035](../modules/vibe-workspace/PROP-035-spec-compiler.xml) (the spec compiler — the contract this design extends), [PROP-009 §2.3](../modules/vibe-workspace/PROP-009-loading-model.xml#artifacts) (the boot artifacts whose `STATIC.md` contract changes), and [`loading-and-boot-model.xml`](loading-and-boot-model.xml) (the loading model's original design record).</fact></p>
  <p p="2"><fact id="authority-line" status="spec/work">**Authority:** non-normative proposal. The PROPs stay the contract; on approval this design lands as PROP edits (§7 below) and this document remains the lore behind them.</fact></p>
  <section id="problem" title="1. The problem, in plain words">
    <p p="3"><fact id="problem-splice" status="spec/work">When `vibe` builds `vibevm/vibespecs/boot/STATIC.xml`, it concatenates the boot text of every static-linked package — today 31 contributions from 27 packages. Each contribution brings its own section labels, and short labels repeat across packages: `{#root}` is defined 26 times in the compiled file, `{#never}` 17 times, `{#when}` 9 times — 59 `duplicate-anchor` warnings over 11 names (host `specmap.json`, measured 2026-08-03). An address of the form «the STATIC file, section root» is a lottery over 26 candidates. Fact-level labels collide too: 61 fact ids appear more than once in the compiled lane (`sibling-document-pointers` ×14, `full-protocol-pointer` ×7 — generic names minted independently by sibling packages; measured the same day).</fact></p>
    <p p="4"><fact id="problem-stripping" status="spec/work">The second half is why this blocks the marker strip (the original B-011 filing): the compiled lane carries 838 house-grammar tokens (`##ANCHOR` ids, `@stage/state` markers) that outside consumers should not see. Stripping them naively **changes what is addressable**: a dynamically-loaded module can hold a reference to an anchor that existed in the source markup and vanished after cleaning — the reference resolves at authoring time and dangles at read time. The owner's framing (2026-07-31): stripping is not a filter; it needs a resolution design first.</fact></p>
    <p p="5"><fact id="problem-determinism" status="spec/work">The owner's ruling that made this the highest priority (2026-08-02, verbatim): «От этой вещи зависит как вообще работает загрузка, насколько детерминированно и хорошо». The requirement behind both halves is **deterministic loading**: every label in the compiled world must have exactly one meaning, that meaning must not depend on splice order or on what else happens to be installed, and references must survive both splicing and future cleaning.</fact></p>
  </section>
  <section id="solution" title="2. The design in one paragraph">
    <p p="6"><fact id="solution-three-layers" status="spec/work">Three layers, each independently useful, together closing B-011: **(1) qualified rename-on-splice** — the splicer rewrites every label a contribution defines into a globally-unique qualified form derived from the package's identity, and rewrites every intra-contribution reference to match, so the compiled file has zero duplicate labels *by construction*; **(2) aliases** — `#use spec://… as X` binds a short local name to a source-of-truth address, and `@!X` references through it; because the alias binds to the *address*, not to the compiled text, it survives both splicing and stripping; **(3) a fixed lookup rule** (the C++ ADL analogy) — an unqualified label reference is resolved against exactly two scopes, the defining document and the file's declared aliases, in that order; anything still ambiguous is a compile error listing the candidates — never a silent pick. Dynamic after-the-fact loading of a library carrying its own `STATIC.md` then composes without renaming anything already spliced, because qualified names depend only on the contribution's own identity, never on the splice's composition.</fact></p>
  </section>
  <section id="rename" title="3. Layer 1 — qualified rename-on-splice">
    <p p="7"><fact id="rename-owner-direction" status="spec/work">The owner's requirement (2026-08-02, recorded in B-011): «склейщик переименовывает метки внутри STATIC.md так, чтобы все ссылки на эти метки сохраняли валидность по всему документу», plus the qualified-rewrite idea: «Возможно, при материализации нам нужно сразу переписывать все ссылки на qualified варианты? То есть, если кто-то обращается к #root внутри документа, мы понимаем, что это какой-то из "spec://.....#root"».</fact></p>
    <p p="8"><fact id="rename-form" status="spec/work">**The qualified form.** A contribution is identified by its package origin `&lt;group&gt;/&lt;name&gt;` (e.g. `org.vibevm.world/wal`). Its labels are rewritten by prefixing a deterministic slug of that origin: heading `{#root}` → `{#org-vibevm-world--wal--root}`, fact `##THE-RULE` → `##org-vibevm-world--wal--THE-RULE` (the slug is always lowercase; the original tail keeps its case, so the normative-vs-lead casing convention stays readable in the tail). Dots in the group become `-`; the joiner is `--` (legal under the anchor grammar `[A-Za-z][A-Za-z0-9_-]*`; dots are excluded because `.` already means tree-path descent in `spec://` addresses). Both label kinds are rewritten because they share one namespace (PROP-035 §7.3 clause 3: fact and heading ids, one namespace) and both are measured to collide (§1).</fact></p>
    <p p="9"><fact id="rename-what-is-rewritten" status="spec/work">**What gets rewritten inside a contribution:** *(i)* heading anchor definitions `{#x}`; *(ii)* fact id definitions `##X`; *(iii)* intra-document markdown links `[…](#x)` that target a label the same contribution defines. **What is deliberately left alone:** full `spec://…` addresses and `@spec://…` in-place uses (they point at the package's source-of-truth document under `vibedeps/`, which the rename does not touch — they stay valid by construction); directive lines (`#use`/`#embed`/`#source` addresses); anything inside fenced code blocks (the scanner's existing fence mask governs); prose mentions of a label that are not links.</fact></p>
    <p p="10"><fact id="rename-determinism" status="spec/work">**Why a qualified prefix and not disambiguation suffixes** (`root`, `root-2`, `root-3` — the HTML-renderer convention): a suffix depends on splice *order* — adding, removing, or reordering one package renames another package's labels, which is precisely the non-determinism the owner is buying out of. The qualified name is a pure function of `(origin, original label)`: stable across recomposition, self-describing to a human reader, and append-safe (§6). This is a decision the design treats as settled by the owner's «детерминированно» requirement; the open forks are the slug's exact shape (§8, fork A/B).</fact></p>
    <p p="11"><fact id="rename-contract-change" status="spec/work">**The contract this changes:** PROP-009 §2.3 `##ARTIFACT-STATIC-MD` currently reads «the **verbatim** concatenation … of every static-typed contribution». Rename-on-splice makes the lane an **anchor-qualified** concatenation — byte-identical except label definitions and intra-contribution label references. The PROP edit is listed in §7; until the owner approves it, nothing ships.</fact></p>
    <p p="12"><fact id="rename-index-effect" status="spec/work">**What it buys immediately:** the host `specmap.json` stops minting one ambiguous address per short name over the compiled file (26 units currently answer to the same `#root` coordinate); the 59 `duplicate-anchor` warnings drop to zero — the first half of the M-LOAD milestone (`TOOLING-MAP.md` `##M-LOAD`) becomes measurable.</fact></p>
  </section>
  <section id="aliases" title="4. Layer 2 — aliases: `#use … as X` and `@!X`">
    <p p="13"><fact id="alias-grammar" status="spec/work">**Grammar.** `#use [options] spec://&lt;…&gt; as &lt;Alias&gt;` — the `as` clause is a suffix after the address; `&lt;Alias&gt;` is an identifier under the existing anchor-segment grammar (`[A-Za-z][A-Za-z0-9_-]*`). Reference form: `@!&lt;Alias&gt;` — the aliased twin of the `@spec://…` in-place use (PROP-035 §7.4): mandatory to read on first encounter, same read-set discipline, same resolution machinery; the only new thing is the indirection through the alias table. A bare `!X` or an alias mention without the sigil means nothing — only `@!X` is grammar.</fact></p>
    <p p="14"><fact id="alias-scope" status="spec/work">**Scope: the declaring file, whole-file.** An alias is visible everywhere in the file that declares it (declaration position does not matter — same as imports in most languages); it is not exported, not inherited by `#use`-ers, not global. Two declarations of one alias name in one file: compile error. `@!X` with no declared `X` in the file: compile error naming the known aliases. File-local scope keeps alias names themselves collision-free without any further machinery — the same reasoning that makes short names CLI-sugar-only in qualified naming.</fact></p>
    <p p="15"><fact id="alias-binding" status="spec/work">**What the alias binds to — the address, never the text.** `X` resolves to its declared `spec://` address; the address resolves through the existing router against the package's source markup under `vibedeps/` (the `FileResolver` path the `#embed` pass already uses). Whether the *compiled* lane still carries the target's label after a future strip, or has renamed it, is irrelevant to alias resolution — which is the property the whole entry was filed for: «алиасы привязываются к source-of-truth адресу, поэтому переживают и склейку, и стриппинг» (owner, 2026-08-02). This is the second half of M-LOAD: «a dynamic module resolves an alias whose carrier was cleaned».</fact></p>
    <p p="16"><fact id="alias-compiled-form" status="spec/work">**What the splicer does with alias forms.** In the compiled `STATIC.md`, `#use … as X` declaration lines are consumed like every `#use` line today (resolved by the topological ordering, stripped from the body), and every `@!X` occurrence is rewritten to the full `@spec://…` address it denotes. The compiled lane therefore contains only fully-qualified references — self-describing without the alias table, resolvable after any amount of cleaning, and exactly the «переписывать все ссылки на qualified варианты» materialisation the owner proposed. Structural (JIT) mode reads the declaration and the sigil directly — no rewrite needed there.</fact></p>
  </section>
  <section id="lookup" title="5. Layer 3 — the lookup rule (the ADL analogy made precise)">
    <p p="17"><fact id="lookup-rule" status="spec/work">**The rule.** An *unqualified* label reference — an intra-document `(#x)` link, or any future short-form the grammar grows — is resolved against exactly two scopes, in order: **(1)** the anchor namespace of the document that contains the reference; **(2)** the file's declared aliases. Found in (1) → it is the document's own label (and rename-on-splice rewrites both ends together). Found in (2) → it means the alias target. Found in neither, or found in both: **compile error listing the candidates** — the resolver never widens the search to «all documents that define `#x`» and never picks silently.</fact></p>
    <p p="18"><fact id="lookup-adl" status="spec/work">**What maps to ADL and what deliberately does not.** The C++ analogy the owner named (Argument-Dependent Lookup): a short call resolves against the namespaces *its arguments bring into scope* — context supplies the search set, and the programmer writes the short form. Here the context is the defining document plus the file's imports (aliases): short labels stay writable, and the search set is exactly what the file itself brought into scope. What is *not* imported from C++ is ADL's willingness to search multiple associated namespaces and overload-resolve among the survivors — for a loading contract the ambiguity must be an error, not a ranking. (Precedent for «fail with candidates, let a human record the qualified form»: the qualified-naming flow's collision law.)</fact></p>
    <p p="19"><fact id="lookup-agent-surface" status="spec/work">**The agent-facing half.** The compiled `STATIC.md` header grows two sentences stating the convention: labels in this file are qualified `&lt;origin-slug&gt;--&lt;original&gt;`; the provenance comment above each block names the origin. A reader (human or agent) who knows a package's short label can derive the qualified one mechanically, and vice versa. No new tooling is required to *read* the lane.</fact></p>
    <section id="priority-placement" title="5.1 Priority placement — the resolution rules must not be forgettable (owner addition, 2026-08-04)">
      <p p="20"><fact id="placement-owner-word" status="spec/work">**The owner's addition on approving the design (2026-08-04, near-verbatim):** нужно каким-то образом все эти правила резолвинга приоритизировать для агента-исполнителя, чтобы он их не забыл — возможно, поставить пораньше в списке загрузки.</fact></p>
      <p p="21"><fact id="placement-mechanism" status="spec/work">**The mechanism, made precise.** The session-start order is fixed: redirect → `STATIC.md` (first, whole) → `INDEX.md` → entries. So «пораньше в списке загрузки» has an exact best position: **the first lines of `STATIC.md`** — and that position also survives forgetting, because boot files are re-read at every session start and after context compaction (the same property the read-set's boot instruction relies on, PROP-035 §7.4). The placement law (`addressable-specs`: critical constraints at the START or END of a file, never mid-document) says the same. Three concrete carriers:</fact></p>
      <list ordered="true" p="22">
        <item><fact id="PLACEMENT-PREAMBLE" status="spec/work">**The resolution preamble in the lane's header** (~8 generated lines, before any content): the qualified-label convention and how to derive short↔qualified; «a short name you cannot find → the tombstone table below»; full `spec://` addresses resolve against package *sources* under `vibedeps/`, never against this file; `@!X` is a mandatory read through the file's alias table; ambiguity is answered with candidates, never a silent pick.</fact></item>
        <item><fact id="PLACEMENT-TOMBSTONE-UNDER-HEADER" status="spec/work">**The tombstone table sits directly under the header** — START-placement, never the file's tail (§6.1 layer 2).</fact></item>
        <item><fact id="PLACEMENT-LOADER-FIRST" status="spec/work">**The structural loader's first-instructions contract carries the same rules.** PROP-035 §13 already binds normatively: the directive instructions load *first, everywhere*, and a project without them is broken — but they are «not yet wired into any live boot» (`structural-loader.xml`, hold). B-011 wires them in for the first time, with the resolution rules as named content of that first-loaded text (the §7 edit).</fact></item>
      </list>
    </section>
  </section>
  <section id="dynamic" title="6. The dynamic-loading case — libraries carrying their own STATIC.md">
    <p p="23"><fact id="dynamic-owner-case" status="spec/work">The owner's named hard case (2026-08-02, recorded in B-011): «отдельно рассмотреть сложные случаи динамической дозагрузки новых библиотек, в которых есть собственные STATIC.md».</fact></p>
    <p p="24"><fact id="dynamic-composition" status="spec/work">**Composition without recomposition.** A library L installed later arrives with its own compiled `STATIC.md` — L's own splice of L's static-linked dependencies, with L-world labels already qualified by *their* origins. Loading L into a running project is then: add L's lane as an entry to the host's `INDEX.md` (the existing dynamic-entry mechanism — a by-reference read, PROP-009 §2.3); nothing in the host's already-compiled `STATIC.md` is renamed or re-spliced, because qualified names collide only if two contributions share an origin — and one origin appearing in both lanes is the *same* text twice (a dedup problem, the read-set's job and PROP-038's hoisting — not a collision). L's outward references are full `spec://` addresses (its `@!X` forms were rewritten at L's own compile time, §4), resolved against the host's materialised `vibedeps/` tree. **The determinism claim, stated once:** under qualified naming, what a label means is decided when its package is *authored*, not when the world is *assembled* — so assembly, in any order, at any time, cannot change any meaning.</fact></p>
    <p p="25"><fact id="dynamic-not-a-new-mechanism" status="spec/work">**No new loader mechanism is proposed here.** The host's `INDEX.md` dynamic entries, the `when` gating, and the structural loader stay as PROP-009/PROP-035 define them; this design only guarantees that the *names* such a load brings along are conflict-free and its references resolvable. A full «hot-attach a package's lane» UX (who writes the INDEX entry, when) is explicitly out of this slice (§9).</fact></p>
    <section id="dynamic-stale-short" title="6.1 The failure the owner probed: a late module citing a short splice anchor">
      <p p="26"><fact id="stale-short-question" status="spec/work">**The owner's probe (2026-08-03, design review):** a dynamically-loaded library references `#root`, which the splice renamed — the agent does not find the unit. Can it happen, and what do we do?</fact></p>
      <p p="27"><fact id="stale-short-taxonomy" status="spec/work">**Which reference classes break — exactly one.** Full addresses (`spec://&lt;pkg&gt;/&lt;doc&gt;#root`, `@spec://…`, `@!X`) resolve against the package's *source* under `vibedeps/`, which the rename never touches — unbroken. A dynamic document's own intra-doc `(#x)` links point into its own un-renamed file — unbroken. **The one breaking class: an address targeting the compiled splice itself** («the STATIC file, section `#root`») — after qualification the short name is gone from the lane.</fact></p>
      <p p="28"><fact id="stale-short-was-a-lottery" status="spec/work">**The honest baseline: that class does not work today either.** `#root` is already defined 26× in the compiled lane and the index mints one ambiguous address over all of them — which section a reader lands on is a lottery. The rename does not break a working reference; it converts a *silent ambiguity* into a *loud not-found*. Strictly better — provided the not-found is handled well, below. Measured population of this class in the tree today: **zero** (B-011's «ссылок из кода пока ноль»), but the grammar does not forbid it and a `simple`-format package (never compiled) can carry one in.</fact></p>
      <p p="29"><fact id="stale-short-defence" status="spec/work">**Four defence layers, cheap-to-rich:**</fact></p>
      <list ordered="true" p="30">
        <item><fact id="DEFENCE-LINT" status="spec/work">**Forbid-and-lint: the splice is not a citation target.** The compiled lane is a generated cache; source-of-truth is the package source. An address targeting `vibevm/vibespecs/boot/STATIC.xml` (any host's compiled lane) becomes an illegal target for new text, and the gate lints it — cheapest exactly now, while the class's population is zero.</fact></item>
        <item><fact id="DEFENCE-TOMBSTONE" status="spec/work">**A tombstone table in the lane's header — the agent's self-service path.** The splicer already holds the rename map; it prints it: each collided short name with its qualified heirs and their origins («`#root` → `org-…--wal--root` (org.vibevm.world/wal), …»). An agent that misses `#root` reads the header, gets the candidates and the selection rule (the block's provenance comment names the origin). The addressable-specs law applied to renames: a retired name leaves a tombstone naming its heirs, never vanishes silently.</fact></item>
        <item><fact id="DEFENCE-RESOLVER" status="spec/work">**The resolver answers with candidates, never emptiness.** The tool half of the same: a query for `STATIC#&lt;short&gt;` that misses, where qualified `*--&lt;short&gt;` tails exist, returns «ambiguous short anchor; candidates: …» with each heir's source-of-truth address — the §5 fail-with-candidates posture extended to post-rename reads.</fact></item>
        <item><fact id="DEFENCE-INSTALL-CHECK" status="spec/work">**Install-time outbound-link validation.** A dynamically-arriving package's outgoing `spec://` addresses are resolved against the tree at materialisation; a dangling one is an `install` diagnostic, not a mid-session surprise. Larger than the other three; may ride separately (fork E).</fact></item>
      </list>
      <p p="31"><fact id="stale-short-in-slice" status="spec/work">**Layers 1–3 belong to this slice** — the rename map is already in the compiler's hands (layer 2 is a print), the resolver change is pointwise (layer 3), and the lint is cheapest at zero population (layer 1). Layer 4 is fork E.</fact></p>
    </section>
  </section>
  <section id="normative" title="7. What becomes normative on approval — the exact edits">
    <p p="32"><fact id="normative-prop035" status="spec/work">**PROP-035 edits:** §7.2 gains the `as &lt;Alias&gt;` clause (grammar + file-local scope + duplicate-alias error); §7.4 gains the `@!X` sigil (semantics: identical to `@spec://` on the alias's target; unknown-alias error); §8's pipeline gains a **qualify** step in the emit phase (each node's labels and intra-node label links rewritten under its origin slug; `@!X` rewritten to the full address); §11 notes that a compiled block's labels are origin-qualified (`decompile` reverses the qualification by stripping the block's own prefix — reversibility preserved).</fact></p>
    <p p="33"><fact id="normative-prop009" status="spec/work">**PROP-009 §2.3 edit:** `##ARTIFACT-STATIC-MD`'s «verbatim concatenation» becomes «anchor-qualified concatenation» with one sentence defining the qualification; `##SESSION-START-ORDER` unchanged.</fact></p>
    <p p="34"><fact id="normative-backlog" status="spec/work">**BACKLOG B-011** gets the acceptance restated as M-LOAD's two measurements (zero `duplicate-anchor` over the compiled lane; an alias resolving with its carrier cleaned) plus the append-safety property test of §6.</fact></p>
  </section>
  <section id="forks" title="8. The forks the owner is asked to rule on">
    <p p="35"><fact id="forks-tree" status="spec/work">Four forks, each with the boss's recommendation first:</fact></p>
    <list ordered="false" p="36">
      <item><fact id="FORK-SLUG-SHAPE" status="spec/work">**(A) The slug's shape** — what prefixes a label. **(A1, recommended) full origin slug** `org-vibevm-world--wal`: globally unique by the qualified-naming laws (group+name is the identity); self-describing; long, but the file is generated and read, never hand-written. (A2) package name only, `wal--root`: shorter; collides the moment two groups publish a same-named package — reintroducing a collision class qualified naming exists to kill. (A3) the boot-snippet slot filename (`10-flow-wal`): stable neither under version bumps nor re-slotting.</fact></item>
      <item><fact id="FORK-FACT-IDS" status="spec/work">**(B) Are fact ids qualified too, or headings only?** **(B1, recommended) both**, because they are one namespace (PROP-035 §7.3-3) and both are measured to collide (§1); the registry and campaign machinery key on the *source packages'* files, which the rename never touches, so nothing downstream re-keys. (B2) headings-only as slice 1, facts in a follow-up — smaller first diff, but ships a lane that is still ambiguous at the fact grain (61 duplicated names stay).</fact></item>
      <item><fact id="FORK-COMPILED-REFERENCE" status="spec/work">**(C) What `@!X` compiles to in the static lane.** **(C1, recommended) the full `spec://` address** — self-describing, strip-proof, and exactly the owner's materialisation idea. (C2) an intra-STATIC qualified link `(#slug--x)` when the target is also in the lane — saves the reader a file hop but breaks the moment the target's carrier is cleaned, which is the case this entry exists for.</fact></item>
      <item><fact id="FORK-STRICTNESS" status="spec/work">**(D) Unresolvable short references at compile time.** **(D1, recommended) hard error with candidates** — the deterministic-loading posture; matches the `#embed`-cycle precedent (report, never silent). (D2) warn-and-keep — tolerable during migration, but a warning that ships ambiguity is how the current 59 got here. A migration flag (error-by-default, `--lenient` for the first re-vendor) is compatible with D1.</fact></item>
      <item><fact id="FORK-INSTALL-VALIDATION" status="spec/work">**(E) Where §6.1's layer 4 (install-time outbound-link validation) lives.** **(E1, recommended) a separate follow-up entry** — it is a general link-integrity gate, useful beyond this design, and the B-011 slice stays small with layers 1–3 covering the probed failure. (E2) inside this slice — one landing, but grows the first diff with a walker over every materialised package's outbound addresses.</fact></item>
    </list>
  </section>
  <section id="out-of-scope" title="9. Deliberately out of this slice">
    <p p="37"><fact id="oos-strip" status="spec/work">**The marker strip itself** — B-011 is «aliasing design first»; the strip builds on top once aliases + qualification land (its own entry when commissioned).</fact></p>
    <p p="38"><fact id="oos-b006" status="spec/work">**The git-family double emission** (B-006) — a dedup/hoisting matter; qualification makes the duplicate *visible as* a same-origin repeat rather than a collision, but removing it is B-006's own build.</fact></p>
    <p p="39"><fact id="oos-b031" status="spec/work">**The host-as-package root** (B-031) and the grammar-superset decision (B-028) — adjacent loading-plane builds, sequenced after B-011 in wave А.</fact></p>
    <p p="40"><fact id="oos-hot-attach" status="spec/work">**A hot-attach UX** for dynamic library lanes (§6) — the naming guarantees are this slice; the workflow that writes the INDEX entry is not.</fact></p>
  </section>
  <section id="implementation" title="10. Implementation shape (for the worker cut, after approval)">
    <p p="41"><fact id="impl-slices" status="spec/work">Four work slices, each a native collaboration packet with a disjoint perimeter; every slice self-verifies with `cargo check -p vibe-spec` / `-p vibe-workspace` class commands and lands behind the existing gate panel:</fact></p>
    <list ordered="true" p="42">
      <item><fact id="IMPL-W1" status="spec/work">**`vibe-spec` qualify module** (new cell, `crates/vibe-spec/src/qualify.rs`): `qualify_contribution(text, origin) -&gt; String` — heading + fact-id definitions and intra-doc `(#x)` links rewritten under the origin slug; fence-mask honoured; pure, property-tested (idempotence; append-independence; reversibility of the prefix).</fact></item>
      <item><fact id="IMPL-W2" status="spec/work">**directives grammar** (`crates/vibe-spec/src/directives.rs`): `as &lt;Alias&gt;` parsing on `#use` (the token tail after the address is currently ignored — the clause is backward-compatible); the `@!X` scanner beside `@spec://`; the per-file alias table with its two error classes.</fact></item>
      <item><fact id="IMPL-W3" status="spec/work">**splice integration** (`crates/vibe-workspace/src/boot_artifacts.rs` `render_static` + `crates/vibe-spec/src/pipeline.rs` emit phase): qualify each entry under its origin; rewrite `@!X`; emit the §5.1 resolution preamble and the §6.1 tombstone table directly under the header (START-placement); §6.1 layer 3 (the resolver answers a missed `STATIC#&lt;short&gt;` with the qualified candidates) and layer 1 (an address targeting a compiled lane is a directive-compile error); regenerate the host lane; gate `DocTree::duplicate_anchors() == []` over the result; golden before/after.</fact></item>
      <item><fact id="IMPL-W4" status="spec/work">**the dynamic-load exhibit** (fixture test): two packages compiled into two lanes, one loaded «later» as an INDEX entry; assert zero collisions, assert an alias in the late lane resolves against `vibedeps/` source with the compiled carrier text removed — the M-LOAD acceptance, executable.</fact></item>
    </list>
    <p p="43"><fact id="impl-spec-edits" status="spec/work">The §7 PROP edits are boss work (spec authoring is never delegated), applied only on the owner's approval of this design.</fact></p>
  </section>
</spec>
