feat(cli): add /combo to distil a thread into a skill draft - #243
Merged
Conversation
The skill system was already complete — loader, frontmatter schema, three source layers, overrides. What was missing was the generating end: every SKILL.md had to be hand-written up front, before anyone knew what the work would involve. Floatboat's insight is that automation should be extracted after the work, not configured before it. The moment someone finishes a task is the moment they understand it best. The security angle Floatboat does not advertise: deriving `allowed-tools` from what the thread actually called yields least privilege for free. Hand-written skills are almost always broader than needed, because guessing generously is easier than auditing. `/combo` previews and writes nothing; `--write` commits. A skill assembled from a transcript is a shareable artifact, so it gets read before it exists on disk. Writing one lands on the governance timeline — creating a skill changes what future runs may do. Two filters on the way out. Credential-shaped values become [REDACTED], and paths the file contract denies reading are dropped entirely: a rule that stops at the tool call but not at the export is not much of a rule, since the filename alone leaks. Both report what was withheld rather than leaving the user to guess. Distillation is pure and offline. Model prose is optional; without it the deterministic body is a real draft rather than a placeholder, because the step sequence and touched files are exactly recoverable and are what a reader needs. Explicitly not built: Floatboat's Tacit Engine passively observes files, browser tabs and system apps to model habits. /combo reads the current thread, only when typed, and never aggregates across threads. The useful half of the idea needs no passive collection. Skill names are sanitized to a single path segment — the name becomes a directory under .deepcode/skills/, so `../escape` must not survive. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
9 tasks
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
PR 6 of
docs/FLOATBOAT_ADOPTION_PLAN.md§2.D — the plan's highest-value-per-line item, because the hard part already existed.The skill system was already complete: loader, frontmatter schema, three source layers, overrides. What was missing was the generating end — every
SKILL.mdhad to be hand-written up front, before anyone knew what the work would involve. Floatboat's insight is that automation should be extracted after the work; the moment you finish a task is the moment you understand it best.allowed-toolsis derived, not guessedThe draft lists exactly the tools the thread actually called.
This is the security angle Floatboat doesn't advertise. Hand-written skills are almost always broader than needed — a skill that only reads files ends up with
Bash"just in case", because guessing generously is easier than auditing. Deriving from a real run gives least privilege for free.Nothing is written until you've seen it
/combopreviews and writes nothing;--writecommits. A skill assembled from a transcript is a shareable artifact, so it gets read before it exists on disk.--writerefuses to overwrite an existing skill.Writing one is recorded on the governance timeline — creating a skill changes what future runs may do, which isn't an ordinary file edit.
Two filters on the way out
[REDACTED]password:-style assignmentsBoth report what was withheld (
withheld: redacted API key) rather than leaving the user to guess.Explicitly not built
Floatboat's Combo sits on a "Tacit Engine" that passively observes files, browser tabs, and system apps to model habits.
/comboreads the current thread, only when you type it, and never aggregates across threads or runs in the background. The useful half of the idea needs no passive collection — which is the positiondocs/research/floatboat.md§7.2 took, now backed by the implementation.Per the plan's open question, distillation is pure and offline. Model prose is optional; without it the deterministic body is a real draft, not a placeholder — the step sequence and touched files are exactly recoverable and are what a reader most needs.
Test plan
pnpm test— 1385 passed, 16 skipped (+28: 937 core, 237 cli)pnpm typecheck·pnpm lint·pnpm format:check·pnpm build·node scripts/check-docs.mjsallowed-toolsfrom actual calls; deduped;Bashabsent when unusedparseFrontmatter, not a regex — a draft the loader rejects is worthless.envdropped from paths and from the body; exclusion reported../../etc/passwd→etc-passwd; no separator or..survives, since the name becomes a directory--writewrites and logs governance; refuses overwrite; empty threadDocumentation
docs/combo.md— why after-not-before, the derivedallowed-toolsargument, the preview/write split, both filters, and an explicit section on what this deliberately is notRelease notes label
release-notes:featureRelated
Plan §2.D (PR 6). Research:
docs/research/floatboat.md§3.1(b) and §7.2.🤖 Generated with Claude Code