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
12 changes: 12 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,18 @@ 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-09-28: Associated creation without standalone routes

**Compiler and Skills — coordinated 0.8.0 source candidate, unreleased.** An associated form can use a create
definition without exposing standalone New/Create routes. For example, keep Rating's create inputs, authorization,
and Movie collection form while omitting `new` and `create` from Rating's `resource_routes`. The nested route still
supplies its Movie; a retained standalone `create.return_to` does not choose the nested form's destination.

Standalone Create without New or a return destination now returns 201 on success even when its definition also
serves associated forms; that shared case previously redirected with 303. Invalid submissions return 422. Review
the [Scaffolds guidance](skills/create-full-stack-app/references/foundation-plan-023.md#scaffolds) for required-parent
gaps and shared-Policy form-entry limits before handing unfinished application behavior to the implementation agent.

## 2026-09-27: Bookmark assets without a planning option

**Compiler and authoring contract — coordinated source candidate, unreleased.** The next Plan contract includes
Expand Down
1 change: 1 addition & 0 deletions evals/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ specifically prepared server-backed run. Never print or commit private `.firstdr
- `reconcile-optional-field-origin`
- `author-deliberate-return-overrides`
- `preserve-current-location-return`
- `author-associated-only-creation`
- `choose-conventional-validations`
- `preserve-structured-validation-gap`
- `retain-outside-vocabulary-requirement`
Expand Down
21 changes: 20 additions & 1 deletion evals/create-full-stack-app/cases.json
Original file line number Diff line number Diff line change
Expand Up @@ -236,6 +236,25 @@
],
"artifacts": []
},
{
"id": "author-associated-only-creation",
"should_trigger": true,
"prompt": "In this local public movie-rating draft, Ratings should be created only from a Movie's ratings collection, never from a standalone New page or standalone POST. Keep the current Rating create definition, inputs, authorization and standalone return choice unchanged; change only its standalone new/create route exposure. Preserve the other routes, model, empty data and no Account choice. Update the Plan locally and explain how the nested route supplies its Movie and where a successful nested save returns. Do not submit or Compile.",
"expectations": [
"Removes only new and create from rating.scaffold.resource_routes while preserving the create definition and the Movie collection create_form; does not add a fictitious standalone route to satisfy the schema.",
"Preserves all subject identities, authored inputs, authorization, return choices and unrelated routes without introducing bindings or Accounts.",
"Explains that the authorized Movie from the URL supplies the nested parent and that competing submitted parent values cannot replace it; the scoped form retains other editable inputs and ordinary validation behavior.",
"Explains that the retained create.return_to applies only to standalone creation, which is no longer exposed; nested saves return to the Movie's ratings collection. Does not transfer that override to create_form.return_to without a separate authored choice.",
"Distinguishes local schema/authoring checks from Analysis and generated-app proof, and makes no network submission or Compilation claim."
],
"artifacts": [
{
"path": "evals/create-full-stack-app/fixtures/redirect-movies.foundation-plan.json",
"role": "input",
"stage_as": ".firstdraft/foundation-plan.json"
}
]
},
{
"id": "choose-conventional-validations",
"should_trigger": true,
Expand Down Expand Up @@ -502,7 +521,7 @@
"should_trigger": true,
"prompt": "The staged Plan's domain, selected iPhone client, Movie icon and Field, and public-index Scaffold are intentional. A successful plan push was followed by plan status --wait, which printed the attached valid analysis. Review the result, but do not compile it.",
"expectations": [
"Branches on analysis.status valid and reports analyzer release foundation-plan-rails/application-2026-09-27-bookmark-assets, graph version 1, and the absence of diagnostics.",
"Branches on analysis.status valid and reports analyzer release foundation-plan-rails/application-2026-09-28-controller-create-context, graph version 1, and the absence of diagnostics.",
"Reports the complete empty firstdraft.foundation-gaps/2 object and exact attached analysis.gap_set_sha256, which the CLI validated against the attached GapSet bytes, rather than omitting the reviewed support result; never substitutes a fixture, historical, or other Project's digest.",
"Preserves the complete staged Plan unchanged, including its domain, native.ios request, semantic icon, required title Field, and exact public-index Scaffold.",
"Recognizes that the prepared 2026-09 boundary admits this bounded web public-index and selected iPhone request, while analysis alone does not prove generated output.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
"id": "01900000-0000-7000-8000-000000000902",
"graph_version": 1,
"head_source_sha256": "9f07c5b77e6dc96c2cd733ac04781abd5b5bfc6ea336a36c4f49a0116bd7f47e",
"analyzer_release": "foundation-plan-rails/application-2026-09-27-bookmark-assets",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-27-bookmark-assets",
"analyzer_release": "foundation-plan-rails/application-2026-09-28-controller-create-context",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-28-controller-create-context",
"target": {
"id": "rails",
"profile": "rails-sketch/2026-09-bookmark-assets"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
"id": "01900000-0000-7000-8000-000000000906",
"graph_version": 1,
"head_source_sha256": "d6f15d4062c95574c40f47a993ea7d24dd920fc10736306ae64c3461b5fda15f",
"analyzer_release": "foundation-plan-rails/application-2026-09-27-bookmark-assets",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-27-bookmark-assets",
"analyzer_release": "foundation-plan-rails/application-2026-09-28-controller-create-context",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-28-controller-create-context",
"target": {
"id": "rails",
"profile": "rails-sketch/2026-09-bookmark-assets"
Expand All @@ -25,9 +25,9 @@
"graph_version": 1
},
"analysis": {
"release": "foundation-plan-rails/application-2026-09-27-bookmark-assets"
"release": "foundation-plan-rails/application-2026-09-28-controller-create-context"
},
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-27-bookmark-assets",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-28-controller-create-context",
"target": {
"id": "rails",
"profile": "rails-sketch/2026-09-bookmark-assets"
Expand All @@ -45,7 +45,7 @@
}
]
},
"gap_set_sha256": "15b24b73c98d2da9abb77d9ca364f950ab26ee8a83ad37289f7efda81a39e8d0",
"gap_set_sha256": "82a2dedf411a3ea673badc5319d90acf7fcaea098bc7baf6b3364796c965a8d4",
"started_at": "2026-07-30T12:03:00.000Z",
"completed_at": "2026-07-30T12:03:01.000Z"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
"id": "01900000-0000-7000-8000-000000000905",
"graph_version": 1,
"head_source_sha256": "b7369e48d1e01418a045d82b1a46e1b4a24b1d472ed20add0af46d402fea39fc",
"analyzer_release": "foundation-plan-rails/application-2026-09-27-bookmark-assets",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-27-bookmark-assets",
"analyzer_release": "foundation-plan-rails/application-2026-09-28-controller-create-context",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-28-controller-create-context",
"target": {
"id": "rails",
"profile": "rails-sketch/2026-09-bookmark-assets"
Expand All @@ -25,16 +25,16 @@
"graph_version": 1
},
"analysis": {
"release": "foundation-plan-rails/application-2026-09-27-bookmark-assets"
"release": "foundation-plan-rails/application-2026-09-28-controller-create-context"
},
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-27-bookmark-assets",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-28-controller-create-context",
"target": {
"id": "rails",
"profile": "rails-sketch/2026-09-bookmark-assets"
},
"gaps": []
},
"gap_set_sha256": "44d81a907339289088976639534111e6fee878d1f3ad5692df80094bf75abee3",
"gap_set_sha256": "dbee576eddfebf638104f92d1a28843e006ce4bfe94f7eb84d53d2efa9dee4cd",
"started_at": "2026-07-30T12:02:00.000Z",
"completed_at": "2026-07-30T12:02:01.000Z"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
"id": "01900000-0000-7000-8000-000000000901",
"graph_version": 1,
"head_source_sha256": "603567c344fe5b0e46d20eeec229c5a2726fa1b4212467dc713c38295b2df85f",
"analyzer_release": "foundation-plan-rails/application-2026-09-27-bookmark-assets",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-27-bookmark-assets",
"analyzer_release": "foundation-plan-rails/application-2026-09-28-controller-create-context",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-28-controller-create-context",
"target": {
"id": "rails",
"profile": "rails-sketch/2026-09-bookmark-assets"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
"id": "01900000-0000-7000-8000-000000000907",
"graph_version": 1,
"head_source_sha256": "00723c6e838dcd4c1c2ed96d2a82c64806843b619cbba6edf63dede4d829ba15",
"analyzer_release": "foundation-plan-rails/application-2026-09-27-bookmark-assets",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-27-bookmark-assets",
"analyzer_release": "foundation-plan-rails/application-2026-09-28-controller-create-context",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-28-controller-create-context",
"target": {
"id": "rails",
"profile": "rails-sketch/2026-09-bookmark-assets"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
"id": "01900000-0000-7000-8000-000000000904",
"graph_version": 2,
"head_source_sha256": "ce6c5037e410718e871eecd89f9ce55797fdb88e27a13ce19a7eeb91ba30d032",
"analyzer_release": "foundation-plan-rails/application-2026-09-27-bookmark-assets",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-27-bookmark-assets",
"analyzer_release": "foundation-plan-rails/application-2026-09-28-controller-create-context",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-28-controller-create-context",
"target": {
"id": "rails",
"profile": "rails-sketch/2026-09-bookmark-assets"
Expand Down
4 changes: 2 additions & 2 deletions evals/create-full-stack-app/fixtures/superseded-analysis.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
"id": "01900000-0000-7000-8000-000000000903",
"graph_version": 2,
"head_source_sha256": "9f07c5b77e6dc96c2cd733ac04781abd5b5bfc6ea336a36c4f49a0116bd7f47e",
"analyzer_release": "foundation-plan-rails/application-2026-09-27-bookmark-assets",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-27-bookmark-assets",
"analyzer_release": "foundation-plan-rails/application-2026-09-28-controller-create-context",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-28-controller-create-context",
"target": {
"id": "rails",
"profile": "rails-sketch/2026-09-bookmark-assets"
Expand Down
10 changes: 5 additions & 5 deletions evals/create-full-stack-app/fixtures/theme-toggle-analysis.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
"id": "01900000-0000-7000-8000-000000000909",
"graph_version": 1,
"head_source_sha256": "d9c3fe7a339e0fe9074e13fe3f24faf27ab4cfd5c428be0bcf13f19dfb34665b",
"analyzer_release": "foundation-plan-rails/application-2026-09-27-bookmark-assets",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-27-bookmark-assets",
"analyzer_release": "foundation-plan-rails/application-2026-09-28-controller-create-context",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-28-controller-create-context",
"target": {
"id": "rails",
"profile": "rails-sketch/2026-09-bookmark-assets"
Expand All @@ -25,9 +25,9 @@
"graph_version": 1
},
"analysis": {
"release": "foundation-plan-rails/application-2026-09-27-bookmark-assets"
"release": "foundation-plan-rails/application-2026-09-28-controller-create-context"
},
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-27-bookmark-assets",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-28-controller-create-context",
"target": {
"id": "rails",
"profile": "rails-sketch/2026-09-bookmark-assets"
Expand Down Expand Up @@ -55,7 +55,7 @@
}
]
},
"gap_set_sha256": "055eab90b7f72c0fbc184774fc299913e44db8fce1686bc5585f165bd4d9f4ca",
"gap_set_sha256": "f35279796f263ebbca731782444a38be445def7ff3606fc5c5b2cba265be63b8",
"started_at": "2026-07-30T12:03:00.000Z",
"completed_at": "2026-07-30T12:03:01.000Z"
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
"id": "01900000-0000-7000-8000-000000000908",
"graph_version": 1,
"head_source_sha256": "3318da62e564ae5b8e6e3f549912354396dbe7b5e694c10a12e2e589ce0ba125",
"analyzer_release": "foundation-plan-rails/application-2026-09-27-bookmark-assets",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-27-bookmark-assets",
"analyzer_release": "foundation-plan-rails/application-2026-09-28-controller-create-context",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-28-controller-create-context",
"target": {
"id": "rails",
"profile": "rails-sketch/2026-09-bookmark-assets"
Expand All @@ -25,9 +25,9 @@
"graph_version": 1
},
"analysis": {
"release": "foundation-plan-rails/application-2026-09-27-bookmark-assets"
"release": "foundation-plan-rails/application-2026-09-28-controller-create-context"
},
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-27-bookmark-assets",
"compiler_release": "foundation-plan-rails/compiler-application-2026-09-28-controller-create-context",
"target": {
"id": "rails",
"profile": "rails-sketch/2026-09-bookmark-assets"
Expand Down Expand Up @@ -55,7 +55,7 @@
}
]
},
"gap_set_sha256": "9da351eaa2f52e55d5915db9cef43b67f01e372cf03f0977fca76de5dd762b5a",
"gap_set_sha256": "2a81b30fe6903beb7de5757c44dc443a6c40794968ee7ab7e5230f4312b56cce",
"started_at": "2026-07-30T12:04:00.000Z",
"completed_at": "2026-07-30T12:04:01.000Z"
}
Expand Down
2 changes: 1 addition & 1 deletion release/compatibility.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"version": "0.8.0",
"plugin_source": {
"package": "@firstdraft.com/claude-code",
"tarball_sha256": "02a7ffe39c563e064890070df174cb34c8be28f63721a32e322b1d43851dc640"
"tarball_sha256": "6019486584f971fa6e405de340e28115b7447a7efd0539296394a7eb5e41c6e8"
},
"requires": {
"api_contract": [
Expand Down
4 changes: 2 additions & 2 deletions script/cli-contract/config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,9 @@ export const apiToken = "canary-private-api-token";
export const foundationPlanFormat =
"firstdraft.foundation-plan.sketch/0.23";
export const analyzerRelease =
"foundation-plan-rails/application-2026-09-27-bookmark-assets";
"foundation-plan-rails/application-2026-09-28-controller-create-context";
export const compilerRelease =
"foundation-plan-rails/compiler-application-2026-09-27-bookmark-assets";
"foundation-plan-rails/compiler-application-2026-09-28-controller-create-context";
export const compilationTarget = {
id: "rails",
profile: "rails-sketch/2026-09-bookmark-assets",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3017,26 +3017,6 @@
}
}
},
{
"if": {
"required": [
"create"
]
},
"then": {
"required": [
"resource_routes"
],
"properties": {
"resource_routes": {
"type": "array",
"contains": {
"const": "create"
}
}
}
}
},
{
"if": {
"properties": {
Expand Down Expand Up @@ -4932,7 +4912,7 @@
},
"scaffoldCreateForm": {
"title": "Associated create form",
"description": "An associated-create entry point backed by the target Entity's selected create definition. Rails derives scoped New and POST routes and supplies the inverse Reference from the route-bound parent.",
"description": "An associated-create entry point backed by the target Entity's create definition, independently of top-level route selection. Rails derives scoped New and POST routes and supplies the inverse Reference from the route-bound parent.",
"type": "object",
"additionalProperties": false,
"properties": {
Expand Down
Loading
Loading