Skip to content

✨ voice: draft a spec from a Plaud/Wispr/file/stdin voice note and publish it as an RFC for a hive - #123

Closed
clubanderson wants to merge 2 commits into
mainfrom
feat/spec-from-voice-note
Closed

clubanderson wants to merge 2 commits into
mainfrom
feat/spec-from-voice-note

Conversation

@clubanderson

@clubanderson clubanderson commented Nov 12, 2026 •

Copy link
Copy Markdown
Member

Adds spektacular voice --from <plaud|wisprflow|file|stdin> [--latest|--title X|--path P] [--publish --repo owner/repo]: fetches one voice note (Plaud via its free MCP server over stdio, Wispr Flow local history, a transcript file, or text on stdin), drafts it onto the spec scaffold, and either starts the seeded spec interview or, with --publish, writes the spec final and files it through publish as an RFC + one child issue per requirement, printing the URLs.
Also serves a non-interactive agent in a hive pod seeded from a transcript on stdin/file (no Plaud MCP in the agent); the spek-new skill now says how to finish from pasted transcript text without asking.
Tests: fake MCP over pipes (no sleeps), fake GitHub for the publish chain, template wording pins. README: "Voice → spec → hive" quickstart.
Closes #122.

The spek-new skill already starts a spec from existing material fetched
with the agent's own tools, so a voice recorder's MCP server (Plaud's
@plaud-ai/mcp, free) is a source like any other. This names it: the
skill recognises "my latest Plaud recording" / "the note titled …",
fetches both the AI summary and the transcript, records
plaud://recordings/<id> (or the exported file) as provenance, and the
seeded interview maps the summary onto sections, action items onto
acceptance criteria, and keeps the transcript's exact phrasing in the
working context, treating tentative remarks as gaps to ask about.

No CLI change: the design (epics-and-seeded-specs) keeps fetching on the
agent side, so no Plaud client lands in the binary.

Signed-off-by: Andrew Anderson <andy@clubanderson.com>
@clubanderson

Copy link
Copy Markdown
Member Author

/approve
/lgtm

@kubestellar-prow

Copy link
Copy Markdown

@clubanderson: you cannot LGTM your own PR.

Details

In response to this:

/approve
/lgtm

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

…a hive

Adds `spektacular voice --from <plaud|wisprflow|file|stdin>` with a small
Source interface: plaud reads one recording (note + transcript) through
Plaud's MCP server over stdio, wisprflow reads Wispr Flow's local history,
file reads .md/.txt/.srt/.vtt transcripts, stdin takes pasted or piped text.
The note is drafted onto the spec scaffold; without --publish the spec
workflow starts seeded with the staged material (new "material" data key the
interview reads instead of fetching), with --publish a spec-shaped note is
written final and filed through publish as an RFC with a child per
requirement. The spek-new skill gains the shortcut and non-interactive
guidance for a transcript handed over as text.

Signed-off-by: Andrew Anderson <andy@clubanderson.com>
@clubanderson clubanderson changed the title ✨ spec: start a spec from a Plaud voice note ✨ voice: draft a spec from a Plaud/Wispr/file/stdin voice note and publish it as an RFC for a hive Nov 12, 2026
@clubanderson

Copy link
Copy Markdown
Member Author

/approve
/lgtm

@kubestellar-prow

Copy link
Copy Markdown

@clubanderson: you cannot LGTM your own PR.

Details

In response to this:

/approve
/lgtm

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@kubestellar-prow kubestellar-prow Bot removed the size/M label Nov 12, 2026
@kubestellar-prow

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: clubanderson
Once this PR has been reviewed and has the lgtm label, please assign nicholasjackson for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@hivecommons-hive hivecommons-hive Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please narrow this to #122’s stated scope before landing; there is also a filesystem write defect.

  • Medium — validate names before staging (cmd/voice.go:125–127). The non-publish path joins the raw --name into the material directory and calls writeVoiceMaterial before runSpecNew validates it. For example, --name ../../../victim resolves the staging directory to <project>/victim; writeVoiceMaterial (cmd/voice.go:279) overwrites existing note.md, transcript.md, and draft.md there. Only afterward does identifier.NormalizePart reject the separators. Validate the name before any staging write and keep the destination inside the staging directory.
  • Medium — the CLI/MCP implementation contradicts the linked issue (cmd/voice.go:26, internal/voice/plaud.go:14). Per #122, this is explicitly a wording-only change, with no CLI MCP client because fetching belongs to the driving agent. This adds that client plus a publish path and vendor integrations. The template edits address the requested workflow; the additional implementation should be removed from this PR or separately scoped.

@nicholasjackson, please review the trust implications if the CLI addition is retained: its default executes npx -y @plaud-ai/mcp@latest (internal/voice/plaud.go:14), and the child inherits the full environment (internal/voice/mcp.go:233), including any available publisher credentials.

Reviewed the changed code, identifier validation, spec-start callers, publisher, tests, PR body and #122 (no comments). Existing build-and-test checks passed. Local test execution was blocked by the reviewer wrapper; registry lookup also failed on an unavailable sibling checkout.

— hive: agent=reviewer backend=codex model=gpt-6.1-sol codex=0.167.0

@clubanderson

Copy link
Copy Markdown
Member Author

Closing in favour of #124, which carves out just the part #122 asked for: the wording-only change to the spek-new skill and the seeded interview step (the first commit of this PR, unchanged).

Not carried over, and why:

  • The in-binary Plaud MCP client and Wispr Flow reader: ✨ spec: start a spec from a voice recording (Plaud / any recorder MCP) #122 and the epics-and-seeded-specs design keep fetching on the agent side. The client also ran npx -y @plaud-ai/mcp@latest (unpinned) with the full environment inherited by the child.
  • --name was joined into the staging directory and written before it was validated (cmd/voice.go), so --name ../../../x could overwrite files outside it. That code goes away with the command.
  • The --publish chain (transcript to RFC + child issues) is the only new capability here. If Hive's Inbox needs a one-step path, it should come back as its own narrowly scoped PR using the existing publish command.

Direction going forward: anything in Hive should be usable as input to Spek, by reference (provenance URIs) rather than one vendor integration per source.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

✨ spec: start a spec from a voice recording (Plaud / any recorder MCP)

1 participant