cosmograph merge sets — 2026-09-08
15 open PRs by thorwhalen on cosmograph-org/cosmograph, merged onto
origin/main @ 3716f38a. Grey lines are stack relationships
(a PR based on another PR); coloured arcs are conflicts.
Changes and conflicts
stack (base → head)
textual conflict
semantic conflict (tests)
dashed circle = conflicts with base alone
Minimal conflicts
| changes | kind | evidence |
|---|---|---|
| #602 | textual | Does not merge onto main at all: 4 conflicted files (package-lock.json, packages/app/next.config.js, useProjectConfigSave.tsx, CosmographProjectStore.ts). Its merge-base with main is b88b1a08 — its base branch stories_refactor moved on without it. GitHub calls it MERGEABLE because it is targeted at stories_refactor, not main. |
| #577 #616 | textual | One overlapping region of tests/unit/commands.test.ts: #577 adds four command ids to the sorted registry list, #616 rewrites the mock factory and adds 3D ids to the same file. Resolution is the union of both edits. Never binds on its own — every closed set containing #616 also contains #587, so the semantic conflict below fires first. |
| #577 #587 | semantic | Four test files fail to load: store/commands/schemas.ts:89 calls z.enum(CosmographTraversalDirection) and the symbol is undefined at module-evaluation time — the stories refactor reshuffles the packages/cosmograph/src/cosmograph/index.ts barrel. Both PRs green alone; {575,576,577} passes and {587} passes. |
| #579 #631 | semantic | #631's drift test tests/unit/params-ssot.test.ts asserts the committed ai/schemas/*.json match the TypeScript sources; #579 adds pointColorHopDirection, pointColorHopSeeds, the hopDistance strategy and TraversalDirectionType without regenerating them. Both PRs green alone; {575,576,579} and {575,576,631} both pass. Fix is mechanical: pnpm run ai:params-ssot after the merge. |
Maximal good sets
| set | n | PRs | dropped | verified |
|---|---|---|---|---|
| A | 12 | #575 #576 #587 #604 #616 #630 #631 #632 #633 #634 #636 #637 | #577 #579 #602 | pass (50 s) |
| B | 8 | #575 #576 #579 #587 #604 #616 #630 #632 | #577 #602 #631 #633 #634 #636 #637 | pass (40 s) |
| C | 10 | #575 #576 #577 #630 #631 #632 #633 #634 #636 #637 | #579 #587 #602 #604 #616 | pass (66 s) |
| D | 6 | #575 #576 #577 #579 #630 #632 | #587 #602 #604 #616 #631 #633 #634 #636 #637 | pass (43 s) |
Evaluation log
16 evaluations. Validation = pnpm run build:cosmos +
pnpm run test + pnpm run lint:ci, the local equivalent of CI's Lint and Unit Tests jobs.
| set | verdict | time | detail | why evaluated |
|---|---|---|---|---|
| #575 #576 #577 #579 #587 #602 #604 #616 #630 #631 #632 #633 #634 #636 #637 | fail | 0s | merge conflict at ui/snapshot-save-dialog: package-lock.json, packages/app/features/project-builder/hooks/useProjectConfigSave.tsx, packages/app/features/project-builder/store/CosmographProjectStore.ts, packages/app/next.config.js | full union |
| #587 #602 | fail | 0s | merge conflict at ui/snapshot-save-dialog: package-lock.json, packages/app/features/project-builder/hooks/useProjectConfigSave.tsx, packages/app/features/project-builder/store/CosmographProjectStore.ts, packages/app/next.config.js | manual |
| #575 #576 #577 #579 #587 #604 #616 #630 #631 #632 #633 #634 #636 #637 | fail | 0s | merge conflict at snapshots_w_3d: tests/unit/commands.test.ts | full union minus singleton-conflict #602 |
| #575 #576 #579 #587 #604 #616 #630 #631 #632 #633 #634 #636 #637 | fail | 99s | build=0 test=1 lint=0 | hitting set {602,577} |
| #575 #576 #577 #579 #587 #604 #630 #631 #632 #633 #634 #636 #637 | fail | 54s | build=0 test=1 lint=0 | hitting set {602,616} |
| #575 #576 #577 | pass | 37s | build=0 test=0 lint=0 | graph-ops stack alone (sanity) |
| #575 #576 #579 | pass | 31s | build=0 test=0 lint=0 | hop-color stack alone (sanity) |
| #575 #576 #579 #631 | fail | 38s | build=0 test=1 lint=0 | hypothesis A: hop-color params vs SSOT drift test |
| #575 #576 #577 #587 | fail | 45s | build=0 test=1 lint=0 | hypothesis B: commands schemas vs stories refactor |
| #575 #576 #631 | pass | 44s | build=0 test=0 lint=0 | isolate C3: 579 is the culprit, not the graph-ops base |
| #587 | pass | 46s | build=0 test=0 lint=0 | stories root alone (sanity) |
| #575 #576 #587 #604 #616 #630 #631 #632 #633 #634 #636 #637 | pass | 50s | build=0 test=0 lint=0 | candidate MSS A: drop 602, 577, 579 |
| #575 #576 #577 #630 #631 #632 #633 #634 #636 #637 | pass | 66s | build=0 test=0 lint=0 | candidate MSS C: keep 577, drop stories + 579 |
| #575 #576 #587 | pass | 47s | build=0 test=0 lint=0 | minimality of C4: is 587 innocent against the graph-ops base? |
| #575 #576 #579 #587 #604 #616 #630 #632 | pass | 40s | build=0 test=0 lint=0 | candidate MSS B: drop 602, 577 and the SSOT stack |
| #575 #576 #577 #579 #630 #632 | pass | 43s | build=0 test=0 lint=0 | candidate MSS D: keep 577 and 579, drop stories + SSOT |