Scaffold full-stack application Skill - #1
Conversation
Establish a portable pre-Compilation workflow before the CLI and API support nonempty import. Keep deterministic operations in the CLI, bundle the exact provisional schema, and make concurrency, recovery, privacy, and capability stops explicit.
Review: technicalReviewed the first PR in this repository against Most of this is prose, so the parts worth checking mechanically are the pinned artifacts and whether the workflow describes software that actually exists. Verified
A dated note: the upstream schema has already movedThe recorded source revision That change is prose-only. I verified it in that review by parsing both revisions and stripping every The reason to say it anyway is that this Skill's own instruction is "update this Skill deliberately when either contract changes", and the contract has changed while this PR was open. Nothing here detects that, by design, since the pinned test compares the copy against itself rather than against upstream. So the update is a person's job, and this is the note that keeps it from being forgotten. The new digest above is the value to move to once #165 lands. Design notes
|
Lesson: what this PR actually didA new repository holding instructions for agents, not code. The ideas worth keeping are how to copy a file from another project honestly, and how to write instructions for software that does not exist yet. The one-sentence versionThis creates a public repository of Skills and its first Skill, What a Skill is hereA Skill is a folder with a The notable decision is that this one contains no executable code at all. Every side effect stays in the CLI: minting UUIDs, writing files, handling concurrency, talking to the network. The Skill only decides what should happen and when to ask the user. That split is worth copying if you ever ship agent instructions. Prose that an agent reads is reviewed by reading it. Code that an agent runs needs a supply chain: dependencies, audits, release process, a story for what happens when it is installed on a machine you have never seen. Mixing the two means the whole bundle inherits the harder requirements. Copying a file from another repo without lying about itThe Skill bundles a copy of the Foundation Plan JSON Schema, because an agent validating a document offline needs the schema locally. Copying a file across repository boundaries is where staleness is born. The usual version of this is a file that says nothing about where it came from, and two years later nobody can tell which upstream revision it matches or whether the differences are intentional. What this does instead, in three parts:
The residual gap is honest and inherent: nothing here can tell when upstream moves, because this repository has no view of the other one. That is a person's job, and saying so is better than pretending automation covers it. As it happens the schema did move while this PR was open, in a prose-only way, so I noted the new digest on the review so the deliberate update does not get lost. If you take one habit from this: when you vendor a file, record the upstream revision next to it and pin its hash. Those two lines turn "is this current?" from an investigation into a comparison. Writing instructions for software that does not exist yetThe interesting problem in this Skill is that it describes a workflow the tooling cannot fully perform. The CLI has There are three ways to handle that, and two are bad. You can pretend the command exists, and the agent tries it and fails confusingly. You can leave that step out, and the Skill silently cannot do a thing it appears to cover. What this does instead is tell the agent to look:
That is capability detection, the same pattern as feature-testing a browser API rather than sniffing the user agent. It also closes the failure mode that matters most: an agent that cannot get a real ID might helpfully make one up, or paste one from the examples, and either would corrupt the identity model the whole system depends on. The instruction forbids exactly those two improvisations by name. The Skill's own description carries the same caveat, so an agent choosing whether to load it knows the limit before it starts. Telling the user when you do not knowThe last thing worth noting is how the stop points line up with reality. The CLI has one genuinely ambiguous outcome: a request went out and no valid response came back, so the Plan may or may not have been accepted. I verified that behavior when reviewing the CLI. The Skill does not paper over it. On that failure it stops, keeps the printed recovery material local and private, and refuses to infer whether the push created a Project or updated one. Instructions that inherit a tool's uncertainty instead of resolving it optimistically are rarer than they should be, and they are the difference between an agent that recovers and one that confidently makes things worse. |
|
The supporting CLI slice is now firstdraft/cli#4. It implements the |
|
Evaluated the dated #165 schema note. I am keeping this PR pinned to |
|
Agreed, and the fork is the part I under-weighted. I treated "upstream moved" as one line when #165 sits on a sibling branch that this Skill's target slice does not include, so pinning to Moving the source revision, bundled copy, digest test, and reference note together in one deliberate update once the API integration line includes #165 is the right shape, and it keeps the four things from drifting apart individually. Nothing further from me on this. |
Make the public name and discovery copy describe the complete First Draft journey rather than the internal Foundation Plan stage. Keep the current pre-Compilation scaffold explicit, and refresh the vendored 0.19 schema to the merged Project-graph baseline.
|
The draft Skill's public name and discovery surface have changed from The installed workflow in this PR remains the pre-Compilation scaffold, while its portable metadata describes the |
|
Re-reviewed Verified
The discovery description asserts things the project's own ledger says are not shownThis is the one place I would push back, and I know from the body that it is deliberate, so treat it as a disagreement to resolve rather than an oversight to fix. The frontmatter, which is the text a user reads when deciding whether to install:
Present tense, and it names Android. and, four lines from the top of the same file:
I take the argument in the body, that the description is the intended launch product description and the scaffold is what is reviewable now. My difficulty is that the two audiences are different. The PR body is read by you and me. The frontmatter is read by a stranger choosing whether to install this, and the correction sits eleven lines below it in a file they may never open:
That sentence is honest and well placed for someone already reading. It cannot carry the weight of a description that promises a deployed application with three clients. A version that keeps discoverability without asserting the unbuilt might open with what the Skill does today and name the destination as intent:
Same search terms, same destination, no present-tense claim about output nothing has produced. If you would rather keep the aspirational wording, I would at least drop Android to the same hedge as the rest, since it is the only item in that list with no exercised evidence at all. The narrower alternative, if the launch description has to stay verbatim for marketing reasons, is to make the experimental sentence the first line of the body rather than the fifth paragraph, so it survives truncation in any surface that shows a preview. Smaller notes
Nothing blocking on the mechanics. The description is a judgement call and it is yours. |
Stage an existing Plan and opaque CLI state for diagnostic and recovery cases so their preservation behavior is observable. Bind the unsupported-content diagnostic to the exact staged Plan bytes.
|
Re-checked
The change worth calling out is the one-line fixture fix. which is a placeholder wearing the costume of a real digest. It now carries That distinction matters more in an eval fixture than almost anywhere else. A fixture is evidence about how the system behaves, and an all-zeros digest is evidence about nothing: it cannot fail, so it cannot catch the case where the staged Plan and the recorded response drift apart. Replacing it with the real value turns a decorative field into a check. The new |
|
The pending server stack now supersedes this scaffold blanket nonempty-import boundary. firstdraft/firstdraft#190 imports and atomically replaces Entities, |
|
The bounded nonempty follow-up is now #2. It supersedes the empty-only importer language and obsolete |
Why
First Draft needs its first portable Skill to be discoverable when a user wants custom software, not only when the
user already knows the term Foundation Plan. This scaffold makes the pre-Compilation authoring workflow reviewable
while the public discovery surface describes the intended end-to-end launch outcome.
What
create-full-stack-appand add portable UI/invocation metadata;Android clients, followed by ordinary source-development workflows;
sketch/0.19schema from First Draft revision12fa2a6bcac122196d55f5528fbc3f1363c684e3;and
Current scaffold boundary
plan initandplan push; the Skill capability-checksplan subject-idrather than assuming an unreleased command.
importable through that slice or Compiler-proven.
Verification
npm ci --ignore-scriptssh script/checkon Node 22.0.0 and Node 24.18.0: 8 tests passnpm audit --audit-level=low: 0 vulnerabilitiesgh skill publish --dry-run: structurally valid; the optional frontmatter-license and release-tag rulesetrecommendations remain intentionally deferred, while the installed Skill carries the exact MIT notice
5994c41f65eab52f92020fa24437e76b6957b7016ccf231dce06e8097f0b34b5project-relative paths
Related implementation slices: firstdraft/firstdraft#162 and firstdraft/cli#4.