ww imports: reject init bindings before recovery
This commit is contained in:
@@ -9033,6 +9033,293 @@ the valid persisted-byte contract is unchanged. Build workdir format remains
|
||||
`18`, test workdir format remains `19`, and semantic storage format remains
|
||||
`3`. No test-result cache is introduced.
|
||||
|
||||
### 11.46 Implemented effective-`init` import-binding recovery
|
||||
|
||||
An import whose effective file-local qualifier is `init` is rejected as
|
||||
`cannot import package as init - init must be a func`. The rule covers an
|
||||
explicit `init` alias and an unaliased dependency declared `package init`.
|
||||
Every resolved rejected occurrence reports the core error at the first
|
||||
import-spec token: the alias token when explicit, otherwise the first path
|
||||
token. The occurrence creates no qualifier and takes no part in unused,
|
||||
duplicate-binding, or declaration/import-collision recovery. A later
|
||||
`init.Name` therefore recovers independently as undefined. Resolution retains
|
||||
precedence, so a missing target fails without an additional effective-`init`
|
||||
diagnostic.
|
||||
|
||||
Only the file-local binding is rejected. The resolved source occurrence and
|
||||
its exact dotted dependency remain loader and graph provenance. Neither the
|
||||
effective qualifier nor the dependency's declared package name becomes
|
||||
canonical package, import, graph, action, symbol, `.wwi`, artifact,
|
||||
publication, or persistence identity.
|
||||
|
||||
The paragraphs above state the normative implementation contract and are
|
||||
**behavior derived from the pinned implementation**. The post-change results
|
||||
recorded in the proof subsection below are **directly measured WW behavior**.
|
||||
|
||||
#### Pinned evidence and fact classification
|
||||
|
||||
The sole authority is official Go 1.26.5 at
|
||||
`c19862e5f8415b4f24b189d065ed739517c548ba`:
|
||||
|
||||
- `(*Checker).collectObjects` resolves an import at lines 248–263, selects the
|
||||
explicit alias or imported declared name at lines 264–274, rejects effective
|
||||
name `init` and immediately continues at lines 275–278, before explicit
|
||||
import recording, `PkgName` construction, used-import tracking, or file-scope
|
||||
installation at lines 280–335 in
|
||||
[`cmd/compile/internal/types2/resolver.go`, lines 223–335](https://github.com/golang/go/blob/c19862e5f8415b4f24b189d065ed739517c548ba/src/cmd/compile/internal/types2/resolver.go#L223-L335);
|
||||
- `(*Checker).unusedImports` examines only admitted imports at
|
||||
[`cmd/compile/internal/types2/resolver.go`, lines 706–740](https://github.com/golang/go/blob/c19862e5f8415b4f24b189d065ed739517c548ba/src/cmd/compile/internal/types2/resolver.go#L706-L740),
|
||||
while package/file collision reconciliation is at lines 472–489 of that
|
||||
file;
|
||||
- the independent public checker implements the same effective-name rejection
|
||||
and immediate continuation in
|
||||
[`go/types/resolver.go`, lines 261–315, especially 290–293](https://github.com/golang/go/blob/c19862e5f8415b4f24b189d065ed739517c548ba/src/go/types/resolver.go#L261-L315);
|
||||
- compiler-syntax `(*parser).importDecl` assigns the declaration position to
|
||||
the first import-spec token in
|
||||
[`cmd/compile/internal/syntax/parser.go`, lines 543–574](https://github.com/golang/go/blob/c19862e5f8415b4f24b189d065ed739517c548ba/src/cmd/compile/internal/syntax/parser.go#L543-L574),
|
||||
with node-position ownership in
|
||||
[`cmd/compile/internal/syntax/nodes.go`, lines 10–31 and 56–64](https://github.com/golang/go/blob/c19862e5f8415b4f24b189d065ed739517c548ba/src/cmd/compile/internal/syntax/nodes.go#L10-L64);
|
||||
- public `ast.ImportSpec.Pos` independently chooses the alias position when
|
||||
present and the path position otherwise in
|
||||
[`go/ast/ast.go`, lines 908–915 and 939–946](https://github.com/golang/go/blob/c19862e5f8415b4f24b189d065ed739517c548ba/src/go/ast/ast.go#L908-L946);
|
||||
- compiler diagnostics are stably position-sorted in
|
||||
[`cmd/compile/internal/base/print.go`, lines 70–92](https://github.com/golang/go/blob/c19862e5f8415b4f24b189d065ed739517c548ba/src/cmd/compile/internal/base/print.go#L70-L92); and
|
||||
- package loading and action construction remain separate from file binding in
|
||||
[`cmd/go/internal/load/pkg.go`, lines 757–805](https://github.com/golang/go/blob/c19862e5f8415b4f24b189d065ed739517c548ba/src/cmd/go/internal/load/pkg.go#L757-L805)
|
||||
and
|
||||
[`cmd/go/internal/load/pkg.go`, lines 2024–2047](https://github.com/golang/go/blob/c19862e5f8415b4f24b189d065ed739517c548ba/src/cmd/go/internal/load/pkg.go#L2024-L2047),
|
||||
[`cmd/go/internal/work/action.go`, lines 647–658](https://github.com/golang/go/blob/c19862e5f8415b4f24b189d065ed739517c548ba/src/cmd/go/internal/work/action.go#L647-L658),
|
||||
and test-variant construction in
|
||||
[`cmd/go/internal/load/test.go`, lines 175–240](https://github.com/golang/go/blob/c19862e5f8415b4f24b189d065ed739517c548ba/src/cmd/go/internal/load/test.go#L175-L240).
|
||||
|
||||
Official assertions are
|
||||
[`internal/types/testdata/check/importdecl0/importdecl0a.go`, lines 9–17](https://github.com/golang/go/blob/c19862e5f8415b4f24b189d065ed739517c548ba/src/internal/types/testdata/check/importdecl0/importdecl0a.go#L9-L17),
|
||||
which expects only the core error for an explicit `init` alias;
|
||||
[`test/fixedbugs/issue4517d.go`, lines 7–9](https://github.com/golang/go/blob/c19862e5f8415b4f24b189d065ed739517c548ba/test/fixedbugs/issue4517d.go#L7-L9),
|
||||
which covers the explicit spelling; and
|
||||
[`test/fixedbugs/issue43962.dir/a.go`, lines 1–5](https://github.com/golang/go/blob/c19862e5f8415b4f24b189d065ed739517c548ba/test/fixedbugs/issue43962.dir/a.go#L1-L5)
|
||||
with
|
||||
[`b.go`, lines 1–7](https://github.com/golang/go/blob/c19862e5f8415b4f24b189d065ed739517c548ba/test/fixedbugs/issue43962.dir/b.go#L1-L7),
|
||||
which covers an imported package declared `init`.
|
||||
|
||||
Those resolver, syntax-position, loader/action branches and official
|
||||
assertions are **behavior directly implemented or asserted by pinned Go**.
|
||||
The immediate continuation proves that the rejected occurrence contributes no
|
||||
unused, duplicate-binding, or declaration/import-collision recovery; every
|
||||
rejected occurrence reports independently; a later selector sees no package
|
||||
binding; and missing resolution wins before effective-name checking. The
|
||||
separate loader/action path proves that rejecting the qualifier does not erase
|
||||
the resolved dependency occurrence or change canonical identity. Those
|
||||
conclusions are **behavior derived from the pinned implementation**. They
|
||||
honestly apply to WW's local, unquoted dotted-import, manifest-free model
|
||||
without adding modules, manifests, registries, lock files, caches, databases,
|
||||
CAS, network resolution, quoted/grouped/dot/general imports, or a source-level
|
||||
build language.
|
||||
|
||||
#### Fresh four-axis audit and direct pre-fix measurements
|
||||
|
||||
The fresh audit also reconfirmed two applicable but unselected differences:
|
||||
multiple named source files remain different across build, test, package, and
|
||||
import construction; shared test-process state and ordinary-abort behavior
|
||||
remain different across test runtime and package/imported mutable state. They
|
||||
remain genuine future candidates and were not reclassified as aligned or
|
||||
inapplicable. Effective-`init` recovery was selected because the pinned
|
||||
resolver supplies one exact, bounded semantic owner whose complete binding and
|
||||
lifecycle effects can be closed without redefining either broader gap.
|
||||
|
||||
Before this slice, the following observations were **directly measured WW
|
||||
behavior**. Every Cstage/WWstage pair had identical status, stdout bytes,
|
||||
stderr bytes, and artifact state:
|
||||
|
||||
| Input | Status and stdout | Pre-fix stderr SHA-256 | Pre-fix recovery |
|
||||
|---|---|---|---|
|
||||
| explicit unused `init` alias | 1; empty | `5248382591e88562ba9c3c648af47523f617be0dcaf16586dc46a2517f76fe58` | bogus unused, then core |
|
||||
| explicit alias used by `init.value()` | 1; empty | `a3189e9aeaf56d5cb8aa63aa1a4de07d5176af531555a5834315298e4e9105a8` | core, then undefined |
|
||||
| implicit declared-name `init`, unused | 1; empty | `c77b3cf3b052727d90662c9b33ba85c10cba133d25b1d8b41dd53e32e1ab4978` | bogus unused, then core |
|
||||
| implicit qualifier used by `init.value()` | 1; empty | `cf0cf83a83077736497cd54a801762912f97ced4684d6c878257edbc79958340` | core, then undefined |
|
||||
| two rejected occurrences plus use | 1; empty | `9124e49408a710e1ed49a0b39b46b0967b9fe4c5f8bc67b21205d174bcfaebee` | bogus redeclaration/alternate and unused; two cores; undefined |
|
||||
| rejected import plus top-level `let init` | 1; empty | `b5e48cfab10e95d581d64d59e28409c63c7f450fa09c8d2bd11d2bb1bf487c08` | bogus unused/collision/alternate plus correct declaration/core errors |
|
||||
| missing target under alias `init` | 1; empty | `5c0fd415bb8bc8791bb87cf7211f69eea06b87ea63f264f5b8b526cbd8ac1fd9` | only missing-package error; aligned precedence |
|
||||
| same-package test, unused alias | 1; exact `FAIL\n` | `9b40aac1b160743787b4782a967350b9c97a4bf414ea0c05ea9b926c85403f9e` | bogus unused, then core |
|
||||
| external test, later use | 1; exact `FAIL\n` | `e3fcb66e8fe4eabaf2bbac0b510c370dd904fca90daab334ad4cd9b82ac914f3` | core, then undefined |
|
||||
|
||||
Representative pre-fix output placed both the bogus unused diagnostic and the
|
||||
core error at generated-unit column 1, the `import` keyword:
|
||||
|
||||
```text
|
||||
...unit.new:3:1: error: "pkg.normal" imported as init and not used
|
||||
...unit.new:3:1: error: cannot import package as init - init must be a func
|
||||
```
|
||||
|
||||
Repeated imports additionally reported `init redeclared in this block`; a
|
||||
top-level declaration additionally reported
|
||||
`init already declared through import of package init`. These were checker
|
||||
recovery artifacts forbidden by the pinned immediate continuation. Pinned
|
||||
position ownership maps WW's `import init ...` spelling to the alias at source
|
||||
column 8.
|
||||
|
||||
Aligned controls succeeded in both stages with empty streams: blank
|
||||
`import _ pkg.normal;` emitted a stage-byte-identical artifact with SHA-256
|
||||
`20847ada6923ab0bfd1dff6a3c387e0c5adace74152b84e895bc420a2e4134e9`,
|
||||
and used `import stable pkg.normal;` emitted a stage-byte-identical artifact
|
||||
with SHA-256
|
||||
`1a8fefbc12d5ea4a2bca938db6fbcdb66f3a14bbc0f7371756e4b5862ed8935c`.
|
||||
Each rejected cold case created no new public artifact. A compiler wrapper
|
||||
recorded exactly two calls per stage—dependency compilation followed by root
|
||||
compilation with its canonical `.wwi`—and failure left the traced workdirs
|
||||
empty with no `.new`, `.install`, or `.wwtxn.*` residue. Changing the warm
|
||||
valid qualifier to `init` preserved the complete committed work-file manifest
|
||||
and public product byte for byte in both stages, with no active transaction
|
||||
residue.
|
||||
|
||||
The direct pre-fix four-axis result was:
|
||||
|
||||
- **Go-like build:** different diagnostic recovery and position; loading,
|
||||
graph, producer order, failure, cold no-publication, warm rollback, and
|
||||
cleanup were aligned;
|
||||
- **Go-like test:** different for same-package and external-test sources for
|
||||
the same checker reason; variant selection and final `FAIL\n` accounting
|
||||
were aligned;
|
||||
- **Go-like package:** different because a rejected qualifier spuriously
|
||||
participated in package-declaration collision recovery; canonical package
|
||||
identity was aligned; and
|
||||
- **Go-like import:** the core rejection and missing-import precedence were
|
||||
aligned, while binding admission, recovery exclusions, and diagnostic
|
||||
position were different.
|
||||
|
||||
#### Ownership and complete four-axis contract
|
||||
|
||||
The semantic owners are the transient import-spec position plus checker-local
|
||||
file-binding recovery:
|
||||
|
||||
- Cstage: `N_USE` in `cmd/wcc/ww.h:319-375`, import parsing in
|
||||
`cmd/wcc/parse.c:1321-1359`, and binding/recovery in
|
||||
`cmd/wcc/check.c:2911-2972,3987-4144`;
|
||||
- WWstage: the `N_USE` twin in `lib/ww/syntax/ast.ww:108-158`, import parsing
|
||||
in `lib/ww/syntax/decl.ww:9-50`, and binding/recovery in
|
||||
`selfhost/cmd/wcc/check.ww:178-221,418-434,7531-7675,8601-8650`.
|
||||
|
||||
Both parsers retain the existing import-keyword node position for unrelated
|
||||
structural diagnostics and record a transient first-spec-token position. Both
|
||||
checkers identify a nonblank resolved occurrence whose effective qualifier is
|
||||
exactly `init`, emit the core diagnostic in source order before qualifier-use,
|
||||
duplicate, unused, collision, or installation recovery, exclude it from every
|
||||
such table, and silently omit the rejected qualifier from file scope. The AST
|
||||
occurrence itself remains intact.
|
||||
|
||||
Declared-name binding in `cmd/w6c/main.c:315-357` and
|
||||
`selfhost/cmd/w6c/main.ww:410-458`, driver graph construction in
|
||||
`cmd/ww/main.c:3396-3425,3630-3689` and its self-hosted twin, and all canonical
|
||||
dotted identity rules remain unchanged.
|
||||
|
||||
- **Go-like build:** a resolved invalid root or dependency reaches the normal
|
||||
dependency action, then the owning compiler action rejects once per
|
||||
occurrence at the spec token without qualifier-recovery noise. Producer
|
||||
failure still prevents new publication and preserves a prior committed
|
||||
generation.
|
||||
- **Go-like test:** the same checker rule applies after existing filename and
|
||||
role selection to production-test, same-package-test, external-test, and
|
||||
test-only sources. Failed products keep command-owned `FAIL\n` accounting and
|
||||
are not installed; test runtime and process topology do not change.
|
||||
- **Go-like package:** rejected qualifiers do not collide with package-scope
|
||||
declarations. An imported declared name `init` remains the effective name
|
||||
tested for an implicit import, but declared name, source role, package
|
||||
identity, and package declaration semantics do not change.
|
||||
- **Go-like import:** explicit and implicit effective-`init` bindings reject at
|
||||
the alias/path spec token; every occurrence rejects; later `init.Name` is
|
||||
undefined; missing resolution keeps precedence; and rejected bindings
|
||||
create no unused, duplicate, or declaration-collision recovery.
|
||||
|
||||
#### Loading, lifecycle, parity, and formats
|
||||
|
||||
Filename/platform/test-role eligibility and selected-source UTF-8, BOM, NUL,
|
||||
package-clause, and import-order validation remain earlier and unchanged.
|
||||
Excluded and wrong-target files remain non-inputs. Existing dependencies load
|
||||
normally; a missing dependency fails before checker binding recovery. Exact
|
||||
canonical paths continue to own package nodes, sorted/deduplicated graph edges,
|
||||
action keys, symbols, `.wwi` files, artifacts, publication, and invalidation.
|
||||
Dependency compilation still precedes the rejecting root action; no action
|
||||
ordering, scheduling, transaction, concurrency, or package-product topology
|
||||
changes.
|
||||
|
||||
Only transient parser/checker state changes. No valid compiler output,
|
||||
assembler, archiver, linker, initialization, runtime, test-runtime, or
|
||||
publication path changes. Invalid root input cannot complete its assembly,
|
||||
object, archive, link, retained-test, install, or runtime phases. Dependency or
|
||||
root producer failures, runtime failures, publication-only failures, and
|
||||
cleanup failures keep their existing owners and classifications.
|
||||
|
||||
Cold rejection creates no new public or retained root product and commits no
|
||||
partial unit, `.wwi`, object, archive, executable, tool record, stamp, or
|
||||
result. Warm rejection preserves the previous complete committed generation
|
||||
and public product. Dependency reuse and ordinary source invalidation remain
|
||||
unchanged, and a rejected generation never replaces root state. The rule adds
|
||||
no process, signal, wait, timeout, cancellation, shared state, or lock, so
|
||||
established request isolation, interruption rollback, descendant cleanup, and
|
||||
concurrent valid/invalid request behavior remain unaffected. Failure leaves no
|
||||
active `.new`, `.install`, `.wwtxn.*`, adjacent `.sepwork`, capture, scratch,
|
||||
or tool-stage transaction residue; the fixed recipe-owned `out/bootstrap` tree
|
||||
is not transaction residue.
|
||||
|
||||
The WW-native `effective_init_imports_never_enter_binding_recovery` observer
|
||||
owns explicit and implicit bindings; unused, used, repeated,
|
||||
declaration-collision, selector, and missing-target recovery; valid blank and
|
||||
explicit-alias controls; ordinary and imported builds; applicable
|
||||
production/same/external/test-only source roles; fixed-path stage
|
||||
status/stdout/stderr parity; invalid binding rejection inside a dependency
|
||||
reached through an imported root; cold empty-workdir rollback; warm
|
||||
preservation; valid artifact-byte parity; and residue cleanup. Concrete
|
||||
post-change statuses, diagnostic bytes and hashes, artifact hashes, and ordered
|
||||
full-gate results are recorded only after focused and full validation; they are
|
||||
not inferred from the implementation.
|
||||
|
||||
No persisted-byte contract changes. Import-spec coordinates and recovery
|
||||
tables are transient compiler state. Build workdir format remains `18`, test
|
||||
workdir format remains `19`, semantic storage format remains `3`, and no test
|
||||
result cache is introduced.
|
||||
|
||||
#### Direct post-fix proof and ordered validation
|
||||
|
||||
The following results are **directly measured WW behavior**. Both rebuilt
|
||||
stages reject explicit and implicit effective-`init` bindings at spec-token
|
||||
column 8. Every occurrence produces one core error; rejected bindings produce
|
||||
no unused, duplicate-binding, declaration/import-collision, or alternate-
|
||||
location recovery. Independent invalid declarations and later undefined
|
||||
selectors remain diagnosed, while missing-package resolution retains
|
||||
precedence.
|
||||
|
||||
A fixed-path explicit-unused probe produced identical Cstage and WWstage
|
||||
results: status 1, empty stdout, and 131-byte stderr with SHA-256
|
||||
`615a06b827a41ce214b9e76049b402be94680a14ba5e3416455d7a628185c7d5`.
|
||||
The valid blank-plus-explicit-alias control ran with status 41 and had identical
|
||||
unit, `.wwi`, assembly, object, archive, generated-init, and executable bytes
|
||||
across stages. Its 4,317-byte executable had SHA-256
|
||||
`64a48e8b18f035b8598fbe39feedc5a0e6df45d256305cb0f32e8b27a0471b92`.
|
||||
|
||||
The WW-native observer passed for ordinary roots, a rejecting imported
|
||||
dependency, production-test, same-package-test, external-test, and test-only
|
||||
sources. It directly proved normalized diagnostic parity, cold empty-workdir
|
||||
rollback and no publication, warm preservation and exact reuse of every
|
||||
committed semantic file and public product, valid artifact-byte parity, and no
|
||||
active transaction residue. `out/bin/test_300_check` passed 73/73 checks.
|
||||
|
||||
All ordered full gates then passed serially in the required order:
|
||||
|
||||
1. `make -j4 JOBS=4 test`
|
||||
2. `make -j4 JOBS=4 test-commit`
|
||||
3. `make -j4 JOBS=4 test-byteid`
|
||||
4. `make -j1 JOBS=1 test-bootstrap`
|
||||
5. `make -j1 JOBS=1 test-platform`
|
||||
6. `make -j1 JOBS=1 test-all`
|
||||
|
||||
The first byte-identity invocation encountered one transient `roster` timeout
|
||||
under four-way load. The exact isolated row passed, and the unchanged third
|
||||
gate was rerun successfully: 161 language files and 1,421 data fixtures were
|
||||
byte-identical with zero pinned divergences. Bootstrap reached the ww2/ww3/ww4
|
||||
fixed point and round-tripped all five WWstage tools byte-identically; the
|
||||
platform gate produced a byte-identical dynamic-link result. No production
|
||||
code changed after the successful ordered sequence began.
|
||||
|
||||
## 12. Candidate architectures and hard-gate decision
|
||||
|
||||
Five candidates were developed as coherent systems, not as feature bins.
|
||||
|
||||
15
docs/spec.md
15
docs/spec.md
@@ -328,6 +328,21 @@ ImportPath = ident { "." ident } .
|
||||
Neither form exposes an imported declaration as a bare `Name`; ordinary
|
||||
unqualified lookup remains limited to lexical, builtin, and same-package
|
||||
declarations.
|
||||
- An import whose effective file-local qualifier is `init` is invalid. This
|
||||
includes both `import init acme.codec;` and an unaliased import whose target
|
||||
declares `package init;`. Each resolved occurrence is rejected at its first
|
||||
import-spec token (the explicit alias when present, otherwise the first path
|
||||
token) as `cannot import package as init - init must be a func`. The rejected
|
||||
qualifier is never installed and does not participate in unused-import,
|
||||
duplicate-binding, or declaration/import-collision recovery; consequently a
|
||||
later `init.Name` independently reports an undefined `init`. Repeated invalid
|
||||
occurrences each report the core error. Import resolution retains
|
||||
precedence, so a missing target fails as missing without an additional
|
||||
effective-`init` error. A resolved rejected occurrence remains source and
|
||||
graph provenance for its exact dotted target: only its file-local qualifier
|
||||
binding is absent. Canonical package, import, graph, action, artifact,
|
||||
symbol, `.wwi`, publication, and persistence identity never derives from the
|
||||
rejected qualifier or from the target's declared name.
|
||||
- `import _ acme.codec;` is a blank side-effect import. The lone `_` creates no
|
||||
qualifier, exposes no bare declaration, and is never diagnosed as unused.
|
||||
It is nevertheless a real import occurrence: resolution and all missing,
|
||||
|
||||
@@ -568,6 +568,39 @@ exact-argv, command, and persistent-workdir observers, the package suite proves
|
||||
archive-only link argv and exact warm/rejection-state behavior without
|
||||
duplicating those broader mechanisms in this observer.
|
||||
|
||||
The focused dual-stage `effective_init_imports_never_enter_binding_recovery`
|
||||
observer is
|
||||
the acceptance owner for imports whose effective file-local qualifier is
|
||||
`init`. Its validation matrix is required to cover an explicit alias and an
|
||||
implicit qualifier obtained from `package init`; unused and used occurrences;
|
||||
repeated rejected occurrences; a package-scope declaration named `init`;
|
||||
later `init.Name` recovery; missing-target precedence; and valid blank and
|
||||
non-`init` explicit-alias controls. It must exercise ordinary root and imported
|
||||
builds plus production-test, same-package-test, external-test, and test-only
|
||||
source roles where applicable. Each resolved rejected occurrence must produce
|
||||
one core diagnostic at the alias/path spec token and no unused, duplicate, or
|
||||
declaration-collision noise from that binding; a later selector remains an
|
||||
independent undefined-name error. The resolved dotted occurrence must remain
|
||||
in dependency graph and action provenance while the rejected qualifier stays
|
||||
absent from file scope.
|
||||
|
||||
That observer's lifecycle proof requires fixed-path Cstage/WWstage status,
|
||||
stdout, and stderr parity; cold absence of public and retained products; warm
|
||||
preservation of the complete committed work-file manifest and public product;
|
||||
imported-dependency rejection and cold empty-workdir rollback; valid control
|
||||
artifact-byte parity; and absence of active `.new`, `.install`, `.wwtxn.*`,
|
||||
adjacent `.sepwork`, capture, scratch, and tool-stage transaction residue.
|
||||
Producer/runtime failure, request concurrency, interruption, descendant
|
||||
cleanup, and test-process topology retain their established owners because
|
||||
the selected checker rejection adds no producer, runtime, process, signal,
|
||||
timeout, shared-state, or publication boundary. The observer passed in both
|
||||
stages, including imported-dependency rejection, all four test-source roles,
|
||||
cold and warm rollback, normalized diagnostic parity, valid artifact-byte
|
||||
parity, and residue checks. The complete ordered `test`, `test-commit`,
|
||||
`test-byteid`, `test-bootstrap`, `test-platform`, and `test-all` gates also
|
||||
passed. Build workdir format remains 18, test workdir format remains 19,
|
||||
semantic storage remains 3, and no test-result cache is introduced.
|
||||
|
||||
The same package owner contains the focused
|
||||
`directory_test_execution_working_directory` observer. It constructs
|
||||
independent temporary directories from an unrelated caller cwd and compares
|
||||
|
||||
Reference in New Issue
Block a user