Skip to content

Prism 0.5.0

Choose a tag to compare

@github-actions github-actions released this 06 Oct 16:05
· 31 commits to main since this release

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) and plans/ (the current status of a plan, with no history), each with a _FORMAT.md, and the single pages direction.md (the current direction and principles) and roadmap.md (what comes next; a date about the world may appear in it), which SCHEMA.md defines. Every kind has front matter with kind (the kind of its folder), sources and, for a topic, research page or plan, a title and a status (topic draft or current; research open or concluded; plan proposed, active, paused, done or dropped). The formats carry no history date and show the evidence labels. prism wiki lint validates the front matter of each kind (missing-<kind>-kind, invalid-<kind>-kind, invalid-<kind>-title, missing-<kind>-status, invalid-<kind>-status, missing-<kind>-frontmatter and invalid-<kind>-sources, with <kind> one of topic, research, plan, direction and roadmap), 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-intake and design-intake remain the role-specific entry points. The connected board accepts ingest as a write skill (25 canonical skills) with a validator built on the intake validators: a new feature meets every po-intake rule; 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 with supersedes: ADR-NNN comes with the old ADR changed in its status fields only (record_immutable and supersession_incomplete otherwise); the manifest lists every written page by path and canonical ID. New rejection codes are invalid_topic, invalid_research, invalid_plan, invalid_direction, invalid_roadmap, wiki_path_invalid, invalid_decision and decision_path_mismatch. The board's pending-intake panel offers ingest next to po-intake, and its card reads "awaiting intake".
  • The general index lists every wiki page. index.md has 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 lint reports missing-index-entry, orphan-index-entry and duplicate-index-entry as warnings on index.md; they never block a lifecycle action.
  • A "Project docs" group in the general index. A generated workspace's knowledge/wiki/index.md lists each template-owned docs/ 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 lint holds these lines to the rules of the other index lines: orphan-index-entry for a line whose doc does not exist and duplicate-index-entry for a doc listed twice. A doc without a line is not a finding, and wiki search does not return docs. A workflow-only workspace has no such group.
  • prism workflow install adds the index lines of the pages it installs. When it keeps your own knowledge/wiki/index.md, it appends a line for each page it creates (CONNECTED.md, status-board.md, direction.md, roadmap.md and similar), in that page's group, and changes no line you wrote, so adoption no longer leaves missing-index-entry warnings for those pages.
  • prism wiki search and wiki-query read the index first. The index lines that contain the query name their pages, which come first in facts.results with their index_line and index among the matched_fields; facts.index_match_count counts them, and the index is listed first under sources. Every page folder, including the new kinds, is still searched by its own fields. The wiki-query skills say so in both layers.
  • Evidence labels on current-state pages. SCHEMA.md defines 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 questions table 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 in log.md and the records), the labeling rule, the rule that records and raw sources are never rewritten, and the quarantine rule. prism wiki lint reports a Decided or Observed item without a link as the warning unlinked-claim, and a bold run-in label that is none of the five as the warning unknown-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 carries status: superseded and superseded-by: ADR-MMM with its body unchanged. SCHEMA.md defines the decision-supersession workflow as one operation that also updates the current-state pages that relied on the old decision. prism wiki lint reports links that disagree or are missing as the error supersession-mismatch, and a current-state page that links a superseded ADR as the warning superseded-decision-cited.
  • Dated, immutable raw sources. Intake folders are named YYYY-MM-DD-slug/ under pending, processed and quarantined, and a processed item keeps a MANIFEST.md. The connected board rejects a move whose folder has another name with intake_name_invalid, and a write into an existing processed item, or a move onto one, with processed_source_immutable. prism wiki lint warns with processed-source-without-manifest when a processed item has no manifest. intake/README.md says how to archive an agent review packet or an agent output as a source, and the intake templates carry a Captured: line that matches the folder's date. design-intake writes a MANIFEST.md in the processed folder it creates, listing the design page and the feature by path; a proposal without it is rejected with intake_manifest_scope or intake_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 a CONFLICT.md: front matter status: open | resolved, and an ## Existing claim and an ## Incoming claim section, each with **Claim:**, **Scope:** and a linked **Evidence:**. The existing page stays untouched until a human resolves the conflict. prism wiki lint reports each open conflict as the warning unresolved-conflict (a non-empty quarantine is not a gate) and a record that does not follow the format as the error malformed-conflict. The board accepts a quarantine only as a valid CONFLICT.md with status: open and no wiki change (conflict_report_invalid, quarantine_write_scope).
  • history-date-on-page, malformed-log-entry and missing-schema-version lint findings. prism wiki lint reports a history-date field (introduced, last-updated, created, updated, date-updated and similar, in any spelling) in the front matter of a current-state page as the error history-date-on-page, with a message that points to log.md. An ADR keeps its date and an advisory review its reviewed, because a dated record's date is part of what it records. A log.md entry that is not in the log format is the warning malformed-log-entry: lint reports it and never rewrites the log. SCHEMA.md and LIFECYCLE.md start with the front matter schema-version: 1, and one without it is the error missing-schema-version.
  • Link and source checks. Every relative Markdown link and every sources entry of a wiki page must resolve to an existing file or folder. prism wiki lint reports one that does not, or that leaves the workspace, as broken-link (the former broken-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 as broken-anchor (warning). Links in code, URLs, images and absolute paths are not checked, and no URL is fetched. A feature's sources entries are paths; a persona, business rule, topic, research page, plan, direction.md or roadmap.md may hold URLs or free text, so only an entry that is a knowledge/ 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 a sources entry, repo:mobile-apps/apps/partner/Login.kt names a file or folder of a repository of prism.workspace.yml (workspace is this repository). Lint resolves it through the untracked prism.local.yml and 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 one external-repository-unresolved warning 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 are broken-link. SCHEMA.md, docs/workspace-model.md and docs/wiki-workflow.md define the form.
  • Freshness from the log. A verification is a log.md entry whose operation is verify; the pages on its paths line were checked against their sources that day. For each current-state page, lint takes the latest verify entry that lists it and reports stale-page (warning) when it is older than wiki-stale-after-days (14 when SETTINGS.md is absent or invalid) and never-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-verified appears in prism wiki lint and its JSON only; stale-page appears wherever diagnostics do, and it keeps a graph node healthy. This replaces the date-based stale-page warning, because pages carry no date. The wiki-owner, lint-wiki and wiki-blockers skills, docs/generated-projects.md and the generated AGENTS.md describe staleness as the log-derived stale-page, and the direct-read fallback of wiki-owner computes it from the verify entries of log.md.
  • prism wiki verify <page>... [--evidence <link>] [--by <name>]. It appends one verify entry to knowledge/wiki/log.md and 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_skill with an empty changes list and the verified pages in read_revisions, each with the digest read_workspace returned, previews one verify entry in log.md; apply is refused as stale when a verified page changed after the preview. Like every skill write it is for agents, and the entry's by names the agent. verify-pages is the 26th canonical skill; the packaged workflow asset and its digest change, so existing grants need prism workflow upgrade.

Changed

  • The packaged skills require prism-kit>=0.5.0. The skills and the generated AGENTS.md use commands and formats that 0.5.0 introduced (ingest, prism wiki verify, the status board and the log format), so their CLI probe accepts prism 0.5.0 or newer.
  • prism wiki lint lists the warnings and information of a wiki without errors. After Wiki contract checks passed. it prints a Findings section; before, only the counts showed.
  • An ADR's status is superseded with a superseded-by field. The earlier status: superseded-by ADR-XXX form is an invalid-decision-status error.
  • The intake skills, writing skills and guidance follow the new rules. po-intake and design-intake take a YYYY-MM-DD-slug folder, label and link every claim, update a changed fact in place, and quarantine a contradiction with a CONFLICT.md; po-specify, the clarify skills, design-handoff, dev-done, board-review and setup-project name the labeling and current-state rule; lint-wiki lists the new findings; the root guidance and the Cursor wiki rule state the rules. The feature new generator creates a dated intake folder.
  • log.md is 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.md defines 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 history entry keep their own date as dated records. The board's entries use the format with evidence: board preview <id> and by: <name> (<kind>), and keep the preview marker and the actor as HTML comments; a move's processed intake folder is listed under evidence. The skills, commands and the Cursor advisory rule that append to the log name the format, and setup-project appends its entry in it. The template log.md starts with no entry.
  • The feature status board is its own file, status-board.md, and has no date column. index.md is now the general index of every page. The board service manages status-board.md exactly as it managed the status rows (merge by feature, stale_status_row and duplicate_status_row, recovery), the write role is status-board, and a proposal that supplies status-board.md is rejected with managed_file. A workspace needs status-board.md besides index.md, SCHEMA.md and LIFECYCLE.md, or the board stays read-only and lint reports missing-required-wiki-file. The file lists | ID | Feature | Status | Owner | Board Review |; the board renders, merges and reads only that header, a table with an Introduced column is refused as invalid_status_board, and lint reports it as malformed-status-board. The lint codes of the status table are malformed-status-board, feature-missing-from-status-board, status-board-missing-feature and status-board-frontmatter-drift. The lifecycle skills, the guidance files and the Cursor rules read and update the status board row, and the packaged wiki-*, feature-status and prep-sprint skills read status-board.md for feature status.
  • A board transition writes no date. preview_transition and apply change status and owner in the feature front matter and nothing else, and the lifecycle, clarify and design-intake checks no longer allow any date field. The packaged po-specify, design-handoff and po-intake guidance 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.md entries.
  • AGENTS.md is the single source of agent rules in a generated workspace, and CLAUDE.md imports it. The root CLAUDE.md is the one line @AGENTS.md, and each platform folder (backend/, web-user-app/, web-admin-portal/, mobile-android/, mobile-ios/) repeats the pattern: its AGENTS.md holds the rules and its CLAUDE.md is @AGENTS.md plus the Claude Code skills and commands that no other tool shares. A platform AGENTS.md points 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 platform CLAUDE.md skill lists name the skills as plain names: their @.claude/skills/... paths resolved relative to the platform folder and pointed at nothing. .cursor/rules/project.mdc is the one always-on rule and references @AGENTS.md; the CLI read-surface and fallback rules that only wiki.mdc carried are in AGENTS.md, and the scoped stack rules (backend, web, mobile-android, mobile-ios, api-conventions) and advisory-review stay. prism workflow install writes the same layout for a new workspace: AGENTS.md carries the connected-workflow section (with the knowledge-root paragraph for a knowledge root) and CLAUDE.md is @AGENTS.md; an existing AGENTS.md or CLAUDE.md is still preserved, and the plan offers to add the CONNECTED.md pointer to AGENTS.md and @AGENTS.md to CLAUDE.md. prism validate and workspace detection look for AGENTS.md where they looked for CONTEXT.md. sync-ai-context checks the single-source layout: the import layout of AGENTS.md and CLAUDE.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

  • introduced and last-updated on feature pages, introduced on persona and business-rule pages and date on design pages. The board rejects them as unknown_frontmatter_fields, lint reports them as history-date-on-page, and the formats, examples and lint's required fields no longer list them. The invalid_last_updated board error and the lint codes invalid-feature-date, invalid-design-date, invalid-business-rule-introduced, invalid-persona-introduced and invalid-wiki-date are gone with them.
  • CONTEXT.md and .cursor/rules/wiki.mdc in a generated workspace. The human overview of CONTEXT.md (setup, repository layout and the operation names by tool) is in the generated README.md, and its operating rules and those of wiki.mdc are in AGENTS.md. template/CONTEXT.md.jinja and every reference to it are gone.