Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,47 @@ Entries are newest first. Keep their headings stable. Publish material correctio
new entries so readers who advanced their checkpoint see them. Entries explain what changed, why, when it applies,
and any useful small example or verification; they need not reproduce commit logs.

## 2026-10-12: More of the Plan reaches the generated app

**Skills — released in plugin 0.8.17.** Once the First Draft service deploys the matching Compiler, more of an
authored Plan reaches the generated app, and what the Compiler cannot write yet is declared where it belongs, behind a
failing spec. The Skill's references now describe that output.

**Validations.** Decimal and money comparisons, conditional presence and absence on scalar Fields, and uniqueness over
wider tuples or under a condition now generate; a conditional uniqueness gets a partial unique index. A Validation the
Compiler still cannot lower, such as an `exclusion`, becomes `validate :<key>` with an empty private method and a
Behavior to write entry, plus an `enforces <path>` model example that expects the Rails error kind wherever the
Compiler can build a record the rule rejects. An unconditional left-out uniqueness over indexable columns still gets
its unique index. Factories build values that satisfy every emitted rule.

**Sample data.** Seeds keep every record no rule is proven to reject, where they used to drop each record a `format`
or not-equal rule covered. A sample record that breaks its own rule gets a
`foundation_plan.development_data.validation_violated` warning, and the read-back names it. Entity `reference_data` is
seeded in every environment.

**State Machines.** An Entity with several machines gets one namespaced AASM machine per Field, so events read
`leave_status!`. An optional machine keeps a nullable column, stubbed events, and an empty applicability callback with
a failing example, instead of storage alone.

**Pages and forms.** A failing input, binding, return, or collection drops only itself, and a create missing a
required value is still generated, with a partial gap. A Reference input to an Account Entity whose Policies don't
decide which Accounts to offer asks for an exact sign-in email. A Primary Descriptor no longer has to be a required
Field: a blank or unshowable one labels the record `Movie #12`. A reserved Policy operation such as `present` becomes
`present_rule?`, and a reserved scope key such as `public` becomes `public_profiles`, each with a warning.

**Relationships.** A cascade or nullification with no authored inverse gets the conventional `has_many` or `has_one`.
Inverse Associations over immutable References are plain Rails, and the app's `AGENTS.md` names the collection writers
that can still clear an optional immutable key. Counter columns and defaulted References keep their storage; a count
Rails cannot maintain, or the default, is left out behind a failing example or a Test coverage to complete entry, and
a Policy that reads an unmaintained count becomes a stub that denies.

**Import.** A `rich_text` Field is stored as plain text for now, a Tree imports with its self-Reference, an
Association's `cardinality` is skipped as one key, and canonical-form slips such as a repeated Ordering source warn
instead of blocking Compile.

Apps compiled earlier are unchanged. A rule they left out can be added by hand in the same shape: a `validate`
declaration, a method, and a spec that pins its error kind.

## 2026-10-12: Agents preview first and debug failures

**Skills — released in plugin 0.8.16.** Once the First Draft service deploys the matching Compiler, a generated app's
Expand Down
2 changes: 1 addition & 1 deletion evals/create-full-stack-app/cases.json
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@
"Keeps the requested username uniqueness and does not add a format Validation to usernames or any other format or not-equal rule the user did not ask for.",
"Authors the requested no-self-follow rule as an Entity comparison with one not_equals clause between the two required Follow References, with a Reference error target.",
"Proposes connected sample members and follows with a disposable demo Account in the ordinary Plan review.",
"Says in the read-back that First Draft cannot yet check the no-self-follow rule against sample data, so the named sample follows will be left out of the generated seed while the members and demo sign-in remain.",
"Keeps the sample follows, each between two different members, and says the generated seed keeps them; does not claim the no-self-follow rule drops sample records.",
"Keeps the requested rule and the sample follows in the Plan rather than dropping either silently to avoid the gaps.",
"Makes no service request, Compile or remote write."
]
Expand Down
4 changes: 2 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@firstdraft/skills",
"version": "0.8.16",
"version": "0.8.17",
"description": "Portable Agent Skills for First Draft",
"license": "MIT",
"private": true,
Expand Down
2 changes: 1 addition & 1 deletion packages/claude-plugin/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
"name": "firstdraft",
"displayName": "First Draft",
"version": "0.8.16",
"version": "0.8.17",
"description": "Author a Foundation Plan and compile a bounded Rails, iPhone, and Android application",
"author": {
"name": "First Draft",
Expand Down
2 changes: 1 addition & 1 deletion packages/claude-plugin/package.template.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@firstdraft.com/claude-code",
"version": "0.8.16",
"version": "0.8.17",
"description": "First Draft Foundation Plan authoring and Compilation for Claude Code and Codex",
"license": "MIT",
"type": "module",
Expand Down
2 changes: 1 addition & 1 deletion release/compatibility.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"format": "firstdraft.release-compatibility/1",
"component": "skills",
"version": "0.8.16",
"version": "0.8.17",
"plugin_source": {
"package": "@firstdraft.com/claude-code",
"tarball_sha256": "09bad8d5c841dc0c452672b5c8a4cdcc937947dd854f20922a0e3a08d5bf22ac"
Expand Down
2 changes: 1 addition & 1 deletion skills/create-full-stack-app/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ explicit handoff. Follow [writing notes](references/modeling-guide.md#retain-imp

## Current boundary

Targets plugin 0.8.16, CLI 0.8.2, API 0.7, Plan 0.23; catalog selection is separate.
Targets plugin 0.8.17, CLI 0.8.2, API 0.7, Plan 0.23; catalog selection is separate.

- Bounded generation includes Web Accounts/Policies/Scaffolds, development data, and selected iPhone/Android
clients. [Appearance](references/foundation-plan-023.md#application-and-clients) controls theme and native colors,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ interleaved output fail closed. Branch on the object's stable `error` and struct
human-readable `detail` or broad process exit status.

This plugin bundles `@firstdraft.com/cli@0.8.2`. Its exact reviewed revision and runtime digest are owned by
[the CLI contract configuration](https://github.com/firstdraft/skills/blob/claude-v0.8.16/script/cli-contract/config.mjs)
[the CLI contract configuration](https://github.com/firstdraft/skills/blob/claude-v0.8.17/script/cli-contract/config.mjs)
at this plugin's protected release tag. Check the command surface rather than assuming the version alone
establishes compatibility. These source checks do not prove plugin/catalog publication, service authentication,
staging compatibility, or a complete user journey.
Expand Down
7 changes: 4 additions & 3 deletions skills/create-full-stack-app/references/examples.md
Original file line number Diff line number Diff line change
Expand Up @@ -160,9 +160,10 @@ only after a release date exists; nil title handling still comes from requiredne
}
```

The same release also admits unconditional or bounded conditional ordered integer-literal range comparisons and
conditional text or ordinary-Reference presence and absence. See the Foundation Plan reference for the exact closed
subset. A conditional maximum does not become an unconditional form `maxlength`.
The same release also admits unconditional or conditional ordered literal comparisons on integer, decimal, money,
and date Fields, conditional presence and absence on scalar Fields and ordinary References, and wider and
conditional uniqueness. See the Foundation Plan reference for the exact closed subset; a rule outside it is declared
as an empty method, with a failing spec where the Compiler can build a record the rule rejects. A conditional maximum does not become an unconditional form `maxlength`.

## Public mutation, show projection, returns, and destroy

Expand Down
Loading
Loading