Extract the reusable helper packages from ward (cli-guard-first half of ward#269) #166
Labels
No labels
burndown-2026-06
sunday-sprint
coherence-core
consult
headless
interactive
P0
P1
P2
P3
P4
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
coilyco-flight-deck/cli-guard#166
Loading…
Add table
Add a link
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?
The cli-guard-first half of ward#269's cross-repo extraction. A headless container cannot span both repos, so this lands the packages in cli-guard first, tags a release, and ward#269 becomes the follow-up that bumps the pin and deletes the ward-side copies.
Land in cli-guard (exported, importable):
pkg/scan- the junk-scan helperpkg/attribution- attributionpkg/flock- flockpkg/version- semvercli/hookregistry (hook tables) + settings-installerParseIssueRef(issue-ref)Then tag a cli-guard release so ward can pin it.
Sequencing: ward#269 waits on this landing + the release tag, then bumps the pin and removes the copies. Both sides are also gated on the headless-container dispatch fix (ward#311 / #321 / #322) - cli-guard headless dispatch is currently broken (cli-guard#79 died on it), so this likely needs a hand-run or the fix first. Origin: ward#269 blocked on the cross-repo path; path B (cli-guard-first split) chosen.
🔁 backlog-loop dispatch - this issue was auto-dispatched by the supervised backlog loop.
When you finish, your final issue comment must start with exactly one of:
WARD-OUTCOME: done- landed/merged, nothing more needed.WARD-OUTCOME: blocked - <the specific decision or information you need from a human>WARD-OUTCOME: failed - <why, briefly>Put your candid retrospective on the line(s) below it. The supervising loop reads this
line to decide whether to close you out, ask a human to unblock you, or retry. If you
are blocked, be concrete about the single thing you need - that is what gets answered.
🔒 Reserved by
ward agent --driver claude— containerward-cli-guard-issue-166-claude-722137cdon hostkais-macbook-pro-2.localis carrying this issue (reserved 2026-06-25T10:22:58Z). Concurrentward agentruns are blocked until it finishes or the reservation goes stale (2h0m0s TTL);--forceoverrides.— Claude (she/her), via
ward agentWARD-OUTCOME: done
The six helper packages plus the hook registry/installer were straightforward to lift. The friction was all in the guardrails, not the Go.
Both inventory docs (FEATURES.md, features-detail.md) sit about 4 chars under the 4000-char doc cap by design, so every line I added overflowed. I split the detail into a new docs/ward-helpers.md and tightened existing prose to fit. The code-comments rule (contiguous blocks of 2 lines max after the package doc) then made me compress most function docstrings and push the nuance into the exempt package headers and that new doc. Neither was hard, just unexpected for what looked like a pure "add packages" task.
One judgment call worth flagging: ParseIssueRef and owner-trust already live inside cli/dispatch, but coupled to the Dispatcher/Config. I built standalone pkg/issueref and pkg/ownertrust as the free-function reusable homes rather than refactor dispatch, to keep the blast radius small. That leaves a transient duplication worth a follow-up (have dispatch delegate to these once the ward half of #269 lands).
Confidence is high on the helpers themselves. Every package ships tests and the full lint/vet/godoc/pre-commit suite is green. The only red tests in the tree are the pre-existing cli/sandbox seccomp/ptrace ones, which are environmental (no kernel caps in this container), not mine. The actual ward-side dedup, deleting ward's copies and importing these, is still pending its own run, since one headless container can't span both repos.