Repository navigation
Release date: 2026-10-14
Prism 0.7.5 keeps every connected read within its size limit, decides which API contracts apply to a feature by one rule on the board, in the lifecycle checks and in lint, and lets an applicable contract that cannot be cited block delivery and release instead of reading as no contract. The side panel shows long app stages and design tracks in full, a board serves current data from its first request, and the npm launcher no longer fails a first install on Windows over a leftover temporary folder.
Fixed
- An API contract without a citation blocks delivery instead of reading as no contract. A contract page whose
versionis not an integer from 1, or whosefeature-idis longer thanF-and 18 digits, has no citation. The three Delivery binding checks left such a contract out of the set of current citations, so a feature whose only applicable contract was unusable, its own or a shared one its app requirements link, accepted a Delivery row that citesnone:dev-donerecordedContract: noneand the contract's lint error did not gate the feature. A contract that applies to the feature and has no citation now blocks every Delivery row the check covers,noneincluded. The board refuses thedev-doneproposal withcontract_binding_staleanddetails.unusablelists the contract paths besidecurrent; thecontract-binding-stalecheck of the transition isblocked; lint reportsstale-delivery-evidenceat the feature page for the rows of apps that are not yet released. Each message names the contract path and says to correct the contract page. A contract page that is missing or does not apply to the feature changes nothing, and a released app's row is still checked against its release record. The board finds the contracts that apply to a feature the way the transitions and lint do: it reads the app requirement pages of the apps in the feature's scope from disk (a requirement page in the proposal replaces its disk version), follows the same links, and counts only the files the wiki readers treat as pages. Sorelease-doneis refused withcontract_binding_stalewhen a contract that only an app requirement on disk links has no citation (a release proposal carries the feature page and the release record, so it used to miss that contract, accept Delivery rows that citenoneand pass lint afterwards), and a file whose name starts with_is a template that never applies: an_example.mdthat names the feature infeature-idno longer blocks a delivery or a release that cites the feature's valid contract. A requirement page belongs to the feature by its parsedfeature-idand itsapp, never by the text it contains, so afeature-idwritten as a YAML escape ("F-\u0030\u0030\u0031") counts asF-001on the board, as it does in the transitions and lint, and its contract blocks a delivery or a release instead of being skipped. The wiki reads one folder level: an API contract page is a file directly inknowledge/wiki/api-contracts/and an app requirement page one directly inknowledge/wiki/app-requirements/. A Markdown file in a sub-folder of either is no page for the board, the transitions or lint: it is not found byfeature-idor file name, it is not a link source, a link to it names no contract, and an implemented contract there is not in the set a QA return lowers. Lint reports it aspage-in-sub-folder, an error at that file that says to move the page directly into the folder and does not gate an action. read_workspaceof a feature page with hundreds of criteria stays within one tool result. The criteria annotations of a feature page (each criterion'sid,revision,applies_toandintegration) rode on the first piece without counting toward its size, so a page with 500 criteria returned about 71,000 characters against the 48,000-character limit. A page whose record with all its annotations does not fit is now cut so that every piece, annotations included, fits, and each piece lists the criteria whose list item starts in its content range (an empty list when none does); joining theannotations.criteriaof the pieces in order gives the list a whole read returns. A criterion whoseapplies_tolist alone is too long to fit beside one character of content keeps its exactidandrevisionand showsapplies_to_countandapplies_to_omitted: trueinstead of the list. A file that fits whole, the cursors, the digests and the recorded reads are unchanged, andmcp_contractstays 4. An API contract whosefeature-idis longer thanF-and 18 digits has no citation, because the citation repeats the ID:read_workspacereturns noannotations.contractfor it, lint reportsinvalid-api-contract-feature-idat the contract page, and no Delivery row can cite it.- The side panel shows app stages and design tracks in full. A feature's panel showed each app ID, app stage, design track and design state on one line, cut with an ellipsis, so a long name could be read only by hovering. The panel now shows them whole and wraps them, at the separator first, so they can be read with the keyboard alone. Cards keep their compact lines.
- A board shows current data from its first request. A board server built its graph snapshot before it held the workspace, so a page opened right after a restart could show data from before another writer's last change until the next poll. It now refreshes the snapshot once it holds the workspace and before it answers any request.
- The npm launcher no longer fails a first install on Windows over a leftover temporary folder. Windows can hold a file for a moment after the process that used it has exited. The launcher now retries removing its staging folder, and a staging folder that still cannot be removed after uv is installed is left in the cache instead of failing the launch.