From 03d9f7141c149ea673170e79ed438b3206faf534 Mon Sep 17 00:00:00 2001 From: Raghu Betina Date: Tue, 20 Oct 2026 09:51:02 -0500 Subject: [PATCH] Adopt the rails-sketch/2026-10 target profile First Draft's Rails target moves to Rails 8.1.4 under a new profile ID, because 8.1.4 changes the schema.rb dump format that every generated application checks. CLI 0.9.0 and API 0.8 accept only the new profile, so bundle that CLI, require that API, and refresh the schema copy, eval fixtures, synthetic release pair, and the digests bound to them. A Project keeps the profile it was created with, so a Project on the retired profile can no longer be analyzed or compiled. The Skill now names the three diagnostics at /target/profile and walks the agent through starting a new Project for the same Plan, keeping its subject UUIDs. A resumed Plan on the old profile goes there before a push. Plugin 0.9.0 is a minor bump because the compatibility change breaks older service and CLI pairings. Review fix: the schema provenance now cites the service commit that holds the bundled bytes, not the revision before the profile change. --- CHANGELOG.md | 17 ++++++++++ README.md | 2 +- evals/create-full-stack-app/cases.json | 6 ++-- .../fixtures/analysis-failed-analysis.json | 8 ++--- .../fixtures/appearance-current-analysis.json | 18 +++++----- .../appearance-current.foundation-plan.json | 2 +- .../application-intent-valid-analysis.json | 18 +++++----- .../application-intent.foundation-plan.json | 2 +- .../fixtures/empty.foundation-plan.json | 2 +- .../first-preview-movies.foundation-plan.json | 2 +- .../fixtures/issues-found-analysis.json | 10 +++--- .../mixed-application-issues-analysis.json | 8 ++--- ...ed-application-issues.foundation-plan.json | 2 +- .../reconcile-habits.foundation-plan.json | 2 +- .../fixtures/recurring-issues-analysis.json | 8 ++--- .../recurring-issues.foundation-plan.json | 2 +- .../redirect-movies.foundation-plan.json | 2 +- .../reserved-constant.foundation-plan.json | 2 +- .../resume-current.foundation-plan.json | 2 +- .../schema-invalid.foundation-plan.txt | 2 +- .../fixtures/superseded-analysis.json | 8 ++--- .../supported-enum.foundation-plan.json | 2 +- .../supported-scalars.foundation-plan.json | 2 +- .../fixtures/theme-toggle-analysis.json | 18 +++++----- .../theme-toggle.foundation-plan.json | 2 +- ...ed-field-capabilities.foundation-plan.json | 2 +- .../fixtures/unsupported-graph-analysis.json | 18 +++++----- package-lock.json | 4 +-- package.json | 2 +- .../claude-plugin/.claude-plugin/plugin.json | 2 +- packages/claude-plugin/package.template.json | 2 +- release/compatibility.json | 8 ++--- script/cli-contract/config.mjs | 12 +++---- script/cli-contract/fixtures.mjs | 2 +- skills/create-full-stack-app/SKILL.md | 4 ++- .../references/diagnostics-and-recovery.md | 34 ++++++++++++++++--- .../references/examples.md | 14 ++++---- .../foundation-plan-0.23.schema.json | 2 +- .../references/foundation-plan-023.md | 14 ++++---- test/repository.test.mjs | 4 +-- test/ui-foundation-authoring.test.mjs | 2 +- 41 files changed, 160 insertions(+), 115 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 341f2b6..62759df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,23 @@ 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-20: Rails 8.1.4 and target profile rails-sketch/2026-10 + +**Skills — released in plugin 0.9.0.** Once the First Draft service deploys the matching Compiler, generated apps use +Rails 8.1.4 under the new target profile `rails-sketch/2026-10`. The plugin bundles CLI 0.9.0, which needs First Draft +API 0.8; both accept only the new profile. Rails 8.1.4 writes `db/schema.rb` columns in table order, where 8.1.3.1 +sorted them alphabetically, so a new app's emitted schema lists them that way. + +**Existing Projects.** A Project keeps the target profile it was created with, so a Project created with +`rails-sketch/2026-09-bookmark-assets` can no longer be analyzed or compiled. Its diagnostics point at +`/target/profile`. The Skill now walks the agent through starting a new Project for the same Plan: set the old +`.firstdraft` directory aside, run `plan init` with the same application name and key, copy the Plan in with the new +profile, and push. Subject UUIDs carry over. + +**Existing apps.** An app generated earlier is unchanged and keeps working. Its Gemfile already allows Rails 8.1.4, +a bug-fix release; `bundle update rails` followed by the app's tests moves it. Afterward a schema dump may reorder +columns, which changes no behavior. + ## 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 diff --git a/README.md b/README.md index 703d715..e6538a0 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ Start a new Codex conversation after installation. Use `$firstdraft:create-full- there is no separate CLI version to choose. A plugin install does not sign you into First Draft. Log in once per environment from any terminal with -`npx --yes @firstdraft.com/cli@0.8.2 login` (add `--staging` for staging). The login is saved in your user +`npx --yes @firstdraft.com/cli@0.9.0 login` (add `--staging` for staging). The login is saved in your user configuration directory, so Claude Code, Codex CLI, and desktop sessions all use it without exported variables. If authentication interrupts an already requested operation, log in and tell the same conversation to continue. Approve the specific CLI command when Codex requests network access; its tool permission is separate from approval of the Plan and Compile mode. diff --git a/evals/create-full-stack-app/cases.json b/evals/create-full-stack-app/cases.json index e2d1fde..6488c13 100644 --- a/evals/create-full-stack-app/cases.json +++ b/evals/create-full-stack-app/cases.json @@ -809,7 +809,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-28-controller-create-context, graph version 1, and the absence of diagnostics.", + "Branches on analysis.status valid and reports analyzer release foundation-plan-rails/application-2026-10-20-rails-8-1-4, 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.", @@ -1548,7 +1548,7 @@ { "id": "compile-prepared-movie-catalog", "should_trigger": true, - "prompt": "I approve the exact pre-Compile semantic read-back and reviewed support result for the unchanged staged Movie Catalog with SHA-256 d6f15d4062c95574c40f47a993ea7d24dd920fc10736306ae64c3461b5fda15f. Preserve its intentional Appearance request and publish that exact candidate to one private GitHub repository now.", + "prompt": "I approve the exact pre-Compile semantic read-back and reviewed support result for the unchanged staged Movie Catalog with SHA-256 06865cb050ca63e06bdc252fb089198d97f2047d094dd4fe56acb87111cc9d8f. Preserve its intentional Appearance request and publish that exact candidate to one private GitHub repository now.", "expectations": [ "Requires the installed CLI to expose both plan compile completion modes and no public plan publish command.", "In the same continuing session, treats the prompt as unambiguous approval of the complete semantic model and reviewed nonempty GapSet, and does not ask for a second confirmation or repeat the unchanged read-back.", @@ -1574,7 +1574,7 @@ { "id": "compile-prepared-drawing-board-application", "should_trigger": true, - "prompt": "I approve the exact pre-Compile Drawing Board semantic read-back and reviewed support result for the unchanged staged Movie Catalog with SHA-256 d6f15d4062c95574c40f47a993ea7d24dd920fc10736306ae64c3461b5fda15f. Materialize that exact candidate into the absent ./application directory. Do not create a GitHub repository.", + "prompt": "I approve the exact pre-Compile Drawing Board semantic read-back and reviewed support result for the unchanged staged Movie Catalog with SHA-256 06865cb050ca63e06bdc252fb089198d97f2047d094dd4fe56acb87111cc9d8f. Materialize that exact candidate into the absent ./application directory. Do not create a GitHub repository.", "expectations": [ "Requires the installed CLI to expose plan compile --output as a direct local completion mode while retaining plan compile --github as the separate GitHub Publication mode.", "In the same continuing session as precompile-drawing-board-read-back, treats the prompt as unambiguous approval of the complete semantic model, reviewed nonempty GapSet, exact Plan bytes, and selected direct local mode; and asks for no second confirmation.", diff --git a/evals/create-full-stack-app/fixtures/analysis-failed-analysis.json b/evals/create-full-stack-app/fixtures/analysis-failed-analysis.json index aa5dc10..b73f551 100644 --- a/evals/create-full-stack-app/fixtures/analysis-failed-analysis.json +++ b/evals/create-full-stack-app/fixtures/analysis-failed-analysis.json @@ -6,12 +6,12 @@ "analysis": { "id": "01900000-0000-7000-8000-000000000902", "graph_version": 1, - "head_source_sha256": "9f07c5b77e6dc96c2cd733ac04781abd5b5bfc6ea336a36c4f49a0116bd7f47e", - "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", + "head_source_sha256": "27d8d5cf60c5bc64496139d52559de130714fa5dd5e9e741921da4bffce297c2", + "analyzer_release": "foundation-plan-rails/application-2026-10-20-rails-8-1-4", + "compiler_release": "foundation-plan-rails/compiler-application-2026-10-20-rails-8-1-4", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "status": "analysis_failed", "diagnostics": [], diff --git a/evals/create-full-stack-app/fixtures/appearance-current-analysis.json b/evals/create-full-stack-app/fixtures/appearance-current-analysis.json index 2b63c3c..1f2b66e 100644 --- a/evals/create-full-stack-app/fixtures/appearance-current-analysis.json +++ b/evals/create-full-stack-app/fixtures/appearance-current-analysis.json @@ -6,31 +6,31 @@ "analysis": { "id": "01900000-0000-7000-8000-000000000906", "graph_version": 1, - "head_source_sha256": "d6f15d4062c95574c40f47a993ea7d24dd920fc10736306ae64c3461b5fda15f", - "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", + "head_source_sha256": "06865cb050ca63e06bdc252fb089198d97f2047d094dd4fe56acb87111cc9d8f", + "analyzer_release": "foundation-plan-rails/application-2026-10-20-rails-8-1-4", + "compiler_release": "foundation-plan-rails/compiler-application-2026-10-20-rails-8-1-4", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "status": "valid", "diagnostics": [], "gap_set": { "format": "firstdraft.foundation-gaps/2", "source": { - "sha256": "d6f15d4062c95574c40f47a993ea7d24dd920fc10736306ae64c3461b5fda15f" + "sha256": "06865cb050ca63e06bdc252fb089198d97f2047d094dd4fe56acb87111cc9d8f" }, "project": { "id": "01900000-0000-7000-8000-000000000021", "graph_version": 1 }, "analysis": { - "release": "foundation-plan-rails/application-2026-09-28-controller-create-context" + "release": "foundation-plan-rails/application-2026-10-20-rails-8-1-4" }, - "compiler_release": "foundation-plan-rails/compiler-application-2026-09-28-controller-create-context", + "compiler_release": "foundation-plan-rails/compiler-application-2026-10-20-rails-8-1-4", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "gaps": [ { @@ -45,7 +45,7 @@ } ] }, - "gap_set_sha256": "82a2dedf411a3ea673badc5319d90acf7fcaea098bc7baf6b3364796c965a8d4", + "gap_set_sha256": "cb81581d2bbca8d66b52158c3252bd168d8b4f2d230d76993aed9c4e404dc92a", "started_at": "2026-07-30T12:03:00.000Z", "completed_at": "2026-07-30T12:03:01.000Z" } diff --git a/evals/create-full-stack-app/fixtures/appearance-current.foundation-plan.json b/evals/create-full-stack-app/fixtures/appearance-current.foundation-plan.json index a93b8f1..4160fc4 100644 --- a/evals/create-full-stack-app/fixtures/appearance-current.foundation-plan.json +++ b/evals/create-full-stack-app/fixtures/appearance-current.foundation-plan.json @@ -2,7 +2,7 @@ "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "movie_catalog", diff --git a/evals/create-full-stack-app/fixtures/application-intent-valid-analysis.json b/evals/create-full-stack-app/fixtures/application-intent-valid-analysis.json index d624d48..98edb42 100644 --- a/evals/create-full-stack-app/fixtures/application-intent-valid-analysis.json +++ b/evals/create-full-stack-app/fixtures/application-intent-valid-analysis.json @@ -6,35 +6,35 @@ "analysis": { "id": "01900000-0000-7000-8000-000000000905", "graph_version": 1, - "head_source_sha256": "b7369e48d1e01418a045d82b1a46e1b4a24b1d472ed20add0af46d402fea39fc", - "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", + "head_source_sha256": "f5efede3cda3261314601358bab6e189959c74cefec10418a2be2eb47f73552d", + "analyzer_release": "foundation-plan-rails/application-2026-10-20-rails-8-1-4", + "compiler_release": "foundation-plan-rails/compiler-application-2026-10-20-rails-8-1-4", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "status": "valid", "diagnostics": [], "gap_set": { "format": "firstdraft.foundation-gaps/2", "source": { - "sha256": "b7369e48d1e01418a045d82b1a46e1b4a24b1d472ed20add0af46d402fea39fc" + "sha256": "f5efede3cda3261314601358bab6e189959c74cefec10418a2be2eb47f73552d" }, "project": { "id": "01900000-0000-7000-8000-000000000020", "graph_version": 1 }, "analysis": { - "release": "foundation-plan-rails/application-2026-09-28-controller-create-context" + "release": "foundation-plan-rails/application-2026-10-20-rails-8-1-4" }, - "compiler_release": "foundation-plan-rails/compiler-application-2026-09-28-controller-create-context", + "compiler_release": "foundation-plan-rails/compiler-application-2026-10-20-rails-8-1-4", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "gaps": [] }, - "gap_set_sha256": "dbee576eddfebf638104f92d1a28843e006ce4bfe94f7eb84d53d2efa9dee4cd", + "gap_set_sha256": "968bda7d909286ee6c731093e4ef7c9f1bb8ca41daf4ee5942838be1b95c3256", "started_at": "2026-07-30T12:02:00.000Z", "completed_at": "2026-07-30T12:02:01.000Z" } diff --git a/evals/create-full-stack-app/fixtures/application-intent.foundation-plan.json b/evals/create-full-stack-app/fixtures/application-intent.foundation-plan.json index 67f1c77..d4c7d53 100644 --- a/evals/create-full-stack-app/fixtures/application-intent.foundation-plan.json +++ b/evals/create-full-stack-app/fixtures/application-intent.foundation-plan.json @@ -2,7 +2,7 @@ "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "movie_catalog", diff --git a/evals/create-full-stack-app/fixtures/empty.foundation-plan.json b/evals/create-full-stack-app/fixtures/empty.foundation-plan.json index 57a956a..9d1a024 100644 --- a/evals/create-full-stack-app/fixtures/empty.foundation-plan.json +++ b/evals/create-full-stack-app/fixtures/empty.foundation-plan.json @@ -2,7 +2,7 @@ "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "oscar_party", diff --git a/evals/create-full-stack-app/fixtures/first-preview-movies.foundation-plan.json b/evals/create-full-stack-app/fixtures/first-preview-movies.foundation-plan.json index f4be869..4eee0a0 100644 --- a/evals/create-full-stack-app/fixtures/first-preview-movies.foundation-plan.json +++ b/evals/create-full-stack-app/fixtures/first-preview-movies.foundation-plan.json @@ -2,7 +2,7 @@ "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "movie_preview", diff --git a/evals/create-full-stack-app/fixtures/issues-found-analysis.json b/evals/create-full-stack-app/fixtures/issues-found-analysis.json index bc59103..daa5ed2 100644 --- a/evals/create-full-stack-app/fixtures/issues-found-analysis.json +++ b/evals/create-full-stack-app/fixtures/issues-found-analysis.json @@ -6,19 +6,19 @@ "analysis": { "id": "01900000-0000-7000-8000-000000000901", "graph_version": 1, - "head_source_sha256": "603567c344fe5b0e46d20eeec229c5a2726fa1b4212467dc713c38295b2df85f", - "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", + "head_source_sha256": "feb7d2d716b98fc2fb3c84f4c261e84ff683d1ba553d28430eb3dc682818c9f9", + "analyzer_release": "foundation-plan-rails/application-2026-10-20-rails-8-1-4", + "compiler_release": "foundation-plan-rails/compiler-application-2026-10-20-rails-8-1-4", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "status": "issues_found", "diagnostics": [ { "code": "foundation_plan.identity.reserved_constant_collision", "severity": "error", - "message": "Rails target profile \"rails-sketch/2026-09-bookmark-assets\" reserves top-level constant \"String\", generated by Entity \"string\".", + "message": "Rails target profile \"rails-sketch/2026-10\" reserves top-level constant \"String\", generated by Entity \"string\".", "location": { "source_pointer": "/application/entities/0/key" }, diff --git a/evals/create-full-stack-app/fixtures/mixed-application-issues-analysis.json b/evals/create-full-stack-app/fixtures/mixed-application-issues-analysis.json index 598c7f2..5105647 100644 --- a/evals/create-full-stack-app/fixtures/mixed-application-issues-analysis.json +++ b/evals/create-full-stack-app/fixtures/mixed-application-issues-analysis.json @@ -6,12 +6,12 @@ "analysis": { "id": "01900000-0000-7000-8000-000000000907", "graph_version": 1, - "head_source_sha256": "00723c6e838dcd4c1c2ed96d2a82c64806843b619cbba6edf63dede4d829ba15", - "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", + "head_source_sha256": "5073839c3174aebf1d1377f315fb30358f793ea6bad5541c315190e55971295d", + "analyzer_release": "foundation-plan-rails/application-2026-10-20-rails-8-1-4", + "compiler_release": "foundation-plan-rails/compiler-application-2026-10-20-rails-8-1-4", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "status": "issues_found", "diagnostics": [ diff --git a/evals/create-full-stack-app/fixtures/mixed-application-issues.foundation-plan.json b/evals/create-full-stack-app/fixtures/mixed-application-issues.foundation-plan.json index 5637559..2a401a6 100644 --- a/evals/create-full-stack-app/fixtures/mixed-application-issues.foundation-plan.json +++ b/evals/create-full-stack-app/fixtures/mixed-application-issues.foundation-plan.json @@ -2,7 +2,7 @@ "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "movie_catalog", diff --git a/evals/create-full-stack-app/fixtures/reconcile-habits.foundation-plan.json b/evals/create-full-stack-app/fixtures/reconcile-habits.foundation-plan.json index 09aa08a..6c6ffab 100644 --- a/evals/create-full-stack-app/fixtures/reconcile-habits.foundation-plan.json +++ b/evals/create-full-stack-app/fixtures/reconcile-habits.foundation-plan.json @@ -2,7 +2,7 @@ "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "workshop_habits", diff --git a/evals/create-full-stack-app/fixtures/recurring-issues-analysis.json b/evals/create-full-stack-app/fixtures/recurring-issues-analysis.json index 706863e..80a4360 100644 --- a/evals/create-full-stack-app/fixtures/recurring-issues-analysis.json +++ b/evals/create-full-stack-app/fixtures/recurring-issues-analysis.json @@ -6,12 +6,12 @@ "analysis": { "id": "01900000-0000-7000-8000-000000000904", "graph_version": 2, - "head_source_sha256": "ce6c5037e410718e871eecd89f9ce55797fdb88e27a13ce19a7eeb91ba30d032", - "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", + "head_source_sha256": "cb1b559139359872ad8ea13ae716f759e9b853967b5d46104821beaa387e3d70", + "analyzer_release": "foundation-plan-rails/application-2026-10-20-rails-8-1-4", + "compiler_release": "foundation-plan-rails/compiler-application-2026-10-20-rails-8-1-4", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "status": "issues_found", "diagnostics": [ diff --git a/evals/create-full-stack-app/fixtures/recurring-issues.foundation-plan.json b/evals/create-full-stack-app/fixtures/recurring-issues.foundation-plan.json index 3de08e2..e076197 100644 --- a/evals/create-full-stack-app/fixtures/recurring-issues.foundation-plan.json +++ b/evals/create-full-stack-app/fixtures/recurring-issues.foundation-plan.json @@ -2,7 +2,7 @@ "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "movies", diff --git a/evals/create-full-stack-app/fixtures/redirect-movies.foundation-plan.json b/evals/create-full-stack-app/fixtures/redirect-movies.foundation-plan.json index 232e59f..a9fd406 100644 --- a/evals/create-full-stack-app/fixtures/redirect-movies.foundation-plan.json +++ b/evals/create-full-stack-app/fixtures/redirect-movies.foundation-plan.json @@ -2,7 +2,7 @@ "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "rating_returns", diff --git a/evals/create-full-stack-app/fixtures/reserved-constant.foundation-plan.json b/evals/create-full-stack-app/fixtures/reserved-constant.foundation-plan.json index 21e7dec..333dbf9 100644 --- a/evals/create-full-stack-app/fixtures/reserved-constant.foundation-plan.json +++ b/evals/create-full-stack-app/fixtures/reserved-constant.foundation-plan.json @@ -2,7 +2,7 @@ "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "movies", diff --git a/evals/create-full-stack-app/fixtures/resume-current.foundation-plan.json b/evals/create-full-stack-app/fixtures/resume-current.foundation-plan.json index 2c59363..7c1006a 100644 --- a/evals/create-full-stack-app/fixtures/resume-current.foundation-plan.json +++ b/evals/create-full-stack-app/fixtures/resume-current.foundation-plan.json @@ -2,7 +2,7 @@ "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "movies", diff --git a/evals/create-full-stack-app/fixtures/schema-invalid.foundation-plan.txt b/evals/create-full-stack-app/fixtures/schema-invalid.foundation-plan.txt index b57f2e2..96a19b2 100644 --- a/evals/create-full-stack-app/fixtures/schema-invalid.foundation-plan.txt +++ b/evals/create-full-stack-app/fixtures/schema-invalid.foundation-plan.txt @@ -2,7 +2,7 @@ "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "Movie Catalog", diff --git a/evals/create-full-stack-app/fixtures/superseded-analysis.json b/evals/create-full-stack-app/fixtures/superseded-analysis.json index 4ac840d..b7c0954 100644 --- a/evals/create-full-stack-app/fixtures/superseded-analysis.json +++ b/evals/create-full-stack-app/fixtures/superseded-analysis.json @@ -6,12 +6,12 @@ "analysis": { "id": "01900000-0000-7000-8000-000000000903", "graph_version": 2, - "head_source_sha256": "9f07c5b77e6dc96c2cd733ac04781abd5b5bfc6ea336a36c4f49a0116bd7f47e", - "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", + "head_source_sha256": "27d8d5cf60c5bc64496139d52559de130714fa5dd5e9e741921da4bffce297c2", + "analyzer_release": "foundation-plan-rails/application-2026-10-20-rails-8-1-4", + "compiler_release": "foundation-plan-rails/compiler-application-2026-10-20-rails-8-1-4", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "status": "superseded", "diagnostics": [], diff --git a/evals/create-full-stack-app/fixtures/supported-enum.foundation-plan.json b/evals/create-full-stack-app/fixtures/supported-enum.foundation-plan.json index 5d43c93..cc9df7a 100644 --- a/evals/create-full-stack-app/fixtures/supported-enum.foundation-plan.json +++ b/evals/create-full-stack-app/fixtures/supported-enum.foundation-plan.json @@ -2,7 +2,7 @@ "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "ranked_tasks", diff --git a/evals/create-full-stack-app/fixtures/supported-scalars.foundation-plan.json b/evals/create-full-stack-app/fixtures/supported-scalars.foundation-plan.json index 9ef544e..a3578dd 100644 --- a/evals/create-full-stack-app/fixtures/supported-scalars.foundation-plan.json +++ b/evals/create-full-stack-app/fixtures/supported-scalars.foundation-plan.json @@ -2,7 +2,7 @@ "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "movies", diff --git a/evals/create-full-stack-app/fixtures/theme-toggle-analysis.json b/evals/create-full-stack-app/fixtures/theme-toggle-analysis.json index 7e04c33..0174af5 100644 --- a/evals/create-full-stack-app/fixtures/theme-toggle-analysis.json +++ b/evals/create-full-stack-app/fixtures/theme-toggle-analysis.json @@ -6,31 +6,31 @@ "analysis": { "id": "01900000-0000-7000-8000-000000000909", "graph_version": 1, - "head_source_sha256": "d9c3fe7a339e0fe9074e13fe3f24faf27ab4cfd5c428be0bcf13f19dfb34665b", - "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", + "head_source_sha256": "3059c98470e8803daf1b819ba85b4ab36ac9e0951b6d9efca5e30337167a8d44", + "analyzer_release": "foundation-plan-rails/application-2026-10-20-rails-8-1-4", + "compiler_release": "foundation-plan-rails/compiler-application-2026-10-20-rails-8-1-4", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "status": "valid", "diagnostics": [], "gap_set": { "format": "firstdraft.foundation-gaps/2", "source": { - "sha256": "d9c3fe7a339e0fe9074e13fe3f24faf27ab4cfd5c428be0bcf13f19dfb34665b" + "sha256": "3059c98470e8803daf1b819ba85b4ab36ac9e0951b6d9efca5e30337167a8d44" }, "project": { "id": "01900000-0000-7000-8000-000000000024", "graph_version": 1 }, "analysis": { - "release": "foundation-plan-rails/application-2026-09-28-controller-create-context" + "release": "foundation-plan-rails/application-2026-10-20-rails-8-1-4" }, - "compiler_release": "foundation-plan-rails/compiler-application-2026-09-28-controller-create-context", + "compiler_release": "foundation-plan-rails/compiler-application-2026-10-20-rails-8-1-4", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "gaps": [ { @@ -55,7 +55,7 @@ } ] }, - "gap_set_sha256": "f35279796f263ebbca731782444a38be445def7ff3606fc5c5b2cba265be63b8", + "gap_set_sha256": "96c179ea9b63477f7ce3f97926096bf04a089aeb95be35488e800740ff81882b", "started_at": "2026-07-30T12:03:00.000Z", "completed_at": "2026-07-30T12:03:01.000Z" } diff --git a/evals/create-full-stack-app/fixtures/theme-toggle.foundation-plan.json b/evals/create-full-stack-app/fixtures/theme-toggle.foundation-plan.json index 688e9a9..cfd5749 100644 --- a/evals/create-full-stack-app/fixtures/theme-toggle.foundation-plan.json +++ b/evals/create-full-stack-app/fixtures/theme-toggle.foundation-plan.json @@ -2,7 +2,7 @@ "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "movie_catalog", diff --git a/evals/create-full-stack-app/fixtures/unsupported-field-capabilities.foundation-plan.json b/evals/create-full-stack-app/fixtures/unsupported-field-capabilities.foundation-plan.json index 665bb7c..9a0d631 100644 --- a/evals/create-full-stack-app/fixtures/unsupported-field-capabilities.foundation-plan.json +++ b/evals/create-full-stack-app/fixtures/unsupported-field-capabilities.foundation-plan.json @@ -2,7 +2,7 @@ "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "movies", diff --git a/evals/create-full-stack-app/fixtures/unsupported-graph-analysis.json b/evals/create-full-stack-app/fixtures/unsupported-graph-analysis.json index ee7ab08..6e0ab5c 100644 --- a/evals/create-full-stack-app/fixtures/unsupported-graph-analysis.json +++ b/evals/create-full-stack-app/fixtures/unsupported-graph-analysis.json @@ -6,31 +6,31 @@ "analysis": { "id": "01900000-0000-7000-8000-000000000908", "graph_version": 1, - "head_source_sha256": "3318da62e564ae5b8e6e3f549912354396dbe7b5e694c10a12e2e589ce0ba125", - "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", + "head_source_sha256": "07632ddbc0233cc80b91d39ea423d1b6698d7143085a79f448b3b9ad060e60db", + "analyzer_release": "foundation-plan-rails/application-2026-10-20-rails-8-1-4", + "compiler_release": "foundation-plan-rails/compiler-application-2026-10-20-rails-8-1-4", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "status": "valid", "diagnostics": [], "gap_set": { "format": "firstdraft.foundation-gaps/2", "source": { - "sha256": "3318da62e564ae5b8e6e3f549912354396dbe7b5e694c10a12e2e589ce0ba125" + "sha256": "07632ddbc0233cc80b91d39ea423d1b6698d7143085a79f448b3b9ad060e60db" }, "project": { "id": "01900000-0000-7000-8000-000000000023", "graph_version": 1 }, "analysis": { - "release": "foundation-plan-rails/application-2026-09-28-controller-create-context" + "release": "foundation-plan-rails/application-2026-10-20-rails-8-1-4" }, - "compiler_release": "foundation-plan-rails/compiler-application-2026-09-28-controller-create-context", + "compiler_release": "foundation-plan-rails/compiler-application-2026-10-20-rails-8-1-4", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "gaps": [ { @@ -55,7 +55,7 @@ } ] }, - "gap_set_sha256": "2a81b30fe6903beb7de5757c44dc443a6c40794968ee7ab7e5230f4312b56cce", + "gap_set_sha256": "52547412bf16fc888b221e3afb8761e805a0a931c1585bd0e78f7a4e7b7f5aed", "started_at": "2026-07-30T12:04:00.000Z", "completed_at": "2026-07-30T12:04:01.000Z" } diff --git a/package-lock.json b/package-lock.json index 8283bb5..9d72544 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@firstdraft/skills", - "version": "0.8.17", + "version": "0.9.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@firstdraft/skills", - "version": "0.8.17", + "version": "0.9.0", "license": "MIT", "devDependencies": { "ajv": "8.20.0" diff --git a/package.json b/package.json index 28c40f1..3846386 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@firstdraft/skills", - "version": "0.8.17", + "version": "0.9.0", "description": "Portable Agent Skills for First Draft", "license": "MIT", "private": true, diff --git a/packages/claude-plugin/.claude-plugin/plugin.json b/packages/claude-plugin/.claude-plugin/plugin.json index b21f664..b59af66 100644 --- a/packages/claude-plugin/.claude-plugin/plugin.json +++ b/packages/claude-plugin/.claude-plugin/plugin.json @@ -2,7 +2,7 @@ "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json", "name": "firstdraft", "displayName": "First Draft", - "version": "0.8.17", + "version": "0.9.0", "description": "Author a Foundation Plan and compile a bounded Rails, iPhone, and Android application", "author": { "name": "First Draft", diff --git a/packages/claude-plugin/package.template.json b/packages/claude-plugin/package.template.json index 756e472..98ec8a8 100644 --- a/packages/claude-plugin/package.template.json +++ b/packages/claude-plugin/package.template.json @@ -1,6 +1,6 @@ { "name": "@firstdraft.com/claude-code", - "version": "0.8.17", + "version": "0.9.0", "description": "First Draft Foundation Plan authoring and Compilation for Claude Code and Codex", "license": "MIT", "type": "module", diff --git a/release/compatibility.json b/release/compatibility.json index da028d3..8d90a55 100644 --- a/release/compatibility.json +++ b/release/compatibility.json @@ -1,18 +1,18 @@ { "format": "firstdraft.release-compatibility/1", "component": "skills", - "version": "0.8.17", + "version": "0.9.0", "plugin_source": { "package": "@firstdraft.com/claude-code", "tarball_sha256": "ad602693013c87a0a549bf1d7023e15bb100dc1fd25be3b4467bcc8b32c0e439" }, "requires": { "api_contract": [ - ">= 0.7.0", - "< 0.8.0" + ">= 0.8.0", + "< 0.9.0" ], "cli": [ - "= 0.8.2" + "= 0.9.0" ], "foundation_plan_formats": [ "firstdraft.foundation-plan.sketch/0.23" diff --git a/script/cli-contract/config.mjs b/script/cli-contract/config.mjs index 7bea199..9cd49bd 100644 --- a/script/cli-contract/config.mjs +++ b/script/cli-contract/config.mjs @@ -1,10 +1,10 @@ import { readFileSync } from "node:fs"; -export const cliRevision = "92f27714fecf45c44b19c52ed811889c5b81d5ae"; +export const cliRevision = "a71962a4f4643d0a1835a2309a29a21268ba61c0"; export const cliRuntimeSha256 = - "d222a231e864151f33e074b08204a2c3457910b0a84637e61ba1103b2206f926"; + "502b8d7502641e4109c12b312c1b51a9f89fef106cee1f94967c39c4873ab856"; export const cliPackageName = "@firstdraft.com/cli"; -export const cliPackageVersion = "0.8.2"; +export const cliPackageVersion = "0.9.0"; export const safeGithubReasonCodes = Object.freeze([ "github.configuration_missing", @@ -46,12 +46,12 @@ export const [foundationPlanFormat] = JSON.parse( readFileSync(new URL("../../release/compatibility.json", import.meta.url), "utf8"), ).requires.foundation_plan_formats; export const analyzerRelease = - "foundation-plan-rails/application-2026-09-28-controller-create-context"; + "foundation-plan-rails/application-2026-10-20-rails-8-1-4"; export const compilerRelease = - "foundation-plan-rails/compiler-application-2026-09-28-controller-create-context"; + "foundation-plan-rails/compiler-application-2026-10-20-rails-8-1-4"; export const compilationTarget = { id: "rails", - profile: "rails-sketch/2026-09-bookmark-assets", + profile: "rails-sketch/2026-10", }; export const artifactMediaType = "application/vnd.firstdraft.compilation-artifact+json"; diff --git a/script/cli-contract/fixtures.mjs b/script/cli-contract/fixtures.mjs index 21ffde1..e602462 100644 --- a/script/cli-contract/fixtures.mjs +++ b/script/cli-contract/fixtures.mjs @@ -39,7 +39,7 @@ export function analysisProjection( graphVersion = 1, identifier = analysisId, headSourceSha256 = - "b7369e48d1e01418a045d82b1a46e1b4a24b1d472ed20add0af46d402fea39fc", + "f5efede3cda3261314601358bab6e189959c74cefec10418a2be2eb47f73552d", gaps = [], } = {}, ) { diff --git a/skills/create-full-stack-app/SKILL.md b/skills/create-full-stack-app/SKILL.md index e4d9dc3..be65b54 100644 --- a/skills/create-full-stack-app/SKILL.md +++ b/skills/create-full-stack-app/SKILL.md @@ -23,7 +23,7 @@ explicit handoff. Follow [writing notes](references/modeling-guide.md#retain-imp ## Current boundary -Targets plugin 0.8.17, CLI 0.8.2, API 0.7, Plan 0.23; catalog selection is separate. +Targets plugin 0.9.0, CLI 0.9.0, API 0.8, 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, @@ -117,6 +117,8 @@ firstdraft_cli generate application-key --name "" If initialization fails, follow the stable error in the recovery reference. Preserve any partial `.firstdraft/` directory. If `.firstdraft/` already exists, read the Plan, resume its Project and subject identities, and do not reinitialize. Inspect private state only for a recovery check explicitly named in the recovery reference. +A Plan whose `target.profile` is not `rails-sketch/2026-10` belongs to a retired profile; follow +[retired target profile](references/diagnostics-and-recovery.md#retired-target-profile) instead of pushing it. ## Interview and author incrementally diff --git a/skills/create-full-stack-app/references/diagnostics-and-recovery.md b/skills/create-full-stack-app/references/diagnostics-and-recovery.md index 42d9a45..81f12d2 100644 --- a/skills/create-full-stack-app/references/diagnostics-and-recovery.md +++ b/skills/create-full-stack-app/references/diagnostics-and-recovery.md @@ -8,8 +8,8 @@ JSON object. An unrecognized prefixed line, a progress line after the envelope, interleaved output fail closed. Branch on the object's stable `error` and structured fields rather than the 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.17/script/cli-contract/config.mjs) +This plugin bundles `@firstdraft.com/cli@0.9.0`. Its exact reviewed revision and runtime digest are owned by +[the CLI contract configuration](https://github.com/firstdraft/skills/blob/claude-v0.9.0/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. @@ -42,7 +42,7 @@ Plans resumed without the flag. Each request uses the credential for its exact origin: `FIRSTDRAFT_API_TOKEN` for production and custom servers, or `FIRSTDRAFT_STAGING_API_TOKEN` for staging, when set; otherwise the token `firstdraft login` saved for that origin. The CLI never sends one environment's credential to another. The usual setup is one login per environment, -which the user runs in their own terminal: `npx --yes @firstdraft.com/cli@0.8.2 login`, with `--staging` added for +which the user runs in their own terminal: `npx --yes @firstdraft.com/cli@0.9.0 login`, with `--staging` added for staging, or `firstdraft login` from an installed CLI. It prints a URL to approve in a browser; on a machine without one, `--interactive` shows a device code to approve elsewhere. The login is saved outside the project, so every session and client on the machine shares it. @@ -122,6 +122,32 @@ After `wait_timed_out`, `analysis_changed`, or a validated `superseded` result, follow-up may report the Project's current state. This follow-up is report-only: do not treat a replacement analysis as the submitted candidate, and do not edit, push, or Compile the replacement. +### Retired target profile + +A Project keeps the target profile it was created with, and this plugin's CLI and First Draft accept only +`rails-sketch/2026-10`. A Plan or Project that names an earlier profile fails at `/target/profile`: + +| Diagnostic code | Meaning | +| --- | --- | +| `foundation_plan.schema.const` | The Plan still names an earlier profile. | +| `foundation_plan.import.target_profile_mismatch` | The Plan names the current profile, but its Project was created with an earlier one. | +| `foundation_plan.analysis.unsupported_target_profile` | The Project was created with an earlier profile. | + +Retrying or editing only the profile cannot fix this. With the user's agreement, start a new Project for the same +Plan: + +1. In the planning directory, which is `.firstdraft/design/` after root adoption, rename `.firstdraft` to a name such + as `.firstdraft-retired-profile`. Keep it: it holds the old Plan and the old Project's private state. +2. Run `plan init` with the old Plan's `application.name` and `application.key`. It creates a new Project identity + and an empty Plan that targets `rails-sketch/2026-10`. +3. Replace the new empty Plan with the old Plan, changing only `target.profile` to `rails-sketch/2026-10`. Keep + every subject UUID. +4. Push and wait for analysis as usual. The new profile can change the GapSet, so read it back again before Compile. + +A Compile in the new Project does not upgrade an application generated under the earlier profile. From +`.firstdraft/design/`, select an absent `--output` path, then bring what the user wants into the existing +application through ordinary development. + ## Product Compile Use these terms when explaining the workflow: @@ -516,7 +542,7 @@ or provenance-changing response requires reconciling the CLI and service contrac 4. requires the envelope's `head_source_sha256` to equal the retained `compilation.head_source_sha256`; 5. verifies transport metadata and exact bytes against the retained artifact digest, then validates Plan format - `firstdraft.foundation-plan.sketch/0.23`, target profile `rails-sketch/2026-09-bookmark-assets`, the canonical Foundation Plan + `firstdraft.foundation-plan.sketch/0.23`, target profile `rails-sketch/2026-10`, the canonical Foundation Plan digest, envelope, manifest, paths, modes, Base64 contents, and file digests; and 6. installs an absent private sibling tree with one atomic rename, or applies direct Compile's [current-root transaction and CLI compatibility boundary](#direct-local-output). diff --git a/skills/create-full-stack-app/references/examples.md b/skills/create-full-stack-app/references/examples.md index b989caf..8cb6e45 100644 --- a/skills/create-full-stack-app/references/examples.md +++ b/skills/create-full-stack-app/references/examples.md @@ -30,7 +30,7 @@ smallest subset accepted by the reviewed conditional PUT. "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "oscar_party", @@ -49,7 +49,7 @@ that the application model is still empty. ## Bounded Rails and iOS application -This complete document is the smallest canonical `rails-sketch/2026-09-bookmark-assets` Rails and iOS success candidate. It +This complete document is the smallest canonical `rails-sketch/2026-10` Rails and iOS success candidate. It requests one read-only public web index and one selected iPhone project with the same navigation label and semantic icon. The domain supplies the native HTTPS origin and identifier prefix, plus the Rails production mailer host. The required title Field supplies the human-facing Primary Descriptor. The prepared analyzer is designed to @@ -60,7 +60,7 @@ return `valid`; that result is still only the Compilation gate, not proof that o "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "movie_catalog", @@ -290,7 +290,7 @@ when the value is `false`; omitting it from the optional Details Field would be "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "tasks", @@ -341,7 +341,7 @@ accepted by the reviewed bounded importer. Here, priority order carries semantic "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "ranked_tasks", @@ -441,7 +441,7 @@ choice emits. "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "member_directory", @@ -776,7 +776,7 @@ Association. The forward `task.project` Association is derived and therefore omi "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": { "key": "project_tasks", diff --git a/skills/create-full-stack-app/references/foundation-plan-0.23.schema.json b/skills/create-full-stack-app/references/foundation-plan-0.23.schema.json index a1b21ec..5708bdb 100644 --- a/skills/create-full-stack-app/references/foundation-plan-0.23.schema.json +++ b/skills/create-full-stack-app/references/foundation-plan-0.23.schema.json @@ -99,7 +99,7 @@ "profile": { "title": "Target profile", "description": "Pins the release of target defaults, supported lowerings, and verification expectations.", - "const": "rails-sketch/2026-09-bookmark-assets" + "const": "rails-sketch/2026-10" } } }, diff --git a/skills/create-full-stack-app/references/foundation-plan-023.md b/skills/create-full-stack-app/references/foundation-plan-023.md index 332c0af..441dfc8 100644 --- a/skills/create-full-stack-app/references/foundation-plan-023.md +++ b/skills/create-full-stack-app/references/foundation-plan-023.md @@ -42,7 +42,7 @@ generated output, not observed application behavior, device installation, or dep **Current design and machine authority** - The bundled JSON Schema owns v0.23 transport shape. This reference describes the bounded - `rails-sketch/2026-09-bookmark-assets` behavior; the public [Rails target profile](https://firstdraft.github.io/firstdraft/docs/architecture/targets/rails/profile.html) + `rails-sketch/2026-10` behavior; the public [Rails target profile](https://firstdraft.github.io/firstdraft/docs/architecture/targets/rails/profile.html) gives lowering details. The public guide can advance beyond an installed Skill, and neither establishes the deployed service revision. Use the matching results for the submitted Plan. - Read `analyzer_release` and `compiler_release` from the matching Analysis result; Compilation results carry @@ -52,7 +52,7 @@ generated output, not observed application behavior, device installation, or dep - The importer preserves each schema-valid exact source as the Project Head and imports a bounded relational graph. Meaning skipped before semantic analysis remains in the Head and appears as ordered `service_support_gap` records. Admitted meaning that the selected target cannot fully realize appears as `target_support_gap` records. -- Service API 0.7 returns the complete canonical `firstdraft.foundation-gaps/2` object and its SHA-256 for every valid +- Service API 0.8 returns the complete canonical `firstdraft.foundation-gaps/2` object and its SHA-256 for every valid AnalysisRun, including an empty `gaps` array. `valid` applies only to the admitted graph; it is not proof of Compilation or of meaning skipped before analysis. - Current public Compilation has bounded Field, relationship, Validation, Predicate, Ordering, State Machine, @@ -76,18 +76,18 @@ generated output, not observed application behavior, device installation, or dep The bundled schema was copied byte-for-byte from `docs/architecture/design/foundation-plan.schema.json` at Service revision -`806090dd36113c856fbd63d702ee74e353e9a7e2` and has SHA-256 -`242889fae4e1031f3be7aa3d226a9966402e7516f0055f506bb40ce05d1430dd`. This is exact contract provenance, not +`43a80d35c371e876ec133e8da36abeaebc61dce8` and has SHA-256 +`1a47a87b31491c3ac0cad5801bb0bd3232b4666faad1d223f5b351da47a41681`. This is exact contract provenance, not release or execution evidence. This plugin's bundled CLI and pinned contract check use the exact reviewed CLI revision and runtime digest in -[the CLI contract configuration](https://github.com/firstdraft/skills/blob/claude-v0.8.17/script/cli-contract/config.mjs) +[the CLI contract configuration](https://github.com/firstdraft/skills/blob/claude-v0.9.0/script/cli-contract/config.mjs) at this plugin's protected release tag, as contract provenance rather than release or execution evidence. The CLI exposes `generate uuid`, `generate application-key`, `plan init`, `plan push`, `plan status`, local `plan compile` (equivalent to `--output .`), explicit `plan compile --github`, `plan compile --output`, `compilation status`, `compilation download`, `compilation cancel`, and the user-run `login` and `logout`. It has no public `plan subject-id` or `plan publish`. The coordinated checkout declares the -`@firstdraft.com/cli@0.8.2` package. Direct output accepts the ordinary absent destination and, on POSIX, +`@firstdraft.com/cli@0.9.0` package. Direct output accepts the ordinary absent destination and, on POSIX, current-root adoption by default or with `--output .`; the recovery reference owns its preconditions. Check commands rather than inferring compatibility from a version number. These source checks do not prove plugin/catalog publication, authentication, staging compatibility, or a complete user journey. @@ -133,7 +133,7 @@ The root contains exactly three required properties: "format": "firstdraft.foundation-plan.sketch/0.23", "target": { "id": "rails", - "profile": "rails-sketch/2026-09-bookmark-assets" + "profile": "rails-sketch/2026-10" }, "application": {} } diff --git a/test/repository.test.mjs b/test/repository.test.mjs index 0de1889..03f39cb 100644 --- a/test/repository.test.mjs +++ b/test/repository.test.mjs @@ -43,9 +43,9 @@ const reviewedFixtureAnalyzerRelease = "foundation-plan-rails/application-2026-08-28-reviewed-realization"; const reviewedFixtureCompilerRelease = "foundation-plan-rails/compiler-application-2026-08-28-reviewed-realization"; -const currentFoundationPlanServiceBaseline = "806090dd36113c856fbd63d702ee74e353e9a7e2"; +const currentFoundationPlanServiceBaseline = "43a80d35c371e876ec133e8da36abeaebc61dce8"; const foundationPlanSchemaDigest = - "242889fae4e1031f3be7aa3d226a9966402e7516f0055f506bb40ce05d1430dd"; + "1a47a87b31491c3ac0cad5801bb0bd3232b4666faad1d223f5b351da47a41681"; const currentFoundationPlanSchemaBaseline = currentFoundationPlanServiceBaseline; const prettyJsonSha256 = (value) => createHash("sha256") diff --git a/test/ui-foundation-authoring.test.mjs b/test/ui-foundation-authoring.test.mjs index fb87782..6379b3e 100644 --- a/test/ui-foundation-authoring.test.mjs +++ b/test/ui-foundation-authoring.test.mjs @@ -98,7 +98,7 @@ test("the bundled Plan contract replaces the previous input identity", () => { const validatePlan = ajv.getSchema(schema.$id); const plan = { format: foundationPlanFormat, - target: { id: "rails", profile: "rails-sketch/2026-09-bookmark-assets" }, + target: { id: "rails", profile: "rails-sketch/2026-10" }, application: { key: "theme_app", name: "Theme App", native: {}, delivery: {}, entities: [], appearance: { theme: "toggle" } }, }; assert(validatePlan(plan));