Skip to content

Prepare plugin 0.8.4 for tonight's Compiler changes - #125

Merged
raghubetina merged 11 commits into
mainfrom
plugin-0-8-4
Oct 5, 2026
Merged

raghubetina merged 11 commits into
mainfrom
plugin-0-8-4

Conversation

@raghubetina

@raghubetina raghubetina commented Oct 4, 2026 •

Copy link
Copy Markdown
Contributor

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

# Commit Depends on Drop?
1 Describe sign-up controls as the Compiler builds Already deployed: firstdraft#999 (released with 0.8.3) Base; keep
2 Use reality-check examples that outlast a deploy Nothing; the examples hold in every combination Base; keep
3 Use First Draft as one tool for the user's app Nothing; skills#127 (ba97889) folded in Keep
4 Describe generated photo and file uploads firstdraft#1006 (merged as 1cdb3d57) Droppable
5 Author counters over the direct Association firstdraft#1003 (merged) Droppable
6 Describe native apps with Accounts and sign-in firstdraft#1001 (owner-approved for tonight; iOS Core a3be8ab1 and Android Core d9befdc0 merged) Droppable
7 Describe the realized literal and date defaults firstdraft#1000 (merged as 425979d1) Droppable only with 8
8 Describe optional enums and partial Field kinds firstdraft#1007 (merged as c59b6dac) Droppable
9 Return Unlike to the parent and cite the Guide firstdraft#1005 (merged); skills#126 unchanged Droppable
10 Prepare plugin 0.8.4 Version, CHANGELOG entries, digest packed with CLI 2f4bc93 Keep
11 Bundle CLI 0.8.2 to cancel stuck Compilations firstdraft/cli#54 (merged as 92f2771) and the CLI 0.8.2 release Droppable (last)

Commit 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 that AGENTS.md requires for a contract change before
this 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 money
literal 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 of
commits 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_sha256 at the head. Dropping commit 11 needs nothing else: commit 10's digest covers the tree
without it.

Notes

  • SKILL.md is 20,266 bytes (budget 20,480; main has 20,332). Commit 3 removes 19 bytes, commit 6 removes 46, commit 11
    removes 1, and the others change none.
  • firstdraft#1006 as merged keeps a partial Account gap for a required upload on the Account ("required Account
    Field has no generated signup control"), so commit 4 says that. Commit 8 says the same for a required JSON Field.
  • Commit 8 matches merged #1007 (c59b6dac), which added two rules after the PR head that was reviewed: money
    literal 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>, and node script/check-plugin-release-order.mjs --prospective at the head; and the same check and contract with CLI 2f4bc93 at 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→65dc6b0 delta), approve; the later 65dc6b0→d2ca00c text change was checked against merged source, not re-reviewed
Review: codex-review 0.7.3, session 3199b5ed-533c-45e5-8fc9-6967e9ca87b9 (max effort, the stack at 16e4dff), approve
Review: codex-review 0.7.3, session 66bc8b41-d0a9-4170-bce9-8556fcdefd0e (max effort, the stack at a18c941), two findings accepted and fixed

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
raghubetina force-pushed the plugin-0-8-4 branch 3 times, most recently from db8035d to 16e4dff Compare October 5, 2026 00:48
@raghubetina
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.
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant