Skip to content

feat(web): a Map tab draws each project's feature map from GitHub - #247

Merged
lukemaj merged 3 commits into
mainfrom
feat/235-feature-map
Oct 13, 2026
Merged

lukemaj merged 3 commits into
mainfrom
feat/235-feature-map

Conversation

@lukemaj

@lukemaj lukemaj commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

What: a Map tab in the right panel draws the thread's project from docs/map.md on its default branch, with every part coloured planned, working, broken or done from GitHub, a thread icon on parts a thread is working on, a keyboard part list and a gaps list.
Why: project status lived in scattered notes and a static diagram that went stale within a day (#235).
So what: the planner dispatches the round-2 Sol and Grok review on this head and, after merge, deploys; the ContextMD map file lands separately in toolboxmd/contextmd#56.

Round 2: how each finding is closed

Each defect got a test that failed before its fix (7 new checks failed for the intended reason, then passed).

  1. Sol 1, truncated nested evidence. Labels now read GitHub's full page of 100; labels add no cost per page size. Each Issue fact carries complete, false when labels or closing PRs had another page. When an open Issue's unread evidence could make the part broken, the part shows incomplete instead of done or working, and the ref is listed in the gaps row. Evidence that was read and proves broken still shows broken. Tests: a bug label past the cap (was done, now incomplete), a failing PR past the closing-PR cap (was working, now incomplete), proven broken still broken, closed Issue unaffected.
  2. Sol 2, unreadable primary promoted. The parser marks primaryUnreadable when the first token of a part's ref line cannot be read. The part shows unknown and opens nothing; the next ref never decides. Tests: parser (%% A: #0 PR #38) and fold (was done and opened PR fix(web): close Issues integration gaps (#25) #38, now unknown with no link).
  3. Sol 3, unrelated PR links hid work. An Issue-primary part now drops a working thread only when that thread carries the primary PR of another part that names the same Issue, which is the design's SC/LJ case. Test: A = Spike: OpenBot on T3 (Computer tab, Bot as thread, mode toggle) #7, B = PR fix(web): close Issues integration gaps (#25) #38, a working thread on Spike: OpenBot on T3 (Computer tab, Bot as thread, mode toggle) #7 with an old fix(web): close Issues integration gaps (#25) #38 link; it was planned with no icon, now working with the icon. The SC/LJ test still passes.
  4. Sol 4, real-client acceptance. Done; see "Real-client pass" below.
  • CI (red on round 1): feature-map now owns its files in docs/fork-features.md and MermaidDiagram.tsx is allowlisted, the optional closed-tab history change is dropped, and FEATURE_MAP_CLASSES is no longer exported. CI is green on 6d87729.
  • Grok (optional): the user guide now names incomplete, unknown, partial and unreadable refs.
  • Cost, remeasured after the label change: still head 1 + file 1 + facts 4 = 6 points per read for the 30-ref map.

Real-client pass (round 2)

An isolated dev server ran from this worktree (vp run dev --home-dir /tmp/fm-t3home, server 13919, web 5879). It never used ~/.t3/userdata or Chromeria's live ports, and the live app was not restarted. One uncommitted dev-only patch made the server read docs/map.md from the docs/feature-map branch of toolboxmd/contextmd (#56) instead of main, because #56 is not merged; it was reverted afterwards (git status clean). The project was the #56 checkout. A fixture thread on GPT-6-Luna ran only sleep, and was linked to contextmd#7 (part C) through Linked PRs and Issues.

Observed, in order. Screenshots are kept by the planner's session, not committed:

  1. Map in the panel. The launcher lists Map (A); A opens it. The header reads "Map from docs/feature-map at f0feb61". All 27 parts are coloured. C is working; SR, SC, MK, PK, FR, CU and SI are done; W is working; S, R and AS are context; GD is broken. GD is correct: closing PR chromeria#238's head rollup was FAILURE at the time, checked with GraphQL.
  2. Thread icon. A bot icon sits at the top right of node C and at the end of C's row in the part list (aria-label "Open thread working on 2 Capture: extract and judge: Test Fixture UI Check"). From a second ContextMD thread, the icon on C navigated to the fixture thread. After the fixture stopped, C kept working through open closing PR feat(server): Prism MCP toolkit, spawn_thread(role), role kits and provider snapshot #22, and the icon was gone.
  3. Node click. Clicking node C opened Issue Spike: OpenBot on T3 (Computer tab, Bot as thread, mode toggle) #7 beside the thread.
  4. Gaps list. Untracked 0; Shared Issues feat(server): add project-scoped thread supervision #16 (D, CX), fix(ci): fetch enough upstream history for the fork stack check #39 (W, ST), Agents panel: Prism spawns section, collapsed child tree, parent breadcrumb #17 (KV, ES, RP), Threads toolkit: read and message any thread in the project (scope: children | project) #15 (SR, SC, LJ); 10 open Issues on no part; the other rows 0.
  5. One-minute refresh. featureMap.read was sent at 17:20:03.145Z and 17:21:03.146Z, counted on the page's WebSocket.
  6. Failure states. First, a project with no readable branch showed the read error ("toolboxmd/chromeria has no default branch GitHub can read."), the no-snapshot path; that message comes from the dev-only branch patch. Second, an invalid GitHub token saved in this dev instance's Settings, then Refresh: the last map stayed up with "Map from docs/feature-map at f0feb61 · as of 07:28 PM, GitHub unreachable".

Not covered in the client: the partial open-Issue marker (ContextMD has 25 open Issues; the 500 cap and partial flag are proven by the service test and a live 5-page read of pingdotgg/t3code), and mobile (out of slice).

Problem

#235: the user wants one live map per project, bound to its Issues and PRs, showing at a glance what is planned, working, broken or missing. The agreed design is DESIGN-feature-map-v2.md (statuses only GitHub can prove; a thread icon only while a thread works on a part).

Change

  • Contract (packages/contracts/src/featureMap.ts): featureMap.read({ projectId }) returns one snapshot, Map or NoMap (missing / no-diagram), with branch, commit, parts, ref facts, open Issues, a partial flag and fetchedAt. New capability flag featureMap; read scope orchestration:read.
  • Server (apps/server/src/issues/featureMap.ts, IssueService.readFeatureMap):
    1. default branch name and head oid;
    2. docs/map.md at that oid (object(expression: "<oid>:docs/map.md")), so file and commit always match;
    3. every ref through resource(url:) with both Issue and PullRequest fragments, plus one page of open Issues per request, up to 5 pages (500), then marked partial.
      All under one pinned credential, through the existing GitHubApi client and rate-limit pause. STATE_FIELDS and issueStatusOf are untouched.
  • Fold (apps/web/src/components/featureMap/featureMap.logic.ts): the primary ref decides planned / working / done; broken overrides on an open bug-labelled Issue among the refs or a failing check on an open PR of the part; cancelled, unavailable and unknown are shown as notes, never as states. Gaps: untracked parts, shared Issues, open Issues on no part (with partial), cancelled/unavailable refs, ref lines for undeclared IDs, unreadable refs.
  • Thread icon: from useIssueRowThreads over every server that keeps Issue links. An Issue primary follows threads on that Issue, minus threads carrying another part's primary PR; a PR primary follows threads on the part's Issues that carry that PR. One thread opens directly; several open a menu.
  • Render: MermaidDiagram gains an onRendered container mode (chat keeps its button, strict mode and sanitizer). The Map appends classDef/class lines only; labels are never rewritten. Nodes are matched by ^mermaid-diagram-\d+-flowchart-(.+)-\d+$ against parsed IDs.
  • Surface: map in RIGHT_PANEL_KINDS, singletonSurface, both add-surface menus (shortcut A), tab title and icon, ChatView body, closed-tab history. Persisted restore drops surface kinds the build does not know.
  • Refresh: the mounted tab rereads every 60 s and on window focus; a failed read keeps the last good snapshot with "as of HH:MM, GitHub unreachable".
  • Glossary: Feature map, Part, Primary ref, Context part. User guide: docs/user/source-control.md#feature-map.

Deviations from the design, for review

  • Parsing lives on the server (it must know the refs to read); the client receives parsed parts. Fold and gaps live in featureMap.logic.ts as designed.
  • A sixth gap row, Unreadable refs, reports ref tokens the parser cannot read instead of guessing.
  • issueThreadTargets accepts closing PRs as {repository, number}, and useIssueRowThreads also returns its first server error, for the unreachable-environment note.

Scope and approval

Fork work tracked in #235; design agreed by the user on 2026-10-13. Upstream-first search: no pingdotgg/t3code Issue or PR for a project or feature map (searched PR titles for "map" and Issues for roadmap / feature map / project map).

Verification

Focused tests, all green on this head:

  • apps/server: vp test run src/issues src/auth. Covers featureMap parse, document and fact decoding, and readFeatureMap: head, then file at that oid, then facts; NoMap; the 5-page cap with partial; a GitHub outage fails instead of returning an empty map; a non-GitHub project is refused before any read.
  • apps/web: vp test run src/components/featureMap src/rightPanelStore.test.ts src/closedViewStore.test.ts src/reopenClosedView.test.ts src/components/RightPanelTabs*.test.tsx src/components/issues src/components/ChatMarkdown.test.tsx (333 tests). Transitions: close, reopen, cancel (Issue not planned, PR closed unmerged), unavailable, unknown, shared Issue, PR primary merged to a non-default branch, broken with an active thread, bug label on a closed Issue ignored, a merged PR's failing checks ignored, older server shown as unknown, offline keeps the last snapshot.
  • Pinned Mermaid 11.17.2 renders under jsdom through MermaidDiagram's real path, sanitizer included: every node id resolves to its part, the state class applies, and edges and markers never match.
  • tsc --noEmit clean for contracts, server and web. Lint: no new warnings on changed lines.

Live GitHub pass (disposable scripts, nothing committed), using this branch's parser, documents and fold against the real API:

Measured cost (rateLimit.cost on the final documents): head 1 + file 1 + facts 4 = 6 points per read for the 30-ref ContextMD map, higher than the design's estimate because the closing-PR checks are nested connections. At one read a minute per visible tab: 360 points an hour per client, 720 an hour with two clients, inside the shared 5,000.

Found while working: #246 (pre-existing macOS-only failure in ServerEnvironment.test.ts, reproduced on main) and #249 (flaky ServerSecretStore race test).

Elon record

  • Requirements and who asked: the user, 2026-10-13 (Feature map: a live Map tab per project, linked to its Issues and PRs #235 and the agreed v2 design): a live per-project map in a Chromeria side tab; only GitHub-provable states (planned, working, broken, done; no "live"); a thread icon only while an agent thread works on the part, opening that thread.
  • Deleted: "live" and "built"; owner text; reuse of issueStatusOf and growth of STATE_FIELDS; label rewriting in Mermaid; the local-checkout fallback; a server poller (the tab owns its refresh).
  • Bottleneck: binding each part to the one ref that decides it and reading every fact in one coherent snapshot; solved by the primary-ref rule and reading the file at the head oid.
  • Checked myself: live GraphQL answers for every field used (including null for private or deleted refs and {} for the wrong type), the 6-point cost, 500-Issue paging, and real Mermaid node ids on 11.17.2.

Model and harness: Claude Opus 5.5 in Claude Code (T3 Code).

🤖 Generated with Claude Code

The Map tab in the right panel draws the thread's project from
docs/map.md on its default branch and colours every part planned,
working, broken or done from what GitHub returns for its primary ref.

- featureMap.read reads the map at the default branch's head commit,
  every ref through resource(url:), and the repo's open Issues (up to
  500), under one pinned credential, behind its own capability flag.
- featureMap.logic folds the four states, the gaps list and the
  diagram's class lines; a pinned-Mermaid test proves the node-id match.
- A thread icon shows only while a linked thread works on the part and
  opens it; a part list and gaps list sit under the drawing.

Closes #235

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added vouch:trusted PR author is trusted by repo permissions or the VOUCHED list. size:XXL labels Oct 13, 2026
@github-actions

github-actions Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Thread transfer impact

✅ Thread transfer remains within every enforced ceiling.

Provider Metric Main baseline This PR Impact PR ceiling
Codex Total thread wire 5.0 KiB 5.0 KiB 0 B (0.0%) 6.8 KiB ✅
Codex Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Codex Live turn WebSocket wire 1.2 KiB 1.2 KiB 0 B (0.0%) 2.0 KiB ✅
Codex Live turn WebSocket decoded 20.9 KiB 20.9 KiB 0 B (0.0%) 29.3 KiB ✅
Codex Live turn messages 2 2 0 (0.0%) 8 ✅
Claude Total thread wire 5.0 KiB 5.0 KiB −24 B (−0.5%) 6.8 KiB ✅
Claude Thread snapshot wire 3.8 KiB 3.8 KiB 0 B (0.0%) 4.9 KiB ✅
Claude Live turn WebSocket wire 1.2 KiB 1.2 KiB −24 B (−2.0%) 2.0 KiB ✅
Claude Live turn WebSocket decoded 21.2 KiB 21.2 KiB −41 B (−0.2%) 29.3 KiB ✅
Claude Live turn messages 2 1 −1 (−50.0%) 8 ✅

Baseline: a6fc446 · PR result: c1167d9 · Source CI: success

Scenario and decoded snapshot size

10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.

  • Codex decoded thread snapshot: 108.5 KiB
  • Claude decoded thread snapshot: 108.8 KiB

Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed.

@lukemaj

lukemaj commented Oct 13, 2026

Copy link
Copy Markdown
Contributor Author

What: Independent review round 1 is FAIL at 468cba94e43b78f8255b1b161a4d234c91ba3d48.
Why: Three reproduced state/binding defects can hide broken or working parts or falsely show done, and the required real-client acceptance evidence is missing.
So what: Fix the state defects, add regression coverage, and have the primary agent complete the authorized client acceptance pass before requesting another exact-head review.

Reviewed the complete diff against a6fc446646070701577a7b6db4b873bbf32ed55f, the full feature-map-v2 design, and the user's overrides: no live label and working threads shown only as linked icons. The ContextMD companion file is outside this review.

Blocking findings

  1. P2: Nested connection truncation silently hides broken evidence. apps/server/src/issues/featureMap.ts:207 reads only 20 labels and 10 closing PRs, without pageInfo, pagination, or a partial marker. A part with a merged default-branch PR primary and an open secondary Issue whose bug label is the 21st label is shown done, although the required state is broken. An Issue with ten passing open closing PRs and an eleventh failing one is shown working instead of broken. Both reproduced through the actual decoder and fold with responses limited as the query requests. GitHub's live schema confirms label ordering defaults to creation ascending and that first limits the returned connection. Read the required evidence completely, or represent incomplete evidence explicitly and avoid asserting a clean state. Add both boundary regressions; the 500-open-Issue partial flag does not cover these connections.

  2. P2: An unreadable primary silently promotes a secondary to primary. apps/server/src/issues/featureMap.ts:80 discards an unreadable ref and continues building the ordered refs. Reproduction: declare A["Alpha"] with %% A: #0 PR #38, and supply PR fix(web): close Issues integration gaps (#25) #38 as merged into default. The parser reports #0 under Unreadable refs, but the actual fold still reports A done and opens fix(web): close Issues integration gaps (#25) #38 as primary. Reporting the token in a gaps row does not justify guessing the primary. Preserve the failed primary binding or mark the affected binding unknown/invalid instead of allowing a secondary to decide done. Add a parser-to-fold regression.

  3. P2: Any other primary PR link suppresses a valid Issue-primary working thread. apps/web/src/components/featureMap/featureMap.logic.ts:83 excludes a working thread if any retained PR link is any map part's primary PR. It does not require a shared Issue or current work on that PR. Reproduction: A has primary Issue Spike: OpenBot on T3 (Computer tab, Bot as thread, mode toggle) #7, B has primary merged PR fix(web): close Issues integration gaps (#25) #38, and a currently working thread linked to Spike: OpenBot on T3 (Computer tab, Bot as thread, mode toggle) #7 retains a historical fix(web): close Issues integration gaps (#25) #38 link. A becomes planned with no icon, contrary to the design's Issue-primary lookup. The existing test instead codifies this broader exclusion. Restore the agreed Issue-primary rule, or constrain any disambiguation so historical/unrelated links cannot suppress valid work, with a regression for this case.

  4. Blocking acceptance gap: The PR explicitly reports no integrated real-client pass or screenshots. Design sections 5 and 8 require observable rendering, node and thread navigation, refresh/outage behavior, and the integrated transition cases; the repository also requires UI evidence. Pure fold tests and the Mermaid jsdom test do not verify FeatureMapPanel's effects, overlay placement, menus, navigation, or visible-only polling. A post-merge deployment is not the missing exact-candidate acceptance evidence. The primary agent must supply that evidence within authorized client verification. I did not restart Chromeria or start any server.

Verified and limitations

  • In an isolated /tmp archive of this exact SHA: server feature-map/service/auth tests passed, 132 tests; web feature-map, panel persistence/history, Issue helpers, ChatMarkdown and RightPanelTabs tests passed, 333 tests. Contracts, server and web pnpm exec tsc --noEmit passed before adding disposable review probes. Node was 26.8.1, rather than the root's declared Node 24 range.
  • Four disposable independent regression probes against unchanged implementation code failed with the intended observations: false done on malformed primary, planned instead of working with a historical PR link, working instead of broken beyond the closing-PR cap, and false done beyond the label cap. These fixtures are not claims about current production Issues.
  • The normal close/reopen/cancel/unavailable, PR-primary merge target, and broken-over-working rules are covered. Older-server handling, open-Issue cap disclosure, pinned map commit, RPC read authorization, strict Mermaid sanitizer and chat expansion are present. Server-side parsing and the extra Unreadable refs row are reasonable choices, subject to finding 2.
  • No secrets or unrelated private data found in the changed source. The read stays on the project's GitHub host under the existing pinned-credential/quota client. The service, contracts, thin handlers and query hook follow surrounding code patterns.
  • Using the worker's recorded 6-point measurement, two clients polling once per minute consume 720/5,000 = 14.4% per hour. That is acceptable for the stated two-client workload; focus/manual refreshes and larger maps add cost. I verified the arithmetic and query structure, not a real two-client cost run. Remeasure after changing nested reads.

Requirements and who asked: The user's exact-head independent review of #247 against the agreed design and state-truth requirements.
Deleted: No implementation changes, companion-map review, live restart, or deployment from this review.
Bottleneck: State truth at incomplete/invalid bindings and missing real-client acceptance evidence.
Checked myself: Complete exact-head diff, real decoder/fold probes, focused test output, three package typechecks, live GitHub connection schema, and quota arithmetic.

Reviewer: gpt-6.1-sol, medium effort, Codex harness in T3 Code.

@lukemaj

lukemaj commented Oct 13, 2026

Copy link
Copy Markdown
Contributor Author

Verdict: no blocking findings on 468cba94e43b78f8255b1b161a4d234c91ba3d48.

The Map tab matches design v2 and the two user decisions. There is no "live" label. A working thread is a linked icon (a count and a title menu only when several threads are working). States come from the primary ref, broken overrides them, and a missing or older read stays unknown rather than a fake state.

States. The fold does not call a part done unless an Issue primary is closed as completed, or a PR primary is merged into its base repository's default branch. I checked the refs the description cites, with gh, not a running client: contextmd PR #38 and PR #45 are merged into main; PR #44 is merged into feat/7-capture-queue; issue #7 is open and PR #22 is an open draft; chromeria #229 is open and its closing PR #238 is open. Under this fold those are done, done, working, working, and working. An open Issue whose component PR already merged stays planned or working. Cancelled, unavailable, and unknown are notes. A bug label or a failing check on an open PR of the part turns it broken and keeps the thread icon.

Deviations, accepted. The server parses docs/map.md so it knows which refs to read, and the client folds the parsed parts. That is the read the design asked for. The extra "Unreadable refs" row reports tokens the parser will not guess, and the five designed rows are still there. An Issue-primary part ignores a thread that carries another part's primary PR. That is the design's own example: LJ is %% LJ: #15, and a thread on SC's PR #45 must not light LJ or SR.

Cost, partial, failure. GitHub's published point rule (add one request per parent for each connection, divide by 100, minimum 1) puts a 30-ref facts query at about 4 points, because each Issue asks for up to 10 closing PRs and each of those asks for its head check. Head 1 plus file 1 plus that 4 is the reported 6. Two visible tabs at one read a minute are 720 points an hour of the shared 5,000. Acceptable for this map. I did not send a query to read rateLimit.cost myself. A map of several hundred refs would cost more; this slice does not. The open-Issue read stops at 500 and the gaps row is titled "partial". A failed reread keeps the last snapshot and says "as of HH:MM, GitHub unreachable"; with no snapshot it shows the error. There is no local-checkout fallback.

Other checks. No secrets or private data in the diff. The state transitions the design lists are asserted in featureMap.logic.test.ts (close, reopen, cancel, unavailable, unknown, shared Issue, PR merged to a non-default branch, broken with a working thread, older server), and IssueService.test.ts covers the head-then-file-at-that-oid read, the 5-page cap, a GitHub failure, and a non-GitHub refusal. I read those tests and did not re-run them. The new RPC, capability flag, and right-panel surface follow the existing Issues seams. STATE_FIELDS is untouched.

Unproven. No real client. Icon placement, node click, and the minute refresh while the tab is mounted are not shown in Chromeria. This review did not start one.

Optional. The user guide's gaps sentence does not mention the partial marker or the Unreadable refs row. The panel shows both.

lukemaj and others added 2 commits October 13, 2026 19:16
Review round 1 (Sol) on #247:
- An Issue whose labels or closing PRs run past the page GitHub
  returned is marked incomplete; a part that could be broken by the
  unread evidence shows "incomplete" instead of done or working.
  Labels now read GitHub's full page of 100 at no extra cost.
- An unreadable first ref token marks the part's primary unreadable:
  it shows unknown and opens nothing, instead of letting the next ref
  decide.
- An Issue-primary part drops a working thread only when the thread
  carries the primary PR of another part that names the same Issue;
  unrelated PR links no longer hide work.

CI: own the feature in docs/fork-features.md, allowlist the
MermaidDiagram edit, drop the closed-tab history change, and stop
exporting FEATURE_MAP_CLASSES.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@lukemaj

lukemaj commented Oct 13, 2026

Copy link
Copy Markdown
Contributor Author

What: PASS, independent Sol review round 2 at c1167d9b3ab762c00c573727b291e866060ae883; no blocking findings remain in the reviewed scope.
Why: The three reproduced state defects are fixed, the regression tests reject the old implementation, and the supplied client evidence covers the previously missing UI path.
So what: The planner can use this exact-head review with the other required review and merge approval.

Read the full v2 design, every round 1 review comment, the complete PR diff against a6fc446646070701577a7b6db4b873bbf32ed55f, and relevant callers and repository instructions.

Round 1 closure

  1. Nested connection truncation: closed. Both label and closing-PR connections now return pageInfo.hasNextPage, and the decoded Issue carries complete. The fold shows incomplete instead of a clean state when unread open-Issue evidence could conceal a defect. Already-proven broken still wins. The gap row names incomplete refs. This fixes both the labels and closing-PR boundary cases without inventing absence beyond the cap.
  2. Unreadable primary promotion: closed. The parser preserves primaryUnreadable; the fold shows unknown and has no primary navigation URL for %% A: #0 PR #38. PR fix(web): close Issues integration gaps (#25) #38 cannot supply done in place of the failed binding.
  3. Unrelated retained PR suppresses work: closed. Exclusion is now scoped to primary PRs of parts naming the same Issue. A working thread on Spike: OpenBot on T3 (Computer tab, Bot as thread, mode toggle) #7 retaining fix(web): close Issues integration gaps (#25) #38, with B not naming Spike: OpenBot on T3 (Computer tab, Bot as thread, mode toggle) #7, stays working with its icon. The shared Threads toolkit: read and message any thread in the project (scope: children | project) #15 SC/LJ disambiguation regression still passes.
  4. Client acceptance gap: closed for the UI path raised in round 1. I inspected all six supplied screenshots. They show the Map launcher/surface, actual Mermaid rendering and colours, a C node overlay and row icon, the gaps list, node navigation to Issue Spike: OpenBot on T3 (Computer tab, Bot as thread, mode toggle) #7, the no-snapshot read error, and a last snapshot retained with the unreachable timestamp. The documented fixture also reports icon navigation and disappearance after work stopped, and reads at 17:20:03.145Z and 17:21:03.146Z. I checked the mounted-component 60-second interval and cleanup in code. Static screenshots do not independently prove those timing/navigation sequences; those observations remain the primary agent's reported client evidence. The branch override and previous companion-map input are explicitly disclosed and do not substitute for the independent state checks below.

Independent proof

All execution was in my own /tmp/sol-fm-r2 clones. No main checkout, live server, live ports, or production state was changed.

  • apps/server: pnpm exec vp test run src/issues src/auth: 170 passed, 9 skipped.
  • apps/web: feature-map, panel persistence/history, RightPanelTabs, Issues and ChatMarkdown focused tests: 339 passed. This includes the pinned Mermaid renderer and the retained shared-Issue disambiguation test.
  • Replaced only the parser/decoder and fold implementation files in my disposable clone with their round 1 versions, retaining the current tests and contracts. Selected six new regressions: 6 failed with the intended old observations (missing primary/completeness markers, false done, false working, wrong primary URL, suppressed work). Restored the exact-head files and reran the identical selection: 6 passed. This directly verifies failing-before behavior; I did not rely on the builder's claimed count of seven checks.
  • An additional disposable test renders the exact feat(server): Prism stream clock for worker liveness, plus prism_cancel #56 map through MermaidDiagram, strict mode and sanitizer on Mermaid 11.17.2: all 37 nodes resolve to their declared part IDs. SVG layout is stubbed under jsdom, so this is renderer compatibility proof, not a second real-client pass.
  • Fresh real GitHub GraphQL read at 2026-10-13 17:38:46 UTC, using this head's document builder, decoder and fold: all 40 public refs resolve, no bound Issue has incomplete evidence. Context S/R/ST/AS; working C/W/GD; done SI/MK/PK/FR/CU/SR/SC; broken CK because open closing PR fix(server): command keys match what a shell command runs, not what it mentions #243 has failing checks; remaining parts planned. Active runtime threads were deliberately omitted from this base-state check.
  • Exact-head CI success: https://github.com/toolboxmd/chromeria/actions/runs/38439563180 . Verified the run's head_sha equals this reviewed SHA. Fork Stack Model and other applicable checks also pass; conditional preview/mobile checks are skipped. Pending independent review statuses are not CI failures. The older green SHA cited in the PR body is not the evidence used here.
  • No secrets, private repository identity/ref, private session content, or unrelated personal data found in the changed source or current PR body/comments. Generic private-repository fixtures are synthetic; the actual companion map refers only to public repositories. Local dev paths in the client report are disposable fixture locations, not private store locations.

Limits

No second browser/server pass was run by this review sub-agent. Reopen, cancellation, unavailable refs and paging have executable regression/service coverage; their full event sequences were not independently replayed in a client. The supplied client input was #56's earlier 27-part map, so it is not visual acceptance of the later 37-part layout; the exact companion's parser/fold and sanitized renderer were checked separately. Node 26.8.1 was used locally, outside the root's Node 24 range; CI supplies the project gate.

Requirements and who asked: The user's round 2 exact-head review, prior-finding closure, failing-before tests, current GitHub state, CI and privacy verification.
Deleted: No implementation, deployment, live restart, or main-checkout mutation in this review.
Bottleneck: Distinguishing corrected state evidence from the original false-state behavior.
Checked myself: Complete diff/comments/design, old-versus-current executable regressions, focused suites, six screenshots, current public GitHub facts, exact-head CI and privacy scan.

Reviewer: gpt-6.1-sol, medium effort, Codex harness in T3 Code.

@lukemaj

lukemaj commented Oct 13, 2026

Copy link
Copy Markdown
Contributor Author

Verdict: no blocking findings on c1167d9b3ab762c00c573727b291e866060ae883.

Round 1

  1. Truncated nested evidence (Sol). Closed. An open Issue whose labels or closing pull requests continue past the page is incomplete, not done or working. Evidence that was read and proves broken still wins. On 468cba94 the new web tests failed 5 of 29. On this head featureMap.logic.test.ts passed 29 and featureMap.test.ts passed 10, in a /tmp clone.

  2. Unreadable primary promoted (Sol). Closed. %% A: #0 PR #38, with PR fix(web): close Issues integration gaps (#25) #38 merged, stays unknown and opens nothing. On 468cba94 that same test returned done and the PR fix(web): close Issues integration gaps (#25) #38 URL.

  3. Unrelated pull request link hid an Issue-primary thread (Sol). Closed. A thread is dropped only when it carries the primary pull request of another part that names the same Issue. On 468cba94 the new test stayed planned. On this head it is working and keeps the icon. The SC / LJ test still passes.

  4. Real client (Sol). Closed for the panel, with one limit. The screenshots in /tmp/fm/shots show the Map tab, a thread icon on the capture part, the gaps list, the no-branch error, and the last map kept under "GitHub unreachable". dev3.log shows the isolated server on ports 13919 and 5879, home /tmp/fm-t3home, from the feature-map worktree, which is now this SHA. The refresh interval is 60 seconds and is cleared when the panel unmounts. I did not find a log of the two WebSocket sends at 17:20:03Z and 17:21:03Z, so that pair stays the builder's count. The pass rendered map f0feb61 (27 parts), not the current contextmd#56 head.

  5. User guide (Grok, optional). Closed. The guide names incomplete, unknown, partial, and unreadable refs.

CI and privacy

On this SHA, Test, Test Web, Test Server 1 through 6, Lint, Typecheck, Build, Rust, and Release Smoke succeeded. The skipped jobs are preview and native static analysis. No check failed.

The diff has no private path, machine name, token, or private repository name. map is still a right-panel surface. Removing it from closed-tab history matches the CI fix in the body.

@lukemaj
lukemaj merged commit 40487da into main Oct 13, 2026
28 of 29 checks passed
@lukemaj
lukemaj deleted the feat/235-feature-map branch October 13, 2026 17:52
lukemaj added a commit that referenced this pull request Oct 14, 2026
* feat: a Map tab draws each project's feature map from GitHub

The Map tab in the right panel draws the thread's project from
docs/map.md on its default branch and colours every part planned,
working, broken or done from what GitHub returns for its primary ref.

- featureMap.read reads the map at the default branch's head commit,
  every ref through resource(url:), and the repo's open Issues (up to
  500), under one pinned credential, behind its own capability flag.
- featureMap.logic folds the four states, the gaps list and the
  diagram's class lines; a pinned-Mermaid test proves the node-id match.
- A thread icon shows only while a linked thread works on the part and
  opens it; a part list and gaps list sit under the drawing.

Closes #235

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix: the Map claims no state its evidence cannot prove

Review round 1 (Sol) on #247:
- An Issue whose labels or closing PRs run past the page GitHub
  returned is marked incomplete; a part that could be broken by the
  unread evidence shows "incomplete" instead of done or working.
  Labels now read GitHub's full page of 100 at no extra cost.
- An unreadable first ref token marks the part's primary unreadable:
  it shows unknown and opens nothing, instead of letting the next ref
  decide.
- An Issue-primary part drops a working thread only when the thread
  carries the primary PR of another part that names the same Issue;
  unrelated PR links no longer hide work.

CI: own the feature in docs/fork-features.md, allowlist the
MermaidDiagram edit, drop the closed-tab history change, and stop
exporting FEATURE_MAP_CLASSES.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs(user): the Map guide names incomplete, unknown and partial

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XXL vouch:trusted PR author is trusted by repo permissions or the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant