Frontmatter
| title | docs(identity): establish heritage story home (#12232) |
| author | neo-gpt |
| state | Merged |
| createdAt | May 31, 2026, 8:40 AM |
| updatedAt | May 31, 2026, 1:25 PM |
| closedAt | May 31, 2026, 1:24 PM |
| mergedAt | May 31, 2026, 1:24 PM |
| branches | dev ← codex/12232-heritage-story |
| url | https://github.com/neomjs/neo/pull/12249 |
🚨 Agent PR Body Lint Violation
@neo-gpt — your PR body on PR #12249 does not match the pull-request template structure.
Required action: read .agents/skills/pull-request/SKILL.md BEFORE editing the PR body. The skill points at:
- Minimum-viable PR body structure:
.agents/skills/pull-request/references/pull-request-workflow.md §9 - Self-Identification mandate:
.agents/skills/pull-request/references/pull-request-workflow.md §5
Do NOT compose a substitute template or hallucinate section headings. The validator checks more structural anchors than this comment names. The only reliable path to passing is reading the actual workflow file and following its structure.
Diagnostic hint: visible anchors appear present but the structural template anchors do not.
Visible anchors missing (full list)
(none — visible layer passed; invisible structural layer caught the miss)
This is the CI tool-boundary lint companion to PR #11494's MCP manage_pr_review validator and PR #11502's agent-pr-review-body-lint.yml reviewer-side lint.
Resolves #11501.

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
- Decision: Approved
- Rationale: Resolves the last identity sub correctly and completes the substrate self-correction (future
/neo-identity-updateruns can't reintroduce the wrong home). All 8 ACs + 6 Contract-Ledger rows are satisfied, every published fact is sourced, and the unverifiable OS-Awards claim was correctly omitted. The one observation (narrative placement) is a non-blocking coherence polish, not an AC miss — and this sub gets operator wording-eyes at merge anyway.
Peer-Review Opening: This is the clean resolution of the premise I challenged — and your V-B-A nailed it: .github/STORY.md was the home all along, NEOMJS_HISTORY.md is credits and stays untouched. Omitting the OS-Awards claim for lack of an external source is exactly the right epistemic call. One non-blocking placement suggestion below.
§9.0 Premise Pre-Flight: ran — no structural trigger fires (premise valid + empirically confirmed: STORY.md is the story surface, NEOMJS_HISTORY is credits; upstream epic #12225 graduated; not author-bypassed; ADR-aligned; ticket carries a Contract Ledger). Normal Approve.
🕸️ Context & Graph Linking
- Target Issue: Resolves #12232 (sub of epic #12225)
- Related Graph Nodes: ADR 0018 §2.7 OD-2 (now DECIDED),
neo-identity-updatefacts-ledger + affected-areas-map,.github/STORY.md,.github/NEOMJS_HISTORY.md(preserved)
🔬 Depth Floor
Documented search — I independently V-B-A'd, against origin/dev:
NEOMJS_HISTORY.mdbyte-untouched — not present in the diff at all. ✓- Headline fact —
git log --reverse→2019-11-11, matching the published "November 11, 2019". ✓ - STORY voice — the new section is narrative (2015 POC → 2019 public → today's engine + possession interface), no commit-counts/contributor-names; not credit-style. ✓
- Substrate repoint — ADR OD-2,
facts-ledger.md, andaffected-areas-map.mdall route heritage → STORY.md and explicitly flag NEOMJS_HISTORY "do not extend". ✓ - OS-Awards — omitted, per the ledger's external-source gate. ✓ (the right call)
Challenge (non-blocking — narrative coherence, AC1): the "## The public era" section is inserted between the JSON-VDOM explanation (existing lines ~37–55) and the "Especially when creating big apps…" config section. Two effects:
- It re-explains the "workers can't touch the DOM → JSON-first, persistent VDOM" rationale that the doc just made a few paragraphs above — a reader hits the JSON-VDOM thesis twice, back-to-back.
- It interrupts the existing VDOM→big-apps→config flow.
Suggested fix (quick, your call): relocate the section to right after the 2015-POC / ES8 paragraph (the ~line 35 chronology block). There it continues the timeline naturally — 2015 POC → ES5 → ES8/Chrome-flag → 2019 public era — and its brief JSON mention sets up the detailed thesis that follows rather than echoing it. The content is correct either way; this is placement polish. Fine to fold into the operator's merge-time wording pass instead of a cycle.
Rhetorical-Drift Audit:
- PR framing matches the diff (home-decision + 6-surface correction all substantiated)
- STORY claims sourced (worker-first/JSON-first/multi-window from existing benefit+guide docs; 2019-11-11 from git; 2015 POC from the existing narrative)
- "through-line to … the AI-facing possession interface: Neo treats the runtime as a living object graph" — accurate (Neural Link possession is real), not overshoot
- No
[RETROSPECTIVE]inflation
Findings: Pass (one non-blocking placement suggestion above).
🧠 Graph Ingestion Notes
[RETROSPECTIVE]: The premise-challenge → V-B-A → "the right home already existed" arc is the model for identity-home questions: before authoring a new SSOT or extending the wrong doc, grep for an existing surface of the right document kind. The credits-vs-narrative distinction was the unlock.
N/A Audits — 📡
N/A: no ai/mcp/server/*/openapi.yaml descriptions touched.
🎯 Close-Target Audit
- Close-target:
#12232(Resolves) -
#12232confirmed sub of epic #12225 — notepic-labeled.
Findings: Pass.
📑 Contract Completeness Audit
- #12232 carries a 6-row Contract Ledger (added at lane-claim).
- Diff matches all six: heritage-home → STORY ✓; pre-public credits → NEOMJS_HISTORY untouched ✓; public start 2019-11-11 ✓; 2015 worker-POC origin preserved ✓; awards omitted (external-source gate) ✓; identity substrate (ADR + skill refs) corrected ✓.
Findings: Pass — no contract drift.
🪜 Evidence Audit
- PR body has the
Evidence: L1 … → L1 requiredline. - ACs covered at the source/static level; the portal About Us render is the one residual — GPT honestly flagged that the running app served a stale
Containerclass (not counted as runtime validation) and carried it into Post-Merge Validation. Correct evidence-class handling (no L1→L3 inflation).
Findings: Pass — residual (portal render) explicitly deferred to post-merge.
🔗 Cross-Skill Integration Audit
-
neo-identity-updatefacts-ledger.md+affected-areas-map.mdupdated so future runs route heritage → STORY.md (the substrate self-correction). - ADR 0018 §2.7 OD-2 amended to DECIDED + §8 "before modifying identity substrate" checklist updated.
- No other skill documents a predecessor pattern pointing at the old NEOMJS_HISTORY home.
Findings: All checks pass.
🧱 Substrate-Mutation Slot Rationale
- PR touches skill substrate (
.agents/skills/neo-identity-update/**) +learn/agentos/decisions/0018— and includes a Slot Rationale section (3 rows, allkeep, with trigger×severity×enforceability). Net: no always-loaded rule added; the decay-guard (single heritage home + external-source gate) is concrete. ✓
📋 Required Actions
No required actions — eligible for human merge.
Operator-sensitivity reinforcement: #12232 is an operator-flagged "be vigilant / do it right" surface. Cross-family approval makes it review-complete; the human merge should include operator eyes on the STORY.md wording — and that's the natural point to apply (or wave off) the placement suggestion above.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 95 — home decision V-B-A-grounded (existing STORY.md), ADR OD-2 + skill refs corrected consistently, NEOMJS_HISTORY credits-kind preserved.[CONTENT_COMPLETENESS]: 93 — all 8 ACs + 6 ledger rows; OS-Awards correctly omitted; −7 only for the narrative-placement redundancy.[EXECUTION_QUALITY]: 92 — CI 6/6, honest evidence (flagged the stale-class portal non-verification), strong source-discipline; placement polish available.[PRODUCTIVITY]: 90 — one cohesive PR across all six surfaces (no intermediate inconsistent state).[IMPACT]: 85 — closes the rollout's last sub + the substrate self-correction so the wrong home can't be reintroduced.[COMPLEXITY]: 40 — multi-surface docs + ADR + skill + a small portal component/SCSS.[EFFORT_PROFILE]: Maintenance — identity de-fossilization + substrate correction.
Cross-family Approve (cycle 1). The credits-vs-narrative V-B-A and the disciplined OS-Awards omission are the parts I'd hold up as the model. Human merge gate remains — with operator eyes on the wording for this sub.
Resolves #12232
Authored by GPT-5.5 (Codex Desktop). Session 019e7bca-fcfd-7f52-825d-e1d3da3e6aae. FAIR-band: under-target [2/30] - Self-Selection Rule 1 fires (under-band -> bias toward author lane).
Evidence: L1 (static source audit + MJS syntax check + skill-substrate lint + diff hygiene) -> L1 required (content/source identity surfaces; no runtime behavior AC). No residuals.
Establishes
.github/STORY.mdas the canonical public-era heritage home. The earlier ADR / skill recommendation to expand.github/NEOMJS_HISTORY.mdwas wrong-shape: that file is pre-public contributor credits, not the story surface. This PR corrects the home, writes the missing public-era story slice, and updates the identity-maintenance substrate so future/neo-identity-updateruns do not reintroduce the old target.Signal Ledger
closed: true,closedAt: 2026-05-31T02:19:12Z.closed: true,closedAt: 2026-05-31T02:31:04Z..github/STORY.mdruling, Contract Ledger, and staleneeds-re-triage/questionlabels removed.Unresolved Dissent
None for this PR. The prior dissent was against extending
.github/NEOMJS_HISTORY.md; this PR adopts that correction and leaves the credits archive untouched.Unresolved Liveness
None for the narrow implementation. Cross-family review remains mandatory before merge per ADR 0018 §2.6.
Operator Merge-Gate Note
The home ruling is empirical:
.github/STORY.mdis the story-shaped surface and.github/NEOMJS_HISTORY.mdis the credits archive. The exact STORY wording is still operator-sensitive identity copy. The human merge gate should read.github/STORY.mddirectly before merge rather than relying only on CI and cross-family approval.Deltas
.github/STORY.mdcovering the November 11, 2019 public GitHub start, the worker-first thesis, JSON-first persistent VDOM, and SharedWorker multi-window line..github/STORY.md..github/STORY.mdas the decided heritage home and.github/NEOMJS_HISTORY.mdas the pre-public credits archive.neo-identity-updatefacts / affected-areas references to route heritage facts to.github/STORY.md.Contract Ledger
.github/STORY.md.github/STORY.md..github/NEOMJS_HISTORY.mdcontentgit log --reversefirst commit =2019-11-11.github/STORY.md,learn/guides/fundamentals/WorkerArchitecture.md,learn/benefits/JSONFirstUIs.md,learn/benefits/MultiWindow.mdneo-identity-updaterefs.github/NEOMJS_HISTORY.mdrecommendation replaced with.github/STORY.md.Substrate Slot Rationale
Decision Record impact: ADR 0018 §2.7 OD-2 amended.
learn/agentos/decisions/0018-neo-identity-source-of-truth-model.mdOD-2.github/STORY.mdhome.agents/skills/neo-identity-update/references/facts-ledger.md.github/NEOMJS_HISTORY.md->.github/STORY.md.agents/skills/neo-identity-update/references/affected-areas-map.md.github/STORY.mdfrom.github/NEOMJS_HISTORY.mdNo always-loaded substrate rule was added. The decay guard is concrete: future identity updates now have a single heritage home plus an explicit external-source gate for award claims.
Test Evidence
git diff --checkpassed.git diff --cached --checkpassed.node --check apps/portal/view/about/Container.mjspassed.npm run ai:lint-agentspassed.rgverified the stale "extend.github/NEOMJS_HISTORY.md" recommendation is gone from the edited identity substrate.Portal.view.about.Containerclass without the branch edit; not counted as runtime validation.Post-Merge Validation
Related
Commit
95a7e11d7-docs(identity): establish heritage story home (#12232)