Repository navigation
Prism 0.4.0
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-rootstarts a workflow-only workspace with no apps that holds the shared wiki for apps living in other repositories, and recordsworkflow.purpose: knowledge-rootbesideworkflow.mode: workflow. The option belongs toinstall, starts a new workspace and cannot be combined with--app; register the external apps withprism app add --repository … --remote …and map their checkouts inprism.local.yml. The purpose is optional and has one valid value, and any other value (or a purpose on a generated workspace) is the errorinvalid-workflow-purpose. No gate reads it.prism statusshowsPurpose: knowledge rootand says there are no features yet,workspace.purposeappears inprism status --json,prism wiki lint --json, the wiki queries and the graph (andboard.purposein the board'sdiscover) for a knowledge root only, the board page shows a "no features yet" guide, and the installedAGENTS.mdandCLAUDE.mddescribe 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 aknowledge_rootcondition (knowledge_root_pointersis new in the packaged workflow asset). With no features, with or without external apps,prism wiki lint,prism validate,prism status,prism doctor --workspaceand the board pass; an external repository without a checkout is one warning.docs/workspace-model.mdhas the worked example and the README quickstart one line about it. prism presetslists workflow presets. The knowledge root is listed with its command under "Workflow presets", apart from the generation presets, andprism presets --json(new) returnsgeneration_presetsandworkflow_presets.prism app listandprism app add.prism app list [PATH] [--json]shows the workspace's apps and repositories.prism app add ID --stack STACKpreviews, and with--apply(and--yesfor automation) writes, one app inprism.workspace.yml, with--name,--repository,--remote,--path,--audience,--has-uiand--serves-api. It never generates code.--remotedeclares a new external repository together with its first app, anotherapp 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.mddescribes stacks and capabilities, repositories andprism.local.yml, apps and their fields, theprism appcommands, 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--applywrites,status: retiredon one app inprism.workspace.yml, with the same plan, confirmation and write checks asprism app add. It deletes no code, wiki page, requirement page or evidence, lists the features beforedonethat 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 inprism app list, status, the board's apps and the graph, markedretired.- Retired apps in feature scope. A retired app stays valid in the
appsof a feature that isdone. A feature beforedonethat still names it is flaggedapp-retired-in-scope: lint reports an error and every lifecycle action on that feature is blocked with that code until itsappsis edited explicitly (retirement never changes scope by itself). A new feature, or an edit that adds a retired app to a scope, is rejected withapp-retired(app_retiredon the board;app_retired_in_scopefor a lifecycle proposal on a flagged feature). Adding an app never changes an existing feature'sapps. - API work needs an app that serves an API. When a feature's
## API surfacedeclares API work, at least one active app in itsappsmust haveserves-api(unknowncounts as true). Lint reportsapi-surface-without-api-appfor features beforedone, thedesign-handoff,dev-startanddev-donetransition checks block with that code, and the board rejects adesign-handoffproposal withapi_surface_without_api_app.
Changed
min_prism_cli_versionfollows the package version. A manifest written byprism new,prism updateorprism workflow installnames 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). Duringprism updatethe saved template renders with the version recorded in the manifest'sgenerated_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 acceptsprism 0.4.0or newer. prism.workspace.ymlis nowschema_version: 2, and earlier manifests are not supported. The manifest listsrepositories(the workspace itself needs no entry; each other repository has a canonicalremote),apps(an ID, a name, astackfrom the registry, arepository, a repository-relativepath, an optionalaudience,statusand capability overrides) andapp_maturitykeyed by app ID.project.platformsandplatform_maturityare gone. A version-1 manifest is refused withunsupported-workspace-manifest-schema; recreate or reinstall the workspace with this CLI.prism new,prism workflow installandprism updatewrite version 2: the questionnaire's platforms and the--appchoices become apps (ID, matching stack, default directory, repositoryworkspace). On a workspace that already declares apps,--appmay only name those same apps; register another withprism app add.- One normalizer reads the manifest. The new
prism_cli/app_model.pyholds the stack registry (spring-backend,nextjs-web,android-compose,ios-swiftui,other, with thehas-uiandserves-apicapabilities) and validates repositories and apps with stable error codes. Workspace inspection, status, the board service and its identity, workflow install andprism updateall read the manifest through it. An external repository without a checkout in the untrackedprism.local.ymlis oneexternal-repository-unresolvedwarning, never an error. - Workspace output reports
appsinstead ofplatforms. Theworkspaceobject ofprism status --json,prism wiki lint --json, the wiki query commands and the graph, and theboardobject of the board'sdiscover, list every app withid,name,stack,repository,path,audience(ornull),status,capabilities(has-uiandserves-api, eachtrue,falseor"unknown") andmaturity(theapp_maturityentry ornull).workspace.platforms,workspace.platform_maturityandboard.platformsare gone.prism status --jsonalso reportsworkspace.repositories(id,remoteand, for an external repository,checkoutasresolvedorunresolved, never the local path). The packaged JSON schemas describe the new shape.prism statusandprism doctor --workspaceshow 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.
discoverandlist_skillsreport"mcp_contract": 3becausediscoverreturnsboard.appswhere it returnedboard.platforms. The server instructions and thediscovertool description mention the apps. --platformis now--app.prism workflow installandprism workflow upgradetake--appwith the five generated app IDs, and--platformis removed. The plan and receipt listappsinstead ofplatforms. A new workspace installed without--apphas no apps instead of failing. The questionnaire, presets andprism newkeep theirplatformsanswer.- Doctor decides relevance by stack. The Docker, JDK and Xcode checks are keyed by the stacks
spring-backend,android-composeandios-swiftuiof 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.ymlis ignored by git. The generated project's.gitignorelists it, andprism workflow installadds the rule to an existing.gitignore.dev-doneneeds release evidence or a delivery attestation per app. TheReleasecell of each delivery evidence row must berelease: <reference>,tag: <reference>ordeployment: <reference>(the URL of, or a workspace path to, a release, tag or deployment record), orattested 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 withrelease-evidence-required, because a commit or pull request proves which code changed, not that it shipped. Lint applies the rule todonefeatures, thedev-donetransition check reports it as the checkrelease-evidence-required, and the board rejects adev-doneproposal withrelease_evidence_required. TheImplementationandTestscells keep their rule. An app in an external repository is linked by URL, and an unresolvedprism.local.ymlentry never blocks evidence given by link. The delivery attestation in theReleasecell 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_evidenceandparse_delivery_evidence_cellsreturnDeliveryProblementries (codeandmessage) 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.mdkeeps the directory structure, the non-feature page formats and the general rules and is read before every wiki operation. The newknowledge/wiki/LIFECYCLE.mdholds the feature page format, the status and owner lifecycle, the lifecycle action registry and the advisory file formats and is read afterSCHEMA.mdfor feature, board and advisory operations. No rule changed; sections moved verbatim.LIFECYCLE.mdis a required wiki file whereverSCHEMA.mdis: wiki lint reportsmissing-required-wiki-file,prism doctorandprism validatefail, 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 recordsLIFECYCLE.mdin 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) replacesplatforms:, and every ID must be an app inprism.workspace.yml, whatever its stack, socustomer-androidandpartner-androidare two separate scopes.platforms:is now an error (unknown-feature-field), and so isplatform:in a requirement page (unknown-requirement-field). The design gates (wiki lintmissing-design, thedesign-handoffanddev-donedesign checks) ask whether any scoped app has thehas-uicapability, whereunknowncounts as true, instead of a fixed list of five IDs; lint reports eachunknowncapability once as an information finding,app-capability-unknown.VALID_PLATFORM_IDSandUI_PLATFORM_IDSare gone; the lint, the transitions, the graph and the board read the workspace model. Renames:Feature.platformsisFeature.apps; the folderknowledge/wiki/platform-requirements/isknowledge/wiki/app-requirements/(filesF-XXX-<app-id>.md, front matterapp:); the feature section## Platform scopeis## App scope; the delivery evidence columnPlatformisApp, and the reopen labelAffected platformsisAffected apps; the query kindplatformisapp(CLIprism wiki platformisprism wiki app <app-id>,prism wiki graph --view platform --platformis--view app --app, the boardquerykind and the MCPqueryliteral); the skillwiki-platformiswiki-appin.agents/skills/and.claude/commands/;wiki_platform,ACTIVE_PLATFORM_STATUSESandPlatformRequirementPagearewiki_app,ACTIVE_APP_STATUSESandAppRequirementPage; graphplatformnodes areappnodes (app:<id>, titled with the app's name),platform-requirementnodes areapp-requirement(areq:<stem>), and the edge evidencefrontmatter-platformsisfrontmatter-apps; the JSON keysplatforms(feature summaries,wiki showand the transition preflight),platform_requirements,platform_requirement_count,platform_requirement_status_counts(status) andplatform(requirement summaries,wiki appfacts) areapps,app_requirements,app_requirement_count,app_requirement_status_countsandapp; the board'sdetailskeysplatforms,board_platformsandmissing_platformsareapps,board_appsandmissing_apps; andWorkspaceManifest.platforms,WorkspaceInspection.platformsand theplan_install(..., platforms=)keyword areapp_ids,app_idsandapps=. Error codes: lintmissing-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-platformsandinvalid-platform-idaremissing-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-appsandunknown-app-id; transition checksplatform-scope,platform-sectionandplatform-requirementsareapp-scope,app-sectionandapp-requirements; and the board'sreopen_platform_scopeisreopen_app_scope. The schemaswiki-query-v1.json,wiki-graph-v1.jsonandwiki-transition-preflight-v1.jsondescribe 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_digestshistory is empty, and the build script records digests inPREVIOUS_DIGESTSonly from the first release that has external users, soprism workflow installandupgradeno 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, andprism status,prism wiki lint, the wiki queries, the graph and the transition preflight no longer infer them from.copier-answers.ymlor from the generated app directories (missing-workspace-manifeststays a warning, andanswers-filesystem-driftis gone); (3)prism workflow installandupgradeno longer read.copier-answers.ymlfor the project name or the apps, and a folder is a generated workspace only when its manifest says so (generated_byorworkflow.mode: generated); (4) the manifest's flatgenerated_by_prism_cli_version,template_source,template_version,template_commitandgenerated_atkeys are no longer read, onlygenerated_by; (5) the board state database no longer adds theasset_digestcolumn to agrantstable that lacks it. In the Python modules,PLATFORM_DIRSofprism_cli.workspaceisGENERATED_PLATFORM_DIRSofprism_cli.app_model,prism_cli.clino longer re-exports the renderers ofprism_cli.render, and the unusedtransition_preflight,evaluate_transitionsandLINKED_CONTEXT_DIRECTORIESre-export ofprism_cli.wiki_queryare removed. The graph's feature nodes no longer carry the singulartransition(readtransitions), and the board page reads only transition capability version 2.