Tier 1: engine readiness for trove adoption#17
Merged
Conversation
…s, nested scenarios) - Add the `protocol` contract kind (protocol.<producer>.<op>, dir specs/protocol/); clears the 17 "unknown kind" I2s on trove's wire contracts. No scenarios required. - I1 accepts both the id-tail stem (engine.scan.md) and the full dotted id stem (story.engine.scan.md) — clears trove's 29 I1s; backward-compatible. - parseScenarios reads a Scenario heading at any level, so a nested `### Scenario N:` under `## Acceptance Criteria` (trove's form) yields its sub-id — without this the scenarios parse empty and every binding dangles.
…ngs, scoped mode) - reports: add the `gotest` format parsing `go test -json` (top-level funcs; subtests rolled into their parent; skips omitted; join identity = the func name). - engine: walk .go sources, and read the language-agnostic leading `// [scenario.id]` comment form (binds to the next `func Test…` in Go or `it/test(…)` title in JS/TS) — the form trove uses across 156 Go + 12 TS tags (the in-title/Swift forms still work). - engine/config: a per-target `bindings` mode — `strict` (default, every test must bind a scenario) or `scoped` (untagged tests are out of scope), so a partially-bound real suite verifies what it does bind. Dangling + failing bound tests stay violations in both. - config: validate the gotest format + the bindings mode; cli threads bindings through.
CONVENTIONS gains the protocol row + notes both filename conventions and any-level scenario headings; docs/config.md documents format gotest + the bindings mode; README softens 'every untagged test is a hard error' to the strict/scoped distinction. BACKLOG records the Tier-1 trove-adoption milestone.
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.
Makes the SpecKit engine able to
scan+verifytrove — the first real Workbench-shaped repo to convert. Holding for your review (not merged).Validated end-to-end against
~/Developer/Projects/trove:scanwent from 46 findings → clean, and a liveverify(realgo test) joins trove's Go bindings — 4 scenarios passed, 0 dangling, 0 unbound, 2 honestly unjoinable (cross-target). trove's tree left pristine.What changed
specmodel— accept trove's spec shapeprotocolkind — a contract kind (protocol.<producer>.<op>, dirspecs/protocol/, no scenarios). Cleared trove's 17I2s.engine.scan.md) and the full-id stem (story.engine.scan.md). Cleared trove's 29I1s; backward-compatible (SpecKit's own specs unchanged).parseScenariosnow reads### Scenario N:under## Acceptance Criteria, not just top-level## Scenario. (An audit miss — without this, trove's scenarios parsed empty and every binding dangled.)engine+reports— verify trove's Go suitegotestformat — parsesgo test -json(top-level funcs; subtests rolled up; skips omitted).// [scenario.id]binding reader —.goadded to the source walk; binds the tag to the nextfunc Test…(Go) orit/test(…)title (TS). This is the form trove uses across 156 Go + 12 TS tags (the in-title Vitest + Swift-trait forms still work).bindings: scopedmode (see decision below).bindingsmodeA blocker the audit didn't surface: trove's Go suite is deliberately partly-bound (it has plain unit tests like
TestOutputPathwith no scenario tag). SpecKit's documented philosophy is "any untagged test is a hard error" (unbound = D12 failure, blocks all locking) — so verify would lock nothing on trove.I added an opt-in, per-target
bindingsmode:strict(default, unchanged) — every test must bind a scenario. The scaffold + SpecKit's own repo are untouched.scoped— untagged tests are out of scope, so a mixed suite verifies what it does bind. Dangling bindings + failing bound tests remain violations in both modes.This softens a documented philosophy, but only when a target opts in. Confirm the name/shape (or reject in favor of "trove must fully-bind its suite").
Also note
x-spec/ OpenAPI protocol-coverage reader is deferred (protocol specs scan clean + drift-track as contract-only for now; covering them needs the OpenAPI reader — a separate milestone)..speckit/specs.jsonthat worked (ago-service/gotest/scopedtarget) is indocs/config.mdas the example.Tests
New coverage for every change (protocol kind/prefix, both filename conventions, nested-scenario parsing, the Go + TS leading-comment readers, the gotest parser, the scoped-vs-strict integration, and config validation).
mise run cigreen; init goldens unaffected.Deferred Tier-1 follow-ups (next milestone)
protocol
x-speccoverage reader · aninit-into-existing path that authors.speckit/specs.json· thego-servicestack pack/scaffold.