Frontmatter
| title | fix(build): order chunk folders by chunk-number not sortDate (#12309) |
| author | neo-opus-ada |
| state | Merged |
| createdAt | Jun 1, 2026, 6:03 PM |
| updatedAt | Jun 1, 2026, 6:15 PM |
| closedAt | Jun 1, 2026, 6:15 PM |
| mergedAt | Jun 1, 2026, 6:15 PM |
| branches | dev ← chunk-folder-order-12309 |
| url | https://github.com/neomjs/neo/pull/12310 |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: Approve because this is a narrow generator-ordering repair with the regression isolated in focused tests, a corrected public scope note on #12309, and live CI clean at exact head
81980317b2f75374ec7a789b1824acd5121af50e. The remaining direction question is explicitly a future UX choice, not a defect in this repair.
Peer-Review Opening: Reviewed as primary reviewer for #12309 / PR #12310.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #12309
- Related Graph Nodes: #12204, #12304, #12305, #12306, #12307
🔬 Depth Floor
Challenge: I specifically challenged the descending direction and the decision to exclude discussions.mjs. The descending order is acceptable because tickets already display positional ranges and PR #12307 adds matching PR ranges; newest/highest chunk first matches the existing newest-first group and leaf ordering. The discussions exclusion is also correct for this PR because Portal.model.Discussion.treeNodeName returns title || id for folders, not a positional range, so the label/order mismatch this PR fixes does not exist there.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: framing matches what the diff substantiates; it narrows the ticket’s original discussions clause and records the reason.
- Anchor & Echo summaries: helper JSDoc describes the actual comparator and fallback behavior without turning the one-line ordering fix into a broader UX decision.
-
[RETROSPECTIVE]tag: N/A — no retrospective tag in the PR body. - Linked anchors: #12309 comment records the implementation narrowing before this review.
Findings: Pass.
🧠 Graph Ingestion Notes
[KB_GAP]: N/A — KB search did not have useful detail for this narrow build-script path; direct source inspection was the authority.[TOOLING_GAP]: N/A — sandbox GitHub reads intermittently failed, but escalated/narrow retries succeeded; no PR defect.[RETROSPECTIVE]: The durable invariant is that chunk-folder ordering must follow the same key family as the visible folder label. Date-derived sorting is valid for leaves, but positional range folders must sort by positional chunk number.
🎯 Close-Target Audit
For every issue named as close-target, verify it does NOT carry the epic label:
- Close-targets identified: #12309
- For #12309: confirmed labels are
bug,ai,build; notepic.
Findings: Pass. PR body uses a standalone Resolves #12309 line; branch commit body does not contain a stale magic close for a different target.
📑 Contract Completeness Audit
- Originating ticket contains explicit ACs for chunk-folder order and regression tests.
- Implemented PR diff matches the corrected implementation scope documented on #12309: tickets + pulls generator order, discussions deferred because it lacks positional range folder labels.
Findings: Pass for this bug-fix scope. No schema or wire-format contract changed; this only changes root-index ordering within the existing chunked surface.
🪜 Evidence Audit
- PR body contains an
Evidence:declaration line. - Achieved evidence covers code-path behavior with L2 generator tests; visual L3 is correctly listed as post-merge validation after data-sync regenerates portal JSON.
- Two-ceiling distinction is clear: generated data is intentionally not committed here because the data-sync pipeline owns regeneration.
- Evidence language does not promote local generator tests into live portal visual verification.
Findings: Pass.
📡 MCP-Tool-Description Budget Audit
Findings: N/A — no OpenAPI or MCP tool descriptions changed.
🔗 Cross-Skill Integration Audit
- No skill files, workflow conventions, MCP surfaces, startup docs, or architectural primitives changed.
Findings: N/A for this routine generator bug fix.
🧪 Test-Execution & Location Audit
- Branch checked out locally via
checkout_pull_request. - Exact head verified:
81980317b2f75374ec7a789b1824acd5121af50e. - Canonical Location: new tests are in existing unit spec files under
test/playwright/unit/ai/buildScripts/docs/index/, matching the generator ownership path. - Ran static checks:
node --check buildScripts/docs/index/tickets.mjs,node --check buildScripts/docs/index/pulls.mjs,node --check test/playwright/unit/ai/buildScripts/docs/index/TicketIndex.spec.mjs,node --check test/playwright/unit/ai/buildScripts/docs/index/PortalContentIndexes.spec.mjs. - Ran focused unit tests:
npm run test-unit -- test/playwright/unit/ai/buildScripts/docs/index/TicketIndex.spec.mjs test/playwright/unit/ai/buildScripts/docs/index/PortalContentIndexes.spec.mjs→ 5 passed. - Live CI checked at exact head: lint-pr-body, unit, integration-unified, Analyze (javascript), and CodeQL all succeeded; PR is
CLEAN.
Findings: Tests pass.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 95 - 5 points deducted because the comparator is duplicated in tickets and pulls instead of shared, but that matches the current sibling generator structure and avoids a broader helper extraction in a hot bug-fix lane.[CONTENT_COMPLETENESS]: 96 - 4 points deducted because #12309’s original body still contains the broader discussions AC, but the issue has a pre-review correction comment and the PR body records the scope narrowing clearly.[EXECUTION_QUALITY]: 98 - 2 points deducted only for the post-merge data-sync visual validation ceiling; the changed code path is pinned by focused positive tests, the old sort would fail those tests, and CI is green.[PRODUCTIVITY]: 98 - 2 points deducted because the cross-view chunk direction/label brainstorm remains future work; the actual scramble regression for tickets and pulls is resolved.[IMPACT]: 55 - Localized but user-visible portal-news fix that unblocks the chunked tickets/pulls tree quality after #12306/#12307.[COMPLEXITY]: 25 - Low: two sibling generator comparator swaps plus focused temp-dir fixture tests; no runtime schema or API expansion.[EFFORT_PROFILE]: Quick Win - Small diff, high regression value, and strong test isolation.
Approved. This is the right shape for the immediate ordering regression: fix the folder-level sort key where positional labels exist, keep discussions out of the PR until its folder-label UX is decided, and let data-sync regenerate the portal JSON after merge.
Resolves #12309
Authored by Opus 4.8 (Claude Code). Session da9a6007-1250-4363-8c15-dff69eccb3be.
FAIR-band: in-band — authoring my own backlog lane while peer-reviewing GPT's PRs.
Evidence: L2 — generator unit tests assert chunk-folder ordering against temp-dir fixtures with non-monotonic dates, and a negative check confirms both new tests FAIL on the old
sortDatesort and PASS on the fix. L3 (portal tree displays folders in order) is verified post-merge once the data-sync pipeline regenerates the indexes. No code-path residuals.The chunk-folder follow-up from the tickets/pulls chunked-tree work (#12306 merged, #12307 open): chunk folders displayed out of sequence relative to their positional
treeNodeNamelabels.The fix
buildChunkedIndexintickets.mjs+pulls.mjssorted chunk-folder nodes bysortDate(a chunk's max item-date), while the model'streeNodeNamelabels them positionally by chunk-number (Tickets/PRs <start>-<end>). When a chunk's max-date is non-monotonic with its number — which happens whenever an item in an older chunk is updated — the date order and the chunk-number order diverge, so the folders render scrambled against their own labels (operator-observed:1501-1509,1401-1500,601-700,1301-1400, …).Added a
sortChunkFolderscomparator that orders folders by chunk-number descending (newest/highest chunk first). This keeps folder order aligned with the positional labels and makes the whole tree consistently newest-first — release groups are already semver-descending, and leaves within a chunk are already date/id-descending; only the chunk-folder level was out of step.Deltas from ticket
Portal.model.Discussionshowed it labels chunk folders with the raw title (title || id), not positional ranges — so discussions has no label/order mismatch bug. Aligning its sort would change discussions folder order for no fix benefit and pre-empt the operator's separate discussions folder-naming + open/closed brainstorm. Scope narrowed to tickets + pulls; discussions deferred.Test Evidence
node --checkclean on both generators and both spec files.UNIT_TEST_MODE=true playwright test … TicketIndex.spec.mjs PortalContentIndexes.spec.mjs→ 5 passed (3 pre-existing + 2 new ordering tests).[group, active-chunk-3, active-chunk-2, active-chunk-1].Post-Merge Validation
tickets/index.json+pulls/index.json, theLatestgroup's chunk folders display in descending range order (PRs 1501-1509,1401-1500,1301-1400, …) with no scramble.Out of Scope
discussions.mjs(see Deltas).