Skip to content

Prism 0.4.0

Choose a tag to compare

@github-actions github-actions released this 06 Oct 06:24
· 38 commits to main since this release

Release date: 2026-10-06

Prism 0.4.0 replaces the five fixed platforms with an application model that the workspace declares: prism.workspace.yml is schema_version: 2 and lists repositories and apps, and features, lifecycle gates, status, the board and the graph read apps and their capabilities. The wiki schema is split into SCHEMA.md and LIFECYCLE.md. A workflow-only workspace can be a knowledge root that holds the shared wiki for apps in other repositories. Prism has no users of earlier versions, so workspaces created with 0.3.0 or earlier must be recreated; there is no upgrade path.

Added

  • Knowledge-root workspaces. prism workflow install PATH --name NAME --knowledge-root starts a workflow-only workspace with no apps that holds the shared wiki for apps living in other repositories, and records workflow.purpose: knowledge-root beside workflow.mode: workflow. The option belongs to install, starts a new workspace and cannot be combined with --app; register the external apps with prism app add --repository … --remote … and map their checkouts in prism.local.yml. The purpose is optional and has one valid value, and any other value (or a purpose on a generated workspace) is the error invalid-workflow-purpose. No gate reads it. prism status shows Purpose: knowledge root and says there are no features yet, workspace.purpose appears in prism status --json, prism wiki lint --json, the wiki queries and the graph (and board.purpose in the board's discover) for a knowledge root only, the board page shows a "no features yet" guide, and the installed AGENTS.md and CLAUDE.md describe the workspace as a knowledge root with the coordination contract for external repositories. The guidance comes from the "Connected board workflow" section of the root guidance templates through a knowledge_root condition (knowledge_root_pointers is new in the packaged workflow asset). With no features, with or without external apps, prism wiki lint, prism validate, prism status, prism doctor --workspace and the board pass; an external repository without a checkout is one warning. docs/workspace-model.md has the worked example and the README quickstart one line about it.
  • prism presets lists workflow presets. The knowledge root is listed with its command under "Workflow presets", apart from the generation presets, and prism presets --json (new) returns generation_presets and workflow_presets.
  • prism app list and prism app add. prism app list [PATH] [--json] shows the workspace's apps and repositories. prism app add ID --stack STACK previews, and with --apply (and --yes for automation) writes, one app in prism.workspace.yml, with --name, --repository, --remote, --path, --audience, --has-ui and --serves-api. It never generates code. --remote declares a new external repository together with its first app, an other app must declare both capabilities, and a path in this repository that does not exist yet is a warning. The manifest is validated before anything is written; any error writes nothing. The command says that the board identity changed, so a running board must be restarted and grants reissued.
  • The workspace model guide. docs/workspace-model.md describes stacks and capabilities, repositories and prism.local.yml, apps and their fields, the prism app commands, workspaces with no apps and an example with one external repository.
  • prism app retire. prism app retire ID [--apply] [--yes] [--json] [PATH] previews, and with --apply writes, status: retired on one app in prism.workspace.yml, with the same plan, confirmation and write checks as prism app add. It deletes no code, wiki page, requirement page or evidence, lists the features before done that still name the app, and says that the board identity changed (restart the board and reissue grants). An unknown or already retired app is an error that writes nothing. A retired app stays in prism app list, status, the board's apps and the graph, marked retired.
  • Retired apps in feature scope. A retired app stays valid in the apps of a feature that is done. A feature before done that still names it is flagged app-retired-in-scope: lint reports an error and every lifecycle action on that feature is blocked with that code until its apps is edited explicitly (retirement never changes scope by itself). A new feature, or an edit that adds a retired app to a scope, is rejected with app-retired (app_retired on the board; app_retired_in_scope for a lifecycle proposal on a flagged feature). Adding an app never changes an existing feature's apps.
  • API work needs an app that serves an API. When a feature's ## API surface declares API work, at least one active app in its apps must have serves-api (unknown counts as true). Lint reports api-surface-without-api-app for features before done, the design-handoff, dev-start and dev-done transition checks block with that code, and the board rejects a design-handoff proposal with api_surface_without_api_app.

Changed

  • min_prism_cli_version follows the package version. A manifest written by prism new, prism update or prism workflow install names the running CLI's version as its minimum, and the template renders that value from the version the CLI passes to Copier. A Copier run without the CLI names no minimum (0.0.0). During prism update the saved template renders with the version recorded in the manifest's generated_by, so an unedited minimum advances with the template and an edited one is reported as a competing edit.
  • The packaged skills require prism-kit>=0.4.0. The wiki, lint, status and sprint-preparation skills and the Cursor wiki rule use commands that 0.4.0 introduced, so their CLI probe accepts prism 0.4.0 or newer.
  • prism.workspace.yml is now schema_version: 2, and earlier manifests are not supported. The manifest lists repositories (the workspace itself needs no entry; each other repository has a canonical remote), apps (an ID, a name, a stack from the registry, a repository, a repository-relative path, an optional audience, status and capability overrides) and app_maturity keyed by app ID. project.platforms and platform_maturity are gone. A version-1 manifest is refused with unsupported-workspace-manifest-schema; recreate or reinstall the workspace with this CLI. prism new, prism workflow install and prism update write version 2: the questionnaire's platforms and the --app choices become apps (ID, matching stack, default directory, repository workspace). On a workspace that already declares apps, --app may only name those same apps; register another with prism app add.
  • One normalizer reads the manifest. The new prism_cli/app_model.py holds the stack registry (spring-backend, nextjs-web, android-compose, ios-swiftui, other, with the has-ui and serves-api capabilities) and validates repositories and apps with stable error codes. Workspace inspection, status, the board service and its identity, workflow install and prism update all read the manifest through it. An external repository without a checkout in the untracked prism.local.yml is one external-repository-unresolved warning, never an error.
  • Workspace output reports apps instead of platforms. The workspace object of prism status --json, prism wiki lint --json, the wiki query commands and the graph, and the board object of the board's discover, list every app with id, name, stack, repository, path, audience (or null), status, capabilities (has-ui and serves-api, each true, false or "unknown") and maturity (the app_maturity entry or null). workspace.platforms, workspace.platform_maturity and board.platforms are gone. prism status --json also reports workspace.repositories (id, remote and, for an external repository, checkout as resolved or unresolved, never the local path). The packaged JSON schemas describe the new shape. prism status and prism doctor --workspace show an apps table (ID, name, stack, repository, path, status, maturity) and one line per external repository, and the board page's workspace summary and generated prompts say "apps" and list their IDs.
  • MCP tool contract 3. discover and list_skills report "mcp_contract": 3 because discover returns board.apps where it returned board.platforms. The server instructions and the discover tool description mention the apps.
  • --platform is now --app. prism workflow install and prism workflow upgrade take --app with the five generated app IDs, and --platform is removed. The plan and receipt list apps instead of platforms. A new workspace installed without --app has no apps instead of failing. The questionnaire, presets and prism new keep their platforms answer.
  • Doctor decides relevance by stack. The Docker, JDK and Xcode checks are keyed by the stacks spring-backend, android-compose and ios-swiftui of the workspace's active apps in this repository, or of a preset's platforms. The checks that run for the five generated apps and a preset are the same as before.
  • A workspace with no apps is served with writes enabled. The board no longer treats an empty app scope as read-only (the "explicit nonempty app scope" requirement is gone; a missing project name now gives "A project name is required."). Operations that need an app scope still stop at their own check, and the rejection says that the workspace declares no apps and points to prism app add.
  • prism.local.yml is ignored by git. The generated project's .gitignore lists it, and prism workflow install adds the rule to an existing .gitignore.
  • dev-done needs release evidence or a delivery attestation per app. The Release cell of each delivery evidence row must be release: <reference>, tag: <reference> or deployment: <reference> (the URL of, or a workspace path to, a release, tag or deployment record), or attested by <Name>: <reference> (a URL or path to what the person checked). The prefix is matched without regard to case. A bare commit SHA, a pull-request or merge-request URL, merged, a branch name, free text or a placeholder is rejected with release-evidence-required, because a commit or pull request proves which code changed, not that it shipped. Lint applies the rule to done features, the dev-done transition check reports it as the check release-evidence-required, and the board rejects a dev-done proposal with release_evidence_required. The Implementation and Tests cells keep their rule. An app in an external repository is linked by URL, and an unresolved prism.local.yml entry never blocks evidence given by link. The delivery attestation in the Release cell differs from the attestation in ## Post-ship notes, which stays the developer's statement about references the agent could not verify.
  • The delivery evidence parser returns codes with its problems. parse_delivery_evidence and parse_delivery_evidence_cells return DeliveryProblem entries (code and message) instead of plain strings.
  • The board's query for an app accepts a retired app. wiki app <id> reads a retired app's features as history.
  • The wiki schema is split in two files. knowledge/wiki/SCHEMA.md keeps the directory structure, the non-feature page formats and the general rules and is read before every wiki operation. The new knowledge/wiki/LIFECYCLE.md holds the feature page format, the status and owner lifecycle, the lifecycle action registry and the advisory file formats and is read after SCHEMA.md for feature, board and advisory operations. No rule changed; sections moved verbatim. LIFECYCLE.md is a required wiki file wherever SCHEMA.md is: wiki lint reports missing-required-wiki-file, prism doctor and prism validate fail, and the board does not identify the workspace without it. Every lifecycle skill, the generated guidance and the connected workflow guide name both files, and the board records LIFECYCLE.md in the context reads and source revisions of lifecycle previews. The packaged workflow asset and its digest changed with it.
  • Feature scope uses apps, and the lifecycle gates read capabilities. A feature's apps: front matter (a required list of app IDs of the workspace) replaces platforms:, and every ID must be an app in prism.workspace.yml, whatever its stack, so customer-android and partner-android are two separate scopes. platforms: is now an error (unknown-feature-field), and so is platform: in a requirement page (unknown-requirement-field). The design gates (wiki lint missing-design, the design-handoff and dev-done design checks) ask whether any scoped app has the has-ui capability, where unknown counts as true, instead of a fixed list of five IDs; lint reports each unknown capability once as an information finding, app-capability-unknown. VALID_PLATFORM_IDS and UI_PLATFORM_IDS are gone; the lint, the transitions, the graph and the board read the workspace model. Renames: Feature.platforms is Feature.apps; the folder knowledge/wiki/platform-requirements/ is knowledge/wiki/app-requirements/ (files F-XXX-<app-id>.md, front matter app:); the feature section ## Platform scope is ## App scope; the delivery evidence column Platform is App, and the reopen label Affected platforms is Affected apps; the query kind platform is app (CLI prism wiki platform is prism wiki app <app-id>, prism wiki graph --view platform --platform is --view app --app, the board query kind and the MCP query literal); the skill wiki-platform is wiki-app in .agents/skills/ and .claude/commands/; wiki_platform, ACTIVE_PLATFORM_STATUSES and PlatformRequirementPage are wiki_app, ACTIVE_APP_STATUSES and AppRequirementPage; graph platform nodes are app nodes (app:<id>, titled with the app's name), platform-requirement nodes are app-requirement (areq:<stem>), and the edge evidence frontmatter-platforms is frontmatter-apps; the JSON keys platforms (feature summaries, wiki show and the transition preflight), platform_requirements, platform_requirement_count, platform_requirement_status_counts (status) and platform (requirement summaries, wiki app facts) are apps, app_requirements, app_requirement_count, app_requirement_status_counts and app; the board's details keys platforms, board_platforms and missing_platforms are apps, board_apps and missing_apps; and WorkspaceManifest.platforms, WorkspaceInspection.platforms and the plan_install(..., platforms=) keyword are app_ids, app_ids and apps=. Error codes: lint missing-platform-requirements, cross-platform-dependency, done-platform-requirement, duplicate-platform-requirement, orphan-platform-requirement, missing-platform-requirement-frontmatter, invalid-platform-requirement-feature-id, invalid-platform-requirement-status, invalid-feature-platforms and invalid-platform-id are missing-app-requirements, cross-app-dependency, done-app-requirement, duplicate-app-requirement, orphan-app-requirement, missing-app-requirement-frontmatter, invalid-app-requirement-feature-id, invalid-app-requirement-status, invalid-feature-apps and unknown-app-id; transition checks platform-scope, platform-section and platform-requirements are app-scope, app-section and app-requirements; and the board's reopen_platform_scope is reopen_app_scope. The schemas wiki-query-v1.json, wiki-graph-v1.json and wiki-transition-preflight-v1.json describe the new shapes, and the graph dashboard's Platforms view is the Apps view. The MCP tool contract stays 3.

