Repository navigation
Prepare plugin 0.8.4 for tonight's Compiler changes - #125
Merged
Merged
Conversation
The Compiler deployed with plugin 0.8.3 (firstdraft#999) dropped the exact Field-only registration topology. Sign-up now shows a control for every required stored Account Field the app does not fill, using that Field's Scaffold control, and sign-up meaning it cannot generate becomes a partial Account gap instead of leaving the Account out. The Plan reference still described the old cliff, so an agent would warn that a required enum on the Account costs the whole Account. This matches deployed behavior and does not depend on tonight's deploy. The upload, Field-type, default, and native changes for plugin 0.8.4 each touch this paragraph, so stating the current rule once lets each of those commits be dropped on its own.
The interview's reality check and the read-back's gap grouping used photos, counters, and private phone apps as examples of what First Draft does not build, and the evidence summary named only scalar and required-enum Field slices. Tonight's Compiler changes generate all of those, and the affected text shares lines, so dropping one feature commit from plugin 0.8.4 would leave stale text or a merge conflict. Formatted descriptions, comments on either of two parents, and an exclusion rule stay ungenerated in every release planned tonight, so these examples hold whichever changes deploy. The summary now points to the Field section, which each feature commit updates for itself. The early reality-check eval asks for gaps named by what the user notices instead of naming photos and phone apps.
raghubetina
force-pushed
the
plugin-0-8-4
branch
3 times, most recently
from
October 5, 2026 00:48
db8035d to
16e4dff
Compare
raghubetina
marked this pull request as ready for review
October 5, 2026 01:01
On 2026-10-04 the owner decided that First Draft is a tool in the agent's belt: plan, plan and Compile, or neither, whichever serves the user's goal. The Skill assumed every request was an app First Draft could build and told the user what it could not build only after the first push. An idea whose core is real-time sensors or a game loop got an interview for records it did not need. references/interview.md now starts from the user's goal. Before every interview the agent takes a quick look at how others build similar apps, to choose better questions and defaults. When feasibility is in question, such as sensors, APIs, or real-time behavior, it researches thoroughly and reports what it found with sources. As soon as it is clear, it says which of four ways First Draft helps: plan and Compile, plan and Compile the backbone while native Swift or Kotlin carries the core, plan only, or not at all, naming the right tool. A fitting app gets no fit talk. The modeling guide keeps three lists in implementation-notes.md and the read-back: what First Draft builds, what is built otherwise, and feasibility findings and open questions. The description now triggers on a request to make or plan an app or game. SKILL.md routes in one line and shrinks from 20,332 to 20,313 bytes by tightening the schema, read-back, and download paragraphs. Rehearsals ran in fresh Claude Code 2.1.286 sessions on Opus 5.5 (claude -p with only this worktree's plugin loaded): - Race-car coaching: three web searches, then an opening turn with sourced findings (1 Hz phone GPS, 10-25 Hz external receivers, Garmin Catalyst, RaceChrono and Harry's LapTimer) that said First Draft builds the backbone, not the sensor advice. After the answers it pushed a backbone Plan to Production (driver Account, cars, tracks, sessions, laps; iPhone and Android requested): valid, two gaps, both phone clients not generated because every page needs sign-in. It named that consequence and asked the user to choose. - First-person shooter: with an app-only description the Skill did not trigger and the agent began building a game itself. With "app or game" it triggered, named Godot, Unity, Unreal, and Three.js, offered First Draft later for accounts or leaderboards, and pushed no Plan. - Family network: the first run opened with "fits this tool well", so the fitting case now says not to mention fit; the rerun had none. With research always on, a third run made two searches (FamilyAlbum and Tinybeans, Instagram clones in Rails), noted that only invited people see posts and that follows add little for one family, and asked the usual three questions without fit talk or a push. - The Rails-maintenance and CSV-analysis controls did not trigger it. Five structural eval cases cover the fit decisions. The version, its CHANGELOG entry, and the tarball digest stay with the 0.8.4 release. Folded into plugin 0.8.4 after the base commits, before the feature commits, so each feature commit can update this text for its own Compiler change. The interview's reality-check examples and the read-back's gap examples keep the base commit's deploy-independent wording, and the family-network eval's reality-check expectation no longer assumes photos are a gap.
The image-uploads Compiler (firstdraft#1006) imports image and attachment Fields and generates Active Storage uploads stored on Cloudinary. The Plan reference still said those Fields are skipped, so an agent would promise a photo-less app. This carries the content of skills#122: list both types as imported, say what they generate and what stays a gap, and keep the CLOUDINARY_URL setup for .env.development.local and Render. Setup works without it; the first upload raises a KeyError naming it. It adds the edges the Compiler now has: a required upload on the Account Entity gets no sign-up file input and keeps a partial Account gap, uploaded files have public URLs, and development data cannot supply file bytes. The damage-photo and After Compile evals now expect generated uploads. Depends on firstdraft#1006 reaching Production; drop this commit if it misses the deploy.
firstdraft#1003 generates counter Fields with Rails counter_cache and shows them on explicit list and details projections, but the Plan reference still left counter off the import list. An agent would report like and follower counts as skipped, or count followers through the indirect join, which stays a gap. List counter as imported and say what it generates: a zero-started integer that counter_cache maintains, never a form input or seed value. The modeling guide says to count the direct Association, such as follower_links rather than followers, to author one counter per Reference, and to keep indirect, filtered, and polymorphic counts as reviewed gaps. Depends on firstdraft#1003 (merged) reaching Production; drop this commit if that deploy is held back.
raghubetina
force-pushed
the
plugin-0-8-4
branch
from
October 5, 2026 01:25
16e4dff to
65dc6b0
Compare
firstdraft#1001 gives selected iPhone and Android clients the Web main navigation, protected lists and the Account entry included. People sign up and sign in through the generated web pages inside the app, a signed-out person on a protected tab is sent to sign-in, Rodauth remember restores the session after a restart, and the Account page offers Sign out. The Skill still said native clients need a public index and have no sign-in, so an agent would tell the owner of a private app that its phone apps cannot sign in, or add a public page for a prerequisite that no longer exists. Replace those statements in SKILL.md, the Plan reference, the modeling guide, the examples, and the fit check's backbone advice, and have the private native and race-coaching evals expect signed-in native pages. SKILL.md shrinks by 46 bytes. Depends on firstdraft#1001, which the owner approved for tonight's deploy, with its iOS Core (a3be8ab1) and Android Core (d9befdc0) merged; drop this commit if it misses the deploy.
firstdraft#1000 realizes compatible literal defaults on boolean, integer, decimal, short_text, and long_text Fields as column defaults, and current_date on a required date Field. The Plan reference still said only current_time and enum keys were realized, so an agent would report a "Finished: false" default as a gap and might suggest adding an input that the default already covers. Say which defaults are realized, which stay gaps (null literals, other kinds, optional environment defaults, and text literals the Field's normalizations would change), and that a required Field with a realized default needs no form or sign-up input. Depends on firstdraft#1000, merged as 425979d1. The field-parity commit extends this paragraph for money, so dropping this commit means dropping that one too.
The field-parity Compiler (firstdraft#1007, merged as c59b6dac) generates optional enums; money, position, secure_token, and json Fields; and same-record date and datetime comparisons such as a check-out after its check-in. The four new kinds emit what a Rails scaffold would and record a field_kind.partially_generated gap for their missing semantics. The Plan reference still called optional enums and same-record date comparisons gaps and left the four kinds off the import list. Add the kinds to the import list with what each generates and what stays a gap, describe optional enum lowering and the comparison slice, and give the modeling guide one line on when to use each kind. The merged change also realizes money literal defaults and keeps a Primary Descriptor on any of the four kinds as a gap, so extend the defaults paragraph and say both. A required json Field on the Account gets no sign-up control; positions and secure tokens are app-filled, so the sign-up text from the base commit covers them. Depends on firstdraft#1007 and builds on the defaults commit, as #1007 builds on #1000 on firstdraft main: dropping the defaults commit now means dropping this one too.
firstdraft/firstdraft#1005 ships the one-tap Compiler change tonight: a no-input associated create renders as a button on the parent page and returns there, and a uniqueness rule plus an owner-authorized destroy turn the button into a Like/Unlike toggle. The destroy keeps its own destination, so Unlike returns to the parent only when the Plan authors destroy.return_to through the parent Reference; otherwise it goes to the ordinary delete destination, which is Home for a Like with no index. The Skill's Like example authored no such return, so an agent copying it would send every Unlike to Home. The Like fragment is now a byte-for-byte copy of the Guide's No-input records example, including destroy.return_to through like.post, and the modeling cue and example link the public Guide anchor. The caveat that a deployed Compiler may still show a separate Create page is removed because publication follows the deploy. The associated-create return and entry-point passages name the no-input exception so they no longer contradict it. The same pull request sends guests who request a protected page to sign-in and returns them afterwards; the signed-in gate example now says so. The one-tap-like-record eval expects the authored return; it was not run. The Like fragment passes the schema test in test/repository.test.mjs. The tarball digest is left for the 0.8.4 release branch, which repacks it.
Plugin 0.8.4 carries the Skill changes for the Compiler changes planned for tonight's Production deploy: uploads, counters, native apps with Accounts, the field-parity kinds, realized defaults, and one-tap records, plus the fit check that treats First Draft as one tool for the user's app. Set the version with npm version, add the CHANGELOG entry with one bullet per feature, move the fit check's pending section into its own dated entry, and record the tarball digest packed with the pinned CLI at 2f4bc93. Publish only after the matching Production deploy and owner approval. If a feature commit is dropped because its Compiler change missed the deploy, delete its CHANGELOG bullet and re-pack to update plugin_source.tarball_sha256.
A Project allows one active Compilation. When one never finishes, every later plan push and plan compile fails with 409 compilation_active, and CLI 0.8.1 had no way out short of an operator. CLI 0.8.2 (firstdraft/cli#54, merged as 92f2771) adds compilation cancel. Pin the bundled CLI to that merge, require CLI 0.8.2, and give the recovery reference the order: read the Compilation with compilation status <id> --wait, cancel it with compilation cancel <id> if it is still queued or running, then rerun the failed command. The ID appears only in the problem's response.detail, so SKILL.md allows that one detail as an ID source when it is a lowercase UUIDv7. Cancelling a --github Compilation also cancels the Project's Publication singleton, so the agent asks first. The reference lists the cancel errors and the Service's 409 and 404 refusals, and the contract check expects cancel in both help texts. Tighter retained status wording keeps SKILL.md 1 byte smaller. Depends on the CLI 0.8.2 release, which needs owner approval and must publish before the plugin. Drop this commit if 0.8.2 does not ship with plugin 0.8.4; the release commit's digest already covers the tree without it.
raghubetina
force-pushed
the
plugin-0-8-4
branch
from
October 5, 2026 02:20
65dc6b0 to
d2ca00c
Compare
This was referenced Oct 5, 2026
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.
Why
Plugin 0.8.4 makes the authoring Skill describe the Compiler and CLI changes planned for tonight's Production deploy,
so an agent stops calling them gaps and authors them correctly. It also carries the fit check that treats First
Draft as one tool for the user's app. Each deploy-dependent commit is separate so it can be dropped if its change
misses the deploy.
Publication waits for the matching Production deploy and owner approval. This PR publishes, tags, and merges
nothing. If the CLI commit ships, publish CLI 0.8.2 before the plugin.
Commits
ba97889) folded in1cdb3d57)a3be8ab1and Android Cored9befdc0merged)425979d1)c59b6dac)2f4bc9392f2771) and the CLI 0.8.2 releaseCommit 3 sits before the feature commits so that each feature commit can update its text for its own Compiler change.
Commit 6 rewrites #127's statements that the generated phone apps show only public pages, so dropping commit 6 leaves
#127's original wording. Commit 3 keeps the base commit's reality-check and read-back examples, and its
family-network eval no longer assumes photos are a gap. Commit 10 moves #127's "Pending for 0.8.4" section into a
dated entry.
skills#122 (content in commit 4), #126 (commit 9), and #127 (commit 3) can be closed in favor of this PR once the
owner approves; they stay open until then.
Commit 11 changes
requires.cli, so it needs the cross-review thatAGENTS.mdrequires for a contract change beforethis merges. It records its own digest, packed with CLI
92f2771.Dropping a commit
Commit 8 builds on commit 7, as #1007 builds on #1000 on firstdraft
main: the merged #1007 also realizes moneyliteral defaults, so commit 8 extends commit 7's defaults paragraph. Commit 7 can therefore be dropped only together
with commit 8; both are merged, so neither is expected to be dropped. Every other combination of commits 4–9 drops
without a conflict, with commits 10 and 11 replayed on top (47 of 63 combinations clean, and the 16 that drop 7 but
keep 8 conflict, as designed). Each single drop, and 7 with 8, passes
sh script/check. After dropping one ofcommits 4–9, delete its bullet from the 0.8.4 photos entry in CHANGELOG.md, re-pack with the pinned CLI, and update
plugin_source.tarball_sha256at the head. Dropping commit 11 needs nothing else: commit 10's digest covers the treewithout it.
Notes
removes 1, and the others change none.
Field has no generated signup control"), so commit 4 says that. Commit 8 says the same for a required JSON Field.
c59b6dac), which added two rules after the PR head that was reviewed: moneyliteral defaults are realized, and a Primary Descriptor on a money, position, secure_token, or json Field stays a
gap. Commit 6 says a signed-out person who opens a protected tab is sent to sign-in, as #1001's newest head does.
Checked locally:
npm ci --ignore-scripts && npm audit(0 vulnerabilities);sh script/check --cli-root <CLI 92f2771>(85 pass),
node script/check-cli-contract.mjs <CLI 92f2771>, andnode script/check-plugin-release-order.mjs --prospectiveat the head; and the same check and contract with CLI2f4bc93at commit 10.Docs: updated the packaged Skill (SKILL.md and references), its evals, README.md, and CHANGELOG.md.
Review: codex-review 0.7.3, session 1bf8541b-0b09-4df7-a99e-c7e4793fd90d (high effort, the
16e4dff→65dc6b0delta), approve; the later65dc6b0→d2ca00ctext change was checked against merged source, not re-reviewedReview: codex-review 0.7.3, session 3199b5ed-533c-45e5-8fc9-6967e9ca87b9 (max effort, the stack at
16e4dff), approveReview: codex-review 0.7.3, session 66bc8b41-d0a9-4170-bce9-8556fcdefd0e (max effort, the stack at
a18c941), two findings accepted and fixed