Repository navigation
feat(lint,viz,stats): see asset relations — lint counts, health view, opens via relation (#1562, stacked) - #1637
Conversation
649ef8b to
a7b0911
Compare
The PR description documents sufficient testing, including built-CLI verification and representative real-CLI results. No missing-testing finding. Nothing from the PR was run, built, or installed. |
Reviewed the four commits beyond #1636 ( What holds:
Findings:
@jeff-r2026 Your call once the count and the dedup match recall. |
a7b0911 to
44b1e98
Compare
Resolved: The earlier per-glob ambiguity finding is fixed: each glob is checked independently before its edges are unioned. Testing: The PR description documents sufficient testing, including built-CLI verification and representative real-CLI results. No missing-testing finding. Nothing from the PR was run, built, or installed. |
… full JSON shape, pooled ambiguity Review on Tencent#1637: - relationCount now includes a relation to a teamwiki page when the page exists and its codebase is not withheld — the issue's acceptance arithmetic (Tencent#1552's example plus the typo gives 4) holds only this way; pages stay out of assetCount and withoutRelation. The fixtures now use the true Tencent#1552 example. - Lint applies declared-beats-link by target, the rule recall renders: a local link to an asset that also has a declared relation from the same entry is prose, not a second edge. - --lint --json without a teamwiki prints the full report shape (summary, issues, graphHealth, assetGraph) so scripts reading .summary see the same structure either way. - via relation pools every applicable run's related paths before the relative-path ambiguity check, the same way adoption pools docs: a relative read that could name a path in two runs' roots credits neither.
44b1e98 to
8a584d3
Compare
|
Review findings addressed in
The page-scope filtering fix from #1636's Verification: |
Resolved: The earlier scope-filtering, same-source declared-over-link precedence, and per-glob ambiguity findings are fixed. Cross-run ambiguity pooling is improved but remains incomplete as described above. Testing: The description documents sufficient testing, including build and representative real-CLI verification. No missing-testing finding. Only the scoped diff was read; nothing from the PR was run, built, or installed. |
Re-checked at Resolved:
Still open:
@jeff-r2026 Your call; the first two are the ones I would settle before merging. |
…ount rule, null graphHealth Review on Tencent#1637: - recall-adoption: the via-relation pool now keeps every in-window run (counted ones included); already-counted runs are skipped only when adding. An absolute read of run A's related path credits A, and a later relative read naming a path in both A's and B's roots sees both runs and credits neither — 1 where the old pool gave 2 (Tencent#1637 review), matching how adoption pools docs. Regression test added. - lint-asset-graph: the counting comment states the reading the relationCount follows — one count per relation line recall renders, so a declared REFERENCES the target links back to counts twice — with a test locking it (Tencent#1637 review). - codebase-wiki-lint: graphHealth is null when graph-index.json is missing or corrupt (and in the no-teamwiki --lint --json fallback), so a JSON reader sees "not checked" instead of a measured 0%. summary zeros stay: issues were checked, none found. Verified: tsc, lint, build clean; lint-asset-graph + recall-attribution + viz unit suites pass (192 tests).
|
All three P2s addressed at [P2] via-relation pool drops counted runs. Fixed: the pool now keeps every in-window run — counted ones included — and only the adding loop skips already-counted runs. Your repro now gives 1: the absolute read credits A, the later relative read sees both A's and B's roots in the pool, reads as ambiguous, and credits no second run. Added a regression test that writes exactly that log. [P2] Reciprocal pair counts twice. Stated, and locked with a test. The count follows what recall renders — one count per relation line — so a declared [P2] [P3s]. The One heads-up for the merge order: this branch still carries the pre-fix version of #1636's Verified: tsc / lint / build clean; |
Resolved: Scope filtering, per-glob ambiguity, same-source declared-over-link precedence, and cross-run ambiguity—including retaining already-counted runs—are fixed. Testing: The description documents sufficient testing, including build and representative real-CLI verification. No missing-testing finding. Only the scoped diff was read; nothing from the PR was run, built, or installed. |
Re-checked at Resolved:
Open:
This branch sits on #1636's @jeff-r2026 Your call once the new line is in English. |
d36db48 to
135ee25
Compare
… full JSON shape, pooled ambiguity Review on Tencent#1637: - relationCount now includes a relation to a teamwiki page when the page exists and its codebase is not withheld — the issue's acceptance arithmetic (Tencent#1552's example plus the typo gives 4) holds only this way; pages stay out of assetCount and withoutRelation. The fixtures now use the true Tencent#1552 example. - Lint applies declared-beats-link by target, the rule recall renders: a local link to an asset that also has a declared relation from the same entry is prose, not a second edge. - --lint --json without a teamwiki prints the full report shape (summary, issues, graphHealth, assetGraph) so scripts reading .summary see the same structure either way. - via relation pools every applicable run's related paths before the relative-path ambiguity check, the same way adoption pools docs: a relative read that could name a path in two runs' roots credits neither.
…ount rule, null graphHealth Review on Tencent#1637: - recall-adoption: the via-relation pool now keeps every in-window run (counted ones included); already-counted runs are skipped only when adding. An absolute read of run A's related path credits A, and a later relative read naming a path in both A's and B's roots sees both runs and credits neither — 1 where the old pool gave 2 (Tencent#1637 review), matching how adoption pools docs. Regression test added. - lint-asset-graph: the counting comment states the reading the relationCount follows — one count per relation line recall renders, so a declared REFERENCES the target links back to counts twice — with a test locking it (Tencent#1637 review). - codebase-wiki-lint: graphHealth is null when graph-index.json is missing or corrupt (and in the no-teamwiki --lint --json fallback), so a JSON reader sees "not checked" instead of a measured 0%. summary zeros stay: issues were checked, none found. Verified: tsc, lint, build clean; lint-asset-graph + recall-attribution + viz unit suites pass (192 tests).
…e onto Tencent#1636's page pool Rebased onto Tencent#1636's collectCodePages pool; SaulMoro's re-check on Tencent#1637: - codebase-wiki-lint prints the new not-checked line in English (AGENTS.md: no Chinese in CLI output). - WikiLintReport documents that graphHealth can be null in every mode, standalone --output included: graph-index.json missing or corrupt means "not checked", never a measured 0%; scripts reading graphHealth.connectivity must handle null. - formatResults delegates relation rendering to resultsRelations (which owns the derived-edge computation now); two leftovers from the rebase removed. Verified: tsc, lint, build clean; lint-asset-graph + recall-attribution + viz + asset-relations (270 tests) and the 5 real-CLI relations-e2e pass.
|
Fixed and rebased at
Verified: tsc / lint / build clean; |
Read at One thing for the rebase: #1653 has since put the rest of @jeff-r2026 Your call once it is rebased onto #1636 and |
Resolved: Scope filtering, per-glob ambiguity, declared-over-link precedence, cross-run ambiguity pooling, and the English-message finding are fixed. The provenance and teamwiki counting concerns are addressed by the revised contract and acceptance tests. Testing: The description documents sufficient build and representative real-CLI verification; no missing-testing finding. Only the scoped diff was read. Nothing from the PR was run, built, or installed. |
Resolved: Earlier scope isolation, per-glob ambiguity, declared-over-link precedence, cross-run ambiguity pooling, and English-output findings are fixed. Provenance/teamwiki counting and nullable Testing: The description documents sufficient build and representative real-CLI verification. No missing-testing finding. Only the scoped diff was read; nothing from the PR was run, built, or installed. |
…er lint's scope inputs Codex review on Tencent#1637: - computeLintAssetGraph now counts path-derived rule→page edges: each glob judged per codebase over the scope's code-page pool, a declared relation from the rule to the page beating the derived one — the same visibility and precedence recall renders. A scoped rule lint used to list as unrelated no longer does. Pages stay targets, not assets. - memberScopeGraphs (extracted from lintAssetGraph) gives the viz health view the same saved indexes and scope selection codebase --lint uses, so the two cannot disagree about inputs (an inherited user scope counted twice before). A report without a member scope (--repo, the ~/.teamai fallback) still counts its own entries. Verified: tsc, lint, build clean; lint-asset-graph + viz + recall-attribution + asset-relations (254 tests) and the 5 real-CLI relations-e2e pass.
|
Both P2s fixed at [P2] Count path-derived relations. [P2] Matching scope/index inputs for the health view. Verified: tsc / lint / build clean; |
Resolved: The previous path-derived counting and health-input findings are fixed for ordinary cwd-selected reports. Earlier scope isolation, per-glob ambiguity, declared-over-link precedence, and counted-run ambiguity fixes remain present. The revised provenance/teamwiki and nullable-health contracts address their earlier findings. Testing: The description documents sufficient build and representative real-CLI verification; no missing-testing finding. Only the scoped diff was read. Nothing from the PR was run, built, or installed. |
…led paths in the ambiguity check Codex review on Tencent#1637: - memberScopeGraphs accepts an already-resolved config and the viz health view passes paths.scope: a dashboard requested with project B's explicit config no longer shows project A's (cwd-detected) relation counts. An explicitly user-scoped config counts as the user scope and cannot inherit itself. - The via-relation ambiguity pool now holds each run's recalled paths alongside its related paths: a relative read that could name one of each credits nothing — it is plausibly an ordinary read of the recalled doc the relation points away from. Regression test added. Verified: tsc, lint, build clean; recall-attribution + lint-asset-graph + viz (223 tests) and the 5 real-CLI relations-e2e pass.
|
Both P2s fixed at [P2] Resolve health counts from the supplied scope. [P2] Pool recalled paths in the ambiguity check. The via-relation pool now holds each run's recalled paths alongside its related paths; only the credit test stays related-only. Your scenario — run recalls Verified: tsc / lint / build clean; |
|
No new findings in the scoped diff. Resolved: Both latest findings are fixed: viz passes its resolved config into Testing: The PR description documents sufficient build and representative real-CLI verification. No missing-testing finding. Only the specified diff was read; nothing from the PR was run, built, or installed. |
Re-checked at
Non-blocking, for the description and polish:
Nothing blocking from our side; CI was still running at this head when this was written. @jeff-r2026 Your call; this merges after #1636. |
|
Friendly nudge @jeff-r2026 — ready from our side pending the stack:
Merge order: #1636 first, then one final |
#1636 is merged (0af232c). This branch still carries #1636's original commits, and The earlier nits still apply if you want to take them in the same push: the lowercase "graph:" label, the stale part of the description, and the casts in |
…ent#1562 part 1) Lint reads the member's own recall indexes — the same scopes recall selects, never a fresh build — and counts the assets visible there: resolved relations (once per unordered asset pair, declared beating link, no 5-line cap), assets without a relation in either direction, and declared relations whose target names no asset in the team clone on disk or the learnings roots, the same existence check contribute makes. The text report gains one line after it; --json gains an assetGraph object. Without a teamwiki the graph checks are skipped but the asset line still prints; standalone --output has no member, so no assetGraph at all. The exit code does not change.
…#1562 part 2) The /kb-report health view and /api/context now show the Tencent#1562 part-1 relation counts next to the never-recalled list: assets, relations, without-a-relation, and unresolved declared targets, each listing the assets behind it by team-tree path, plus the silent ∩ without-relation intersection. Counts are computed server-side over the report's own search index, resolving with recall's RelationContext (recall-identical visibility, withheld teamwiki codebases) and contribute's team-clone / learnings-roots existence check for unresolved targets; the section labels the scope it was resolved for like the rest of the view.
…#1562 part 3) The run line's per-doc entry now records exactly the Related: paths recall printed for that doc (relation, direction, resolved path), computed once per result and shared between stdout and the log. teamai stats' recall section gains a "via relation" column: a run counts once when a countable read of the session opens any of its recorded related paths within the adoption window, mirroring the adoption join without touching votes. Docs without related (any log written before this change) contribute 0, and opening a related path changes no vote.
The view now calls the same pure counter as codebase --lint, so the two can never disagree about the counts (Tencent#1562): a relation to a teamwiki page resolves for recall but does not count, a page being a target, not an asset. The viz fixture gains the rule's REFERENCES of the learning to match the issue's acceptance example.
… full JSON shape, pooled ambiguity Review on Tencent#1637: - relationCount now includes a relation to a teamwiki page when the page exists and its codebase is not withheld — the issue's acceptance arithmetic (Tencent#1552's example plus the typo gives 4) holds only this way; pages stay out of assetCount and withoutRelation. The fixtures now use the true Tencent#1552 example. - Lint applies declared-beats-link by target, the rule recall renders: a local link to an asset that also has a declared relation from the same entry is prose, not a second edge. - --lint --json without a teamwiki prints the full report shape (summary, issues, graphHealth, assetGraph) so scripts reading .summary see the same structure either way. - via relation pools every applicable run's related paths before the relative-path ambiguity check, the same way adoption pools docs: a relative read that could name a path in two runs' roots credits neither.
…ount rule, null graphHealth Review on Tencent#1637: - recall-adoption: the via-relation pool now keeps every in-window run (counted ones included); already-counted runs are skipped only when adding. An absolute read of run A's related path credits A, and a later relative read naming a path in both A's and B's roots sees both runs and credits neither — 1 where the old pool gave 2 (Tencent#1637 review), matching how adoption pools docs. Regression test added. - lint-asset-graph: the counting comment states the reading the relationCount follows — one count per relation line recall renders, so a declared REFERENCES the target links back to counts twice — with a test locking it (Tencent#1637 review). - codebase-wiki-lint: graphHealth is null when graph-index.json is missing or corrupt (and in the no-teamwiki --lint --json fallback), so a JSON reader sees "not checked" instead of a measured 0%. summary zeros stay: issues were checked, none found. Verified: tsc, lint, build clean; lint-asset-graph + recall-attribution + viz unit suites pass (192 tests).
…e onto Tencent#1636's page pool Rebased onto Tencent#1636's collectCodePages pool; SaulMoro's re-check on Tencent#1637: - codebase-wiki-lint prints the new not-checked line in English (AGENTS.md: no Chinese in CLI output). - WikiLintReport documents that graphHealth can be null in every mode, standalone --output included: graph-index.json missing or corrupt means "not checked", never a measured 0%; scripts reading graphHealth.connectivity must handle null. - formatResults delegates relation rendering to resultsRelations (which owns the derived-edge computation now); two leftovers from the rebase removed. Verified: tsc, lint, build clean; lint-asset-graph + recall-attribution + viz + asset-relations (270 tests) and the 5 real-CLI relations-e2e pass.
…er lint's scope inputs Codex review on Tencent#1637: - computeLintAssetGraph now counts path-derived rule→page edges: each glob judged per codebase over the scope's code-page pool, a declared relation from the rule to the page beating the derived one — the same visibility and precedence recall renders. A scoped rule lint used to list as unrelated no longer does. Pages stay targets, not assets. - memberScopeGraphs (extracted from lintAssetGraph) gives the viz health view the same saved indexes and scope selection codebase --lint uses, so the two cannot disagree about inputs (an inherited user scope counted twice before). A report without a member scope (--repo, the ~/.teamai fallback) still counts its own entries. Verified: tsc, lint, build clean; lint-asset-graph + viz + recall-attribution + asset-relations (254 tests) and the 5 real-CLI relations-e2e pass.
…led paths in the ambiguity check Codex review on Tencent#1637: - memberScopeGraphs accepts an already-resolved config and the viz health view passes paths.scope: a dashboard requested with project B's explicit config no longer shows project A's (cwd-detected) relation counts. An explicitly user-scoped config counts as the user scope and cannot inherit itself. - The via-relation ambiguity pool now holds each run's recalled paths alongside its related paths: a relative read that could name one of each credits nothing — it is plausibly an ordinary read of the recalled doc the relation points away from. Regression test added. Verified: tsc, lint, build clean; recall-attribution + lint-asset-graph + viz (223 tests) and the 5 real-CLI relations-e2e pass.
9024c85 to
63c32aa
Compare
|
No new findings in the specified diff. Resolved: Viz passes its resolved config into Testing: The PR description documents sufficient testing, including build and representative real-CLI verification. No missing-testing finding; the deferred full suite is not blocking. Only the specified diff was read. Nothing from the PR was run, built, or installed. |
|
Rebased onto main at
The nits: the not-checked line is the lowercase Nothing in the rebase but the rebase. Ready when you are. |
SaulMoro
left a comment
There was a problem hiding this comment.
This was generated by AI during triage.
Approving at 63c32aa. All three parts of #1562 are met, within the scope of the #1552 triage:
codebase --lintcounts the member's asset relations.- The knowledge-base health view shows the same counts.
statscounts the files a session opens from a relation.
Rebase check: compared with 9024c85, the range-diff shows eight of the nine commits unchanged. The only difference is the resolved conflict with #1653's English output in src/codebase-wiki-lint.ts. In the final tree that file prints only English, keeps the graphHealth === null branch and the asset line, and has no conflict markers. CI is green at this head.
Everything from our earlier rounds is resolved. Remaining nit: the not-checked line still starts with a lowercase graph:, while the measured line says Graph:.
… full JSON shape, pooled ambiguity Review on Tencent#1637: - relationCount now includes a relation to a teamwiki page when the page exists and its codebase is not withheld — the issue's acceptance arithmetic (Tencent#1552's example plus the typo gives 4) holds only this way; pages stay out of assetCount and withoutRelation. The fixtures now use the true Tencent#1552 example. - Lint applies declared-beats-link by target, the rule recall renders: a local link to an asset that also has a declared relation from the same entry is prose, not a second edge. - --lint --json without a teamwiki prints the full report shape (summary, issues, graphHealth, assetGraph) so scripts reading .summary see the same structure either way. - via relation pools every applicable run's related paths before the relative-path ambiguity check, the same way adoption pools docs: a relative read that could name a path in two runs' roots credits neither.
…ount rule, null graphHealth Review on Tencent#1637: - recall-adoption: the via-relation pool now keeps every in-window run (counted ones included); already-counted runs are skipped only when adding. An absolute read of run A's related path credits A, and a later relative read naming a path in both A's and B's roots sees both runs and credits neither — 1 where the old pool gave 2 (Tencent#1637 review), matching how adoption pools docs. Regression test added. - lint-asset-graph: the counting comment states the reading the relationCount follows — one count per relation line recall renders, so a declared REFERENCES the target links back to counts twice — with a test locking it (Tencent#1637 review). - codebase-wiki-lint: graphHealth is null when graph-index.json is missing or corrupt (and in the no-teamwiki --lint --json fallback), so a JSON reader sees "not checked" instead of a measured 0%. summary zeros stay: issues were checked, none found. Verified: tsc, lint, build clean; lint-asset-graph + recall-attribution + viz unit suites pass (192 tests).
…e onto Tencent#1636's page pool Rebased onto Tencent#1636's collectCodePages pool; SaulMoro's re-check on Tencent#1637: - codebase-wiki-lint prints the new not-checked line in English (AGENTS.md: no Chinese in CLI output). - WikiLintReport documents that graphHealth can be null in every mode, standalone --output included: graph-index.json missing or corrupt means "not checked", never a measured 0%; scripts reading graphHealth.connectivity must handle null. - formatResults delegates relation rendering to resultsRelations (which owns the derived-edge computation now); two leftovers from the rebase removed. Verified: tsc, lint, build clean; lint-asset-graph + recall-attribution + viz + asset-relations (270 tests) and the 5 real-CLI relations-e2e pass.
…er lint's scope inputs Codex review on Tencent#1637: - computeLintAssetGraph now counts path-derived rule→page edges: each glob judged per codebase over the scope's code-page pool, a declared relation from the rule to the page beating the derived one — the same visibility and precedence recall renders. A scoped rule lint used to list as unrelated no longer does. Pages stay targets, not assets. - memberScopeGraphs (extracted from lintAssetGraph) gives the viz health view the same saved indexes and scope selection codebase --lint uses, so the two cannot disagree about inputs (an inherited user scope counted twice before). A report without a member scope (--repo, the ~/.teamai fallback) still counts its own entries. Verified: tsc, lint, build clean; lint-asset-graph + viz + recall-attribution + asset-relations (254 tests) and the 5 real-CLI relations-e2e pass.
…led paths in the ambiguity check Codex review on Tencent#1637: - memberScopeGraphs accepts an already-resolved config and the viz health view passes paths.scope: a dashboard requested with project B's explicit config no longer shows project A's (cwd-detected) relation counts. An explicitly user-scoped config counts as the user scope and cannot inherit itself. - The via-relation ambiguity pool now holds each run's recalled paths alongside its related paths: a relative read that could name one of each credits nothing — it is plausibly an ordinary read of the recalled doc the relation points away from. Regression test added. Verified: tsc, lint, build clean; recall-attribution + lint-asset-graph + viz (223 tests) and the 5 real-CLI relations-e2e pass.
… for in the relations and read-gates code `oxlint --fix` with only this rule on, over the files Tencent#1636, Tencent#1637 and
…unchecked casts From Tencent#1636 and Tencent#1637: - a code page's `source:` field is parsed with a schema (one path or a list, other entries name nothing) instead of typeof; - readdirSync with an encoding returns string[], and Map iterators already type `.next().value`, so their casts go; - the run line leaves `related` undefined, which the JSONL writer drops, instead of spreading an empty object; - the health view's partial LocalConfig carries a SAFETY note naming the fields its readers use. Proof: tsc and npm run lint pass; the recall, asset-relations and viz tests pass.
… for in the relations and read-gates code `oxlint --fix` with only this rule on, over the files Tencent#1636, Tencent#1637 and
…unchecked casts From Tencent#1636 and Tencent#1637: - a code page's `source:` field is parsed with a schema (one path or a list, other entries name nothing) instead of typeof; - readdirSync with an encoding returns string[], and Map iterators already type `.next().value`, so their casts go; - the run line leaves `related` undefined, which the JSONL writer drops, instead of spreading an empty object; - the health view's partial LocalConfig carries a SAFETY note naming the fields its readers use. Proof: tsc and npm run lint pass; the recall, asset-relations and viz tests pass.
Implements all three parts of #1562: the team sees the relations as a whole, and whether sessions use them.
1.
codebase --lintcounts relationsLint reads the member's own recall indexes as they are (project scope plus inherited user scope, mirroring recall), never a rebuild. New
src/lint-asset-graph.tsholds one pure counter,computeLintAssetGraph, reused by part 2.relationCount: one count per relation line recall renders — each relation once per unordered asset pair, relation and via (a declaredREFERENCESthe target links back to counts twice: declared + link), links included, declared-beats-link by target, no 5-line cap. Relations to a teamwiki page count when the page exists and the codebase is not withheld — SaulMoro's re-check showed the acceptance arithmetic (4 relationson the [feat] Deepen a team's knowledge: relations across every asset, delivered to every tool, proved on the task bank #1552 example) is satisfiable only this way (ruleMAPS_TOpage +REFERENCESdoc + skill + learningSUPERSEDESdoc).unresolved: declared targets naming nothing in the team clone on disk or the learnings roots — the same predicatecontributeuses, so lint and contribute never disagree.--jsongainsassetGraph; without a teamwiki the line still prints with no new graph findings; with standalone--outputthere is noassetGraphand the output is unchanged; exit code unchanged. Help text names the counts andcommands.mdis regenerated.2. Relation counts in the knowledge-base health view
/kb-reportand/api/context(built bysrc/viz.tsfrom the same index recall uses) show the same counts next to thesilentlist, each listing the assets behind it by team-tree path, labeled with the scope they were resolved for, plus the silent ∩ without-relation intersection ("the clearest candidate to link or to prune"). The view counts throughcomputeLintAssetGraph— one implementation, so the view and--lint --jsoncannot drift.3. Count the files a session opens from a relation
The recall run line gains, per doc, exactly the
Related:paths recall printed (related: [{ relation, direction: out|in, path }], omitted when none); stdout is byte-identical.teamai statsgains thevia relationcolumn: a run counts once when the session opens any of its recorded related paths within the adoption window — same join, window and actor rules asadopted(#884), and votes stay exactly as defined there (opening a related path changes no vote, neither the hit's nor the related asset's). A pre-change log reads as before (via relation0);--dry-runrecords nothing.Testing
npx tsc --noEmit,npm run lint,npm run buildclean.lint-asset-graph(14), viz relation counts incl. exact acceptance example and XSS escaping (7+),relatedRefsOf, 5 new acceptance tests inrecall-attribution(run-line shape, once-per-run counting, votes untouched, outside-window 0, old-log compatibility);commands-referenceregenerated.viz dashboard-ui lint-asset-graph asset-relations relation-candidates recall-attribution codebase-reconcile commands-reference stats recall-adoption recall-log(271 + 43 tests) and the real-CLIrelations-e2e(5 tests).assetGraphJSON, no-teamwiki and--outputbehaviors. Part 3 verified against the built CLI: run JSONL carriesrelated,statsshowsvia relationflip 0→1 on an evidence read withadoptedand all vote counts unchanged.Refs #1562 (closes it once merged).
Review updates (SaulMoro re-checks): via-relation ambiguity pool keeps counted runs (skip on add only); the counting rule is stated in code and locked by a test;
graphHealthisnull("not checked") whengraph-index.jsonis missing or corrupt instead of reading as a measured 0% — in every mode, standalone--outputincluded, and the type documents that scripts must handlenull. The one new not-checked CLI line is English per AGENTS.md.Rebased onto #1636's
collectCodePagespool (head135ee25f); the stacking note above is historical. If #1636 squash-merges first, one final--onto origin/mainrebase drops its commits from this diff.