feat: passthrough dialect (cli-guard) → ward ssh + tailscale ssh #158
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#158
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?
feat: passthrough dialect (cli-guard) → ward ssh + tailscale ssh
Guard
ssh(andtailscale ssh) as a default-allow passthrough so agents on workstations get fast, gated ssh egress. Two repos; cli-guard is the prerequisite.Part 1 — cli-guard engine (DONE, ready to merge)
Implemented and pushed on branch
feat/passthrough-ssh-dialect(1 commit off main, all hooks/tests/lint/godoc green):https://forgejo.coilysiren.me/coilyco-flight-deck/cli-guard/compare/main...feat/passthrough-ssh-dialect
passthrough <bin> [prefix...]— sugar forexec <bin>+ an implicitcan run "*"funnel (first arg = binary, rest = fixed leading argv). Mutually exclusive withexec/can run.never pass <token...>/never pass when <sel> is <glob...>/only pass when <sel> is <glob...>— wrap-level guards enforced on every leaf.shell <cmd>selector source — trimmed stdout of a command exec'd directly (no shell interpretation) once at invocation; resolver error fails closed. The host gate.docs/passthrough.md;docs/execverb.md+docs/FEATURES.mdupdated; tests incli/execverb/execverb_test.go.Task: open a PR from that branch to
main, confirm CI green, merge (auto minor release, e.g. v0.45.0).Part 2 — ward rollout (release-gated; do after Part 1 releases)
In
coilyco-flight-deck/ward, once the new cli-guard tag exists:MakefileREFfromv0.44.0to the new tag.cmd/ward-kdl/ward-kdl.ssh.guardfile.kdl:cmd/ward-kdl/ward-kdl.tailscale-ssh.guardfile.kdl(same body, binarytailscalewithsshprefix):cmd/ward-kdl/ward-kdl.tailscale.guardfile.kdl, change the wrap pathwrap ward-kdl ops tailscale {→wrap ward-kdl tailscale api {(so tailscale groups under its own name:api= guarded HTTP,ssh= passthrough). No external callers ofops tailscaleexist (only the guardfile + its generated doc).make build-ward-kdl(driver discovers the new guardfiles + regenerates the.guardfile.mddocs underdocs/; relocate per the Makefile). Update the tailscale.guardfile.mdheading fromops tailscaletotailscale api.pre-commit run --all-files, land.Host-gate notes (confirmed)
hostname(notekais-macbook-pro-2.localcarries.local, so*macbook*notmac*). Admits mac/laptop/windows/tower; denieskai-server,ser8, and k8s/service nodes (fail closed).never pass rmis a speed-bump, not a boundary (ssh runs opaque remote strings). The host gate is the real boundary. Full rationale indocs/passthrough.md.🔒 Reserved by
ward agent claude— containerward-cli-guard-issue-158-claude-2f02881bon hostkais-macbook-pro-2.localis carrying this issue (reserved 2026-06-19T07:11:39Z). Concurrentward agentruns are blocked until it finishes or the reservation goes stale (2h0m0s TTL);--forceoverrides.— Claude (she/her), via
ward agent🔒 Reserved by
ward agent --driver claude— containerward-cli-guard-issue-158-claude-48be8e0con hostkais-macbook-pro-2.localis carrying this issue (reserved 2026-06-24T06:43:59Z). Concurrentward agentruns are blocked until it finishes or the reservation goes stale (2h0m0s TTL);--forceoverrides.— Claude (she/her), via
ward agent🔒 Reserved by
ward agent --driver claude— containerward-cli-guard-issue-158-claude-8b900595on hostkais-macbook-pro-2.localis carrying this issue (reserved 2026-06-24T08:36:14Z). Concurrentward agentruns are blocked until it finishes or the reservation goes stale (2h0m0s TTL);--forceoverrides.— Claude (she/her), via
ward agentPart 1 (cli-guard engine) landed on
mainas merge778fbd1— thepassthrough <bin>dialect plus the wrap-level host-gate guards (never pass/only pass/shell <cmd>selector). The push auto-cuts the minor release (the new tag ward bumps to).This merge reconciled the branch against the
allowinspect-list sugar that landed on main in parallel (4b09142): the merged Guardfile carries both wrap-level guard sets,wildcardLeafthreads theHostResolverthrough the shared funnel path, andParse/applyNodewere factored into helpers to hold gocyclo under the repo's complexity-12 ceiling. Verified green: build, vet, golangci-lint (cli/execverb: 0 issues), godoc pinned, full unit suite (thecli/sandboxseccomp/ptrace tests need kernel caps absent in the build container and fail identically on clean main).Part 2 (ward rollout) is not in this change — it lives in
coilyco-flight-deck/ward, is release-gated on the tag this push produces, and is tracked by the Part 2 checklist in the issue body. Closing #158 on the Part 1 deliverable per the task; the ward-side rollout proceeds as its own work once the tag is published.