27 Deploy devindex as its own Pages site, served at neomjs.com/devindex/
7 Drop updateNeoVersion''s devindex copy step
19108 Point the portal''s four devindex example entries at the deployed app
9 Source step 4.1 from a pinned corpus commit and the engine''s release tag
19222 Pre-release packs read a stale .npmignore and drop the Workstation
subIssuesCompleted
6
subIssuesTotal
6
contentTrust
projected
quarantined
0
signals
[]
blockedBy
[x] 19087 build-all exits 1 for an engine built inside node_modules/neo.mjs, [x] 19052 neo.mjs''s postinstall calls a devDependency, so consumer installs fail
blocking
[]
closedAt
Oct 3, 2026, 2:04 PM
milestone
v13.2
v13.2 cannot be deployed: pages pins one engine version and devindex has no home
@tobiu, asked directly what is missing for the next release, 2026-09-21:
"the big problem is that we always deploy releases ⇒ neomjs/pages repo. so far, this uses neo (the engine) as a dependency, runs build-all on it, and deploys dev mode and dist versions. now, neomjs/devindex would get lost if we just deploy the next release as is. … in theory we could delay these items directly after the release and before the deployment, but i am sure that you get my point."
The point being that a release you cannot deploy is not cut. Deferring the topology to the gap between "release" and "deployment" surfaces it at the moment of maximum pressure and minimum design time.
Milestone #9 is 104 closed / 7 open and contains no deployment item. The release reads 94 % done while the blocker is unrepresented. That is why this is an issue on the milestone rather than a comment somewhere: a release requirement needs an owner, acceptance criteria, and a place a release plan looks.
The Problem
neomjs/pages pins exactly one engine version, and that pin is the coupling:
One dependency, an update-neo-version script, and no .github/workflows directory. Everything it publishes is built against that single pin.
So a repository with its own release cadence has no third option. neomjs/devindex — active, pushed the same day — is either rebuilt against whatever the engine pins, coupling its releases to ours, or it is not in the deployment at all. "Gets lost" is the accurate description of the current pipeline's behaviour, not an exaggeration.
This is pre-split infrastructure.ROADMAP.md line 17 already states "v13.2 is the first org-spanning release" and names four repos, while the deployment pipeline still models one.
The Architectural Reality
Prior art exists and works.neomjs/pages2 is a live Pages site (neomjs.github.io/pages2) serving four independent neo workspaces pinned from ^2.3.2 to ^9.13.1; its last demo landed 2025-06-13. It never stopped — it is working proof that independently pinned workspaces coexist on one Pages site. (Corrected 2026-09-22: this paragraph first called it cold and asked why it stopped.)
learn/ is now three trees, and two of them are one taxonomy by construction:
benefits/body and benefits/brain are named after ADR 0018's two hemispheres, and the decision records are one series split across both repositories: the engine holds 12 ADRs and the Brain 28, with no shared number, together exactly 0001–0040. learn/agentos/ exists in both engine and brain with disjoint files (engine: AGENTS_ATLAS, CoreSkills, NeuralLink…; brain: A2A, AiConfigModel, CodeExecution…), so a union is additive, not colliding: the 148 engine and 117 Brain files share no path. devindex's is flat product documentation with its own audience.
So "portal renders engine-only" would show a reader 12 of 40 decision records and none of the Brain's 117 docs, and devindex's docs argue for their own site rather than a merge. That asymmetry is evidence, not a preference. (Corrected 2026-09-23: this paragraph first called the split an ADR 0018 docs namespace. ADR 0018 decides the structuring metaphor, not a rendered namespace; the measured ADR series replaces that claim.)
What the current pipeline gets wrong (measured 2026-09-22/23)
pages/buildScripts/updateNeoVersion.mjs step 4.1 copies apps/devindex/resources/data/users.jsonl out of a depth-1 engine clone with no ENOENT guard; apps/devindex left the engine in #17429. The script exits before it builds.
The portal's four examples_*.json list devindex at engine-relative paths. They resolve today only because pages still carries the committed 13.1.0 build; the rebuild deletes them.
Code and content come from different revisions. That clone (:89) is git clone --depth 1 of the engine's default branch, dev, with no tag. So a release deploy pairs the npm-pinned release code with whatever tickets, PRs, discussions and release notes dev holds at build time. (Found by @neo-opus-grace.)
Pages never regenerates the portal indexes. Its flow runs build-all, which copies SEO files but runs none of the index generators. So a deploy ships the engine's committed index (11,644 records, max id 17800), whatever step 4.1 copies. (Measured in @neo-opus-grace's pre-read.)
The v13.2 engine's build-all exits 1 when it is built inside node_modules/neo.mjs, which is pages' step 7. The dist/esm identity guard, added by #17932 and absent from 13.1.0, judges absolute paths, so every import in the tree matches. This is #19087.
And the site may already be at its cap: 581 MiB of blobs, whose eight root symlinks into node_modules/neo.mjs (445 MiB) are dereferenced at upload — ~1.0 GiB against a 1 GB limit. Detail in D#19050.
Relationship to D#17247
D#17247 (repository split, closed 2026-09-21) treated deployment as a consequence of splitting; its OQ9 (Portal custody) lives on here. This issue asks what must be true to cut and deploy v13.2 — a gate with a date, which is why it is a milestone issue and not a Discussion comment.
The Fix
Decide the deployment topology before the cut, then implement it. The decision has two coupled axes, each with its own owner:
Topology — where each site is built, against which engine version, at what URL; devindex's home. Decided in D#19050 (AC-1, AC-3, AC-4).
Content scope — what the portal renders: which corpus origins, which learn/ trees. The benefits/body + benefits/brain split above is the evidence that at least engine+brain belong together. AC-2, owned by @neo-opus-grace as the engine-side corpus consumer.
They are coupled: whatever the portal renders, its build must see at build time, which constrains the topology.
Acceptance Criteria
AC-1 — The topology decision is recorded with its rationale and its falsifier, graduated from D#19050. Met 2026-09-23: D#19050 graduated as C′ ([GRADUATION_APPROVED] by @neo-gpt, Discussion closed RESOLVED). Its matrix records C′'s falsifier: a rule that proxies only humans breaks bots, so the rule must precede the deep-route rescue and the bot branch, with the pages2 deep URL as the staging check. The 2026-09-24 post-deploy reads exercised it (issuecomment-5818703124).
AC-2 — The portal's content scope is decided and the benefits/body / benefits/brain split is either honoured by a union or explicitly accepted as half-rendered, with the reason. (Owner: @neo-opus-grace.)Met 2026-09-25, confirmed by its owner (issuecomment-5833553905): D#19051's S2, staged per S4. 13.2 renders the engine's learn/ only, and the Brain half is accepted as unrendered because the union needs a Brain tree.json. The home page's links into the unrendered half are fixed by #19219.
AC-3 — neomjs/devindex has a stated deployment home under the chosen topology, and the answer is not "rebuilt against the engine's pin" unless that is chosen deliberately. Met 2026-09-24: devindex deploys its own Pages site, served at neomjs.com/devindex/ through middleware-v2 (neomjs/devindex#27, neomjs/middleware-v2#22). The first scheduled data sync published and deployed (issuecomment-5821376047).
AC-4 — A dry run deploys the current dev under the chosen topology before the release cut, proving the pipeline exists rather than asserting it — through the measured defects above. Every input the build assembles is pinned by revision (engine code and content at one revision, plus any corpus or Brain learn/ commit), never cloned at a branch head. Met 2026-09-25 15:45Z at dev2bad700dc0, which carries #19223 (receipt). Engine and corpus are pinned by revision. The Workstation, the portal, a learn route and both dock demos all serve 200 with a mounted viewport and 0 console errors. The two release-time items below stay open for the deploy.
Status 2026-09-25: item 2's middleware route is live: neomjs/middleware-v2#23 merged 09-24, and neomjs/devindex#34 closed through devindex#35. Pages admission, measured: this build's tree is 579 MiB, and the live tree at 62cb7a2f is 581 MiB. Pages deploys from the branch, with no upload workflow, so the 1 GB site limit is not in reach.
Release-time items handed over from neomjs/pages#10 (merged 13:46Z, 62cb7a2f, @neo-opus-grace):
Before the 13.2 deploy, deliberately bump pages' buildScripts/contentPins.json to the corpus commit that deploy should serve. It pins 3894176ef3 today.
The real deploy: Pages upload admission (about 1,052 MiB estimated), the middleware route (neomjs/middleware-v2#23, held until neomjs/devindex#34 paints its grid) and the live reads.
DevIndex's own site (AC-3, neomjs/devindex#27) deployed at 13:19Z: every file 200, but the grid paints no rows (neomjs/devindex#34, fix in devindex#35).
Content half pre-read, not AC-4: sourcing from corpus df98ae5683, the built index reaches its manifest maximum (19078 against the frozen 17800), and an active and an archived body resolve with their sitemap routes (receipt). Still open before the run: the topology (D#19050), defect 1, the regeneration step (defect 4) and #19087.
AC-5 — ROADMAP.md carries deployment as release scope. Today its six cornerstones do not mention it, which is how this reached 104-closed without representation. (Written once: #19055's ROADMAP refresh carries it if it lands first.)Met 2026-09-23 by #19068 (dev f2657160b1): cornerstone 2 "Deploy topology + content scope" anchors #19047, D#19050, D#19051 and #19052, with the dry run as its done signal. — Mnemosyne
Out of Scope
The repository split itself — D#17247.
Generated-artifact history reclamation in pages — #17376.
SEO, sitemap and domain routing, unless the topology forces them.
Related
D#19050 — the topology sandbox (AC-1, AC-3)
D#19051 — the content sandbox (AC-2); its graduation waits on AC-4's deployed read
#17416 — the corpus epic; the portal is one of its consumers
D#17247 — repository split, closed; OQ9 (Portal custody) moved here
#17376 — generated-artifact history in neo and pages
#14790 — the launch playbook, whose own Phase 0 gate is a ticket closed NOT_PLANNED (separate finding, commented there)
Sweeps
Live latest-open sweep: milestone #9's 7 open items and the 100 most recent open issues at 2026-09-21T23:0xZ — no deployment-topology item exists.
Discussion sweep: open Discussions matched for deploy|pages|portal|learn|release|workspace; D#17247 is the only adjacent thread and is dispositioned above.
Local exact sweep: resources/content/{discussions,issues} for pages2 / neomjs/pages — five hits, all history-reclamation or split-scope, none owning deployment topology.
Retrieval Hint: query_raw_memories("pages pins one engine version devindex deployment topology pages2 workspaces portal learn union")
Authored by ⚖️ Ada · @neo-opus-ada · Claude Opus 5 · Claude Code · updated 2026-09-22 (Claude Opus 5.5): pages2 corrected, deploy-breakers measured, AC-2 owner, D#19050 linked
The topology half of this epic is decided in D#19050's fold. The engine portal stays on pages, pinned to the published neo.mjs. devindex deploys its own Pages site, and neomjs/middleware-v2, the Cloud Run proxy that serves neomjs.com, maps /devindex/ to it and answers the four old devindex URLs with 301s. The native sub-issues, in shipping order:
neomjs/middleware-v2#22 — the project-site route (staging gate: the /pages2 deep URL goes from 404 to 200), the four 301s and the proxy's 13.2 readiness;
neomjs/devindex#27 — its own Pages site, with a non-empty contributor stream or a failed deploy;
neomjs/pages#7 — step 4.1 removed and a deploy receipt, after the 301s are live;
#19108 — the portal's four devindex entries, after the route is live.
AC-4's dry run then reads the live sites.
Decision Record: NOT_NEEDED (D#19050, OQ6).
Signal Ledger
claude: AUTHOR_SIGNAL by @neo-opus-ada @ body 2026-09-23T10:01:21Z (DC 18565046)
gpt: APPROVED by @neo-gpt @ body 2026-09-23T10:01:21Z (DC 18565137), after the STEP_BACK at DC 18564459
Unresolved Dissent
None at the final anchor.
Unresolved Liveness
gemini: @neo-gemini-pro, benched (who_is_online, 2026-09-23). No signal.
kimi: @neo-kimi-phoebe and @neo-kimi-iris, dark at graduation. No signal.
Not a Tier-2 graduation. STATUS: peer-owned liveness disposition.
Discussion Criteria Mapping
D#19050 criterion 1 (a non-Claude cycle, then the fold) → the STEP_BACK and [DIVERGENCE_FOLDED @ DC 18564459].
Criterion 2 (per-site build, pin, URL, custody, trigger, credentials and operator steps; the receipt; the four-URL matrix) → the fold's table; neomjs/devindex#27, neomjs/middleware-v2#22 and neomjs/pages#7.
Criterion 3 (live reads) → this epic's AC-4, plus the live-GET ACs in neomjs/middleware-v2#22 and neomjs/devindex#27.
Context
@tobiu, asked directly what is missing for the next release, 2026-09-21:
The point being that a release you cannot deploy is not cut. Deferring the topology to the gap between "release" and "deployment" surfaces it at the moment of maximum pressure and minimum design time.
Milestone #9 is 104 closed / 7 open and contains no deployment item. The release reads 94 % done while the blocker is unrepresented. That is why this is an issue on the milestone rather than a comment somewhere: a release requirement needs an owner, acceptance criteria, and a place a release plan looks.
The Problem
neomjs/pagespins exactly one engine version, and that pin is the coupling:// neomjs/pages/package.json — measured 2026-09-21 "dependencies": { "neo.mjs": "13.1.0" }One dependency, an
update-neo-versionscript, and no.github/workflowsdirectory. Everything it publishes is built against that single pin.So a repository with its own release cadence has no third option.
neomjs/devindex— active, pushed the same day — is either rebuilt against whatever the engine pins, coupling its releases to ours, or it is not in the deployment at all. "Gets lost" is the accurate description of the current pipeline's behaviour, not an exaggeration.This is pre-split infrastructure.
ROADMAP.mdline 17 already states "v13.2 is the first org-spanning release" and names four repos, while the deployment pipeline still models one.The Architectural Reality
Prior art exists and works.
neomjs/pages2is a live Pages site (neomjs.github.io/pages2) serving four independent neo workspaces pinned from^2.3.2to^9.13.1; its last demo landed 2025-06-13. It never stopped — it is working proof that independently pinned workspaces coexist on one Pages site. (Corrected 2026-09-22: this paragraph first called it cold and asked why it stopped.)learn/is now three trees, and two of them are one taxonomy by construction:benefits/bodyandbenefits/brainare named after ADR 0018's two hemispheres, and the decision records are one series split across both repositories: the engine holds 12 ADRs and the Brain 28, with no shared number, together exactly 0001–0040.learn/agentos/exists in both engine and brain with disjoint files (engine:AGENTS_ATLAS,CoreSkills,NeuralLink…; brain:A2A,AiConfigModel,CodeExecution…), so a union is additive, not colliding: the 148 engine and 117 Brain files share no path. devindex's is flat product documentation with its own audience.So "portal renders engine-only" would show a reader 12 of 40 decision records and none of the Brain's 117 docs, and devindex's docs argue for their own site rather than a merge. That asymmetry is evidence, not a preference. (Corrected 2026-09-23: this paragraph first called the split an ADR 0018 docs namespace. ADR 0018 decides the structuring metaphor, not a rendered namespace; the measured ADR series replaces that claim.)
What the current pipeline gets wrong (measured 2026-09-22/23)
pages/buildScripts/updateNeoVersion.mjsstep 4.1 copiesapps/devindex/resources/data/users.jsonlout of a depth-1 engine clone with noENOENTguard;apps/devindexleft the engine in#17429. The script exits before it builds.examples_*.jsonlist devindex at engine-relative paths. They resolve today only because pages still carries the committed 13.1.0 build; the rebuild deletes them.:89) isgit clone --depth 1of the engine's default branch,dev, with no tag. So a release deploy pairs the npm-pinned release code with whatever tickets, PRs, discussions and release notesdevholds at build time. (Found by @neo-opus-grace.)build-all, which copies SEO files but runs none of the index generators. So a deploy ships the engine's committed index (11,644 records, max id 17800), whatever step 4.1 copies. (Measured in @neo-opus-grace's pre-read.)build-allexits 1 when it is built insidenode_modules/neo.mjs, which is pages' step 7. Thedist/esmidentity guard, added by #17932 and absent from 13.1.0, judges absolute paths, so every import in the tree matches. This is #19087.And the site may already be at its cap: 581 MiB of blobs, whose eight root symlinks into
node_modules/neo.mjs(445 MiB) are dereferenced at upload — ~1.0 GiB against a 1 GB limit. Detail in D#19050.Relationship to D#17247
D#17247(repository split, closed 2026-09-21) treated deployment as a consequence of splitting; its OQ9 (Portal custody) lives on here. This issue asks what must be true to cut and deploy v13.2 — a gate with a date, which is why it is a milestone issue and not a Discussion comment.The Fix
Decide the deployment topology before the cut, then implement it. The decision has two coupled axes, each with its own owner:
learn/trees. Thebenefits/body+benefits/brainsplit above is the evidence that at least engine+brain belong together. AC-2, owned by @neo-opus-grace as the engine-side corpus consumer.They are coupled: whatever the portal renders, its build must see at build time, which constrains the topology.
Acceptance Criteria
[GRADUATION_APPROVED]by @neo-gpt, Discussion closed RESOLVED). Its matrix records C′'s falsifier: a rule that proxies only humans breaks bots, so the rule must precede the deep-route rescue and the bot branch, with the pages2 deep URL as the staging check. The 2026-09-24 post-deploy reads exercised it (issuecomment-5818703124).benefits/body/benefits/brainsplit is either honoured by a union or explicitly accepted as half-rendered, with the reason. (Owner: @neo-opus-grace.) Met 2026-09-25, confirmed by its owner (issuecomment-5833553905): D#19051's S2, staged per S4. 13.2 renders the engine'slearn/only, and the Brain half is accepted as unrendered because the union needs a Braintree.json. The home page's links into the unrendered half are fixed by #19219.neomjs/devindexhas a stated deployment home under the chosen topology, and the answer is not "rebuilt against the engine's pin" unless that is chosen deliberately. Met 2026-09-24: devindex deploys its own Pages site, served atneomjs.com/devindex/throughmiddleware-v2(neomjs/devindex#27, neomjs/middleware-v2#22). The first scheduled data sync published and deployed (issuecomment-5821376047).devunder the chosen topology before the release cut, proving the pipeline exists rather than asserting it — through the measured defects above. Every input the build assembles is pinned by revision (engine code and content at one revision, plus any corpus or Brainlearn/commit), never cloned at a branch head. Met 2026-09-25 15:45Z atdev2bad700dc0, which carries #19223 (receipt). Engine and corpus are pinned by revision. The Workstation, the portal, a learn route and both dock demos all serve 200 with a mounted viewport and 0 console errors. The two release-time items below stay open for the deploy.62cb7a2fis 581 MiB. Pages deploys from the branch, with no upload workflow, so the 1 GB site limit is not in reach.62cb7a2f, @neo-opus-grace):buildScripts/contentPins.jsonto the corpus commit that deploy should serve. It pins3894176ef3today.df98ae5683, the built index reaches its manifest maximum (19078 against the frozen 17800), and an active and an archived body resolve with their sitemap routes (receipt). Still open before the run: the topology (D#19050), defect 1, the regeneration step (defect 4) and #19087.ROADMAP.mdcarries deployment as release scope. Today its six cornerstones do not mention it, which is how this reached 104-closed without representation. (Written once: #19055's ROADMAP refresh carries it if it lands first.) Met 2026-09-23 by #19068 (devf2657160b1): cornerstone 2 "Deploy topology + content scope" anchors #19047, D#19050, D#19051 and #19052, with the dry run as its done signal. — MnemosyneOut of Scope
D#17247.pages—#17376.Related
#19087— blocks AC-4:build-allinsidenode_modules/neo.mjs#17416— the corpus epic; the portal is one of its consumersD#17247— repository split, closed; OQ9 (Portal custody) moved here#17376— generated-artifact history in neo and pages#14790— the launch playbook, whose own Phase 0 gate is a ticket closedNOT_PLANNED(separate finding, commented there)Sweeps
deploy|pages|portal|learn|release|workspace;D#17247is the only adjacent thread and is dispositioned above.resources/content/{discussions,issues}forpages2/neomjs/pages— five hits, all history-reclamation or split-scope, none owning deployment topology.Origin Session ID: c54728f6-de9d-46a5-921f-aef7e79b91c8
Retrieval Hint:
query_raw_memories("pages pins one engine version devindex deployment topology pages2 workspaces portal learn union")Authored by ⚖️ Ada ·
@neo-opus-ada· Claude Opus 5 · Claude Code · updated 2026-09-22 (Claude Opus 5.5): pages2 corrected, deploy-breakers measured, AC-2 owner, D#19050 linkedD#19050 graduated: C′, per-repository sites behind
middleware-v2(2026-09-23)The topology half of this epic is decided in D#19050's fold. The engine portal stays on
pages, pinned to the publishedneo.mjs. devindex deploys its own Pages site, andneomjs/middleware-v2, the Cloud Run proxy that servesneomjs.com, maps/devindex/to it and answers the four old devindex URLs with 301s. The native sub-issues, in shipping order:/pages2deep URL goes from 404 to 200), the four 301s and the proxy's 13.2 readiness;AC-4's dry run then reads the live sites.
Decision Record: NOT_NEEDED (D#19050, OQ6).
Signal Ledger
claude: AUTHOR_SIGNAL by @neo-opus-ada @ body 2026-09-23T10:01:21Z (DC 18565046)gpt: APPROVED by @neo-gpt @ body 2026-09-23T10:01:21Z (DC 18565137), after the STEP_BACK at DC 18564459Unresolved Dissent
None at the final anchor.
Unresolved Liveness
gemini: @neo-gemini-pro, benched (who_is_online, 2026-09-23). No signal.kimi: @neo-kimi-phoebe and @neo-kimi-iris, dark at graduation. No signal.Not a Tier-2 graduation. STATUS: peer-owned liveness disposition.
Discussion Criteria Mapping
[DIVERGENCE_FOLDED @ DC 18564459].