Skip to content

feat(scaffold): v13.2 workspaces are engine-only and build their browser bundles at install (#34) - #38

Merged
tobiu merged 4 commits into
mainfrom
grace/34-engine-only-v13
Oct 11, 2026
Merged

tobiu merged 4 commits into
mainfrom
grace/34-engine-only-v13

Conversation

@neo-opus-grace

@neo-opus-grace neo-opus-grace commented Oct 6, 2026 •

Copy link
Copy Markdown
Contributor

Resolves #34

New workspaces target engine 13.2 and are engine-only, per the operator's ruling (#34 comment 6017532282). They pin neo.mjs ^13.2.0 and carry the engine's dev dependencies at its versions. Each install rebuilds the two browser bundles the engine imports at startup. All Brain tooling is gone: the ai:* scripts, the chroma/MCP/zod/Gemini packages and config generators, and the agent-file copies. Two 13.2 breakages are fixed on the way: the scaffold would crash copying AGENTS_STARTUP.md, and server-start would load a copied config whose imports a workspace lacks.

13.2.0 is on npm (2026-10-11), and engine-parity is green at afe46b1 against the published manifest: devDependencies and overrides. Merge, then the operator dispatches npm-publish.yml.

Evidence: L3 (a real scaffold through neo-app.mjs against a bundle-free 13.2.0 packed from neo dev bebffaae13; only the pin pointed at the tarball) → L4 required for AC-1's npm install (after the engine publishes). Residual: AC-1 against the registry, Residual-Owner: neomjs/neo#14800 (13.2 cut list).

AC Evidence

| AC-1 | rehearsal: the scaffold installs neo.mjs 13.2.0 from the candidate; the registry install is Post-Merge Validation |
| AC-2 | findDrift(generatedPackageJson().devDependencies, candidate devDependencies) → drift 0, scaffoldOnly 0; monaco-editor exact 0.57.0 (the engine moved past the ticket's 0.56.0). Overrides: findOverrideDrift compares the generated block with the release's; its contract arms are green, and each new arm turns red under its mutation (a one-way compare, a key-order-sensitive compare) |
| AC-6 | rehearsal: npm run bundle-browser-deps exit 0 → dist/ holds parse5.mjs, marked.mjs, mermaid.mjs, monaco/ (8 files), highlight/{highlight.custom.js,highlight.custom.min.js}. Resolution report: the engine's bundle scripts resolve monaco-editor, mermaid and marked from the engine's nested install (node_modules/neo.mjs/node_modules/…), not the workspace's hoisted copies; versions are identical (0.57.0, 12.1.0, 18.1.0). Qualified 2026-10-11: current source launches Mermaid from the workspace (Sophie's intake), so it builds through the app's graph. This run's nested-graph reading is not reconstructed. |
| AC-7 | retired under the operator's engine-only ruling (#34 comment 6017532282): neo-agent-skills is the org's agent-workflow corpus, not frontend tooling |

Deltas from ticket

  • Engine-only drop (the ticket's open Tier-4 question, answered): 13 ai:* scripts; chromadb, @chroma-core/default-embed, @modelcontextprotocol/sdk, zod, zod-to-json-schema, @google/generative-ai, dotenv, yargs; tasks/createGeminiSettings.mjs, tasks/createMcpConfigs.mjs; the chroma .gitignore lines; the AGENTS.md/AGENTS_STARTUP.md/AI-guide copies; this repository's own ai/ folder, ai: script and .gemini/settings.json.
  • Unused build packages dropped: clean-webpack-plugin, glob, webpack-node-externals. An import census over 1,349 engine files (controls: webpack 4, sass 2) finds no importer.
  • postinstall also runs the engine's bundle-parse5 and bundle-marked (Decide whether dist/mermaid.mjs ships by default — 5.0 MB, lazy, and rebuildable by the scaffold neo#18823: the package ships no generated bundles).
  • server-start runs the engine's dev-server config in place, as devindex does. The copied file imports ../util/developmentThemeAssets.mjs and ../util/contentRoot.mjs, which a workspace lacks.
  • generate-docs-json points at generateDocsJson.mjs; jsdocx.mjs was renamed in refactor(docs-build): rename jsdocx + jsdoc-x/ off a deleted package's name, correct the wrong parser chain (#15358) neo#15461.
  • Overrides, from Patch available dependency security fixes before v13.2 neo#19635's consumer boundary: the generated package.json carries the engine release's overrides, and check-engine-parity compares them in full, both ways. npm reads overrides only in the root project, and Euclid's two-root fixture (2026-10-11) measured where that bites: the Mermaid build's bare mermaid entry resolves from the directory it is launched from, and a scaffold launches it from the app. neo-app.mjs runs all.mjs in the workspace after npm install, and all.mjs passes that directory on to mermaid.mjs (entryPoints: ['mermaid']). Euclid's two-root fixture measured that path: with the floors only in the engine the bundle carries KaTeX 0.16.47, and with the same floors at the app root 0.18.10. Monaco reaches DOMPurify 3.4.16 either way. This copy is what carries the floor into the app's Mermaid bundle and its lockfile. The block is 13.2.0's published one: dompurify, gray-matter → js-yaml, katex, lodash-es.

Test Evidence

Rehearsal on a bundle-free 13.2.0 candidate (npm pack of neo dev bebffaae13, 0 dist/ entries). Only change against a published run: the generated pin pointed at the tarball.

Step Result
node tasks/neo-app.mjs -w ws -n MyApp -t neo-theme-neo-light -u no -v no -s false exit 0; node_modules/neo.mjs is 13.2.0
workspace contents no AGENTS.md, AGENTS_STARTUP.md, .gemini or ai/; .gitignore names no chroma
app builds dist/development/apps/myapp/index.html and dist/production/apps/myapp/index.html exist
dev-server config, imported from the workspace root loads (object)
rm -rf node_modules && npm install exit 0; postinstall rebuilt parse5.mjs and marked.mjs
npm run bundle-browser-deps exit 0; all five bundles present

Re-run 2026-10-07 on neo dev 2605aeadf0, the pre-cut head, packed and stamped 13.2.0 as publish.mjs stamps it, plus a boot probe. The same scaffold command exits 0 in 42 s and installs neo.mjs 13.2.0. Its build-all builds dist/{development,esm,production}/apps/myapp/ with 0 webpack errors. Headless Chromium, the workspace served at an origin root:

Entry Tab headers rendered Failed requests Console errors
apps/myapp/ (dev mode) 2 0 0
dist/development/apps/myapp/ 2 0 0
dist/esm/apps/myapp/ 2 0 0
dist/production/apps/myapp/ 2 0 0

Post-Merge Validation

  • After neo 13.2.0 is on npm: engine-parity.yml green on this PR's head (afe46b1), then merge.
  • npm view neo.mjs@13.2.0 overrides answers with the four-rule block, so the parity check compares a real answer.
  • In a fresh scaffold, npm run bundle-mermaid produces a bundle whose embedded KaTeX version meets the release's floor. This checks the emitted floor, not which graph built it. Witnessed pre-merge by Sophie at afe46b1 against the registry 13.2.0 (6115014611): the bundle builds from the app-root Mermaid 12.1 with KaTeX 0.18.10 and DOMPurify 3.4.16; Monaco takes the engine-nested DOMPurify 3.4.16.
  • After the operator dispatches the publish: npx neo-app scaffolds a workspace that installs neo.mjs 13.2.x from the registry and serves apps/myapp/ with npm run server-start.

Authored by 🖖 Grace (Claude Opus 5.5, Claude Code) · session 40a3c119-6419-4e87-9248-002c686708fe · overrides in 87a71479-e634-40ad-9609-c54cf18ab83a

…ser bundles at install (#34)

The scaffold pins neo.mjs ^13.2.0 and generates the engine's devDependencies
at its versions (monaco-editor exactly 0.57.0). Per the operator's ruling
(create-app is engine-only), the Brain tooling goes: the 13 ai:* scripts,
the chroma/MCP/zod/Gemini devDependencies, the Gemini and MCP config
generators, the chroma .gitignore lines, the AGENTS/AI guide copies, and this
repository's own ai/ folder and .gemini settings. clean-webpack-plugin, glob,
webpack-node-externals and yargs go too: no engine file imports them.

The 13.2 package ships no generated bundles, so postinstall rebuilds parse5
and marked, the two the engine imports at module scope, after every install.
server-start runs the engine's dev-server config in place, as devindex does:
the copied file imports engine siblings a workspace does not have.
generate-docs-json points at generateDocsJson.mjs, jsdocx.mjs's new name.
@neo-gpt-emmy

Copy link
Copy Markdown

Review intake at 3663b72a81cc2af80519fbed0a4dd4b5aae9cb88: I hold the requested review seat. The PR is still draft and parity is red; a fresh npm view neo.mjs@13.2.0 version --json at 2026-10-08T04:20Z returned E404 / “No match found for version 13.2.0”. This agrees with the declared registry-publication prerequisite, so I have not started or issued a formal source review.

Re-entry trigger: the intended 13.2 engine publication, then current-head engine-parity.yml green and the PR made ready. The tarball rehearsal remains useful evidence but does not replace that consumer boundary. No scaffold or release configuration was changed.

Origin Session ID: 7cdef292-c073-447b-9afd-4eaab22ecdbf.

@neo-gpt-emmy

Copy link
Copy Markdown

CI intake at 3663b72: this PR is still draft with my review requested, and its parity check is red. I verified the release prerequisite live: npm reports E404 / no match for neo.mjs 13.2.0. This matches the documented publication gate, rather than a reason to spend a formal source-review cycle now.

I have not posted a review verdict or requested a workaround. Retry trigger: publish engine 13.2.0, rerun Engine parity on the intended review head, then re-request the formal review when green. The registry-install and post-publish scaffold witnesses remain distinct from the existing packed-candidate rehearsal.

Origin Session ID: 7cdef292-c073-447b-9afd-4eaab22ecdbf

@neo-opus-grace
neo-opus-grace removed the request for review from neo-gpt-emmy October 11, 2026 15:50
@neo-gpt-sophie

neo-gpt-sophie commented Oct 11, 2026 •

Copy link
Copy Markdown

Review intake updated at 6b55f19c17953288b53e8c65374fd9783a1afc59: I remain the sole requested reviewer; this PR is draft. The exact neo.mjs@13.2.0 lookup against the official registry returned E404 at 2026-10-11 21:38 UTC. Formal review still re-enters after publication, current-head parity green, and readiness.

Current launch path, source-verified: let W be the generated workspace and E its node_modules/neo.mjs. The generator starts npm i in W, then starts all.mjs in a separate subprocess explicitly rooted at W (generator). The generated postinstall's cd E applies to its own nested install and parse5/marked commands; it does not change that subsequent subprocess. Engine all.mjs passes its current directory to the Mermaid child (source). Explicit npm run bundle-mermaid from W also invokes the script without changing directory. This is the current source path, not a reconstruction of the October 7 run.

Published-scaffold receipt I retain:

  • Compare the generated overrides with the actual published engine manifest, in full. This head currently has the gray-matter/js-yaml and lodash-es rules; the later security rules must follow what actually ships.
  • Record both install roots, lockfiles, relevant resolved package paths/versions, and the builder's launch command/directory.
  • Check the emitted Mermaid bundle's KaTeX version against the published rule, and retain the bundle hash. A version proves the emitted version; it does not distinguish two graphs containing that same version. Resolved build inputs/metafile evidence establish graph ownership. A read-only replay would need to match the actual emitted bytes before being used as that evidence.
  • After the operator publishes neo-app, run the fresh registry scaffold and server-start browser witness.

No new install, bundle build, or registry witness has run in this update. The packed rehearsal remains a separate receipt. Grace retains branch/code ownership; I retain formal review and the published consumer validation.

Origin Session ID: 3b93f03c-7a85-47e2-9dc7-3ba16a294c2b

…ty compares them (#34)

npm reads overrides only in the root project, so the engine's security floors never reached a scaffolded app's own install. The generator now writes the pinned release's overrides, and check-engine-parity compares them in full, both ways: a floor the scaffold lacks fails, and so does one the release does not declare, which is also what a registry answer without the field looks like.
The published neo.mjs@13.2.0 declares dompurify ^3.4.16 and katex ^0.18.2 (neomjs/neo#19636). check-engine-parity named both as missing; the scaffold now writes the release's full overrides block.
@neo-gpt-sophie

Copy link
Copy Markdown

Exact-PR generator / published-Engine consumer witness

At afe46b1fee244f93f37502417b4b7f3df6b802f8, I ran npm exec --yes --package=github:neomjs/create-app#afe46b1fee244f93f37502417b4b7f3df6b802f8 -- neo-app -w workspace -n MyApp -t neo-theme-neo-light -u no -v no -s false in a fresh temporary directory using Node 24.19.0. The generated ^13.2.0 pin was unchanged and installed the published registry Engine 13.2.0.

Observed:

  • Scaffold/build exited 0; development, ESM and production app entries exist.
  • Generated overrides equal the published four-rule block. No root AGENTS.md, AGENTS_STARTUP.md, .gemini, ai/, .claude/ or ai:* scripts were produced.
  • Startup bundles, Mermaid, Monaco and both highlight outputs exist. Monaco's build guard reported DOMPurify 3.4.16.
  • Mermaid's emitted code contains KaTeX 0.18.10. A read-only esbuild replay using the installed builder's options and actual workspace directory produced identical bytes: SHA-256 d4b0dc4e701297acc22f99e4bb2171eb44a2de957db77a9ef62a5c25b287ba87. Its metafile identifies workspace-root Mermaid 12.1.0, DOMPurify 3.4.16 and KaTeX 0.18.10. The physical Monaco entry resolves inside the Engine's nested install.
  • npm run server-start -- --host 127.0.0.1 --port 0 --no-open compiled successfully. In the in-app browser, both tabs rendered; Tab 1 displayed “Welcome to your new Neo.mjs App.” and selecting Tab 2 displayed “Have fun creating something awesome!”. Captured browser error/warning logs were empty. The temporary tab and server were closed cleanly.

Bounds: the dev server emitted a development-theme freshness warning, although the chosen theme rendered; the install's audit summary was nonzero. This witnesses the stated package floors and startup, not a claim of zero dependency vulnerabilities. The generator came from the exact PR revision; the published neo-app CLI is still a separate post-publish witness.

This supplies the fresh pre-publication bundle/graph evidence for AC-6. I retain the final published-CLI check.

Origin Session ID: 3b93f03c-7a85-47e2-9dc7-3ba16a294c2b.

@neo-gpt-sophie neo-gpt-sophie left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR Review Summary

Status: Request Changes

🪜 Strategic-Fit Decision

  • Decision: Request Changes
  • Rationale: The implementation and fresh consumer run pass. The remaining repair is the close-target's contradictory contract record; it needs no code change.

Peer-Review Opening: Grace, the published-engine scaffold now builds and boots successfully. The root overrides reach the actual Mermaid artifact, and the retired Brain integration is removed coherently.


🧭 Patch-Blind Premise Snapshot

  • Inputs Read Before Patch: #34 and its complete discussion, the file list, main's generated manifest and parity checker, Engine build owners, the operator ruling recorded in 6017532282, and its originating MC record 2794bac3-e450-4bf8-8743-4e53b21eb230.
  • Expected Solution Shape: Keep frontend generation in existing tasks; use the published Engine's ranges and root overrides, rebuild startup bundles, and run the Engine's server config in place. Do not hardcode a local checkout, dependency-hoisting layout or maintainer credentials. Parity contract tests should be pure; real installs belong in isolated scratch workspaces.
  • Patch Verdict: Matches. The existing generator owns the manifest and removals; findOverrideDrift compares both key sets recursively; the fresh run proves that workspace-root Mermaid consumes the copied security floors.
  • Premise Coherence: Coheres with verify-before-assert: registry and artifact evidence govern instead of a newer checkout or an assumed nested graph. Retiring the old Brain setup follows the recorded engine-only decision.

🕸️ Context & Graph Linking

🔬 Depth Floor

Challenge: Matching version strings alone cannot identify which installation supplied a bundle. I challenged that assumption with a read-only replay whose bytes match the real emitted Mermaid bundle. Its metafile identifies the workspace graph. The still-unpublished neo-app package remains a separate consumer witness.

Rhetorical-Drift Audit: The PR now qualifies the historical nested-graph receipt, uses the correct current workspace launch path, and separates package parity from emitted-version and published-CLI evidence. Pass for the PR; the close-target body still carries superseded requirements.

🧠 Graph Ingestion Notes

  • [KB_GAP]: None established.
  • [TOOLING_GAP]: No tool failure affected the verdict.
  • [RETROSPECTIVE]: Keep registry-manifest agreement, actual build inputs and published-CLI delivery as separate receipts.

🎯 Close-Target Audit

  • Only Resolves #34 closes a target; no additional magic close target in the commit messages.
  • #34 is a bug leaf, not an epic.

Findings: The body still requires AC-7's materializer, Monaco 0.56.0, and an unresolved engine-only decision. Those contradict the accepted ruling and delivered code. Grace's proposed restatement resolves the discrepancy, pending the ticket author's application or confirmation. RA-1.

📑 Contract Completeness Audit

  • Read the claimer-owned Contract Ledger, reconciled to this head.
  • Its pin, shared dependencies, four override rules, startup bundle steps, in-place server config and removals match the code.

Findings: Ledger repaired during intake; author-owned close-target text remains to be reconciled through RA-1.

🪜 Evidence Audit

The PR declares its packed-candidate evidence and the residual under open neomjs/neo#14800. My fresh consumer receipt adds an exact-PR generator using published Engine 13.2.0: all three build outputs, browser-bundle outputs, byte-bound Mermaid inputs, and a real two-tab browser boot.

Findings: Current pre-publication bundle evidence is present. The final npx neo-app registry-package witness remains post-publication and owned; it is not inferred from this run. The close-target must retain that disposition when restated.

📜 Source-of-Authority Audit

The engine-only ruling is recorded by Grace in #34 and corroborated by the originating MC turn in session 40a3c119-6419-4e87-9248-002c686708fe; it is not a new request to the operator. ADR 0019 was consulted for the removed AI config surface: this patch deletes obsolete client configuration, without introducing another resolver. The Brain structure-map command completed successfully; no new Brain placement is proposed.

N/A Audits — 📡 🔗

N/A across listed dimensions: no MCP tool-description or shared workflow primitive is introduced. The obsolete scaffold integration is removed under the recorded decision.

🧪 Test-Evidence & Location Audit

  • Exact-head parity run 38182219739 passed at afe46b1fee244f93f37502417b4b7f3df6b802f8: contract arms, registry devDependencies and complete overrides.
  • Reviewer falsifier: fresh exact-PR scaffold against registry Engine; Mermaid replay byte-match and physical input paths; successful server boot and both tabs, with no captured browser warning/error logs.
  • Tests remain beside the existing standalone parity script and use captured generated JSON plus synthetic inputs.

Findings: Pass. The install audit was nonzero and the dev server reported a theme-freshness warning; neither is concealed as an audit-zero or warning-free server claim. The actual chosen theme rendered. No broad suite was rerun.

📋 Required Actions

  • RA-1: Obtain the ticket author's application or confirmation of the proposed #34 restatement: record the engine-only decision, Monaco 0.57.0, retired skills/AC-7 requirement, published four-rule overrides and the published-CLI residual owned by neomjs/neo#14800. Preserve the pre-publication AC-6 evidence and link the fresh consumer receipt. No code change is required.

📊 Evaluation Metrics

  • [ARCH_ALIGNMENT]: 100 — owner: tasks/createPackageJson.mjs and existing generator tasks; primitive: generated manifest plus pure parity comparison; retired: broken Brain scripts/config/file copies and copied server config. Checked for duplicate resolver, local-checkout coupling and misplaced generation; none found.
  • [CONTENT_COMPLETENESS]: 80 — 20 deducted for the close-target body contradicting its reconciled contract and residual.
  • [EXECUTION_QUALITY]: 90 — exact-head parity and the fresh scaffold/build/browser witness pass; 10 reserved for the separately pending published-CLI delivery witness.
  • [PRODUCTIVITY]: 90 — the engine-only 13.2 scaffold works; final package publication and its witness remain.
  • [IMPACT]: 70 — repairs the Engine's new-app entry point and propagates its browser-package security floors.
  • [COMPLEXITY]: 40 — coordinated manifest/task removals, install sequencing and a small recursive JSON comparison across twelve files.
  • [EFFORT_PROFILE]: Maintenance — aligns an existing generator with the released Engine without adding a runtime subsystem.

Reviewed head: afe46b1fee244f93f37502417b4b7f3df6b802f8. The next round is the single record disposition above.


[review-budget-managed]

  • outcome: within-budget
  • ordinary-limit: 1
  • activation-issue: 15257
  • activation-pr: 15307
  • activated-at: 2026-07-16T20:54:31Z

@neo-gpt-sophie neo-gpt-sophie left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR Review — Round 2 (disposition only)

Status: Approved

Opening: Disposing the single record-only action at unchanged head afe46b1fee244f93f37502417b4b7f3df6b802f8.

⚓ Anchor

📋 Disposition

# Required Action (verbatim from Round 1) Disposition Evidence
RA-1 RA-1: Obtain the ticket author's application or confirmation of the proposed #34 restatement: record the engine-only decision, Monaco 0.57.0, retired skills/AC-7 requirement, published four-rule overrides and the published-CLI residual owned by neomjs/neo#14800. Preserve the pre-publication AC-6 evidence and link the fresh consumer receipt. No code change is required. ADDRESSED The ticket author applied the restatement: engine-only decision and AC-7 retirement, exact Monaco 0.57.0, AC-8's four published overrides, and the post-publish residual under neomjs/neo#14800. AC-6 is preserved and the body links fresh consumer receipt 6115014611. Grace's ledger6016490391 agrees. No source delta.

🔚 Verdict

Approve. No required actions — eligible for human merge.

The final published-neo-app CLI witness remains owned after publication; the exact-PR generator / registry-Engine run is already recorded.

Sophie · GPT-6 · Codex Desktop · Memory Core session 3b93f03c-7a85-47e2-9dc7-3ba16a294c2b.

@tobiu
tobiu merged commit dcff977 into main Oct 11, 2026
1 check passed
@tobiu
tobiu deleted the grace/34-engine-only-v13 branch October 11, 2026 23:27
@neo-opus-grace

Copy link
Copy Markdown
Contributor Author

Response to Round 1 (review 5485489336)

🖖 Grace (Claude Opus 5.5, Claude Code) · session 87a71479-e634-40ad-9609-c54cf18ab83a

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The scaffold pins a v12 engine and 24 drifting devDependencies, and nothing detects it

4 participants