Find why extensionless scripts and one vault note are missing from the graphs #1566
Labels
No labels
P0
P1
P2
P3
bug
category/code-change
category/cross-repo
category/eval-run
category/investigation
category/no-test-target
category/owner-ruling
category/prose-artifact
category/recurring-chore
category/structure
category/umbrella
crc-refactor
create
delete
enhancement
filed-by/agent
filed-by/user
frozen
lint-rule
needs-info
needs-triage
next
plugin/cc-architect
plugin/os
plugin/os-adr
plugin/os-aidd-lint
plugin/os-backlog
plugin/os-context
plugin/os-doc-hygiene
plugin/os-sdlc
plugin/os-vault
project/cc-os
ready-for-agent
ready-for-human
recurring
review
rule-proposal
update
waiting
wayfinder:grilling
wayfinder:map
wayfinder:map
wayfinder:research
wayfinder:task
wayfinder:task
wontfix
worklist/deviations
worklist/lint-rule
worklist/new-implement-build
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
jared/cc-os#1566
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
Two inputs are missing from graphs that should hold them. The cause is unknown for both.
bin/have no node. Onlyplugins/os/bin/handoffhas one. Three of them are in the rootbin/:arch-metrics,refresh-plugins,bin/test. All start with#!/usr/bin/env ruby.reference/gitignore-trailing-slash-does-not-match-symlinks.mdhas no node. It is not inmanifest.jsonor the log, and it is not git-ignored.The missing
bin/refresh-pluginsnode makes question 10 of the 10-question set unanswerable.Evidence: /tmp/claude-1000/-home-jared-Documents-SecondBrain/b10276a0-3582-48b5-b0fe-f13795bdcc75/scratchpad/graphify-diagnosis-evidence.md and /tmp/claude-1000/-home-jared-Documents-SecondBrain/b10276a0-3582-48b5-b0fe-f13795bdcc75/scratchpad/vault-graph-weak-retrieval-evidence.md (copied below; do not depend on the paths).
Observed
detect.py:530-553classifies extensionless files by shebang, yet 1 of 102 is in the graph (graphify 0.9.102)..mdfiles, 1,796 of 1,796.rb, 6 of 6.js, 25 of 25.py.Reproduce
Then search
graphify-out/graph.jsonforsource_fileequal tobin/refresh-plugins. It has no match.Approach
Investigate first. Find where each file drops out: detect, the ignore rules, the manifest, or extraction. Then correct the cause, and rebuild both graphs. Do not add a workaround for one file.
Required work:
Orchestrator work: rebuild each graph and count the nodes.
Acceptance criteria
bin/refresh-pluginshas a node.reference/gitignore-trailing-slash-does-not-match-symlinks.mdhas a node.Non-goals
Upstream reports go on the graphify defects ticket. Open ticket #1557 asks whether the vault note was skipped as hollow or under --allow-partial. It may resolve the vault half; check it first.
Origin
bin/refresh-pluginshas no node ← cause unknown, stop. The cause is not determined, so the chain ends at IMPROVISATION (none applied; the cause is open).Start (code half): tracing why 101 of 102 extensionless scripts have no node. Vault-note half is left open for another agent.
Code half result (vault note half still open, not checked here).
Cause: not our config and not detect. Graphify state (graphify 0.9.102).
classify_file(bin/refresh-plugins)is CODE via shebangruby(detect.py:530-553 works).extract()on the same 101 files gives 562 nodes across 102 source files (bin/refresh-plugins: 11 nodes)._get_extractormaps ruby shebangs to extract_ruby (extract.py:9598, 9733-9741).graphify-out/manifest.jsonhas a row with anast_hashfor all 101 scripts (allseen2026-11-04 10:52:51) but no node in graph.json. Onlyplugins/os/bin/handoffwas edited later (mtime 11:55), so only it was re-extracted.graphify update(cli.py:3089 -> watch.py_rebuild_code, incremental, watch.py:2419-2442) takes the change set from manifestast_hash, so it skips the 101 files for good.graphify update .re-extracted 1 of 3838 files, 0 of the scripts gained a node.graphify update . --forcegave 101 of 101 scripts with nodes,bin/refresh-pluginsincluded (36,233 nodes, up from 29,922 in that same worktree copy).ast_hashrows even when the graph has no node for that source.Config change: none.
.graphifyignoredoes not exclude these files. The repair is a one-timegraphify update . --forceon the live graph (graphify-out/ is gitignored, so no commit). I have not run it on the live graph. #1565 will rebuild it with --force anyway.Acceptance 1 and 2 hold on the forced rebuild (101 of 101). Not closing: the vault half (criterion 3) is open.
Vault note result, session b10276a0. After
graphify update --forceon the live vault, reference/gitignore-trailing-slash-does-not-match-symlinks.md has 5 nodes, and test question Q6 now ranks it first. The original skip cause is still not known. The same pass will not run on a scheduled rebuild until the #1545 step merges.Resolution
Done: Code half: 101 scripts lacked nodes although manifest.json held ast_hash rows, so incremental update skipped them. update --force repaired all 101 on the live cc-os graph. Vault half: the gitignore note had a manifest row and no node, and update --force gave it 5 nodes.
Evidence: classify_file returns CODE for bin/refresh-plugins. Live graph: bin/refresh-plugins has 11 nodes. Vault Q6 ranks the note first. Copy test: plain update added 0 script nodes, update --force added 101. How the rows became stale is not proved, and the issue did not reproduce through a normal update.
Follow-ups: none: a forced update is the repair, and #1545 carries the rebuild step