You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: .agents/docs/2026-09-15-641-642-implementation-plan.md
+40-10Lines changed: 40 additions & 10 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -28,16 +28,16 @@ the parallel work trees of §8.
28
28
29
29
| id | task (triage §) | owner | depends on | status |
30
30
|---|---|---|---|---|
31
-
| M1 | a required compiler family's version is taken from pins that name the same payload; the refusal no longer states a false reason (§3.1) | lead | - |todo|
32
-
| M2 |`mcpp pack --features` reaches every build pass `pack` performs (§3.6) | lead | - |todo|
33
-
| M3 | a dependency's C++ shared library in a graph whose C++ runtime is a package is refused before compiling, unless `cxx_runtime` states `self-contained` for shared libraries; under that statement the library links the provider's objects (§3.3) | lead | - |todo|
34
-
| M4 |`linkage = "static" \| "shared"` in `[targets.<n>]` and `[target.<sel>.targets.<n>]` states the package's default form; precedence and the information line (§3.4) | W1 | - |todo|
35
-
| M5 | dependency link forms are computed once before the root's build program and applied where they are today; `MCPP_DEP_<NAME>_LINKAGE` and `mcpp::dep_linkage` for the root's program (§3.5) | W1 | M4 |todo|
36
-
| M6 | a C++-layer provider that states `[package] standard` compiles its implementation units at that level; module units stay at the graph's (§3.2) | W2 | - |todo|
37
-
| M7 | the object address of a source outside its declaring package is relative to its owning package, or a hashed directory when no package owns it (§3.7 item 3) | W3 | - |todo|
38
-
| M8 | the host-tool sub-build runs in a short key-named scratch directory (§3.7 item 2) | W3 | - |todo|
39
-
| M9 | files the engine opens from ninja-invoked subcommands go through one extended-length path helper on Windows (§3.7 item 1) | W3 | - |todo|
40
-
| M10 | CI: the llvm-dependent e2e scripts of M3 and M6, and the existing 663, run on a job that has llvm, with their PASS lines asserted (§1.8) | lead | M3, M6 |todo|
31
+
| M1 | a required compiler family's version is taken from pins that name the same payload; the refusal no longer states a false reason (§3.1) | lead | - |branch: unit `RequiredFamilyPins.*`; M1 probe reads `llvm@30.0.16248370` on 2026.9.15.1|
32
+
| M2 |`mcpp pack --features` reaches every build pass `pack` performs (§3.6) | lead | - |branch: e2e 689 (fails on 2026.9.15.1: `pack --features installer failed`)|
33
+
| M3 | a dependency's C++ shared library in a graph whose C++ runtime is a package is refused before compiling, unless `cxx_runtime` states `self-contained` for shared libraries; under that statement the library links the provider's objects (§3.3) | lead | - |branch: e2e 690, four legs (fails on 2026.9.15.1: the refusal is absent)|
34
+
| M4 |`linkage = "static" \| "shared"` in `[targets.<n>]` and `[target.<sel>.targets.<n>]` states the package's default form; precedence and the information line (§3.4) | W1 | - |branch: unit `LinkageForm.*`, manifest cases; e2e 692 (fails on 2026.9.15.1: no libfw.so for a silent consumer)|
35
+
| M5 | dependency link forms are computed once before the root's build program and applied where they are today; `MCPP_DEP_<NAME>_LINKAGE` and `mcpp::dep_linkage` for the root's program (§3.5) | W1 | M4 |branch: e2e 693 (fails on 2026.9.15.1: `'dep_linkage' is not a member of 'mcpp'`)|
36
+
| M6 | a C++-layer provider that states `[package] standard` compiles its implementation units at that level; module units stay at the graph's (§3.2) | W2 | - |branch: unit `CxxLayerStandard.*` (9), `CacheKey` case; e2e 696 (fails on 2026.9.15.1: `new.cpp` at `-std=c++20`)|
37
+
| M7 | the object address of a source outside its declaring package is relative to its owning package, or a hashed directory when no package owns it (§3.7 item 3) | W3 | - |branch: unit `ObjectAddress.*`; e2e 698 leg A (fails on 2026.9.15.1: `obj/installer/__up/__up/dep/...`)|
38
+
| M8 | the host-tool sub-build runs in a short key-named scratch directory (§3.7 item 2) | W3 | - |branch: unit `ToolStoreScratch.*`; e2e 698 leg B|
39
+
| M9 | files the engine opens from ninja-invoked subcommands go through one extended-length path helper on Windows (§3.7 item 1) | W3 | - |branch: unit `PlatformFs.*`; e2e 698 leg C (Windows readings from CI)|
40
+
| M10 | CI: the llvm-dependent e2e scripts of M3 and M6, and the existing 663, run on a job that has llvm, with their PASS lines asserted (§1.8) | lead | M3, M6 |branch: `ci-linux-e2e.yml` hermetic job step|
41
41
| M11 | user documentation with its Chinese mirror; SPEC changes; CHANGELOG; version 2026.9.15.2 | lead, W1-W3 | M1-M9 | todo |
42
42
| M12 | the triage and plan records closed with their readings | lead | all | todo |
43
43
@@ -158,6 +158,36 @@ which has never run in CI, directly on the `hermetic` job (which already
158
158
installs `llvm@22.1.8`) and asserts each script's final PASS line, and the
159
159
line of the run step inside it.
160
160
161
+
### 1.9 Refinements found while implementing
162
+
163
+
-**M5's computation follows the layer-conditional pass (L1b), not only the
164
+
dependency programs.** L1b changes dependency manifests, so a computation
165
+
placed before it would read facts that are not final. The p1689 scanner had a
166
+
source enumeration of its own that ignored `!` exclusions; it now reads the
167
+
function the resolution reads. Form B descriptors read `linkage` as
168
+
`mcpp.toml` does, and SPEC-001 records the precedence (v1.4, criterion 9).
169
+
-**M6's level enters the dependency cache key and the fingerprint** when a
170
+
provider states one, because the graph's level alone no longer says which
171
+
level the provider's sources were compiled at. The opt-in p1689 scan runs
172
+
before planning and still preprocesses these units at the graph's level,
173
+
which affects import detection only.
174
+
-**M7 and M8 shorten the issue's case to about 170 characters,** so crossing
175
+
260 now needs nesting deep inside the dependency; e2e 698 leg C does that and
176
+
is the Windows reading of whether ninja and the compilers cope. M9 had to
177
+
guard two things beyond opens: a path string ninja reads back (the copied
178
+
depfile's target keeps ninja's spelling) and an ANSI Win32 call
179
+
(`CreateFileW` for the detached compile's log).
180
+
-**M3's static remedy depends on who made the library shared.** A package that
181
+
constrains its form (`declaredShared`) cannot be linked static from its edge,
182
+
so that remedy is offered only when a request or the package's default
183
+
decided, and the refusal names the package's statement otherwise. `mcpp run
184
+
--format` built its pack without the run's features; it now passes them.
185
+
-**F3, recorded and not addressed.** The std module object is linked into every
186
+
C++ image, so a program over a C++ shared library that imports `std` reports
187
+
its module initialiser as provided twice (`symbol_provision`). This predates
188
+
the work: under gcc on 2026.9.15.1 the same shape reports 882 symbols; under
189
+
the private copy of M3 it reports two, `_ZGIW3std` and `_ZGIW3stdW6compat`.
0 commit comments