[epic] Make kdl-specs a first-class standalone specgen product #239
Labels
No labels
burndown-2026-06
sunday-sprint
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/umbra#239
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?
Product thesis
kdl-specsshould be usable and understandable as a standalone product: install one driver, author KDL policy plus committed locks, and generate a guarded CLI without owning Go source, a Makefile, Ward, or any coilyco-specific runtime.This is not a proposal to split another repository for appearances. The engine, policy grammar, code generator, and driver are already tightly coupled and belong together in cli-guard. The missing work is to turn the substantial subsystem that already exists into an explicit, installable, documented product surface.
What already exists
The implementation is much farther along than the current README/product posture suggests:
main.go, keeping consumer source policy-only.kdl-specs.Today
cmd/kdl-specsexposesgen,lock,skew,build, andrun; it prunes and commits API locks, freezes the generated Go dependency graph, materializes out of band, supports mixed HTTP/exec members, generates reference docs, and runs offline after locking.The product gap
Despite that implementation:
kdl-specs;cmd/cli-guard-hook; it does not publish or document installation of thekdl-specsdriver;install -> author -> lock -> inspect -> build -> runoutside Ward;Boundary
Standalone specgen means a first-class driver over cli-guard's policy and operation engine. It does not mean cli-guard should absorb deployment policy or become a workflow orchestrator.
Workstreams to scope into discrete child issues
1. Install and release
Choose and ship a supported installation path for
kdl-specsitself. At minimum documentgo installagainst Forgejo tags; preferably publish versioned cross-platform binaries with checksums through the existing two-stage release pipeline. The installed driver must report its version and the cli-guard ref it will freeze into generated consumers.2. Neutral quickstart and examples
Add a small vendor-neutral fixture and a canonical journey from an empty directory to a generated binary:
It must require no Ward checkout, private infrastructure, SSM parameter, or live destructive API. The example should demonstrate the source-of-truth files, generated/cache artifacts, and expected review diff.
3. Discovery and project layout
Resolve cli-guard#182. A project containing one KDL file or many files across nested directories should have an explicit, deterministic project/binary selection model rather than relying on
*.guardfile.kdlbeside one selected file. Preserve unambiguous grouping, stable cache keys, per-member locks/docs, and fail-closed duplicate/conflict handling.4. Generated artifact families
Scope cli-guard#222 as an optional product milestone: typed client/library generation for Go, Python, Node, and Rust from the same policy-reduced operation model. Do not couple the core milestone to all four languages at once. Define whether generated libraries expose only granted operations, how names are derived, and how schema/auth/policy metadata survive projection.
5. Spec gaps and extension model
Resolve cli-guard#223 and document the extension hierarchy for operations not represented by upstream OpenAPI: spec-backed operation, inline operation, fetch overlay, or guarded exec bridge. Support must remain explicit and reviewable; a declared-but-dead bridge is worse than a clear unsupported error.
6. Credentials and secret confinement
Resolve cli-guard#215 after the driver boundary is stable. Generated tools need a documented credential-provider contract that keeps secret values out of generated source, argv, logs, dry-run output, caches, and committed locks.
7. Compatibility and confidence
State compatibility promises for the KDL grammar, lock formats, cache stamps, generated docs, driver exit codes, and generated binary behavior. Add product-level fixtures that exercise upgrades, deterministic regeneration, offline builds, upstream skew, malformed policy, and actionable recovery.
8. Product documentation
Give
kdl-specsfirst-class space in README/docs navigation: what it is, who it is for, how it differs from importing cli-guard as a Go library, the security model, and the quickest path to a useful generated tool.Epic acceptance
kdl-specswithout already knowing Ward.Director commission
Audit current main against these workstreams, reconcile the existing issues named above, and file only the missing discrete children with dependencies and appropriate execution labels. Do not implement the epic as one change and do not duplicate work already landed.
Director commission attempted from the read-only surface on 2026-07-23. The issue-scoped director did not launch: Ward hit the attached-role Docker 125 tracked in coilyco-flight-deck/ward#577 (
/workspace/coilysirenwas passed as a host bind and Docker Desktop rejected it as unshared). The roadmap remains captured here; no scoping director is currently in flight.Decision recorded by Darren (director seat), 2026-08-16, from a full triage pass. Kai's call in a consult round.
The call
The standalone-product thesis stands, sequenced behind #295. Land the
specgentoumbra-shroudrename first so the product has a settled name, then decompose the eight workstreams into dependency-ordered children.Why the sequencing is the substance of the answer
This epic is written against
cmd/kdl-specs. The binary isspecgentoday and becomesumbra-shroudunder #295. That is the third name for one thing, and this epic's workstreams are mostly name-bearing surfaces: the install path, the Homebrew formula, the Scoop manifest, the quickstart, the docs navigation, and the compatibility promises all embed the binary name.Decomposing now would file eight children that each need rewriting after #295. Decomposing after means each child is authored once, against a name that is not going to move again.
What was rejected, and why
The stale premise this issue carries
Recording it so the decomposition does not inherit it. The body says the product name was consolidated as
kdl-specsin cli-guard#164 and #174. That consolidation was superseded twice over, and #295 sets out why:specis overloaded four ways acrossspec,specgen,specverb, and.specgen/, and any name keepingspeckeeps the collision. Whoever decomposes this should read #295 first and treatumbra-shroudas the product name throughout.specverb.lockstill carries a field namedcliGuardholding the umbra version, which is the same class of residue from the rename before last. #295 owns fixing it.What unblocks the decomposition
The director commission never launched: Ward hit the attached-role Docker 125 tracked in
coilyco-flight-deck/ward#577, where/workspace/coilysirenwas passed as a host bind and Docker Desktop rejected it as unshared. That blocker is unaddressed here and is not this epic's to fix. A decomposition pass can equally be run from an interactive seat.Staying
priority/P4autonomy/epicrole/director. P4 because it is deliberately parked behind #295 rather than because the direction is in doubt, andautonomy/epicbecause its children carry their own ceilings and nothing should dispatch this as one task.