Skip to content

Commit 34fd446

Browse files
feat(angular-13cell): pigallery2 compiles at the honest cell — both spike-A gates green (T009a)
ngcc needs no -p override in a real cell (the CLI already prefers module over main); leaflet-ng2 is Ivy-native; a FOURTH ViewEngine library surfaced in the full closure (i18n-polyfill). pigallery2's own frontend AOT-compiles at Angular 13.4.0 / Node 16.20.2 / rxjs 6.6.7: ngc exit 0, 0 diagnostics, 121 files, three diagnostic-named one-line edits. Evidence: evidence/runs/angular-13cell/pigallery2-compile.json (3508bd8c). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
1 parent 2655f99 commit 34fd446

2 files changed

Lines changed: 436 additions & 0 deletions

File tree

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# Angular 13 cell — pigallery2 compile probe (T009a)
2+
3+
`pigallery2-compile.json` (schema `versionless.angular-13cell-compile.v1`) is the
4+
measured answer to the two open questions Spike A left hanging in
5+
`evidence/spikes/ngcc-1213-feasibility/verdict.json`.
6+
7+
## Headline
8+
9+
| Question | Answer |
10+
|---|---|
11+
| Where does the ngcc `-p module main` override live in a real cell? | **Nowhere — it is not needed.** The Angular CLI passes webpack's `resolve.mainFields` (`es2015, browser, module, main`) to ngcc as `--properties`, and that order already prefers `module` over `main`. The spike's hand-typed `-p module main` was reproducing the CLI default, not deviating from it. |
12+
| Does pigallery2 1.7.0's own source AOT-compile at the honest cell? | **Yes** — Angular 13.4.0 / Node v16.20.2 / rxjs 6.6.7, `ngc` exit 0, **0 diagnostics**, 121 emitted JS files — after **3** mechanical single-line source edits, each named verbatim by the diagnostic that demanded it. |
13+
14+
Two findings worth carrying forward:
15+
16+
- **A fourth legacy library.** The sealed holdout receipt names three no-successor
17+
pre-Ivy libraries. This closure has four: `@ngx-translate/i18n-polyfill@1.0.0` is
18+
also ViewEngine and also needs ngcc. It is consumable, but it was invisible until
19+
the whole application closure was installed rather than a 3-import probe.
20+
- **Diagnostic counts are not monotonic.** Clearing the TypeScript layer *raised* the
21+
count from 2 to 13, because TS diagnostics gate before Angular's semantic ones — the
22+
behaviour the sealed receipt predicted. Twelve of those thirteen were cascade from a
23+
single undecorated abstract base class.
24+
25+
## Recipe files
26+
27+
The work area is unversioned scratch; these are the files that constitute the recipe,
28+
all under `.versionless/work/angular-pigallery2/13cell/`:
29+
30+
| File | Role |
31+
|---|---|
32+
| `package.json` | the cell manifest — Angular 13.4.0, CLI/devkit 13.3.11, rxjs 6.6.7, TypeScript 4.6.4, the four legacy libraries, and the Angular-13-era repins of `ngx-bootstrap` / `ngx-toastr` / `ngx-clipboard` |
33+
| `package-lock.json` | the resolved closure the `cell` block of the JSON is read from |
34+
| `.npmrc` | `legacy-peer-deps=true` — required only by `@ngx-translate/i18n-polyfill@1.0.0`'s stale `^7.0.0` peer |
35+
| `tsconfig.13cell.json` | the AOT tsconfig; only two deltas from pigallery2's own (`target` es5→es2017, `module` es2015→es2020), everything else preserved so this measures the app and not a stricter cell |
36+
| `tsconfig.13cell.strict.json` | the secondary `fullTemplateTypeCheck: true` reading — **not** the cell claim |
37+
| `ngcc.config.js.held` | the project-root override, **committed disabled**. Kept as the counterfactual: `ngcc_processor.js` does read `<projectRoot>/ngcc.config.js`, so this is the right home if an override is ever needed — for this closure it is not, and leaving it live would have it pretending to be load-bearing |
38+
| `frontend/`, `common/` | pigallery2 1.7.0 source, copied verbatim from the baseline, plus the 3 recorded edits |
39+
| `logs/` | every run's raw output: `npm-install.log`, `ngcc-cli-control.log`, `ngcc-cli-run2.log`, `ngc-aot-run1..4.log`, `ngc-aot-strict.log` |
40+
41+
Runtime: `.versionless/cache/angular-13-cell-runtime/node-v16.20.2-darwin-arm64`
42+
(sha256 `6a5c4108…ea88c`), **copied from the already-cached
43+
`angular-jira-clone-runtime`** — no download was performed.
44+
45+
## Reproduce
46+
47+
```sh
48+
export PATH="$PWD/.versionless/cache/angular-13-cell-runtime/node-v16.20.2-darwin-arm64/bin:$PATH"
49+
cd .versionless/work/angular-pigallery2/13cell
50+
VERSIONLESS_NETWORK_MODE=consented VERSIONLESS_CONSENT_ID=VL-LEGACY-CORPUS-2026-08-10 npm ci
51+
node node_modules/@angular/compiler-cli/bundles/ngcc/main-ngcc.js \
52+
--source node_modules --properties es2015 browser module main \
53+
--first-only --create-ivy-entry-points --async \
54+
--tsconfig tsconfig.13cell.json --use-program-dependencies
55+
node node_modules/@angular/compiler-cli/bundles/src/bin/ngc.js -p tsconfig.13cell.json # exit 0
56+
```
57+
58+
The ngcc argv above is not invented — it is reproduced verbatim from
59+
`@ngtools/webpack/src/ngcc_processor.js:118-130`, which is what the CLI itself spawns.
60+
61+
Integrity:
62+
63+
```sh
64+
node -e "const c=require('crypto'),r=require('./evidence/runs/angular-13cell/pigallery2-compile.json');delete r.integrity;console.log(c.createHash('sha256').update(JSON.stringify(r)).digest('hex'))"
65+
# 3508bd8c396e9ac8306d49cb0b4c7e9f0ac31f30d6b5fffe29d242450ec4c4c8
66+
```
67+
68+
## What this does not establish
69+
70+
Read `notEstablished` in the JSON — it is the binding list. In short: this is
71+
**compile-at-cell only**. Not a migration (the three edits were made by hand as a
72+
measurement of what a migration would have to do), not runtime behaviour (nothing was
73+
bundled or executed), not the witness, not a full `ng build`, not the test or backend
74+
closures. The sealed pigallery2 RED at the Angular 16 cell is untouched and unweakened,
75+
and no `packages/**` file was read into or written by this unit.

0 commit comments

Comments
 (0)