Design ignore-surface propagation (.graphifyignore etc.) #44
Labels
No Label
P0
P1
P2
P3
afk-ready
hitl
next
ready-for-agent
review
semi
waiting
wayfinder:grilling
wayfinder:map
wayfinder:research
wayfinder:task
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: jared/cc-os#44
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
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?
Map: #31
Blocked by #40
Question
When a rule marks files temporary/delete-once-served, should it also propagate to .graphifyignore (keeping them out of the session-start knowledge graph) and the scanner's own skip lists? Define which ignore surfaces, and whether propagation is automatic or an op in the clean report.
CONSTRAINT from #43 (Decide deletion confirm-gates and temporary-tier durations): the ignore surface is an explicit list, NOT an inference from .gitignore. #43 established that gitignored != deletable (graphify-out/** is a tool working store: expensive/slow to rebuild, must never be walked or touched by hygiene) and gitignored != keepable (autoresearch//** raw rounds ARE delete targets once extracted). The #41 inventory's proposal to treat graphify-out/ and .dochygiene/ as 'temporary' is rejected. #43 also fixes an IGNORE posture distinct from lifetime: 'keep' — IGNORE means never walked (directory-rule walk-pruning per #40 implements it), 'keep' means walked and reported but never deleted. graphify-out/** and .dochygiene/** are the seed members of IGNORE.
RESOLUTION: No ignore-surface propagation. os-doc-hygiene stays in its own lane — separation of concerns.
Decision: A lifecycle rule never writes into any other tool's ignore/config surface. The
propagate_ignorefield is dropped from the rulebook schema (it was reserved in #40 pending this ticket; the slot is now removed, not left empty).Two surfaces were considered and both rejected, for different reasons:
The scanner's own skip list (
.dochygiene-ignore) — moot, not rejected on principle. #40 already made the rulebook itself the scanner's skip instruction: a directory-rule match prunes the walk and files beneath are never opened. Propagating into.dochygiene-ignorewould have os-doc-hygiene writing a file to tell itself a fact it already holds, in a weaker dialect (.dochygiene-ignoreis fnmatch —scripts/scanner.py:191-212; the rulebook isglob.translategitignore-style). Two sources of truth for one fact, with no precedence rule to break a disagreement..dochygiene-ignoretherefore remains a hand-authored, human-only escape hatch, unmanaged by the rulebook..graphifyignore— rejected on ownership..graphifyignoreis real (verified in installedgraphifyy0.8.31,graphify/detect.py:682-717; true gitignore dialect, per-directory, falls back to.gitignorewhere absent). But ADR-017 already assigns ownership of.graphifyignoretoos-vault:onboard-project. Having os-doc-hygiene also append to it creates a cross-plugin ownership seam over a file with two writers and no arbiter. The payoff was thin anyway:delete-once-servedfiles get deleted, so they leave the knowledge graph at the next rebuild without any propagation. Propagation would only have helped the narrowtemporary-but-not-yet-served window.memsearch is not a propagation target (fact, not judgement): it indexes its own
~/.memsearch/memory/daily files, not project docs. It has no ignore-file surface for a 'this project doc is disposable' fact to reach. The only "ignore"/"skip" tokens in its runner are a Pythonerrors="ignore"and a--skip-git-repo-checkflag.Consequences:
glob.translatevs gitignore vs fnmatch) dissolves — no rule glob is ever translated into a foreign dialect, so there is nothing to translate.propagate_ignore. This supersedes that one field of #40's locked schema; the rest of #40 stands.os-vault:onboard-project— not to a hygiene rule reaching across the seam.jared referenced this issue2026-07-14 18:14:41 +00:00
Correction to the resolution above — provenance fix (decision unchanged, rationale strengthened).
The comment above said "ADR-017 already assigns ownership of
.graphifyignoretoos-vault:onboard-project." That overstated a second-hand summary; I had not read the ADR. Having now readdocs/adr/0017-project-graph-onboarding-assesses-the-repo-and-writes-graphifyignore-before-extracting.md, the accurate statement is:os-vault:onboard-projectis the current writer of.graphifyignore, generating it per-project (never from a static template) and confirming the proposed ignore list with the user before writing.So the real reason propagation is refused is stronger than the one I first recorded: an os-doc-hygiene rule appending to
.graphifyignoreautomatically would reinstate precisely the alternative an Accepted ADR already rejected — and would add a second writer to a file with no arbiter between them. Separation of concerns (the user's stated reason) stands on its own regardless.Unrelated discrepancy found while verifying, logged for #46's ADR set: ADR-017's Context asserts "graphify does NOT honor
.gitignore". The installedgraphifyy0.8.31 source (graphify/detect.py:707-711) shows this is no longer strictly true — graphify prefers.graphifyignorebut falls back to.gitignoreper-directory where no.graphifyignoreexists. This does not change ADR-017's decision (a per-project, human-confirmed ignore list is still the right cost lever), but the stated premise is now stale and should be noted rather than propagated as fact.