Repository navigation
Prism 0.5.0
Release date: 2026-10-06
Prism 0.5.0 turns the wiki into a knowledge base with one rule for time: a current-state page says what is true now, and log.md is the only home of history, in one structured entry shape. Claims carry evidence labels (Decided, Observed, Proposed, Assumed, Unknown) and link their evidence; decisions are records that are superseded rather than rewritten, with the pages that relied on them updated in the same operation. Raw sources are dated, immutable folders (YYYY-MM-DD-slug/) with a manifest, and a source that contradicts a page is quarantined with a CONFLICT.md until a human resolves it. The wiki has new page kinds (topics, research, plans, direction.md and roadmap.md), a generic ingest skill that writes any of them for any role, a general index.md that lists every page, and a separate status-board.md for feature status. AGENTS.md is the single source of agent rules in a generated workspace, and CLAUDE.md and the Cursor rules import it. prism wiki lint checks links, sources entries, repo: links into other repositories and page freshness from the log, and prism wiki verify records a verification. Prism has no users of earlier versions, so workspaces created with 0.4.0 or earlier must be recreated; there is no upgrade path.
Added
- Page kinds beyond the feature pipeline. The wiki has
topics/(synthesis),research/(one question and its current answer) andplans/(the current status of a plan, with no history), each with a_FORMAT.md, and the single pagesdirection.md(the current direction and principles) androadmap.md(what comes next; a date about the world may appear in it), whichSCHEMA.mddefines. Every kind has front matter withkind(the kind of its folder),sourcesand, for a topic, research page or plan, atitleand astatus(topicdraftorcurrent; researchopenorconcluded; planproposed,active,paused,doneordropped). The formats carry no history date and show the evidence labels.prism wiki lintvalidates the front matter of each kind (missing-<kind>-kind,invalid-<kind>-kind,invalid-<kind>-title,missing-<kind>-status,invalid-<kind>-status,missing-<kind>-frontmatterandinvalid-<kind>-sources, with<kind>one oftopic,research,plan,directionandroadmap), applies the history-date, evidence-label, superseded-decision and relative-link checks to them, and the graph no longer reports a link to one of these pages as dangling. ingest, a generic intake skill for any role and any page kind. It processes one pending folder into a topic, research page, plan, direction, roadmap, persona, business rule, decision (ADR) or new feature, with the evidence labels, the date-slug processed source, the conflict quarantine and the current-state replacement rules.po-intakeanddesign-intakeremain the role-specific entry points. The connected board acceptsingestas a write skill (25 canonical skills) with a validator built on the intake validators: a new feature meets everypo-intakerule; a topic, research page, plan, direction or roadmap page is created or replaced in place; a persona, business rule or decision is created and never rewritten, except that a new decision withsupersedes: ADR-NNNcomes with the old ADR changed in its status fields only (record_immutableandsupersession_incompleteotherwise); the manifest lists every written page by path and canonical ID. New rejection codes areinvalid_topic,invalid_research,invalid_plan,invalid_direction,invalid_roadmap,wiki_path_invalid,invalid_decisionanddecision_path_mismatch. The board's pending-intake panel offersingestnext topo-intake, and its card reads "awaiting intake".- The general index lists every wiki page.
index.mdhas one line per page, in the present tense, grouped by kind (- [F-001 User login](features/F-001-login.md): Users sign in with an email address.), with no dates and no narrative; a changed page's line is replaced in place. The connected board adds or replaces the line of each page it writes, derived from the page's title and the first sentence of its summary, and merges it by page with the same conflict, idempotence and recovery guarantees as the status rows (stale_index_entry,duplicate_index_entry).prism wiki lintreportsmissing-index-entry,orphan-index-entryandduplicate-index-entryas warnings onindex.md; they never block a lifecycle action. - A "Project docs" group in the general index. A generated workspace's
knowledge/wiki/index.mdlists each template-owneddocs/page once, as- [Architecture](../../docs/architecture.md): System design, platform map, tech decisions and the auth flow., so an agent finds the human docs from the wiki.prism wiki lintholds these lines to the rules of the other index lines:orphan-index-entryfor a line whose doc does not exist andduplicate-index-entryfor a doc listed twice. A doc without a line is not a finding, andwiki searchdoes not return docs. A workflow-only workspace has no such group. prism workflow installadds the index lines of the pages it installs. When it keeps your ownknowledge/wiki/index.md, it appends a line for each page it creates (CONNECTED.md,status-board.md,direction.md,roadmap.mdand similar), in that page's group, and changes no line you wrote, so adoption no longer leavesmissing-index-entrywarnings for those pages.prism wiki searchandwiki-queryread the index first. The index lines that contain the query name their pages, which come first infacts.resultswith theirindex_lineandindexamong thematched_fields;facts.index_match_countcounts them, and the index is listed first undersources. Every page folder, including the new kinds, is still searched by its own fields. Thewiki-queryskills say so in both layers.- Evidence labels on current-state pages.
SCHEMA.mddefines five labels, written as a bold run-in label at the start of a list item or paragraph:**Decided:**,**Observed:**,**Proposed:**,**Assumed:**and**Unknown:**. A Decided or Observed claim links its evidence: a processed intake item, a record or a URL. A feature's## Open questionstable is its Unknown form. Each page format's example shows the labels, and operational rules 12 to 15 state the current-state rule (replace superseded content in place, rationale as a current fact, history inlog.mdand the records), the labeling rule, the rule that records and raw sources are never rewritten, and the quarantine rule.prism wiki lintreports a Decided or Observed item without a link as the warningunlinked-claim, and a bold run-in label that is none of the five as the warningunknown-evidence-label. Lint checks the form only and never whether the evidence supports the claim. - Decision supersession. An ADR can carry
supersedes: ADR-NNN, and a superseded ADR carriesstatus: supersededandsuperseded-by: ADR-MMMwith its body unchanged.SCHEMA.mddefines the decision-supersession workflow as one operation that also updates the current-state pages that relied on the old decision.prism wiki lintreports links that disagree or are missing as the errorsupersession-mismatch, and a current-state page that links a superseded ADR as the warningsuperseded-decision-cited. - Dated, immutable raw sources. Intake folders are named
YYYY-MM-DD-slug/underpending,processedandquarantined, and a processed item keeps aMANIFEST.md. The connected board rejects a move whose folder has another name withintake_name_invalid, and a write into an existing processed item, or a move onto one, withprocessed_source_immutable.prism wiki lintwarns withprocessed-source-without-manifestwhen a processed item has no manifest.intake/README.mdsays how to archive an agent review packet or an agent output as a source, and the intake templates carry aCaptured:line that matches the folder's date.design-intakewrites aMANIFEST.mdin the processed folder it creates, listing the design page and the feature by path; a proposal without it is rejected withintake_manifest_scopeorintake_manifest_incomplete, because every processed item has a manifest. - Conflict quarantine records. A source that contradicts an existing page moves to
intake/quarantined/YYYY-MM-DD-slug/with aCONFLICT.md: front matterstatus: open | resolved, and an## Existing claimand an## Incoming claimsection, each with**Claim:**,**Scope:**and a linked**Evidence:**. The existing page stays untouched until a human resolves the conflict.prism wiki lintreports each open conflict as the warningunresolved-conflict(a non-empty quarantine is not a gate) and a record that does not follow the format as the errormalformed-conflict. The board accepts a quarantine only as a validCONFLICT.mdwithstatus: openand no wiki change (conflict_report_invalid,quarantine_write_scope). history-date-on-page,malformed-log-entryandmissing-schema-versionlint findings.prism wiki lintreports a history-date field (introduced,last-updated,created,updated,date-updatedand similar, in any spelling) in the front matter of a current-state page as the errorhistory-date-on-page, with a message that points tolog.md. An ADR keeps itsdateand an advisory review itsreviewed, because a dated record's date is part of what it records. Alog.mdentry that is not in the log format is the warningmalformed-log-entry: lint reports it and never rewrites the log.SCHEMA.mdandLIFECYCLE.mdstart with the front matterschema-version: 1, and one without it is the errormissing-schema-version.- Link and source checks. Every relative Markdown link and every
sourcesentry of a wiki page must resolve to an existing file or folder.prism wiki lintreports one that does not, or that leaves the workspace, asbroken-link(the formerbroken-wiki-link, which covered only links to wiki pages) (error, naming the page, the link and the line), and an anchor that no heading of its target gives asbroken-anchor(warning). Links in code, URLs, images and absolute paths are not checked, and no URL is fetched. A feature'ssourcesentries are paths; a persona, business rule, topic, research page, plan,direction.mdorroadmap.mdmay hold URLs or free text, so only an entry that is aknowledge/path is checked, and a pending intake path names the processed path to list. Only a broken link to a page of the wiki gates a lifecycle action, as before; the other link findings never block. repo:<repository-id>/<path>links into an external repository. In a body link or asourcesentry,repo:mobile-apps/apps/partner/Login.ktnames a file or folder of a repository ofprism.workspace.yml(workspaceis this repository). Lint resolves it through the untrackedprism.local.ymland only checks that the path exists: it never reads a file in a checkout, never follows a symlink inside one and never writes there. A repository with no checkout gives oneexternal-repository-unresolvedwarning for that repository, however many links point into it, and its links are skipped. A path missing from a resolved checkout, an undeclared repository id and a malformed link arebroken-link.SCHEMA.md,docs/workspace-model.mdanddocs/wiki-workflow.mddefine the form.- Freshness from the log. A verification is a
log.mdentry whose operation isverify; the pages on itspathsline were checked against their sources that day. For each current-state page, lint takes the latestverifyentry that lists it and reportsstale-page(warning) when it is older thanwiki-stale-after-days(14 whenSETTINGS.mdis absent or invalid) andnever-verified(information) when there is none, so an overdue page is not confused with one that nobody has checked. Records, the log, the index, the status board, the schema files and generated files are exempt. Freshness never changes a status and never blocks a lifecycle action or a board write.never-verifiedappears inprism wiki lintand its JSON only;stale-pageappears wherever diagnostics do, and it keeps a graph node healthy. This replaces the date-basedstale-pagewarning, because pages carry no date. Thewiki-owner,lint-wikiandwiki-blockersskills,docs/generated-projects.mdand the generatedAGENTS.mddescribe staleness as the log-derivedstale-page, and the direct-read fallback ofwiki-ownercomputes it from theverifyentries oflog.md. prism wiki verify <page>... [--evidence <link>] [--by <name>]. It appends oneverifyentry toknowledge/wiki/log.mdand changes nothing else. A page is named from the workspace root or from the wiki. The command refuses a path outside the wiki, a page that does not exist and a page that is not a current-state page, and writes nothing when it refuses any page. It appends the way the board does: it rejects a symlink or reparse point on the path, swaps the log in atomically only while it is unchanged and reads it again when another writer got in between.verify-pages, a canonical skill that records a verification through the board.preview_skillwith an emptychangeslist and the verified pages inread_revisions, each with the digestread_workspacereturned, previews oneverifyentry inlog.md;applyis refused as stale when a verified page changed after the preview. Like every skill write it is for agents, and the entry'sbynames the agent.verify-pagesis the 26th canonical skill; the packaged workflow asset and its digest change, so existing grants needprism workflow upgrade.
Changed
- The packaged skills require
prism-kit>=0.5.0. The skills and the generatedAGENTS.mduse commands and formats that 0.5.0 introduced (ingest,prism wiki verify, the status board and the log format), so their CLI probe acceptsprism 0.5.0or newer. prism wiki lintlists the warnings and information of a wiki without errors. AfterWiki contract checks passed.it prints a Findings section; before, only the counts showed.- An ADR's status is
supersededwith asuperseded-byfield. The earlierstatus: superseded-by ADR-XXXform is aninvalid-decision-statuserror. - The intake skills, writing skills and guidance follow the new rules.
po-intakeanddesign-intaketake aYYYY-MM-DD-slugfolder, label and link every claim, update a changed fact in place, and quarantine a contradiction with aCONFLICT.md;po-specify, the clarify skills,design-handoff,dev-done,board-reviewandsetup-projectname the labeling and current-state rule;lint-wikilists the new findings; the root guidance and the Cursor wiki rule state the rules. Thefeature newgenerator creates a dated intake folder. log.mdis the only home for history, and every entry has one structured shape. An entry is## YYYY-MM-DD <operation> | <subject>followed by- paths:(the changed paths),- evidence:(links to evidence, never copied evidence) and- by:(the actor), and at most one optional line of plain text.SCHEMA.mddefines the format, states that the log is append-only, and states the rule for pages: a current-state page carries no date about itself, a date about the world stays in the page, and an ADR, an advisory review and each## Reopen historyentry keep their own date as dated records. The board's entries use the format withevidence: board preview <id>andby: <name> (<kind>), and keep the preview marker and the actor as HTML comments; a move's processed intake folder is listed underevidence. The skills, commands and the Cursor advisory rule that append to the log name the format, andsetup-projectappends its entry in it. The templatelog.mdstarts with no entry.- The feature status board is its own file,
status-board.md, and has no date column.index.mdis now the general index of every page. The board service managesstatus-board.mdexactly as it managed the status rows (merge by feature,stale_status_rowandduplicate_status_row, recovery), the write role isstatus-board, and a proposal that suppliesstatus-board.mdis rejected withmanaged_file. A workspace needsstatus-board.mdbesidesindex.md,SCHEMA.mdandLIFECYCLE.md, or the board stays read-only and lint reportsmissing-required-wiki-file. The file lists| ID | Feature | Status | Owner | Board Review |; the board renders, merges and reads only that header, a table with anIntroducedcolumn is refused asinvalid_status_board, and lint reports it asmalformed-status-board. The lint codes of the status table aremalformed-status-board,feature-missing-from-status-board,status-board-missing-featureandstatus-board-frontmatter-drift. The lifecycle skills, the guidance files and the Cursor rules read and update the status board row, and the packagedwiki-*,feature-statusandprep-sprintskills readstatus-board.mdfor feature status. - A board transition writes no date.
preview_transitionandapplychangestatusandownerin the feature front matter and nothing else, and the lifecycle, clarify and design-intake checks no longer allow any date field. The packagedpo-specify,design-handoffandpo-intakeguidance no longer asks for one. - The status board's "Recently updated wiki pages" report section is "Recently changed wiki pages" and lists the paths of the newest
log.mdentries. AGENTS.mdis the single source of agent rules in a generated workspace, andCLAUDE.mdimports it. The rootCLAUDE.mdis the one line@AGENTS.md, and each platform folder (backend/,web-user-app/,web-admin-portal/,mobile-android/,mobile-ios/) repeats the pattern: itsAGENTS.mdholds the rules and itsCLAUDE.mdis@AGENTS.mdplus the Claude Code skills and commands that no other tool shares. A platformAGENTS.mdpoints at the root wiki workflow instead of restating it, and operations are named without a/or$prefix, with one section that gives the prefix of each tool. The platformCLAUDE.mdskill lists name the skills as plain names: their@.claude/skills/...paths resolved relative to the platform folder and pointed at nothing..cursor/rules/project.mdcis the one always-on rule and references@AGENTS.md; the CLI read-surface and fallback rules that onlywiki.mdccarried are inAGENTS.md, and the scoped stack rules (backend,web,mobile-android,mobile-ios,api-conventions) andadvisory-reviewstay.prism workflow installwrites the same layout for a new workspace:AGENTS.mdcarries the connected-workflow section (with the knowledge-root paragraph for a knowledge root) andCLAUDE.mdis@AGENTS.md; an existingAGENTS.mdorCLAUDE.mdis still preserved, and the plan offers to add theCONNECTED.mdpointer toAGENTS.mdand@AGENTS.mdtoCLAUDE.md.prism validateand workspace detection look forAGENTS.mdwhere they looked forCONTEXT.md.sync-ai-contextchecks the single-source layout: the import layout ofAGENTS.mdandCLAUDE.md, the scoped Cursor rules, and the.claude/and.agents/skill packagings, which cannot import each other. The packaged workflow asset has a new digest, so existing board grants need to be issued again.
Removed
introducedandlast-updatedon feature pages,introducedon persona and business-rule pages anddateon design pages. The board rejects them asunknown_frontmatter_fields, lint reports them ashistory-date-on-page, and the formats, examples and lint's required fields no longer list them. Theinvalid_last_updatedboard error and the lint codesinvalid-feature-date,invalid-design-date,invalid-business-rule-introduced,invalid-persona-introducedandinvalid-wiki-dateare gone with them.CONTEXT.mdand.cursor/rules/wiki.mdcin a generated workspace. The human overview ofCONTEXT.md(setup, repository layout and the operation names by tool) is in the generatedREADME.md, and its operating rules and those ofwiki.mdcare inAGENTS.md.template/CONTEXT.md.jinjaand every reference to it are gone.