docs: simplify WWAR phase boundaries

This commit is contained in:
2026-08-11 19:36:58 +09:00
parent 64f7a54be3
commit 3157e1d688

View File

@@ -157,6 +157,68 @@ absence of a garbage collector says nothing about version resolution.
| Assembler/linker ownership | No permanent ownership. The toolchain descriptor pins complete implementations. The current WW tools may bridge migration only. | | Assembler/linker ownership | No permanent ownership. The toolchain descriptor pins complete implementations. The current WW tools may bridge migration only. |
| Stage zero | One release-generated, checked-in portable C99 compiler snapshot plus a tiny declarative bootstrap plan and digest file. | | Stage zero | One release-generated, checked-in portable C99 compiler snapshot plus a tiny declarative bootstrap plan and digest file. |
### 1.4 Corrective protocol boundary (2026-08-11)
The first Phase 0 experiment over-scoped the protocol freeze. It turned package
resolution, manifest parsing, compiler projections, action lowering, provider
recursion, graph traversal, scheduling, cache policy, failure precedence, and
bootstrap assertions into a declarative expression language. Its checker then
implemented those operations again. That experiment is preserved as recoverable
migration evidence, but it is not the production architecture.
The correction follows the separation visible in the pinned Go source. Go reads
imports from source with an imports-only parse and resolves them in ordinary
loader code ([`go/build/read.go`](https://go.googlesource.com/go/+/refs/tags/go1.26.5/src/go/build/read.go#272),
[`cmd/go/internal/load/pkg.go`](https://go.googlesource.com/go/+/refs/tags/go1.26.5/src/cmd/go/internal/load/pkg.go#1775)).
The compiler writes a narrow export representation in compiler code
([`cmd/compile/internal/noder/writer.go`](https://go.googlesource.com/go/+/refs/tags/go1.26.5/src/cmd/compile/internal/noder/writer.go)),
while `cmd/go` builds and schedules an in-memory action graph with ordinary Go
functions ([`work/action.go`](https://go.googlesource.com/go/+/refs/tags/go1.26.5/src/cmd/go/internal/work/action.go#85),
[`work/exec.go`](https://go.googlesource.com/go/+/refs/tags/go1.26.5/src/cmd/go/internal/work/exec.go#73)).
Action IDs and cache storage/validation are executable hashing and storage
operations, not schema programs
([`work.buildActionID`](https://go.googlesource.com/go/+/refs/tags/go1.26.5/src/cmd/go/internal/work/exec.go#260),
[`internal/cache`](https://go.googlesource.com/go/+/refs/tags/go1.26.5/src/cmd/go/internal/cache/cache.go#95)).
Go's `cmd/dist` performs concrete staged builds and checks that the final targets
are not stale. Separate compiler reproducibility tests compare repeated outputs
byte-for-byte, while the release process independently rebuilds and compares
archives bit-for-bit
([`cmd/dist/build.go`](https://go.googlesource.com/go/+/refs/tags/go1.26.5/src/cmd/dist/build.go#1404),
[`reproduciblebuilds_test.go`](https://go.googlesource.com/go/+/refs/tags/go1.26.5/src/cmd/compile/internal/test/reproduciblebuilds_test.go),
[`rebuild` account](https://go.dev/blog/rebuild)).
WW adopts that division, not Go's module/network/toolchain policy. Normal typed
C/WW code MUST own source loading, parsing, resolution, compiler behavior,
lowering, orchestration, storage, and bootstrap execution. Declarative schemas
MUST describe wire representation only. Tests MUST verify executable behavior;
a schema or proof-shaped record MUST NOT stand in for running it. A generator is
permitted only for repetitive codec data and MUST be small, generic,
deterministic, and byte-for-byte reproducible.
Phase 0 therefore freezes only WWAR framing and primitive canonical encoding;
record/enum/union tags, field order, encoded defaults and record kinds; exact
domain-separated digest and action-key byte formulas; compact positive and
malformed-wire vectors; a small reference codec; deterministic data-only codec
generation; and its repository gate. It does not freeze algorithms for deriving
the represented records. Every declared record tag remains encoded, including
an optional field's empty `encoded_default`; absence is not default insertion.
The owning implementation phases are binding:
| Behavior removed from the Phase 0 experiment | Owning phase |
|---|---|
| source imports, package graph/cycles, `.wwe`/`.wwlm`, compiler export and public type/ABI projections | Phase 1 |
| action construction, graph traversal, scheduling, CAS/cache, environment/sandbox and build failure behavior | Phase 2 |
| manifest/lock/work/vendor text parsing, module/source resolution, fetching, source-store policy and source-tree construction | Phase 3 |
| native/provider recursion, lowering, link-plan construction, tool adapters and platform policy | Phase 4 |
| actual staged bootstrap, fixed-point rebuild and byte comparison | Phase 6 |
WW-specific guarantees remain stronger and explicit: frozen artifact builds are
deterministic and offline, selections are locked, artifacts are content-addressed,
cached objects are rehashed on read, and bootstrap is established by rebuilding and
comparing actual bytes. At cutover there is one user-facing build path, as
already required by the migration plan.
## 2. Normative vocabulary ## 2. Normative vocabulary
| Term | Exact meaning | | Term | Exact meaning |
@@ -1589,15 +1651,16 @@ closure, 8 identical logical stage-2/3/4 action roots, 9 semantic fixed-point
output roles, and 10 raw-record fixed-point roles. No clause or executable step output roles, and 10 raw-record fixed-point roles. No clause or executable step
exists beyond that closed plan. exists beyond that closed plan.
These sections fix the architectural fields and every reference/key These sections fix the architectural fields, but they do not make Phase 0 an
transformation. Phase 0 transcribes every named and nested record into the executable specification of every reference or key transformation. Phase 0
normative checked-in `protocol/wwar-v1.idl`, assigns any remaining mechanical transcribes only their wire-visible record fields, tags, enum values, union
numeric enum values and field tags, and freezes its digest before Phase 1. The discriminants, encoded defaults, field order, record kinds, wrapper framing, and
IDL must state every cardinality, default, ordering rule, enum, discriminator, digest preimage formulas into the checked-in compact schemas. Cross-field
cross-field constraint, and top-level record kind; generated codecs/tables and validity, construction, resolution, projection, lowering, and failure behavior
golden vectors derive from it. The IDL, WWAR 1, and those vectors jointly belong to the executable phase that implements them. The Phase 0 generator and
determine bytes. Phase 0 may not add a semantic field, change a default/order golden vectors determine bytes, not future build-engine semantics. No phase may
rule, retain producer identity in a final action, or alter action-key behavior. silently add a wire field, renumber an assignment, change an encoded default, or
alter a frozen digest formula.
## 7. Interface and artifact protocol ## 7. Interface and artifact protocol
@@ -2894,19 +2957,22 @@ only path.
### Phase 0 — conformance corpus and protocol freeze ### Phase 0 — conformance corpus and protocol freeze
- Land this decision and the exhaustive checked-in `protocol/wwar-v1.idl`. The - Land the compact checked-in `protocol/schema/` modules for WWAR framing,
IDL mechanically assigns every remaining nested tag/enum and is rejected if record/enum/union/default/kind assignments, wrappers, and finite digest byte
it adds or changes any semantic field, ordering/default, reference lowering, formulas. Freeze the exact schema-file digests. Preserve representation-only
or key rule specified here. Generate codecs plus canonical vectors for tree preimage records without embedding the algorithms that construct them.
hashing/WWAR/action keys, target descriptors, manifest/lock grammar, native ABI - Generate data-only codec tables deterministically. Keep one schema-aware
records, link plans, and failure diagnostics. reference codec and a second independent oracle limited to raw WWAR framing,
- Turn current measurement fixtures into versioned benchmarks: 1/8/15-package hashing, and record identity; neither may implement future compiler or build
graphs, direct/transitive API changes, corrupted cache artifacts, two absolute behavior.
roots, C/WW stage equivalence, and B/H/T generator traps. - Gate: strict duplicate-key UTF-8/NFC schema loading, byte-identical generation
- Gate: freeze the IDL digest; independent generated and hand-written readers in separate fresh directories, compact valid/invalid vectors, all assignment
reproduce every digest from the vectors and reject every malformed union, coverage, stable malformed-length precedence, domain separation, action-key
unresolved final reference, and record-kind substitution; no production vectors, and record-kind substitution rejection. No production behavior
behavior changes. changes beyond adding this conformance gate.
- Package/API, graph/cache, native B/H/T, and bootstrap measurements remain useful
fixtures, but become tests in Phases 1, 2, 4, and 6 respectively. They are not
Phase 0 semantic answer tables.
### Phase 1 — compiler export and package protocol ### Phase 1 — compiler export and package protocol
@@ -2915,15 +2981,18 @@ only path.
- Add package identity/alias syntax, strict directory enumeration, compiler - Add package identity/alias syntax, strict directory enumeration, compiler
import extraction, target suffix selection, cycle/collision/internal checks, import extraction, target suffix selection, cycle/collision/internal checks,
and protocol compatibility diagnostics. and protocol compatibility diagnostics.
- Prove the deep public type closure and API digest with existing standard-library - Construct and test the deep public type closure and public type/ABI digest
graphs. Reject `.wwi` input in the experimental path; do not translate it. preimages in compiler code with existing standard-library graphs. Reject
`.wwi` input in the experimental path; do not translate it.
- Gate: Cstage/WWstage emit byte-identical vectors, importers open only direct - Gate: Cstage/WWstage emit byte-identical vectors, importers open only direct
export files, and API propagation stops on unchanged middle exports. export files, and API propagation stops on unchanged middle exports.
### Phase 2 — one action engine and local CAS ### Phase 2 — one action engine and local CAS
- Implement WWAR, typed action graph, lazy keys, scheduler, atomic CAS/results, - Integrate the frozen WWAR codec into production code and implement typed pure
project index, corruption quarantine, graph JSON, and causal explanation. action-record/key functions, the action graph, lazy keys, scheduler, atomic
CAS/results, project index, corruption quarantine, graph JSON, environment and
sandbox policy, deterministic failure behavior, and causal explanation.
- Add deterministic package/archive/link adapters using the existing compiler, - Add deterministic package/archive/link adapters using the existing compiler,
assembler, and linker as explicitly hashed tools. This is a temporary adapter, assembler, and linker as explicitly hashed tools. This is a temporary adapter,
not a compatibility promise. not a compatibility promise.
@@ -2934,9 +3003,13 @@ only path.
### Phase 3 — module, lock, source, and workspace layer ### Phase 3 — module, lock, source, and workspace layer
- Implement the closed manifest grammar, monotonic selector, canonical lock, - Implement the manifest, lock, work, and vendor text parsers as ordinary typed
parser code, then implement the closed grammar, monotonic selector, canonical
lock,
HTTPS source-index/archive protocol, immutable source store, signatures, HTTPS source-index/archive protocol, immutable source store, signatures,
explicit add/update/lock/fetch, overlays, and vendor index. explicit add/update/lock/fetch, overlays, vendor index, and canonical
source-tree construction. The schema fixes only the resulting record bytes and
source-tree digest formula.
- Build/test/doc/install remain network-denied from their first experimental use. - Build/test/doc/install remain network-denied from their first experimental use.
- Gate: frozen offline builds work from project source + complete locked source - Gate: frozen offline builds work from project source + complete locked source
closure + lock + installed named toolchain; collision/downgrade/hash/ closure + lock + installed named toolchain; collision/downgrade/hash/
@@ -2945,7 +3018,8 @@ only path.
### Phase 4 — native, target, and external toolchain closure ### Phase 4 — native, target, and external toolchain closure
- Implement full target descriptors, B/H/T lowering, C/assembly/native-provider - Implement full target descriptors, B/H/T lowering, C/assembly/native-provider
records, generated actions/sandbox, object sidecars, exact link plans, sysroot, records, recursive provider selection/expansion, generated actions/sandbox,
object sidecars, exact link-plan construction, sysroot,
libc/CRT/loader/SDK/runtime, shared-library installation, and freestanding libc/CRT/loader/SDK/runtime, shared-library installation, and freestanding
products. products.
- Package supported assembler/linker/archive/C tools as immutable external - Package supported assembler/linker/archive/C tools as immutable external
@@ -2979,10 +3053,13 @@ only path.
- Implement/gate the portable C recovery backend and snapshot generator, then - Implement/gate the portable C recovery backend and snapshot generator, then
generate/check in `bootstrap/ww0.c` and the fixed plan. Produce stages 1/2/3/4, generate/check in `bootstrap/ww0.c` and the fixed plan. Produce stages 1/2/3/4,
fixed-point and diverse-seed-compilation reports, signed toolchain rebuild stages with the executable engine, compare the actual bytes of every
bundles, and recovery documentation on a clean machine with no WW compiler. declared output directly, and produce fixed-point and diverse-seed-compilation
- Gate: stage 2 equals stage 3 semantically and stage 3 equals stage 4 including reports, signed toolchain bundles, and recovery documentation on a clean
raw action/result records in two roots/concurrency levels; project plus complete machine with no WW compiler.
- Gate: stage 2 equals stage 3 and stage 3 equals stage 4 by explicit
byte-for-byte comparison, including raw action/result records, in two
roots/concurrency levels; project plus complete
locked source closure and published named tool closure reproduce every release locked source closure and published named tool closure reproduce every release
artifact. artifact.
@@ -3020,12 +3097,17 @@ compiler, environment switch, or fallback subprocess retains a dual system.
### 14.1 Unit and format tests ### 14.1 Unit and format tests
- Golden and adversarial vectors for WWAR, source-tree digest, action key, CAS - Phase 0 has golden and adversarial vectors only for WWAR representation,
tree/result objects, `.wwe`, `.wwlm`, manifest, lock, work, vendor index, source-tree digest bytes, action-key/record identity formulas, typed record
target/toolchain/native records, and canonical JSON. assignments, wrappers, and canonical schema JSON.
- Unicode normalization, case folding, traversal, symlink/device, duplicate key, - Phase 0 tests UTF-8/NFC, duplicate schema keys, unknown wire type/schema field,
unknown schema/field, oversized input, truncation, hash collision simulation, oversized declarations, truncation, exact-length mismatch, union shape, and
and malformed binary tests. record-kind substitution. Case-fold collision, traversal, symlink/device,
cache collision/corruption, and semantic record tests land with their owning
executable phases.
- Phases 14 add behavior tests for CAS tree/result objects, `.wwe`, `.wwlm`,
manifest/lock/work/vendor parsing, and target/toolchain/native processing;
these are not encoded as Phase 0 vector outcomes.
- Resolver vectors for minimum selection, incompatible-major identities, - Resolver vectors for minimum selection, incompatible-major identities,
workspace identity preservation, source origin independence, vendor matching, workspace identity preservation, source origin independence, vendor matching,
internal packages, aliases, nested module/root-versus-parent-subpackage internal packages, aliases, nested module/root-versus-parent-subpackage