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. |
| 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
| 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
exists beyond that closed plan.
These sections fix the architectural fields and every reference/key
transformation. Phase 0 transcribes every named and nested record into the
normative checked-in `protocol/wwar-v1.idl`, assigns any remaining mechanical
numeric enum values and field tags, and freezes its digest before Phase 1. The
IDL must state every cardinality, default, ordering rule, enum, discriminator,
cross-field constraint, and top-level record kind; generated codecs/tables and
golden vectors derive from it. The IDL, WWAR 1, and those vectors jointly
determine bytes. Phase 0 may not add a semantic field, change a default/order
rule, retain producer identity in a final action, or alter action-key behavior.
These sections fix the architectural fields, but they do not make Phase 0 an
executable specification of every reference or key transformation. Phase 0
transcribes only their wire-visible record fields, tags, enum values, union
discriminants, encoded defaults, field order, record kinds, wrapper framing, and
digest preimage formulas into the checked-in compact schemas. Cross-field
validity, construction, resolution, projection, lowering, and failure behavior
belong to the executable phase that implements them. The Phase 0 generator and
golden vectors determine bytes, not future build-engine semantics. No phase may
silently add a wire field, renumber an assignment, change an encoded default, or
alter a frozen digest formula.
## 7. Interface and artifact protocol
@@ -2894,19 +2957,22 @@ only path.
### Phase 0 — conformance corpus and protocol freeze
- Land this decision and the exhaustive checked-in `protocol/wwar-v1.idl`. The
IDL mechanically assigns every remaining nested tag/enum and is rejected if
it adds or changes any semantic field, ordering/default, reference lowering,
or key rule specified here. Generate codecs plus canonical vectors for tree
hashing/WWAR/action keys, target descriptors, manifest/lock grammar, native ABI
records, link plans, and failure diagnostics.
- Turn current measurement fixtures into versioned benchmarks: 1/8/15-package
graphs, direct/transitive API changes, corrupted cache artifacts, two absolute
roots, C/WW stage equivalence, and B/H/T generator traps.
- Gate: freeze the IDL digest; independent generated and hand-written readers
reproduce every digest from the vectors and reject every malformed union,
unresolved final reference, and record-kind substitution; no production
behavior changes.
- Land the compact checked-in `protocol/schema/` modules for WWAR framing,
record/enum/union/default/kind assignments, wrappers, and finite digest byte
formulas. Freeze the exact schema-file digests. Preserve representation-only
preimage records without embedding the algorithms that construct them.
- Generate data-only codec tables deterministically. Keep one schema-aware
reference codec and a second independent oracle limited to raw WWAR framing,
hashing, and record identity; neither may implement future compiler or build
behavior.
- Gate: strict duplicate-key UTF-8/NFC schema loading, byte-identical generation
in separate fresh directories, compact valid/invalid vectors, all assignment
coverage, stable malformed-length precedence, domain separation, action-key
vectors, and record-kind substitution rejection. No production behavior
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
@@ -2915,15 +2981,18 @@ only path.
- Add package identity/alias syntax, strict directory enumeration, compiler
import extraction, target suffix selection, cycle/collision/internal checks,
and protocol compatibility diagnostics.
- Prove the deep public type closure and API digest with existing standard-library
graphs. Reject `.wwi` input in the experimental path; do not translate it.
- Construct and test the deep public type closure and public type/ABI digest
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
export files, and API propagation stops on unchanged middle exports.
### Phase 2 — one action engine and local CAS
- Implement WWAR, typed action graph, lazy keys, scheduler, atomic CAS/results,
project index, corruption quarantine, graph JSON, and causal explanation.
- Integrate the frozen WWAR codec into production code and implement typed pure
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,
assembler, and linker as explicitly hashed tools. This is a temporary adapter,
not a compatibility promise.
@@ -2934,9 +3003,13 @@ only path.
### 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,
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.
- Gate: frozen offline builds work from project source + complete locked source
closure + lock + installed named toolchain; collision/downgrade/hash/
@@ -2945,7 +3018,8 @@ only path.
### Phase 4 — native, target, and external toolchain closure
- 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
products.
- 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
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
bundles, and recovery documentation on a clean machine with no WW compiler.
- Gate: stage 2 equals stage 3 semantically and stage 3 equals stage 4 including
raw action/result records in two roots/concurrency levels; project plus complete
rebuild stages with the executable engine, compare the actual bytes of every
declared output directly, and produce fixed-point and diverse-seed-compilation
reports, signed toolchain bundles, and recovery documentation on a clean
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
artifact.
@@ -3020,12 +3097,17 @@ compiler, environment switch, or fallback subprocess retains a dual system.
### 14.1 Unit and format tests
- Golden and adversarial vectors for WWAR, source-tree digest, action key, CAS
tree/result objects, `.wwe`, `.wwlm`, manifest, lock, work, vendor index,
target/toolchain/native records, and canonical JSON.
- Unicode normalization, case folding, traversal, symlink/device, duplicate key,
unknown schema/field, oversized input, truncation, hash collision simulation,
and malformed binary tests.
- Phase 0 has golden and adversarial vectors only for WWAR representation,
source-tree digest bytes, action-key/record identity formulas, typed record
assignments, wrappers, and canonical schema JSON.
- Phase 0 tests UTF-8/NFC, duplicate schema keys, unknown wire type/schema field,
oversized declarations, truncation, exact-length mismatch, union shape, and
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,
workspace identity preservation, source origin independence, vendor matching,
internal packages, aliases, nested module/root-versus-parent-subpackage