* test(graphify): TDD-red design contract for #3170 commit-staleness signal Captures the proposed extension to graphifyStatus() as 8 failing assertions across 3 groups (git-aware, non-git, back-compat). Suite is describe.skip()'d so npm test stays green on the branch — removing .skip is the green-light moment when the enhancement is approved and implementation lands. Verified against safishamsi/graphify v0.7.0 release notes: the field on graph.json is built_at_commit (full git HEAD), not commit_hash as originally guessed in #3170. Tests assert against the verified name. Design highlights captured in the file's docstring: - Tri-state commit_stale (true/false/null) — null means "we don't know" (pre-v0.7 graph or no git), distinct from false ("known fresh") - Argument-injection fence /^[0-9a-f]{4,40}$/i validates built_at_commit before it reaches `git` as an argv element - Existing graphifyStatus() fields (node_count, edge_count, stale, age_hours, etc.) are unchanged — back-compat fenced Per the issue's enhancement template: no PR will be opened until the issue is labeled `approved-enhancement`. Refs #3170 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * feat(graphify): surface commit-based staleness from graphify v0.7+ built_at_commit Closes #3170 graphify v0.7+ embeds built_at_commit (full git HEAD) into graph.json at write time. GSD's existing graphifyStatus() ignored it; staleness was mtime-only, which is a poor proxy for "does this graph reflect the current code." A CI-built graph rebuilt minutes ago against an old checkout reads as FRESH on mtime but is materially stale. graphifyStatus() now returns four additional fields on the success path: built_at_commit short hash from graph.built_at_commit, or null current_commit short hash of git HEAD, or null when no git commits_behind git rev-list --count <built>..HEAD, or null commit_stale true | false | null Tri-state on commit_stale is load-bearing. null means "we don't know" (pre-v0.7 graph, non-git cwd, unreachable commit) — semantically distinct from false ("known fresh"). Agents reading null should fall back to mtime; reading false can confidently skip a rebuild. Security: built_at_commit is on-disk and user-influenceable. Without validation, a hostile value (e.g. "--upload-pack=evil") would reach git as an argv element and be interpreted as an option. The /^[0-9a-f]{4,40}$/i fence rejects anything else as absent. spawnSync's array args (no shell) is defense in depth, not the boundary. Skill (commands/gsd/graphify.md) Step 2b renders one conditional line: Source commit: abc1234 (5 commits behind HEAD) Source commit: abc1234 (current) Source commit: abc1234 (freshness unknown) Pre-v0.7 graphs omit the line entirely — no confusing "Source commit: unknown" rendered. Also documents `graphify hook install` in docs/CONFIGURATION.md for multi-dev teams who would otherwise hit graph.json merge conflicts on parallel rebuilds (sub-enhancement 2 from #3170). TDD red→green: tests/enh-3170-graphify-commit-staleness.test.cjs (8 assertions across git-aware, non-git, back-compat) was committed describe.skip()'d in c567f23d when the issue was filed; this commit removes .skip and lands the implementation that makes them green. Full suite 7503/7503 passes. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -362,6 +362,38 @@ Toggle optional capabilities via the `features.*` config namespace. Feature flag
|
||||
| `graphify.enabled` | boolean | `false` | Enable the project knowledge graph. When `true`, `/gsd-graphify` builds and queries a graph in `.planning/graphs/`. Added in v1.36 |
|
||||
| `graphify.build_timeout` | number (seconds) | `300` | Maximum seconds allowed for a `/gsd-graphify build` run before it aborts. Added in v1.36 |
|
||||
|
||||
#### Multi-developer setup
|
||||
|
||||
If multiple developers will rebuild the graph in the same repo, run once per
|
||||
clone after enabling graphify:
|
||||
|
||||
```bash
|
||||
graphify hook install
|
||||
```
|
||||
|
||||
This installs a git merge driver that union-merges concurrent `graph.json`
|
||||
writes (no conflict markers in the knowledge graph), plus the post-commit
|
||||
rebuild hook. It writes `.gitattributes` and registers `graphify
|
||||
merge-driver` in `.git/config`. Solo projects can skip this step; running it
|
||||
anyway is harmless. Introduced upstream in graphify v0.7.0 alongside the
|
||||
`built_at_commit` freshness signal that `/gsd-graphify status` surfaces.
|
||||
|
||||
#### Commit-based staleness
|
||||
|
||||
`/gsd-graphify status` reports two orthogonal staleness signals:
|
||||
|
||||
- **`stale`** (mtime-based, 24-hour window) — when the graph file was last
|
||||
written. Useful when graphify isn't run automatically.
|
||||
- **`commit_stale`** (commit-based, requires graphify v0.7+) — whether the
|
||||
graph was built against the current `git HEAD`. Trustworthy when present.
|
||||
Tri-state: `true` / `false` / `null`. `null` means the signal is
|
||||
unavailable (pre-v0.7 graph, no git, or unreachable commit) — fall back
|
||||
to the mtime flag.
|
||||
|
||||
A CI-built graph rebuilt minutes ago against an old checkout will read as
|
||||
fresh on mtime but `commit_stale: true`. Surface both when answering
|
||||
architecture questions.
|
||||
|
||||
### Usage
|
||||
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user