docs(spec-loop): add spec-gap staleness verification spec#926
Open
justinmclean wants to merge 1 commit into
Open
docs(spec-loop): add spec-gap staleness verification spec#926justinmclean wants to merge 1 commit into
justinmclean wants to merge 1 commit into
Conversation
Generated-by: Claude (claude-opus-5)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds
tools/spec-loop/specs/spec-gap-staleness.md, aproposedspec forstopping a
## Known gapsbullet from outliving the gap it describes.Spec-only. Nothing is implemented by this PR.
Why now
Nine Known-gap bullets across eight specs currently describe capabilities
that have already shipped. Examples verified against
main:adapters.mdsays adapter authoring smoke validation is missing;validate_adapter_authoringis called at__init__.py:3710.privacy-llm-gate.mdsays branch-name confidentiality validation ismissing;
validate_branch_name_confidentialityis called twice.issue-management-family.mdandreviewer-routing.mdboth say thereviewer-routingrow is missing fromdocs/modes.md; it is atdocs/modes.md:85.release-management-lifecycle.mdsays the audit record schema isprose-only;
skills/release-audit-report/audit-record-schema.mdexists.This matters beyond tidiness: the plan beat reads Known gaps to select
work, so a stale bullet sends the loop at finished work. There is also a
straight contradiction between
triage-mode.md(repo-health is "afive-skill family") and
repo-health-family.md("six skills deep").What the spec proposes
may only become a work item if the beat cites a call site, current
file content, or a counted value. The presence of a name is
explicitly not admissible, since a function defined but never called
satisfies a name match while the gap stays open.
gap-closes-when:predicates on gap bullets, with athree-verb vocabulary (
symbol-called,path-exists,skill-count) that covers all nine observed cases. A satisfied ormalformed predicate is HARD; an unannotated bullet is SOFT, so
nothing breaks on the day this lands.
validate_cross_spec_counts, HARD. Counted claims checkedagainst live
family:frontmatter, with cross-spec disagreement aviolation regardless of which side is right.
Bullets whose gap is inherently narrative declare
gap-closes-when: none (narrative). That is the correct annotation forthe eleven "experimental, no adopter pilot has run" bullets, whose truth
depends on facts outside the repository and which should never be
machine-checked.
Reviewer questions
validate_cross_spec_countsis proposed HARD and the unannotated-bulletadvisory SOFT. SOFT is what allowed nine bullets to accumulate, so
there is a case for making it HARD, at the cost of a blocking backfill
across all 25 specs.
Generated-by: Claude (claude-opus-5)
Type of change
.claude/skills/<name>/) — eval fixtures updated belowtools/<system>/*.md)tools/*/withpyproject.toml)docs/,README.md,CONTRIBUTING.md)projects/_template/)prek, workflows, validators)Test plan
prek run --all-filespassesuv run pytest/ruff check/mypypasses(
PYTHONPATH=tools/skill-evals/src python3 -m skill_evals.runner tools/skill-evals/evals/<skill>/)(a regression test for the bug fixed / the behaviour added — see CONTRIBUTING.md)