Fixed

  • The generated iOS UI test no longer fails on slow simulators. It waits until the logout button can be tapped before tapping it, and allows 30 seconds for each screen.

Removed

  • Compatibility code for earlier Prism versions. Prism has no users of earlier versions to carry forward, so what existed only for them is gone: (1) the packaged workflow asset's previous_digests history is empty, and the build script records digests in PREVIOUS_DIGESTS only from the first release that has external users, so prism workflow install and upgrade no longer replace an earlier shipped copy of an installer-owned file, and a copy that differs from the packaged text is preserved or reported as a conflict as before; (2) a workspace without a usable manifest declares no apps and no project name, and prism status, prism wiki lint, the wiki queries, the graph and the transition preflight no longer infer them from .copier-answers.yml or from the generated app directories (missing-workspace-manifest stays a warning, and answers-filesystem-drift is gone); (3) prism workflow install and upgrade no longer read .copier-answers.yml for the project name or the apps, and a folder is a generated workspace only when its manifest says so (generated_by or workflow.mode: generated); (4) the manifest's flat generated_by_prism_cli_version, template_source, template_version, template_commit and generated_at keys are no longer read, only generated_by; (5) the board state database no longer adds the asset_digest column to a grants table that lacks it. In the Python modules, PLATFORM_DIRS of prism_cli.workspace is GENERATED_PLATFORM_DIRS of prism_cli.app_model, prism_cli.cli no longer re-exports the renderers of prism_cli.render, and the unused transition_preflight, evaluate_transitions and LINKED_CONTEXT_DIRECTORIES re-export of prism_cli.wiki_query are removed. The graph's feature nodes no longer carry the singular transition (read transitions), and the board page reads only transition capability version 2.