{"contextKind":"public_baseline","language":"en","transferId":"orivelaiq-full-public-transfer","transferVersion":"1.0.0","generatedAt":"2026-11-04T01:58:40.991Z","profile":{"contextKind":"public_baseline","language":"en","profileId":"orivelaiq-public-authoring","profileVersion":"1.3.0","title":"Authoring & Integration","introduction":"Create portable Knowledge views and choose the correct Work or Review channel using the current public contracts. This profile is public guidance; authenticated context and current authority refine what is available in a Workspace.","compatibleContracts":[{"id":"work-repository","version":"0.1","contractDigest":"sha256:c44422bb9dc074e87573e14b95feee6124d897b2f49481f5402748d012ef0bcc","url":"/api/public/contracts/work-repository"},{"id":"review-exchange","version":"1.0.0","contractDigest":"sha256:6b39cae0c6af595c7b3764919e5e7d327271961b0a0b7a3acefbd7f9bb87c68d","url":"/api/public/contracts/review-exchange"},{"id":"artifact-navigation","version":"1","contractDigest":"sha256:c7c7be4669d239d218f80f9056f6eacf946d8218fa30fe7e47bf00cd39b275c4","url":"/api/public/contracts/artifact-navigation"},{"id":"interactive-html","version":null,"contractDigest":"sha256:96433212233224233944eba6ba33eced1f1d2118ae574825df1b6426259894ba","url":"/api/public/contracts/interactive-html"}],"rules":[{"id":"profile-versioning","title":"Profile compatibility and exact snapshot identity","text":"profileVersion describes the semantic compatibility of this authoring guidance, independently of Product releases and the underlying contract versions. An incompatible profile shape or authoring rule requires a major increment; compatible capabilities or fields require a minor increment; clarifications or corrections that retain compatibility require a patch increment. Evidence-only changes may change profileDigest without changing profileVersion when the profile shape, authoring rules and compatible contract pins remain unchanged. Pin an exact snapshot with profileId + profileVersion + profileDigest; a version alone is not content identity. At one installation, Discovery profile.digest, Bootstrap profileDigest, the HTTP Public Profile profileDigest and MCP read_public_authoring_profile profileDigest must agree. Compare the representations available to your client; compare MCP only when connected. Public guidance requires no MCP authentication, and MCP-only or offline use requires no Web access. For offline use, pin the included identities and obtain a fresh profile before later connected use. If available representations differ, reread the compared representations once to refresh a potentially stale snapshot. If disagreement persists, stop and reject mixing those snapshots; do not infer compatibility or select one digest silently. Verify each pinned contract against its own contractDigest, not against profileDigest.","evidence":["docs/adr/0044-self-describing-guidance-and-operation-authority.md"]},{"id":"authority","title":"Public Baseline and contextual authority","text":"This Public Baseline explains generic compatible authoring without login or MCP. It grants no Workspace, Topic, administration or Git access. An authenticated Effective Workspace Profile refines safe available capabilities; Admin Configuration is a separate authorized view. Every protected operation checks current Human and resource authority. Tool discovery and client policy grant no server authority.","evidence":["docs/adr/0044-self-describing-guidance-and-operation-authority.md"]},{"id":"indexing","title":"Publish through a configured Source","text":"An authorized administrator configures source selection, artifact types, ordered include/exclude rules and navigation assignment. The current Git-backed content path supports Markdown (.md), SVG (.svg) and HTML (.html). Exclusions apply before a matched artifact is loaded. Authors should use simple supported patterns: **/*.md, **/*.svg, **/*.html, docs/**/*.md, docs/*.md or exact relative paths. Patterns are the current bounded source matcher, not a promise of every glob feature. Work repository JSON is separate structured import data, not indexed Knowledge.","evidence":["server/lib/source-patterns.ts","server/lib/github-source-adapter.ts","contracts/work-repository/work-repository-contract-v0.1.md"]},{"id":"index-failures","title":"Index availability and controlled failures","text":"Readers browse prepared indexes, not a live repository or whole-content search. Stable and Dynamic are immutable view selectors; display labels may vary. Successful indexing publishes a complete validated projection atomically. A failed run preserves the previous successful projection. A candidate above the configured artifact byte limit is omitted with a too_large diagnostic: no truncated content, placeholder artifact, navigation item or search document is created. Its Grounding targets remain unresolved. Other unsafe load, integrity, source/revision and persistence failures remain fatal. Ask an authorized administrator to inspect diagnostics, reduce content or correct rules, then reindex.","evidence":["docs/foundation/index-contract.md","docs/adr/0039-immutable-workspace-read-projections.md"]},{"id":"markdown","title":"Use the supported Markdown subset","text":"The current reader supports headings #, ## and ###, paragraphs, hyphen bullet lists, **bold**, inline `code`, triple-backtick fenced code, pipe tables, inline [label](reference) links and ![alt](reference) images. YAML front matter is hidden from the reader. A leading H1 matching the reader title is suppressed; H2/H3 headings provide the outline. Raw HTML is escaped. Do not depend on full CommonMark/GFM, ordered or nested lists, italics, task lists, block quotes, math or executable Markdown. Language tags on fences do not promise syntax highlighting.","evidence":["src/lib/markdown/render-markdown.ts"]},{"id":"links-assets","title":"Links, SVG and image references","text":"Use source-relative indexed paths for local Markdown/HTML/SVG links. Resolution uses the current authorized loaded index; unresolved local links remain passive text. Heading fragments are compatibility addresses, not stable semantic-node identity. Local image embedding currently resolves indexed SVG only, through its protected content reference and passive <img> rendering; SVG is never injected into the application DOM. Unresolved/blocked image references show a placeholder. HTTP(S) remote images currently render as images; prefer indexed SVG for portable authored content. HTTP(S) and mailto links open separately; unsafe schemes are blocked. Interactive HTML has stricter self-contained, no-network rules.","evidence":["src/lib/markdown/render-markdown.ts","docs/foundation/index-contract.md","docs/adr/0030-cross-variant-semantic-node-identity.md"]},{"id":"html","title":"Static and interactive HTML","text":"HTML defaults to static sandboxed rendering with scripts disabled. Interactive HTML requires explicit Source-level Admin opt-in; an artifact cannot enable its own policy. Author one self-contained HTML file with inline CSS/JavaScript/data, inline SVG or data images/fonts and a system-font fallback. No CDN, remote stylesheet/font/image/API, fetch/XHR/WebSocket, browser storage, form submission, popups, downloads, parent DOM/data or direct top-level navigation may be required. Scripts run only in an isolated allow-scripts frame without same-origin. Include semantic keyboard controls, visible focus, meaningful initial content, accessible labels, reduced-motion support where needed and usable standalone fallback.","evidence":["docs/guides/authoring-interactive-html-artifacts.md","docs/adr/0031-opt-in-interactive-html-artifacts.md","server/lib/html-execution-policy.ts"]},{"id":"navigation","title":"Request mediated navigation","text":"Use only protocol orivelaiq.artifact.v1. Wait for the parent host-ready handshake with capabilities [navigate]; verify event.source === window.parent. Send navigate only from a real click/keyboard handler, with exactly protocol,type,requestId,userActivated:true,target. Targets are artifactPath with path, artifactId with id, or search with query. Paths are current-Workspace relative paths, not URLs: no scheme, absolute root, traversal, backslash, query, fragment or encoded separator. requestId is 1–64 characters, path/id 1–512, query 1–200; whitespace-only values are invalid. Replies expose only accepted, not-found or denied and no content/context. Match requestId and parent source, use a bounded timeout, keep target/reference visible and preserve local content for no-host, negative result or timeout. Prefer search when the exact path is uncertain. Never auto-request during load or retry in a loop; at most five requests per frame in two seconds.","evidence":["docs/foundation/artifact-navigation-contract.md","src/lib/content/artifact-navigation-contract.ts"],"example":"interactive-html"},{"id":"identity","title":"Persist the right identity","text":"A source path and documentId are locators/aliases/evidence; artifact.id and projectionId are concrete runtime selectors, not durable Knowledge identity. Do not invent, persist or hard-code those runtime IDs into repository Work definitions. Source-owned knowledge_object_id establishes the current bounded canonical Markdown identity when explicitly declared. Keep it stable on move/rename/title edit and never reuse it for unrelated Knowledge. Review Exchange uses UUID public IDs, never internal rv* IDs. Work externalKey is configuration-scoped import identity, not internal Domain identity.","evidence":["docs/product-ux/01-product-domain-model-baseline-v1.6.md","docs/adr/0029-rendition-representation-and-knowledge-identity.md","docs/adr/0037-source-owned-current-knowledge-grounding.md","contracts/work-repository/work-repository-contract-v0.1.md","docs/architecture/review-exchange-contract-v1.md"]},{"id":"grounding","title":"Declare direct Current Grounding","text":"Canonical Git-backed Markdown in a non-companion canonical Source may declare top-level knowledge_object_id and optional grounded_by in YAML front matter. Use lower-case UUID URNs (UUID versions 1–8, RFC variant), and at most 128 unique grounded_by strings of the same syntax. References resolve directly within the same ContentSource Public ID and authorized projection; no cross-Source lookup or transitive inference occurs. grounded_by requires identity. Duplicate IDs/references, self-reference, malformed participating YAML or identity fail the indexing run. Use unique YAML mapping keys; no aliases, anchors, tags or merge keys. Unknown/excluded/unavailable targets remain generic unresolved. grounds is derived, never authored. Translation declarations do not establish graph authority.","evidence":["docs/adr/0037-source-owned-current-knowledge-grounding.md","docs/architecture/current-knowledge-grounding.md"],"example":"grounding"},{"id":"snapshot-metadata","title":"Optional whole-artifact snapshot evidence","text":"Canonical Git-backed Markdown may declare kind: snapshot and snapshotAt: an RFC-3339 timestamp in top-level YAML front matter. A participating declaration must be complete and valid; aliases, anchors, tags and merge keys are rejected. These fields describe a whole-artifact snapshot observation. They do not establish row/claim/section correctness, create a governed Knowledge Time State or confer authority. Invalid participating metadata fails indexing and preserves the previous successful projection.","evidence":["docs/foundation/index-contract.md"]},{"id":"localization","title":"Current localization and Rendition limits","text":"Durable translations stay externally owned and read-only to OrivelaIQ. The implemented Translation Manifest v1 maps document_id, source_path and target_path plus source revision/blob, locale, repository-owned status/currency, review evidence and source findings. A configured companion Source requires explicit canonical binding and manifest mapping; arbitrary translated filenames or similar titles do not establish equivalence. Keep status/currency claims distinct from technical source drift. Current UI can group document-level language variants and select an available preferred language. Translation is Rendition, not Knowledge State; meaning-changing localization is not a Rendition of the same Knowledge Object. Governed State binding remains unresolved without evidence. Use Translation Manifest v1 for current authoring. Manifest v1 requires schema_version: 1 and root pilot_id, canonical_repository, canonical_branch, canonical_language, target_locale, source_audit (repository/path/pull_request), terminology_version and a nonempty translations list. Each mapping requires document_id, source_path, target_path, source_commit, source_blob_sha, status, currency, review_evidence and a nonempty source_findings list; translation_commit is optional. target_path must start with target_locale/. Status is experimental, draft, reviewed, approved or rejected; currency is current, stale or unknown. review_evidence is a safe relative path with persistent fragment. Source/target paths must be matched by the configured canonical/companion rules. Unknown fields, duplicate document/path mappings and YAML aliases/anchors fail validation.","evidence":["server/lib/translation-manifest.ts","docs/foundation/translation-manifest-v2-contract.md","docs/foundation/multilingual-viewer-projection.md","docs/adr/0029-rendition-representation-and-knowledge-identity.md","docs/adr/0030-cross-variant-semantic-node-identity.md"],"example":"localization-v1"},{"id":"work","title":"Author portable Work Repository JSON","text":"Use Work Repository 0.1: one topic.json and items/*.json per configured root; Topic → Item → Entry, with stable externalKey values. Entry types are exactly INSIGHT, CLARIFICATION_POINT, DECISION and RESULT. Labels belong to Item; relatesTo links Entry externalKeys within the same Topic. Entry type is immutable: use a new key to retype. Clarification open/closed state, membership, internal IDs/revisions and receipts remain runtime-owned. Portable artifactRefs use workspaceAlias,sourceKey,path,view (stable or dynamic); omit references until an authorized configured target can resolve them. Manual Human PLAN → Preview → APPLY rechecks schema, cross-file links, access, exact projections, freshness and conflicts. Schema validity alone is not APPLY readiness. Reimport preserves clarification state; source removal does not delete Work. No automatic import or Git write is supplied.","evidence":["contracts/work-repository/work-repository-contract-v0.1.md","server/lib/work-repository-authoring.ts"],"example":"work-repository"},{"id":"feedback","title":"Contribution and External Response use different channels","text":"Capture a Contribution in Knowledge context through the available authorized product interaction. Contribution is raw provenance, not a typed Work Result and not the External Response write channel. A controlled Review Exchange produces a Review Package/Item and exact exported context. An external Human/AI authors an External Response in that exchange repository with separately authorized Git access, then the authorized import/review path brings it into Knowledge context. MCP Knowledge/Work access grants no Git write and is not a replacement feedback-response channel. Authorship claims are provenance, never authentication; repeated concerns do not by themselves become Findings.","evidence":["docs/product-ux/10-feedback-results-interaction-contract-v1.0.md","docs/adr/0026-feedback-results-ingress-and-normalization-domain-amendment.md","docs/adr/0027-feedback-results-interaction-projection-and-density.md","docs/adr/0044-self-describing-guidance-and-operation-authority.md"]},{"id":"external-response","title":"Author an External Response against an export","text":"Use Review Exchange 1.0.0. The response pair lives at installations/<ownerInstallationId>/review-packages/<packagePublicId>/items/<itemPublicId>/responses/<newResponsePublicId>/response.yaml and response.md. Use exact exported UUID v4 public IDs/revisions/context hash in basedOn; allocate a new response UUID. Both files share validated external authorship authority; the package owner has no implicit response write permission. Response metadata/bodies are create-only. Use the actual exported owner/package/item/context values, a distinct external exporter installation and matching authorship.installationId. Validate the envelope and Markdown front matter using the included schemas; preserve passive body content. Current import additionally requires complete item/context BasedOn. Stale/conflicting inputs receive controlled review treatment, never silent re-anchoring. Read canonical path/authority and import checks before any separately authorized Git write.","evidence":["docs/architecture/review-exchange-contract-v1.md","contracts/review-exchange/v1/README.md","server/lib/review-response-import.ts"],"example":"external-response"},{"id":"authorship-limit","title":"Known current Review import limitation","text":"The canonical Review Exchange schema accepts human, ai, ai_assisted, tool, system and unknown. The current External Response import allowlist accepts only human, ai, tool and system; ai_assisted and unknown are currently unsupported by that import path. Do not mislabel authorship to work around this. If the truthful type is unsupported, stop that import and ask the authorized reviewer to handle the limitation. AI authorship requires modelName; tool authorship requires toolName. No agent authentication/runtime or server-side agent execution is implied.","evidence":["docs/adr/0032-review-response-import-authorship-vocabulary-drift.md","contracts/review-exchange/v1/review-shared.schema.json","server/lib/review-response-import.ts"]},{"id":"home-naming-en","title":"OrivelaIQ Home · English","text":"OrivelaIQ Home is an optional OIQ-operated source alongside independent external GitHub. Inside OIQ and in Human-directed AI answers call it Home; OIQ Home is the branded short name. One Home pairs one canonical repository with its real home Workspace and default Source; one Human may have several Homes (Your Homes / Your Home). Home requires per-account administrator enablement. A separately authorized Home AI connection may write permitted Markdown source content; the OIQ Knowledge/Work MCP connection is independent and grants no Home write access. Writing does not update the fixed Stable view: committed Markdown may already be indexed and read in Dynamic. An existing pinned Stable remains unchanged until an authorized Human deliberately replaces the pin. Without a Stable pin, Dynamic may be the default. This is not a new approval workflow. Preserve technical managed_git, mgit.use, oiq-045/1, tool names, schemas and OAuth resources. No new consent, grant or reconnect is needed merely for the name. Connector display names belong to their App/client registration owner; Home OAuth and tool descriptions belong to the independently deployed M.Git service. Public guidance cannot verify a client title or its installed revision. Home ownership and a separately granted shared Repository are different: use the collaboration guidance below. Do not promise browser upload/editing, unrestricted export/delete, retention, hosting geography or legal ownership.","evidence":["docs/adr/0039-immutable-workspace-read-projections.md","docs/adr/0048-managed-git-identity-home-workspace-and-source-integration.md"]},{"id":"home-naming-de","title":"OrivelaIQ Home · Deutsch","text":"OrivelaIQ Home ist eine optionale, von OIQ betriebene Source neben unabhängigem externem GitHub. Innerhalb von OIQ und in AI-Antworten an Humans heißt sie Home; die kurze Markenform ist OIQ Home. Ein Home verbindet ein kanonisches Repository mit seinem echten Home-Workspace und der Standard-Source; ein Human kann mehrere Homes haben (Deine Homes / Dein Home). Die Administration muss Home für jedes Konto freischalten. Eine getrennt autorisierte Home-AI-Verbindung kann erlaubte Markdown-Quelldateien schreiben; die OIQ-Knowledge/Work-MCP-Verbindung ist unabhängig und erteilt keinen Home-Schreibzugriff. Schreiben ist nicht die Freigabe des festen Stands: Geschriebenes Markdown kann bereits indexiert und in Dynamic gelesen werden. Ein bestehender fester Stable-Stand bleibt unverändert, bis ein berechtigter Human den Pin ausdrücklich ersetzt. Ohne Stable-Pin kann Dynamic die Standardansicht sein. Das ist kein neuer Freigabeprozess. Technische managed_git, mgit.use, oiq-045/1, Tool-Namen, Schemas und OAuth-Ressourcen bleiben erhalten. Allein die Benennung erfordert keine neue Zustimmung, Berechtigung oder Verbindung. Den sichtbaren Connector-Namen verantwortet der App-/Client-Registrierungsinhaber; Home-OAuth und Tool-Beschreibungen verantwortet der unabhängig bereitgestellte M.Git-Dienst. Öffentliche Hilfe bestätigt keinen Client-Titel oder installierten Stand. Home-Eigentümerschaft und ein separat freigegebenes Repository sind verschieden: Beachte die folgende Anleitung zur Zusammenarbeit. Versprich keine Browser-Uploads oder Editoren, uneingeschränkten Export/Löschung, Aufbewahrung, Hosting-Geografie oder rechtliches Eigentum.","evidence":["docs/adr/0039-immutable-workspace-read-projections.md","docs/adr/0048-managed-git-identity-home-workspace-and-source-integration.md"]},{"id":"home-collaboration-en","title":"Shared Repository authoring · English","text":"An Owner can use Participants to grant Collaborator access to one specific existing active OIQ Human whose account is already administrator-enabled for Home (mgit.use). Enter the recipient's exact email, verify the displayed identity and confirm the grant. An unavailable match does not reveal whether an account exists. Collaborator means repository-scoped Markdown read/write access; the original Owner keeps ownership and alone manages Participants. The recipient uses their own separately authorized Home AI/MCP connection or authenticated Home REST access. A shared Repository is not the recipient's own Home and creates no OIQ Workspace membership, protected Knowledge/Work access, Source/Index rights or Stable publication rights. OIQ's existing independent Indexer grant can update Dynamic automatically after a valid commit; an existing Stable pin stays fixed. Current active-account eligibility and repository grants are checked on every protected operation. After revoke, the next protected read/write operation is denied even with an already connected client; an operation already admitted at the final pre-push authorization may finish and remains historical fact. Removing administrator enablement also blocks use; it does not erase the persisted grant. Restore access only through current explicit authority. No Deputy, new global role or browser Markdown editor is supplied. Availability depends on the connected Home service; older services keep existing Owner use without Participants.","evidence":["docs/architecture/oiq-048-collaborative-authoring-contract-v1.md","docs/adr/0048-managed-git-identity-home-workspace-and-source-integration.md","docs/adr/0039-immutable-workspace-read-projections.md"]},{"id":"home-collaboration-de","title":"Gemeinsam im Repository schreiben · Deutsch","text":"Ein Owner kann unter Teilnehmer einem bestimmten bestehenden, aktiven OIQ-Human Bearbeiter-Zugriff erteilen, dessen Konto die Administration bereits für Home (mgit.use) freigeschaltet hat. Gib die genaue E-Mail-Adresse ein, prüfe die angezeigte Identität und bestätige die Berechtigung. Ein nicht verfügbarer Treffer verrät nicht, ob ein Konto existiert. Bearbeiter bedeutet Markdown-Lese-/Schreibzugriff auf dieses Repository; der ursprüngliche Owner bleibt Eigentümer und verwaltet allein die Teilnehmer. Der Empfänger nutzt seine eigene, getrennt autorisierte Home-AI-/MCP-Verbindung oder authentifizierten Home-REST-Zugriff. Ein freigegebenes Repository ist nicht das eigene Home des Empfängers und erzeugt keine OIQ-Workspace-Mitgliedschaft, keinen geschützten Knowledge-/Work-Zugriff, keine Source-/Index-Rechte und kein Recht zur Stable-Veröffentlichung. OIQ kann Dynamic nach einem gültigen Commit über seine bestehende unabhängige Indexer-Berechtigung automatisch aktualisieren; ein bestehender Stable-Pin bleibt fest. Aktueller Kontostatus, Freischaltung und Repository-Berechtigung werden bei jeder geschützten Operation geprüft. Nach Widerruf wird die nächste geschützte Lese-/Schreiboperation auch bei bestehender Client-Verbindung verweigert; eine bei der letzten Prüfung vor dem Push bereits zugelassene Operation kann noch abschließen und bleibt Historie. Entzug der administrativen Freischaltung sperrt die Nutzung ebenfalls, löscht aber keine gespeicherte Berechtigung. Zugriff kehrt nur mit aktueller ausdrücklicher Berechtigung zurück. Es gibt keinen Stellvertreter, keine neue globale Rolle und keinen Browser-Markdown-Editor. Die Verfügbarkeit hängt vom verbundenen Home-Dienst ab; ältere Dienste erhalten die bestehende Owner-Nutzung ohne Teilnehmerverwaltung.","evidence":["docs/architecture/oiq-048-collaborative-authoring-contract-v1.md","docs/adr/0048-managed-git-identity-home-workspace-and-source-integration.md","docs/adr/0039-immutable-workspace-read-projections.md"]}],"limitations":["Knowledge content is read from configured Sources. Authors update repository files through separately authorized repository tools.","The product does not execute external agents.","Current Markdown is a bounded subset. Interactive HTML requires Source-level Admin opt-in and remains self-contained.","Current localization uses Translation Manifest v1. A translation does not establish a governed Knowledge State or semantic-node equivalence.","Review import authorship limitation: ai_assisted and unknown remain rejected by the current import path.","No public guidance, contract, identifier, discovery or transfer grants access."],"examples":[{"id":"interactive-html","title":"Self-contained interactive Knowledge map","path":"contracts/public-authoring/examples/interactive-map.html","purpose":"Open standalone to filter local content; a registered interactive host progressively enables mediated navigation.","digest":"sha256:608f21fcca71d23f472bfb72df0e528f6c136b35a99e6c35295d2a509e17f68a"},{"id":"work-repository","title":"Complete Work Topic and Item","path":"contracts/public-authoring/examples/work-repository.json","purpose":"Schema-valid repository files without runtime Artifact references.","digest":"sha256:5b5d6eb1c5aee5aa7a56349d4e068741b23a9636b41704b788b2af85a6d4ece7"},{"id":"external-response","title":"External Response file pair","path":"contracts/public-authoring/examples/external-response.json","purpose":"Schema/runtime-valid illustrative values. Replace identities and BasedOn with exact authorized export context before authoring.","digest":"sha256:8d0ee43f7e22f69c8cef396f1914c41687f2e24501d63fc5ca280c4a7c09a656"},{"id":"grounding","title":"Canonical Markdown Grounding","path":"contracts/public-authoring/examples/grounding.md","purpose":"A direct same-Source declaration; the referenced target must declare the matching identity.","digest":"sha256:626ad08d2419a238670a0d4ff240d2b17aee22a6488127af17b0a7cac3db6129"},{"id":"localization-v1","title":"Translation Manifest v1","path":"contracts/public-authoring/examples/localization-v1.json","purpose":"Runtime-valid document-level companion mapping with illustrative repository/ref/path evidence. Configuration must match the canonical and companion Sources; translations remain externally owned.","digest":"sha256:1cd0c45939296d6463c22283a0eac87b2f285e138e61b491bea818f8178f0c48"}],"channelSummary":"For a Knowledge view, author a compatible Markdown, SVG or HTML file in an authorized configured Source. For continuing Work, an authenticated MCP agent may edit an authorized Topic with mutate_work, or an external author may prepare portable Work Repository JSON for the Human PLAN → Preview → APPLY path. For an External Response, use exported Review Exchange context and separately authorized Git access. Source choice: optional OrivelaIQ Home with separate authorized Markdown writing, or independent external GitHub with its own source authority. Home is per-account admin-enabled; an Owner may separately grant an eligible Human Collaborator access to a Repository. OIQ Knowledge/Work, Workspace membership and each Human's Home AI connection remain separate.","contextGuidance":"After signing in, an accessible Workspace can provide an Effective Workspace Profile through the application or read_workspace_authoring_profile. Authorized administrators have a separate Admin Configuration view and read_workspace_admin_profile. Both refine this Public Baseline; current Topic owner/member or Admin rights separately govern direct MCP Work mutations.","agentInstruction":"Apply the pinned Public Authoring Profile and relevant canonical contracts. Resolve authenticated context separately. Preserve current limits and use the correct authoring channel. Human-facing naming: OrivelaIQ Home standalone, OIQ Home branded short, Home inside OIQ; Your Homes / Your Home, Deine Homes / Dein Home. Apply both Home glossary rules and both collaboration rules. Distinguish an Owner's Home from a Repository shared with a Collaborator; describe a shared write as in the shared Repository / im freigegebenen Repository, not as ownership of that Home. Say where you wrote (in your Home / in deinem Home) only after an authorized confirmed write. Written Markdown can be read in indexed Dynamic; an existing fixed Stable is unchanged until deliberately replaced; no Stable pin can mean Dynamic default. Never interpret this as invisible content or a new approval requirement. For Home repository writes, use the separately connected Home service and its current effectiveRole/capabilities. Participants require collaboratorProfile oiq-048/1; preserve oiq-045/1, managed_git, mgit.use, existing OAuth resources, mcp:access and the legacy REST envelope repository:owner. That scope never proves Owner authority. Do not require a scope rename or OAuth reconnect. Preserve requestId, expectedRevision, expectedFileHash and validation; after an uncertain result retry only the exact authorized request or recover its receipt/status under current access. A denied or conflicted write is not a blind retry. Do not infer OIQ Workspace, Indexer or Stable authority from Repository access.","bootstrapSteps":["Resolve the relative links against the OrivelaIQ installation URL and GET Discovery.","Read the pinned Public Authoring Profile and relevant canonical contracts. Apply the profile-versioning rule: compare profileDigest across available representations at this installation, including MCP only when connected; verify each contract against its own pinned contractDigest. Public guidance requires no MCP authentication.","Read Agent Instructions and complete examples for your artifact or channel.","Without Web or MCP access, obtain Full Transfer: it includes contracts, schemas, rules, examples, limits and release changes.","For Workspace-specific use, request the authenticated Effective Workspace Profile; administration requires the separate Admin Configuration.","For an authenticated MCP connection, read the Workspace profile and current Topic before authorized mutate_work calls; read_public_changes supplies release impacts without Web access.","Guidance and discovery grant no access. External Response requires Review Exchange and separately authorized Git access. Home Repository collaboration uses each Human's separate Home connection and creates no OIQ Workspace rights."],"offlineGuidance":"Give the Full Public Transfer JSON to an agent without Web/MCP access. It includes profile/contract identities, all canonical contract files and schema dependencies, complete examples, rules, limitations, generation time and release changes. Parse schema content from contracts[].files and resolve relative schema references against the included path/$id; the included schemas require no network lookup. Replace illustrative External Response values with exact authorized export context before any separately authorized Git write. This snapshot grants no access and cannot assert current Workspace capability.","integrityGuidance":"All digest values use SHA-256 over UTF-8 bytes, expressed as sha256: followed by lower-case hexadecimal. A raw file/source digest covers the exact UTF-8 bytes of its content, including whitespace and newlines, without text or Unicode normalization. For structured identities, canonical JSON recursively sorts object keys lexically, retains array order, and serializes compact JSON without text or Unicode normalization. The Public Authoring Profile hashes its complete projected object after removing only the top-level profileDigest field. The Contract Registry hashes its complete projected object after removing only the top-level registryDigest field. Each contract hashes exactly the canonical object {id,version,sources:[{path,digest}]}: use the contract id and version (including null where present), with sources in the order listed for that contract in the registry. Full Transfer hashes its complete projected object after removing only the top-level digest field; retain all nested profile, registry, contract and file digest fields. Evidence-only hashes cannot be independently rehashed offline when their raw bytes are omitted; this intentional boundary keeps implementation details private. Snapshot integrity does not establish publisher authenticity or currentness. The snapshot records its generation time; obtain a fresh profile before later connected use.","mcp":{"endpoint":"/api/mcp","resourceMetadata":"/.well-known/oauth-protected-resource","connectionScope":"mcp:access","steps":["MCP requires a personal AI connection authenticated as a current active Human. Connect to /api/mcp using the installation’s OAuth resource metadata. New consent uses mcp:access; valid legacy grants remain connection-compatible. Connection consent and tool visibility grant no Workspace, Topic, administration or Git rights.","A connected agent can read_public_authoring_profile, read_public_contract_registry and read_public_contract without Web access. read_public_changes supplies the same repository-owned release impacts, audiences, breaking and action-required information as the public Changes JSON.","Use list_visible_workspaces and read_workspace_authoring_profile for the current readable Workspace context. read_workspace_admin_profile additionally requires current Admin authority; a visible tool may return forbidden. These reads expose no authentication secrets.","For direct Work, use list_work_topics and read_work_topic. The Topic response identifies the current authority as admin, owner or member. Owners and Admins manage the Topic; current members may edit its children. Workspace read membership alone does not grant Topic mutation rights.","Only with current applicable Topic rights, invoke mutate_work with a fresh UUID requestId and the expectedRevision from a fresh read_work_topic result. Existing-topic actions also require topicId. create_topic omits topicId and expectedRevision. Select current artifacts through read_work_artifact_catalog before add_reference and retain the exact view/projectionId.","On an uncertain transport outcome, retry the identical request; read_work_receipt can recover its durable receipt. A revision_conflict applies no mutation: reread the Topic, reassess the action and use a deliberate new requestId. Current server authority is checked on every operation and receipt replay, without reconnect.","mutate_work edits Work only. It has no delete_item or delete_entry action; removal actions cover references and relations. Entry type remains immutable, and only CLARIFICATION_POINT has open/closed state. Topic lifecycle and Item knowledgeContextExposure are existing visibility controls, not deletion.","The Work Repository JSON route remains a separate external authoring/import channel. Neither direct Work mutation nor Knowledge access publishes Source content, imports Review responses, writes Git or executes external agents. A client may independently suppress or confirm writes; current server-side Human and resource rights remain the authorization boundary."]},"sourceEvidence":[{"path":"contracts/public-authoring/examples/external-response.json","digest":"sha256:8d0ee43f7e22f69c8cef396f1914c41687f2e24501d63fc5ca280c4a7c09a656"},{"path":"contracts/public-authoring/examples/grounding.md","digest":"sha256:626ad08d2419a238670a0d4ff240d2b17aee22a6488127af17b0a7cac3db6129"},{"path":"contracts/public-authoring/examples/interactive-map.html","digest":"sha256:608f21fcca71d23f472bfb72df0e528f6c136b35a99e6c35295d2a509e17f68a"},{"path":"contracts/public-authoring/examples/localization-v1.json","digest":"sha256:1cd0c45939296d6463c22283a0eac87b2f285e138e61b491bea818f8178f0c48"},{"path":"contracts/public-authoring/examples/work-repository.json","digest":"sha256:5b5d6eb1c5aee5aa7a56349d4e068741b23a9636b41704b788b2af85a6d4ece7"},{"path":"contracts/public-authoring/profile-v1.json","digest":"sha256:2dcb4a4499d901a671e4947fcd526d802f79f6808947b14de85923cf2df54ace"},{"path":"contracts/public-authoring/registry.json","digest":"sha256:e299bce874f72ff91811aab65d9372343d70af1e65c080c898025afa91f2b4ea"},{"path":"contracts/review-exchange/v1/README.md","digest":"sha256:2bc4187b53f9fc71725b8106866018976b1c5fdbf4035699c97de281bb418832"},{"path":"contracts/review-exchange/v1/review-shared.schema.json","digest":"sha256:3b0d4ac332b3cd6f5c3d6d9621e055ac0d05ffa4904b38b5a1d3fc5258da36d9"},{"path":"contracts/work-repository/work-repository-contract-v0.1.md","digest":"sha256:355552fa54ee230ef60e651e18f35eb913ef41664b7bf6b59e7c6b386516bba0"},{"path":"docs/adr/0026-feedback-results-ingress-and-normalization-domain-amendment.md","digest":"sha256:3e83faf1991e229cf7df0d6c994b942e92b615f5a41fd717b861f0c2701e827c"},{"path":"docs/adr/0027-feedback-results-interaction-projection-and-density.md","digest":"sha256:3568706df9341d396e80ea953c3a39d75b84f02a77d4efefdd013d04d0a89b69"},{"path":"docs/adr/0029-rendition-representation-and-knowledge-identity.md","digest":"sha256:ef048e1b3bc45baebb2a9d99d33145891bc0a8767665627ad1d1b0f949397530"},{"path":"docs/adr/0030-cross-variant-semantic-node-identity.md","digest":"sha256:9fc91fffff6d780972f0b56010368502deeb65f1090471dde823ed9d31437dca"},{"path":"docs/adr/0031-opt-in-interactive-html-artifacts.md","digest":"sha256:16ac7668d7042b44b53dde4de7f67fe34d618387c2690621465acd637265da58"},{"path":"docs/adr/0032-review-response-import-authorship-vocabulary-drift.md","digest":"sha256:ca5d29994853d7b06414bb37ac918af986364700311f47c9d736f053588dc830"},{"path":"docs/adr/0037-source-owned-current-knowledge-grounding.md","digest":"sha256:9f93bb854d636467fa8a109874949a67fe9bb6fa1e1d72331297cd7343570c7e"},{"path":"docs/adr/0039-immutable-workspace-read-projections.md","digest":"sha256:06f40886d8ee43a50f2e851874778a6ec155afde2f7580c8ffb8400b70fac0fb"},{"path":"docs/adr/0044-self-describing-guidance-and-operation-authority.md","digest":"sha256:66114187b5f58f12ee3aa5d3f487c362d99ca8d2fff1d5f15fb940fab9629edd"},{"path":"docs/adr/0048-managed-git-identity-home-workspace-and-source-integration.md","digest":"sha256:8ab1b612bae50b79999ef3c5414985671618984015c694f68531d17b15ef9c86"},{"path":"docs/architecture/current-knowledge-grounding.md","digest":"sha256:0daed631f6550f0e4c3f2770e622c38b5199530645c2959c4de9e42acd589e14"},{"path":"docs/architecture/oiq-048-collaborative-authoring-contract-v1.md","digest":"sha256:1cec5eb7e751f2d6ba8787303aa5f876deff4d01aaa630adfcdf0249c345538c"},{"path":"docs/architecture/review-exchange-contract-v1.md","digest":"sha256:805963613d3221b8cdec93effe9ad293b123d72001e302258a28af172ecac54a"},{"path":"docs/foundation/artifact-navigation-contract.md","digest":"sha256:f88fe3beb8cf136ca0cbde007bf510aa83f9eac9a05b5fabd546cad7732ca663"},{"path":"docs/foundation/index-contract.md","digest":"sha256:83c3eee104a575393bdfd779ade6d5d4ed0f5ef6c4233d1935cb4daa04662672"},{"path":"docs/foundation/multilingual-viewer-projection.md","digest":"sha256:ff7704130e652f507842597cc1cf81484dc18ae278e40c17551671139283df75"},{"path":"docs/foundation/translation-manifest-v2-contract.md","digest":"sha256:c8dd4c123d63195f7747003fed98d8fa89a40a3a5f2b23ca7141bb72527332cf"},{"path":"docs/guides/authoring-interactive-html-artifacts.md","digest":"sha256:d3ae575507b237fbf41c0aec9dce233bb96c2fd2d94a833e9a73f42ecc70351d"},{"path":"docs/product-ux/01-product-domain-model-baseline-v1.6.md","digest":"sha256:cfbaab98f22df1d664632b343fee86494b83b631815a1eb674c6e9b842b1ef29"},{"path":"docs/product-ux/10-feedback-results-interaction-contract-v1.0.md","digest":"sha256:7820987a8a367c01bfea5dda288034919e62d30279f1ae937c89b578840a743e"},{"path":"server/lib/github-source-adapter.ts","digest":"sha256:7e1e812c16857030bacd007444c109fa9b3df77c8ee66df33e0bb3b88ecae5a3"},{"path":"server/lib/html-execution-policy.ts","digest":"sha256:6f2459c16409756b66d157e611fd01e6d75abc30cf440cb034b437a6481575ea"},{"path":"server/lib/review-response-import.ts","digest":"sha256:aae0e7ac3941634707861c3726c5e6b5eea3c77397ed92f06a49bb534af4e7b0"},{"path":"server/lib/source-patterns.ts","digest":"sha256:a7ac9d32bbf0750fe23bc5a954eda0799fd8f65d58cfacc02435f999c7fe37b3"},{"path":"server/lib/translation-manifest.ts","digest":"sha256:bbf567a46c6d5f2ab3823d8c4a02b71af9c97a2fd60cbe7b4513e9fca1f35dd2"},{"path":"server/lib/work-repository-authoring.ts","digest":"sha256:54f68792812c1d4e8258f8d78c1065e823ac40d067d2a29a7d40c72ecf76c38b"},{"path":"src/lib/content/artifact-navigation-contract.ts","digest":"sha256:7b662aab347c9526619ca477807ddc1693d89fd3f1cb32c0c19e3351fc877d2d"},{"path":"src/lib/markdown/render-markdown.ts","digest":"sha256:f435fd946509b05d86fde2b3633bbb2b59989cd6e524ab271f88d585655a012f"}],"links":{"discovery":"/.well-known/orivelaiq","humanGuidance":"/guidance","agentGuidance":"/guidance/agents","registry":"/api/public/registry","profile":"/api/public/profile","bootstrap":"/api/public/bootstrap","transfer":"/api/public/transfer","agentInstructions":"/api/public/agent-instructions","releases":"/releases","changes":"/api/public/changes","contracts":"/api/public/contracts/{id}","mcp":"/api/mcp"},"profileDigest":"sha256:b901c3bab9f73e89956eb476819e0d1a341f40660ff43cb0cd8222273151da62"},"registry":{"contextKind":"public_baseline","language":"en","registryId":"orivelaiq-public-contracts","registryVersion":"1.0.0","contracts":[{"id":"work-repository","version":"0.1","contractDigest":"sha256:c44422bb9dc074e87573e14b95feee6124d897b2f49481f5402748d012ef0bcc","title":"Work Repository","kind":"repository-contract","url":"/api/public/contracts/work-repository","sources":[{"path":"contracts/work-repository/work-repository-contract-v0.1.md","digest":"sha256:355552fa54ee230ef60e651e18f35eb913ef41664b7bf6b59e7c6b386516bba0"},{"path":"contracts/work-repository/work-topic.schema.json","digest":"sha256:304a9a3e78d2e19d878960d018c8d9f8d665c0b486d237c736b73611d0995fc3"},{"path":"contracts/work-repository/work-item.schema.json","digest":"sha256:c167cd5d5e8bcf364e1b41c7bb0c46fb34da062b790b2d19118a6b7243b07bd7"}]},{"id":"review-exchange","version":"1.0.0","contractDigest":"sha256:6b39cae0c6af595c7b3764919e5e7d327271961b0a0b7a3acefbd7f9bb87c68d","title":"Review Exchange","kind":"repository-contract","url":"/api/public/contracts/review-exchange","sources":[{"path":"docs/architecture/review-exchange-contract-v1.md","digest":"sha256:805963613d3221b8cdec93effe9ad293b123d72001e302258a28af172ecac54a"},{"path":"contracts/review-exchange/v1/manifest.json","digest":"sha256:15c8721c5ae28decb32b3945363a7735c0994f4b7bf25efcb6b59dc5e2dfb81b"},{"path":"contracts/review-exchange/v1/installation.schema.json","digest":"sha256:88377f5377097f4631533d4be662f0ef7e5c59dae49738d2f82ea6857c22867c"},{"path":"contracts/review-exchange/v1/import-report.schema.json","digest":"sha256:9158c2cdb1cd805c43726bc2097301118eb7dcc986de6563a2652e22aa9d827c"},{"path":"contracts/review-exchange/v1/review-package.schema.json","digest":"sha256:25134e24edfd0df771cf2867a4cfc1e7222a7dfa11a33c15cc8ebb0a64a336ac"},{"path":"contracts/review-exchange/v1/review-item.schema.json","digest":"sha256:5d8bd50554478d0f363a16b2b851bf935ffcae7d52cda6519332e00de7f4f0f4"},{"path":"contracts/review-exchange/v1/review-contribution.schema.json","digest":"sha256:1a424a689650a390d7cd1809cfe5dedceb527595ac59df1190ff253007bf8d82"},{"path":"contracts/review-exchange/v1/review-response.schema.json","digest":"sha256:a97320521f43efde65b5cc1487546c77ee88252a59bb1ad7034f5013bdbf0100"},{"path":"contracts/review-exchange/v1/review-decision.schema.json","digest":"sha256:47c65a9df9f47377c23587881167aa997fc1841b30085c226cef9c6223871dfd"},{"path":"contracts/review-exchange/v1/review-verification.schema.json","digest":"sha256:ce0fbff83fa9b6ff5eba1ce654dc089e21de6e54a709ac5ca9fb92a2cdf8e127"},{"path":"contracts/review-exchange/v1/result-report.schema.json","digest":"sha256:b84df0ddf56e4726074dcdd363e2c2d8aba395787861184738941af60fa60603"},{"path":"contracts/review-exchange/v1/review-audit_event.schema.json","digest":"sha256:df9b14ce63ed7dc6eef77e88c5a2327a708c2b1b6e8daa2111b3058919bc825d"},{"path":"contracts/review-exchange/v1/response-frontmatter.schema.json","digest":"sha256:019feb86e0092ffd64cb21103dda201631e8d2b335f2ee69685f49481cab1d09"},{"path":"contracts/review-exchange/v1/review-shared.schema.json","digest":"sha256:3b0d4ac332b3cd6f5c3d6d9621e055ac0d05ffa4904b38b5a1d3fc5258da36d9"},{"path":"contracts/review-exchange/v1/README.md","digest":"sha256:2bc4187b53f9fc71725b8106866018976b1c5fdbf4035699c97de281bb418832"}]},{"id":"artifact-navigation","version":"1","contractDigest":"sha256:c7c7be4669d239d218f80f9056f6eacf946d8218fa30fe7e47bf00cd39b275c4","title":"Artifact Navigation","kind":"message-contract","url":"/api/public/contracts/artifact-navigation","sources":[{"path":"docs/foundation/artifact-navigation-contract.md","digest":"sha256:f88fe3beb8cf136ca0cbde007bf510aa83f9eac9a05b5fabd546cad7732ca663"}]},{"id":"interactive-html","version":null,"contractDigest":"sha256:96433212233224233944eba6ba33eced1f1d2118ae574825df1b6426259894ba","title":"Interactive HTML authoring","kind":"current-guidance","url":"/api/public/contracts/interactive-html","sources":[{"path":"docs/guides/authoring-interactive-html-artifacts.md","digest":"sha256:d3ae575507b237fbf41c0aec9dce233bb96c2fd2d94a833e9a73f42ecc70351d"}]}],"sourceEvidence":[{"path":"contracts/public-authoring/registry.json","digest":"sha256:e299bce874f72ff91811aab65d9372343d70af1e65c080c898025afa91f2b4ea"}],"registryDigest":"sha256:a384c9c90d7b3a44ac1540dd6e6d267b4c55953964f6d04acab2eca35a98ec32"},"contracts":[{"contextKind":"public_baseline","language":"en","id":"work-repository","version":"0.1","contractDigest":"sha256:c44422bb9dc074e87573e14b95feee6124d897b2f49481f5402748d012ef0bcc","title":"Work Repository","kind":"repository-contract","files":[{"path":"contracts/work-repository/work-repository-contract-v0.1.md","digest":"sha256:355552fa54ee230ef60e651e18f35eb913ef41664b7bf6b59e7c6b386516bba0","mediaType":"text/markdown","content":"---\nrole: exploration\nlifecycle: draft\nversion: \"0.1\"\nlanguage: en\n---\n# OrivelaIQ Work Repository Contract v0.1\n\n## 1. Purpose\n\nThis contract defines a portable, Git-native representation of existing OrivelaIQ Work semantics for manual repository import.\n\nIt does not create a second Work model.\n\nThe repository representation follows the implemented Work aggregate exactly:\n\n```text\nTopic\n  └── Item\n        └── Entry\n              type = INSIGHT | CLARIFICATION_POINT | DECISION | RESULT\n```\n\nRepository files are structured Work definition data. They are not Knowledge Artifacts and are never processed by Knowledge indexing.\n\nThe v0.1 operating model is deliberately manual:\n\n```text\nsaved import configuration\n        ↓\nHuman starts import\n        ↓\nPLAN\n        ↓\npreview / blockers\n        ↓\nHuman starts APPLY\n        ↓\nshared OrivelaIQ Work\n```\n\nv0.1 has no automatic polling, scheduled PLAN or automatic APPLY.\n\n## 2. Core boundary\n\n> Git carries portable Work definitions. OrivelaIQ owns Work identity, authorization and runtime state.\n\nThe repository describes intended Topic / Item / Entry content and selected links.\n\nOrivelaIQ remains authoritative for:\n\n- internal Topic, Item, Entry, Reference and Relation IDs;\n- Topic revision;\n- Topic owner and members;\n- assigned internal Workspace IDs;\n- authenticated actor and channel stamps;\n- Entry creation/update stamps;\n- Clarification Point `open | closed` state;\n- server-resolved Artifact origin/projection evidence;\n- mutation and import receipts.\n\nRepository import must use the same Work authorization and mutation invariants as Browser/MCP.\n\n## 3. Canonical repository format\n\nv0.1 uses JSON only.\n\nRecommended layout:\n\n```text\nwork/\n└── <topic-directory>/\n    ├── topic.json\n    └── items/\n        ├── <item>.json\n        └── ...\n```\n\nPaths are locators only. Stable repository identity is carried by `externalKey`.\n\n## 4. Saved import configuration\n\nRepository connection details are not re-entered for every import.\n\nOrivelaIQ persists one named import configuration for one repository Work root.\n\nA v0.1 configuration contains conceptually:\n\n- configuration ID and revision;\n- display name;\n- GitHub `credentialId`;\n- repository `owner/name`;\n- explicit Git ref;\n- Work root;\n- Workspace alias → internal Workspace ID mappings;\n- optional bound internal Topic ID after the first successful APPLY;\n- created/updated audit metadata.\n\nThe configuration is OrivelaIQ-owned data and is not stored inside the source repository.\n\nThere is no import mode or schedule in v0.1. Every PLAN and APPLY is Human-triggered.\n\n### Configuration authority\n\nExisting GitHub credentials are Admin-only resources.\n\nTherefore:\n\n- only Admin may create, edit or remove an import configuration or select/change its `credentialId`;\n- the configuration stores only the credential ID, never token material;\n- the credential must still be active at PLAN and APPLY;\n- an unbound configuration may be run only by Admin;\n- after first successful APPLY binds the configuration to a Topic, later PLAN/APPLY requires current Topic manage authority: Topic owner or Admin.\n\nThis does not grant a general repository browser. The saved configuration is the explicit server-side delegation to read that one configured repository/ref/root for Work import.\n\n## 5. Topic repository definition\n\nRequired:\n\n- `schemaVersion`\n- `externalKey`\n- `title`\n\nOptional:\n\n- `description`\n\nExample:\n\n```json\n{\n  \"schemaVersion\": \"0.1\",\n  \"externalKey\": \"service-handover\",\n  \"title\": \"Service handover knowledge\",\n  \"description\": \"Capture reusable findings while improving service handover instructions.\"\n}\n```\n\nTopic members, owner and Workspace IDs are not repository fields.\n\nWorkspace assignment required for Artifact References comes from the saved import configuration and remains subject to existing Topic/Workspace authorization.\n\n## 6. Item repository definition\n\nAn Item groups one or more semantic Entries.\n\nRequired:\n\n- `schemaVersion`\n- `externalKey`\n- `topicExternalKey`\n- `title`\n- `entries`\n\nOptional:\n\n- `labels`\n- `knowledgeContextExposure` (`include | exclude`, default `include`)\n- `artifactRefs`\n\nExample:\n\n```json\n{\n  \"schemaVersion\": \"0.1\",\n  \"externalKey\": \"handover-preparation\",\n  \"topicExternalKey\": \"service-handover\",\n  \"title\": \"Service handover preparation\",\n  \"labels\": [\n    \"service-handover\",\n    \"readiness\"\n  ],\n  \"entries\": [\n    {\n      \"externalKey\": \"handover-checklist\",\n      \"type\": \"INSIGHT\",\n      \"text\": \"Service handovers work best when responsibilities, operating instructions and open issues are prepared before the handover meeting.\",\n      \"artifactRefs\": [\n        {\n          \"workspaceAlias\": \"knowledge-base\",\n          \"sourceKey\": \"service-handbook\",\n          \"path\": \"docs/service-handover.md\",\n          \"view\": \"stable\"\n        }\n      ]\n    },\n    {\n      \"externalKey\": \"handover-ownership\",\n      \"type\": \"CLARIFICATION_POINT\",\n      \"text\": \"Clarify who owns the service handover record.\",\n      \"relatesTo\": [\n        \"handover-checklist\"\n      ]\n    }\n  ]\n}\n```\n\nThis mirrors the existing Work model:\n\n- Item owns `title` and `labels`;\n- Entry owns semantic `type` and `text`;\n- Artifact References may belong to Item or Entry;\n- entry-to-entry relation is plain `relates-to`, not a new typed dependency vocabulary.\n\n`knowledgeContextExposure` controls only the derived Knowledge-side Related Work Context projection available in Knowledge. `exclude` does not remove the Item, its Entries, references or relations; it grants and revokes no access. Re-import updates this field while keeping mapped Work identities and runtime clarification state.\n\n## 7. Entry semantics\n\nAllowed types are exactly the implemented Work Entry values:\n\n- `INSIGHT`\n- `CLARIFICATION_POINT`\n- `DECISION`\n- `RESULT`\n\nNo `OPEN_ITEM` type exists in this contract.\n\nOnly `CLARIFICATION_POINT` has runtime state `open | closed`.\n\nThe repository does not author that state. A newly created Clarification Point starts `open` through the existing Work mutation rule; later Browser/MCP/import runs never reopen or close it merely because the JSON is re-imported.\n\nEntry type is immutable after creation. A repository change that attempts to retype an already mapped Entry is a blocking `TYPE_CONFLICT`; the author must use a new Entry `externalKey` when the semantic role truly changes.\n\n## 8. External keys and internal identity\n\nRepository `externalKey` is import identity, not OrivelaIQ Domain identity.\n\nOrivelaIQ continues to generate its existing internal IDs.\n\nThe importer persists a mapping scoped to the saved import configuration:\n\n```text\nconfiguration + object kind + externalKey\n        → internal OrivelaIQ ID\n```\n\nv0.1 requires:\n\n- one Topic definition per import configuration;\n- Topic externalKey unique within that configuration;\n- Item externalKey unique within the Topic;\n- Entry externalKey unique across that Topic so relations can resolve without path coupling.\n\nFile moves and title changes do not create new objects.\n\nBrowser/MCP-created Work without an import mapping remains ordinary Work and is not implicitly adopted by the importer.\n\nIf a removed repository definition later reappears with the same mapped externalKey, it resolves to the same existing Work object.\n\n## 9. Labels\n\nLabels apply to Item exactly as the Work model defines them.\n\nRepository validation mirrors the existing limits:\n\n- maximum eight labels per Item;\n- maximum 30 characters per label;\n- normalization/deduplication is enforced by the Work mutation service.\n\nThe repository does not introduce Topic labels or Entry labels.\n\n## 10. Portable Artifact selectors\n\nRepository JSON cannot store ephemeral internal Artifact IDs or projection IDs.\n\nIt therefore stores a portable selector:\n\n```json\n{\n  \"workspaceAlias\": \"knowledge-base\",\n  \"sourceKey\": \"service-handbook\",\n  \"path\": \"docs/service-handover.md\",\n  \"view\": \"stable\"\n}\n```\n\n`workspaceAlias` resolves through the saved import configuration to one explicitly configured internal Workspace ID.\n\nPLAN must then use the existing authorized Work catalog/projection boundary to resolve the selector to the exact Work mutation tuple:\n\n```text\nworkspaceId\nartifactId\nview\nprojectionId\n```\n\nA plan is APPLY-ready only when the selector resolves uniquely in the current authorized projection and source.\n\nMissing, ambiguous, hidden, unassigned or no-longer-readable targets produce `UNRESOLVED_REFERENCE`.\n\nAPPLY uses the resolved exact tuple through the existing `add_reference` Work invariant. Repository selectors never bypass Work Artifact validation and never become arbitrary URL/path bookmarks.\n\n## 11. Entry relations\n\nWork supports one relation semantic: exact Entry `relates-to`.\n\nRepository Entries may therefore declare:\n\n```json\n{\n  \"relatesTo\": [\n    \"another-entry-external-key\"\n  ]\n}\n```\n\nPLAN resolves both endpoints through the import identity map.\n\nThe existing Work rules apply:\n\n- both Entries exist in the same Topic;\n- self-relations fail;\n- duplicate/reverse-duplicate relations fail;\n- relation creation/removal is authorized through the Topic.\n\nNo `depends_on`, `supports`, `blocks` or `supersedes` Work relation vocabulary is introduced.\n\n## 12. Repository-managed definition surface\n\nFor mapped objects the repository may propose changes only to fields already mutable through Work operations:\n\nTopic:\n\n- `title`\n- `description`\n\nItem:\n\n- `title`\n- `labels`\n- `knowledgeContextExposure` (default `include`; projection preference only)\n\nEntry:\n\n- `text`\n\nEntry `type` is create-time identity and cannot be changed in place.\n\nRepository-declared Artifact References and relates-to edges are import-managed links. Browser/MCP-created links remain outside import management unless they originated from the same import mapping.\n\nNo other Work field is repository-owned.\n\n## 13. Source removal\n\nAbsence is never automatic deletion.\n\nWhen a previously mapped Topic child is no longer defined in the current repository snapshot, PLAN reports:\n\n```text\nSOURCE_REMOVED\n```\n\nv0.1 does not automatically delete the Item/Entry, close a Clarification Point, remove Topic access or otherwise destroy Work.\n\nThe mapping is retained so a later reappearance of the same externalKey resumes the same object.\n\n## 14. PLAN\n\nPLAN is read-only.\n\nIt reads the saved import configuration, resolves the configured ref to an exact Git commit and creates a bounded plan for the single configured Topic.\n\nThe persisted plan contains at minimum:\n\n- `planId`;\n- configuration ID + configuration revision;\n- authenticated planner identity;\n- resolved repository commit SHA;\n- root;\n- target Topic ID when already bound;\n- target Topic revision when already bound;\n- canonical plan digest;\n- validated definition snapshot / hashes;\n- exact resolved Artifact mutation targets;\n- external-key mappings used;\n- proposed Work actions;\n- object/action states and blockers;\n- created-at timestamp.\n\nPLAN performs no Work mutation and no configuration binding mutation.\n\nPlan result states include:\n\n- `CREATE`\n- `UPDATE`\n- `UNCHANGED`\n- `SOURCE_REMOVED`\n- `CONFLICT`\n- `TYPE_CONFLICT`\n- `UNRESOLVED_REFERENCE`\n\n## 15. Three-way comparison\n\nFor repository-managed fields/links, OrivelaIQ stores the last successfully imported canonical repository representation as baseline.\n\nConceptually:\n\n```text\nB = last applied repository definition\nR = current repository definition\nO = current mapped OrivelaIQ definition\n```\n\n- `O = B`, `R != B` → repository change may UPDATE;\n- `R = B`, `O != B` → Browser/MCP change is preserved; no repository overwrite;\n- `R != B`, `O != B` → `CONFLICT`;\n- `R = B`, `O = B` → `UNCHANGED`.\n\nComparison excludes runtime-owned fields such as Topic revision/stamps and Clarification state.\n\nv0.1 performs no automatic semantic conflict merge.\n\n## 16. PLAN freshness\n\nAPPLY must reject a stale plan.\n\nBefore any mutation, APPLY revalidates:\n\n1. the import configuration still exists and its revision equals the planned configuration revision;\n2. the Git credential is still active;\n3. the configured ref still resolves to the exact planned repository commit SHA;\n4. the bound Topic still exists and current manage authority still holds;\n5. the current Topic revision equals the planned Topic revision;\n6. exact planned Artifact projections/targets are still valid and authorized;\n7. the plan digest matches the stored immutable plan payload.\n\nAny mismatch returns `PLAN_STALE` or the relevant authorization/reference error and requires a new PLAN.\n\nFor an unbound first import, APPLY additionally verifies the configuration is still unbound.\n\n## 17. APPLY and existing Work mutation invariants\n\nAPPLY must not write Work tables through a parallel importer-specific mutation model.\n\nImplementation must reuse/factor the existing Work domain mutation rules so the import batch is checked with the same:\n\n- active Human validation;\n- Topic owner/Admin manage boundary where Topic mutation requires it;\n- Topic membership/authorization;\n- Workspace assignment/readability constraints;\n- label limits/normalization;\n- immutable Entry type semantics;\n- exact Artifact reference validation;\n- same-Topic Entry relation rules;\n- Topic aggregate limits;\n- expected Topic revision / stale-write protection;\n- authenticated actor/time/channel attribution.\n\nThe importer compiles repository differences and configured Workspace bindings into the existing Work action vocabulary:\n\n- `create_topic` / `update_topic`;\n- `assign_workspace` when a configured Workspace is not yet assigned to the Topic;\n- `create_item` / `update_item`;\n- `create_entry` / `update_entry`;\n- `add_reference` / `remove_reference`;\n- `add_relation` / `remove_relation`.\n\nIt does not compile repository data into `set_clarification`.\n\nv0.1 never removes a Topic Workspace assignment merely because an alias is removed from the import configuration. Workspace removal remains an explicit existing Work management action.\n\n### Atomicity\n\nOne APPLY is one bounded transaction for one configured Topic.\n\nThe transaction includes:\n\n- all compiled Work changes;\n- Topic revision advancement;\n- external-key → internal-ID mappings;\n- imported baseline snapshot/hash;\n- initial configuration → Topic binding when needed;\n- durable import receipt.\n\nAny failed action or guard rolls back the whole APPLY.\n\nPartial repository import is not a v0.1 outcome.\n\n### Idempotency\n\nAPPLY has a durable `requestId` and immutable `planId` / plan digest.\n\n- same current actor + same requestId + same plan returns the original receipt;\n- same requestId with a different plan/payload conflicts;\n- uncertain client retry cannot create duplicate Topic/Item/Entry/Reference/Relation objects;\n- current Human and Topic authorization are rechecked on replay.\n\nThis extends, rather than bypasses, existing Work request/receipt semantics.\n\n## 18. First import and binding\n\nAn unbound saved configuration represents a potential new Topic.\n\nFirst successful APPLY:\n\n1. creates the Topic through the existing `create_topic` invariant;\n2. creates the configured Items/Entries/links;\n3. persists external-key mappings;\n4. atomically binds the import configuration to the new internal Topic ID.\n\nThe authenticated Admin who runs the unbound import becomes the Topic owner under existing `create_topic` semantics.\n\nSubsequent runs operate only on that bound Topic.\n\nv0.1 does not retarget a configuration to another Topic.\n\n## 19. Git read authority\n\nRepository read uses the existing encrypted GitHub Credential Store.\n\nRules:\n\n- import configuration stores only `credentialId`;\n- raw token is never returned to Browser or stored in Work definitions;\n- configuration creation/edit remains Admin-only because credentials are Admin-only resources;\n- PLAN/APPLY fail when the credential is disabled/error/expired/unavailable;\n- repository access is read-only and limited to the configured repository/ref/root;\n- import never creates/changes a Knowledge Source;\n- import never writes Git;\n- import never treats a Workspace membership as Git repository authority.\n\nThe saved import configuration is the explicit delegation that allows later Topic owner/Admin runs against that configured repository root without exposing the credential itself.\n\n## 20. Manual-only v0.1 UX\n\nThe normal Work experience starts from saved configurations, not repeated source-entry forms.\n\nConceptually:\n\n```text\nWork\n└── Repository imports\n    ├── Service handover knowledge\n    │     service-handbook · main\n    │     /work/service-handover\n    │     [Run import] [Manage]\n    └── ...\n```\n\n`Run import` performs PLAN.\n\nThe Human reviews the plan and explicitly chooses APPLY.\n\n`Manage` reopens the saved configuration.\n\nAutomatic checks, schedules and auto-apply do not appear in v0.1.\n\n## 21. Validation\n\nCanonical schema artifacts:\n\n- `work-topic.schema.json`\n- `work-item.schema.json`\n\nRepository CI may validate them where practical; OrivelaIQ validates again during PLAN.\n\nUnsupported `schemaVersion` fails closed.\n\nThe `read_work_repository_authoring` MCP tool returns these canonical schemas, a complete schema/runtime-valid example and the current Human-authorized saved import contexts. It is a read-only projection of this contract. It does not authorize Git access or replace the existing manual PLAN/Preview/APPLY validation. Schema validity alone does not prove cross-file relation resolution, current Artifact availability, content/aggregate limits, import freshness or absence of conflicts.\n\n## 22. AI authoring rule\n\nAI should create a small coherent Topic → Item → Entry structure with continuing work value.\n\nDo not create one Entry per sentence, slide, transcript paragraph or extracted fact merely because it exists.\n\nThe repository contract is a durable Work authoring surface, not a replacement extraction register.\n\n## 23. Current v0.1 coverage\n\nv0.1 supports:\n\n1. saved manual import configurations;\n2. one repository Work Topic per configuration;\n3. exact Topic → Item → Entry representation;\n4. stable external-key mapping to existing internal IDs;\n5. existing Work labels, Entry types, Artifact References and relates-to relations;\n6. mutation-free PLAN;\n7. freshness validation;\n8. atomic/idempotent APPLY through existing Work invariants;\n9. three-way conflict detection for import-managed definition fields/links;\n10. Clarification runtime-state preservation;\n11. safe `SOURCE_REMOVED` handling;\n12. exact repository revision and durable import receipt traceability.\n\nAutomatic/scheduled import is explicitly outside v0.1.\n"},{"path":"contracts/work-repository/work-topic.schema.json","digest":"sha256:304a9a3e78d2e19d878960d018c8d9f8d665c0b486d237c736b73611d0995fc3","mediaType":"application/json","content":"{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$id\": \"https://orivelaiq.dev/contracts/work-repository/0.1/work-topic.schema.json\",\n  \"title\": \"OrivelaIQ Work Topic Repository Definition v0.1\",\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\n    \"schemaVersion\",\n    \"externalKey\",\n    \"title\"\n  ],\n  \"properties\": {\n    \"schemaVersion\": {\n      \"const\": \"0.1\"\n    },\n    \"externalKey\": {\n      \"type\": \"string\",\n      \"pattern\": \"^[a-z0-9][a-z0-9-]*$\",\n      \"maxLength\": 160\n    },\n    \"title\": {\n      \"type\": \"string\",\n      \"minLength\": 1,\n      \"maxLength\": 160\n    },\n    \"description\": {\n      \"type\": \"string\",\n      \"maxLength\": 1000\n    }\n  }\n}\n"},{"path":"contracts/work-repository/work-item.schema.json","digest":"sha256:c167cd5d5e8bcf364e1b41c7bb0c46fb34da062b790b2d19118a6b7243b07bd7","mediaType":"application/json","content":"{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$id\": \"https://orivelaiq.dev/contracts/work-repository/0.1/work-item.schema.json\",\n  \"title\": \"OrivelaIQ Work Item Repository Definition v0.1\",\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\n    \"schemaVersion\",\n    \"externalKey\",\n    \"topicExternalKey\",\n    \"title\",\n    \"entries\"\n  ],\n  \"properties\": {\n    \"schemaVersion\": {\n      \"const\": \"0.1\"\n    },\n    \"externalKey\": {\n      \"$ref\": \"#/$defs/externalKey\"\n    },\n    \"topicExternalKey\": {\n      \"$ref\": \"#/$defs/externalKey\"\n    },\n    \"title\": {\n      \"type\": \"string\",\n      \"minLength\": 1,\n      \"maxLength\": 160\n    },\n    \"labels\": {\n      \"type\": \"array\",\n      \"maxItems\": 8,\n      \"uniqueItems\": true,\n      \"items\": {\n        \"type\": \"string\",\n        \"minLength\": 1,\n        \"maxLength\": 30\n      }\n    },\n    \"knowledgeContextExposure\": {\n      \"enum\": [\n        \"include\",\n        \"exclude\"\n      ],\n      \"default\": \"include\",\n      \"description\": \"Controls only whether this Item's directly referencing Entries appear in Knowledge-side Related Work Context. It is not authorization.\"\n    },\n    \"artifactRefs\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"$ref\": \"#/$defs/artifactSelector\"\n      }\n    },\n    \"entries\": {\n      \"type\": \"array\",\n      \"minItems\": 1,\n      \"maxItems\": 200,\n      \"items\": {\n        \"$ref\": \"#/$defs/entry\"\n      }\n    }\n  },\n  \"$defs\": {\n    \"externalKey\": {\n      \"type\": \"string\",\n      \"pattern\": \"^[a-z0-9][a-z0-9-]*$\",\n      \"maxLength\": 160\n    },\n    \"artifactSelector\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\n        \"workspaceAlias\",\n        \"sourceKey\",\n        \"path\",\n        \"view\"\n      ],\n      \"properties\": {\n        \"workspaceAlias\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 160\n        },\n        \"sourceKey\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 200\n        },\n        \"path\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 2000\n        },\n        \"view\": {\n          \"enum\": [\n            \"stable\",\n            \"dynamic\"\n          ]\n        }\n      }\n    },\n    \"entry\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\n        \"externalKey\",\n        \"type\",\n        \"text\"\n      ],\n      \"properties\": {\n        \"externalKey\": {\n          \"$ref\": \"#/$defs/externalKey\"\n        },\n        \"type\": {\n          \"enum\": [\n            \"INSIGHT\",\n            \"CLARIFICATION_POINT\",\n            \"DECISION\",\n            \"RESULT\"\n          ]\n        },\n        \"text\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 4000\n        },\n        \"artifactRefs\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"#/$defs/artifactSelector\"\n          }\n        },\n        \"relatesTo\": {\n          \"type\": \"array\",\n          \"maxItems\": 200,\n          \"uniqueItems\": true,\n          \"items\": {\n            \"$ref\": \"#/$defs/externalKey\"\n          }\n        }\n      }\n    }\n  }\n}\n"}]},{"contextKind":"public_baseline","language":"en","id":"review-exchange","version":"1.0.0","contractDigest":"sha256:6b39cae0c6af595c7b3764919e5e7d327271961b0a0b7a3acefbd7f9bb87c68d","title":"Review Exchange","kind":"repository-contract","files":[{"path":"docs/architecture/review-exchange-contract-v1.md","digest":"sha256:805963613d3221b8cdec93effe9ad293b123d72001e302258a28af172ecac54a","mediaType":"text/markdown","content":"---\nrole: authority\nlifecycle: frozen\nversion: \"1\"\nlanguage: en\n---\n# Review Exchange contract v1\n\n## Canonical aggregate and identity\n\nUI and file exchange feed one aggregate: **Review Package → Review Items → Responses, Decisions, Verification, and Audit Events**. Comments, clarifications, evidence, proposals, change evidence, verification notes, and decision notes are response types. Review Packages are the only grouping model.\n\nEvery installation has an immutable RFC 4122 UUID and `productId: orivelaiq`, mutable optional alias/environment metadata, and created/updated timestamps. Every review entity has an internal database ID (`rvp_`, `rvi_`, and related prefixes) and a separate UUID public ID. Only public IDs occur in exchange artifacts and `ExchangeEntityRef`; internal IDs never cross the installation boundary.\n\n## Status and transition contract\n\nPackage statuses are exactly:\n\n`draft | open | in_review | completed | completed_with_open_items | deferred | out_of_scope | archived`\n\nItem statuses are exactly:\n\n`open | in_review | needs_clarification | response_received | decision_pending | change_required | change_applied | verification_pending | verified | resolved | deferred | out_of_scope | parking_lot | archived`\n\nEvery allowed non-idempotent edge has a named manual gate and evaluable preconditions. There is no `open → completed` shortcut. Completion with open items uses the distinct `completed_with_open_items` state and requires policy permission plus explicit risk acceptance for every open mandatory item. Deferred mandatory items require owner and due date. Finding rejection and parking-lot disposition require reasons. Conflicting responses require a decision. Stale responses are rejected or manually reviewed according to policy. `change_required → change_applied → verification_pending` keeps implementation evidence distinct from verification.\n\n## Origin, authorship, and based-on\n\nOrigin is exactly `orivelaiq_ui | review_exchange | migration | system` and identifies the responsible installation and optional source reference. Authorship is independently and explicitly `human | ai | ai_assisted | tool | system | unknown`. AI-assisted authorship requires a human reviewer, AI authorship records a model, and tool authorship records a tool. These are provenance claims, never authentication or authorization.\n\nEvery response, decision, verification, and report has `basedOn`: package public ID/revision, optional item public ID/revision, optional context revision/hash, and export timestamp. Stale imports cannot silently re-anchor or overwrite current work.\n\nContext hashes use canonical JSON with sorted keys, Unicode NFC for keys and values, CRLF/CR normalized to LF, then SHA-256 over UTF-8. Revision and transport metadata are not hashed.\n\n## Normative exchange layout\n\n```text\ninstallations/<installationId>/\n  installation.yaml\n  review-packages/<packagePublicId>/\n    package.yaml\n    items/<itemPublicId>/\n      item.yaml\n      context.md\n      evidence.md\n      responses/<responsePublicId>/\n        response.yaml\n        response.md\n      attachments/**\n    reports/\n      current-status.md\n      result-report.md\n      result-report.json\n    attachments/**  # optional package-level compatibility extension\n    execution-results/**\n    sync/\n      state.yaml\n      import-report.json\n      violations.json\n```\n\nYAML files carry structured metadata validated against the JSON Schemas after safe YAML parsing. Markdown uses YAML front matter where structured fields are required; `response-frontmatter.schema.json` validates response front matter. Markdown bodies remain passive content and are never executed.\n\n## Fail-closed write authority\n\nEvery path is classified into exactly one category:\n\n| Classification | Artifacts | Rule |\n|---|---|---|\n| `orivelaiq-managed` | `installation.yaml`, `package.yaml`, `item.yaml`, `context.md`, `evidence.md`, all three report files, `sync/**` | package/installation owner writes with optimistic revision |\n| `external-managed` | the complete `responses/**` surface (`response.yaml` and `response.md`), normative item `attachments/**`, optional package `attachments/**` | writer must be resolved from validated response authorship or attachment metadata; unresolved means deny |\n| `mixed-managed` | `execution-results/**` | tool writer must be resolved from authoritative execution ownership; unresolved means deny |\n| `unknown` | unrecognized but non-malicious path | no read-to-domain or write permission |\n| `forbidden` | traversal, absolute/NUL/backslash paths, secret/credential areas | reject before adapter I/O |\n\nBoth files in a response directory use the same author resolved from validated response authorship; the package owner has no implicit response write permission. Item-level `items/<itemPublicId>/attachments/**` is normative. Package-level `attachments/**` is supported only as an explicit compatibility extension.\n\n`unknown` and `forbidden` always fail closed. Authority is evaluated again at runtime; TypeScript types are not a security boundary. Immutable response metadata/bodies, attachments, and execution results are create-only. Managed metadata and reports use compare-and-swap. Workspace source artifacts remain outside exchange write authority.\n\n## Adapter boundary\n\nAdapter `kind` is a closed union: `local-directory | github-repository | file-share | azure-devops-repository`. The source-neutral interface provides `readFile`, `listFiles`, `listChanges`, `getRevision`, `writeFile`, and `deleteFile`. Change listings return added/modified/deleted entries and a continuation revision. Writes/deletes require classified paths and optimistic revisions. Implementations normalize paths, prevent root/symlink escape, enforce size/count limits, and perform atomic writes where the source permits.\n\n## Policy, violations, and reports\n\nThe package policy controls stale responses, forces conflicting responses into decision, allows or forbids completion with open items, and mandates risk acceptance, finding-rejection reasons, deferred owner/due date, and parking-lot reasons. `evaluateReviewPolicy` returns stable violation codes rather than booleans. Violations carry severity, rule ID, safe message, and optional entity reference.\n\nImport reports record source/target installations, counts, terminal status, and violations. Result reports are immutable reviewer-authored YAML artifacts based on exact public IDs/revisions. Reports communicate results; they do not bypass the package owner's transition gates.\n\nValidation order is: path/authority and limits; UTF-8/YAML-front-matter parsing with duplicate-key rejection; installation/version/schema; public-ID/reference consistency; attachment digests; `basedOn` and context; authorship mapping; local authorization; transition/policy evaluation; transactional persistence and audit; report emission. Schema validity is never authorization.\n\n## Schema inventory and compatibility\n\n`contracts/review-exchange/v1/manifest.json` lists installation, package, item, response front matter, decision, verification, result report, import report, and audit schemas. Schemas use JSON Schema 2020-12 and reject unknown fields. Producers emit `1.0.0`; breaking changes require another major directory.\n"},{"path":"contracts/review-exchange/v1/manifest.json","digest":"sha256:15c8721c5ae28decb32b3945363a7735c0994f4b7bf25efcb6b59dc5e2dfb81b","mediaType":"application/json","content":"{\n  \"contract\": \"orivelaiq-review-exchange\",\n  \"version\": \"1.0.0\",\n  \"jsonSchemaDraft\": \"2020-12\",\n  \"installation\": \"installation.schema.json\",\n  \"importReport\": \"import-report.schema.json\",\n  \"entities\": {\n    \"package\": \"review-package.schema.json\",\n    \"item\": \"review-item.schema.json\",\n    \"contribution\": \"review-contribution.schema.json\",\n    \"response\": \"review-response.schema.json\",\n    \"decision\": \"review-decision.schema.json\",\n    \"verification\": \"review-verification.schema.json\",\n    \"result_report\": \"result-report.schema.json\",\n    \"audit_event\": \"review-audit_event.schema.json\"\n  },\n  \"responseFrontmatter\": \"response-frontmatter.schema.json\"\n}\n"},{"path":"contracts/review-exchange/v1/installation.schema.json","digest":"sha256:88377f5377097f4631533d4be662f0ef7e5c59dae49738d2f82ea6857c22867c","mediaType":"application/json","content":"{\"$schema\":\"https://json-schema.org/draft/2020-12/schema\",\"$id\":\"https://schemas.orivelaiq.dev/review-exchange/v1/installation.schema.json\",\"title\":\"OrivelaIQ Installation Identity\",\"type\":\"object\",\"additionalProperties\":false,\"required\":[\"schemaVersion\",\"productId\",\"installationId\",\"createdAt\",\"updatedAt\"],\"properties\":{\"schemaVersion\":{\"const\":\"1.0.0\"},\"productId\":{\"const\":\"orivelaiq\"},\"installationId\":{\"$ref\":\"review-shared.schema.json#/$defs/installationId\"},\"installationAlias\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":128},\"environmentId\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":128},\"createdAt\":{\"$ref\":\"review-shared.schema.json#/$defs/timestamp\"},\"updatedAt\":{\"$ref\":\"review-shared.schema.json#/$defs/timestamp\"}}}\n"},{"path":"contracts/review-exchange/v1/import-report.schema.json","digest":"sha256:9158c2cdb1cd805c43726bc2097301118eb7dcc986de6563a2652e22aa9d827c","mediaType":"application/json","content":"{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$id\": \"https://schemas.orivelaiq.dev/review-exchange/v1/import-report.schema.json\",\n  \"title\": \"OrivelaIQ Review Import Report\",\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\n    \"publicId\",\n    \"sourceInstallationId\",\n    \"targetInstallationId\",\n    \"startedAt\",\n    \"completedAt\",\n    \"status\",\n    \"discovered\",\n    \"imported\",\n    \"skipped\",\n    \"rejected\",\n    \"violations\"\n  ],\n  \"properties\": {\n    \"sourceInstallationId\": {\n      \"$ref\": \"review-shared.schema.json#/$defs/installationId\"\n    },\n    \"targetInstallationId\": {\n      \"$ref\": \"review-shared.schema.json#/$defs/installationId\"\n    },\n    \"startedAt\": {\n      \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n    },\n    \"completedAt\": {\n      \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n    },\n    \"status\": {\n      \"enum\": [\n        \"accepted\",\n        \"partially_accepted\",\n        \"rejected\"\n      ]\n    },\n    \"discovered\": {\n      \"type\": \"integer\",\n      \"minimum\": 0\n    },\n    \"imported\": {\n      \"type\": \"integer\",\n      \"minimum\": 0\n    },\n    \"skipped\": {\n      \"type\": \"integer\",\n      \"minimum\": 0\n    },\n    \"rejected\": {\n      \"type\": \"integer\",\n      \"minimum\": 0\n    },\n    \"violations\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"$ref\": \"review-shared.schema.json#/$defs/violation\"\n      }\n    },\n    \"publicId\": {\n      \"$ref\": \"review-shared.schema.json#/$defs/publicId\"\n    }\n  }\n}\n"},{"path":"contracts/review-exchange/v1/review-package.schema.json","digest":"sha256:25134e24edfd0df771cf2867a4cfc1e7222a7dfa11a33c15cc8ebb0a64a336ac","mediaType":"application/json","content":"{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$id\": \"https://schemas.orivelaiq.dev/review-exchange/v1/review-package.schema.json\",\n  \"title\": \"OrivelaIQ Review Package Exchange Envelope\",\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\n    \"schemaVersion\",\n    \"entityType\",\n    \"exportedAt\",\n    \"exporter\",\n    \"entity\"\n  ],\n  \"properties\": {\n    \"schemaVersion\": {\n      \"const\": \"1.0.0\"\n    },\n    \"exportedAt\": {\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"entity\": {\n      \"type\": \"object\",\n      \"required\": [\n        \"publicId\",\n        \"workspaceId\",\n        \"title\",\n        \"status\",\n        \"revision\",\n        \"origin\",\n        \"itemPublicIds\",\n        \"createdAt\",\n        \"updatedAt\",\n        \"policy\"\n      ],\n      \"properties\": {\n        \"workspaceId\": {\n          \"type\": \"string\",\n          \"minLength\": 1\n        },\n        \"title\": {\n          \"type\": \"string\",\n          \"minLength\": 1\n        },\n        \"description\": {\n          \"type\": \"string\"\n        },\n        \"status\": {\n          \"enum\": [\n            \"draft\",\n            \"open\",\n            \"in_review\",\n            \"completed\",\n            \"completed_with_open_items\",\n            \"deferred\",\n            \"out_of_scope\",\n            \"archived\"\n          ]\n        },\n        \"revision\": {\n          \"type\": \"integer\",\n          \"minimum\": 1\n        },\n        \"origin\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/origin\"\n        },\n        \"createdAt\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n        },\n        \"updatedAt\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n        },\n        \"policy\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/policy\"\n        },\n        \"publicId\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/publicId\"\n        },\n        \"itemPublicIds\": {\n          \"type\": \"array\",\n          \"uniqueItems\": true,\n          \"items\": {\n            \"$ref\": \"review-shared.schema.json#/$defs/publicId\"\n          }\n        }\n      },\n      \"unevaluatedProperties\": false\n    },\n    \"exporter\": {\n      \"$ref\": \"review-shared.schema.json#/$defs/installationId\"\n    },\n    \"entityType\": {\n      \"const\": \"package\"\n    }\n  }\n}\n"},{"path":"contracts/review-exchange/v1/review-item.schema.json","digest":"sha256:5d8bd50554478d0f363a16b2b851bf935ffcae7d52cda6519332e00de7f4f0f4","mediaType":"application/json","content":"{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$id\": \"https://schemas.orivelaiq.dev/review-exchange/v1/review-item.schema.json\",\n  \"title\": \"OrivelaIQ Review Item Exchange Envelope\",\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\n    \"schemaVersion\",\n    \"entityType\",\n    \"exportedAt\",\n    \"exporter\",\n    \"entity\"\n  ],\n  \"properties\": {\n    \"schemaVersion\": {\n      \"const\": \"1.0.0\"\n    },\n    \"exportedAt\": {\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"entity\": {\n      \"type\": \"object\",\n      \"required\": [\n        \"publicId\",\n        \"packagePublicId\",\n        \"title\",\n        \"status\",\n        \"revision\",\n        \"origin\",\n        \"context\",\n        \"createdAt\",\n        \"updatedAt\",\n        \"priority\",\n        \"mandatory\"\n      ],\n      \"properties\": {\n        \"title\": {\n          \"type\": \"string\",\n          \"minLength\": 1\n        },\n        \"question\": {\n          \"type\": \"string\"\n        },\n        \"status\": {\n          \"enum\": [\n            \"open\",\n            \"in_review\",\n            \"needs_clarification\",\n            \"response_received\",\n            \"decision_pending\",\n            \"change_required\",\n            \"change_applied\",\n            \"verification_pending\",\n            \"verified\",\n            \"resolved\",\n            \"deferred\",\n            \"out_of_scope\",\n            \"parking_lot\",\n            \"archived\"\n          ]\n        },\n        \"revision\": {\n          \"type\": \"integer\",\n          \"minimum\": 1\n        },\n        \"origin\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/origin\"\n        },\n        \"context\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/context\"\n        },\n        \"createdAt\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n        },\n        \"updatedAt\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n        },\n        \"priority\": {\n          \"enum\": [\n            \"low\",\n            \"medium\",\n            \"high\"\n          ]\n        },\n        \"publicId\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/publicId\"\n        },\n        \"packagePublicId\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/publicId\"\n        },\n        \"mandatory\": {\n          \"type\": \"boolean\"\n        },\n        \"owner\": {\n          \"type\": \"string\",\n          \"maxLength\": 512\n        },\n        \"dueDate\": {\n          \"type\": \"string\",\n          \"format\": \"date\"\n        },\n        \"dispositionReason\": {\n          \"type\": \"string\",\n          \"maxLength\": 4096\n        }\n      },\n      \"unevaluatedProperties\": false\n    },\n    \"exporter\": {\n      \"$ref\": \"review-shared.schema.json#/$defs/installationId\"\n    },\n    \"entityType\": {\n      \"const\": \"item\"\n    }\n  }\n}\n"},{"path":"contracts/review-exchange/v1/review-contribution.schema.json","digest":"sha256:1a424a689650a390d7cd1809cfe5dedceb527595ac59df1190ff253007bf8d82","mediaType":"application/json","content":"{\n  \"$schema\":\"https://json-schema.org/draft/2020-12/schema\",\n  \"$id\":\"https://schemas.orivelaiq.dev/review-exchange/v1/review-contribution.schema.json\",\n  \"type\":\"object\",\"additionalProperties\":false,\n  \"required\":[\"schemaVersion\",\"entityType\",\"exportedAt\",\"exporter\",\"entity\"],\n  \"properties\":{\"schemaVersion\":{\"const\":\"1.0.0\"},\"entityType\":{\"const\":\"contribution\"},\"exportedAt\":{\"$ref\":\"review-shared.schema.json#/$defs/timestamp\"},\"exporter\":{\"$ref\":\"review-shared.schema.json#/$defs/installationId\"},\"entity\":{\"type\":\"object\",\"additionalProperties\":false,\"required\":[\"publicId\",\"revision\",\"createdAt\",\"updatedAt\",\"origin\",\"packagePublicId\",\"itemPublicId\",\"contributionKind\",\"summary\",\"bodyDigest\",\"authorship\",\"sourceResponsePublicIds\",\"basedOn\",\"status\"],\"properties\":{\"publicId\":{\"$ref\":\"review-shared.schema.json#/$defs/publicId\"},\"revision\":{\"type\":\"integer\",\"minimum\":1},\"createdAt\":{\"$ref\":\"review-shared.schema.json#/$defs/timestamp\"},\"updatedAt\":{\"$ref\":\"review-shared.schema.json#/$defs/timestamp\"},\"origin\":{\"$ref\":\"review-shared.schema.json#/$defs/origin\"},\"packagePublicId\":{\"$ref\":\"review-shared.schema.json#/$defs/publicId\"},\"itemPublicId\":{\"$ref\":\"review-shared.schema.json#/$defs/publicId\"},\"contributionKind\":{\"enum\":[\"request_clarification\",\"request_updated_response\",\"request_more_evidence\"]},\"summary\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":4096},\"bodyDigest\":{\"$ref\":\"review-shared.schema.json#/$defs/digest\"},\"authorship\":{\"$ref\":\"review-shared.schema.json#/$defs/authorship\"},\"sourceResponsePublicIds\":{\"type\":\"array\",\"uniqueItems\":true,\"maxItems\":100,\"items\":{\"$ref\":\"review-shared.schema.json#/$defs/publicId\"}},\"basedOn\":{\"$ref\":\"review-shared.schema.json#/$defs/basedOn\"},\"status\":{\"enum\":[\"ready\",\"exported\",\"answered\",\"superseded\",\"cancelled\"]}}}}}\n"},{"path":"contracts/review-exchange/v1/review-response.schema.json","digest":"sha256:a97320521f43efde65b5cc1487546c77ee88252a59bb1ad7034f5013bdbf0100","mediaType":"application/json","content":"{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\n    \"schemaVersion\",\n    \"entityType\",\n    \"exportedAt\",\n    \"exporter\",\n    \"entity\"\n  ],\n  \"$id\": \"https://schemas.orivelaiq.dev/review-exchange/v1/review-response.schema.json\",\n  \"title\": \"OrivelaIQ Review Response Exchange Envelope\",\n  \"properties\": {\n    \"schemaVersion\": {\n      \"const\": \"1.0.0\"\n    },\n    \"entityType\": {\n      \"const\": \"response\"\n    },\n    \"exportedAt\": {\n      \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n    },\n    \"exporter\": {\n      \"$ref\": \"review-shared.schema.json#/$defs/installationId\"\n    },\n    \"entity\": {\n      \"type\": \"object\",\n      \"required\": [\n        \"publicId\",\n        \"revision\",\n        \"createdAt\",\n        \"updatedAt\",\n        \"origin\",\n        \"packagePublicId\",\n        \"itemPublicId\",\n        \"responseType\",\n        \"authorship\",\n        \"basedOn\"\n      ],\n      \"properties\": {\n        \"revision\": {\n          \"type\": \"integer\",\n          \"minimum\": 1\n        },\n        \"createdAt\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n        },\n        \"updatedAt\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n        },\n        \"origin\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/origin\"\n        },\n        \"text\": {\n          \"type\": \"string\",\n          \"maxLength\": 100000\n        },\n        \"selectedOptions\": {\n          \"type\": \"array\",\n          \"uniqueItems\": true,\n          \"items\": {\n            \"type\": \"string\",\n            \"maxLength\": 1024\n          }\n        },\n        \"authorship\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/authorship\"\n        },\n        \"basedOn\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/basedOn\"\n        },\n        \"inReplyTo\": {\n          \"allOf\": [\n            { \"$ref\": \"review-shared.schema.json#/$defs/entityRef\" },\n            { \"type\": \"object\", \"properties\": { \"entityType\": { \"const\": \"contribution\" } } }\n          ]\n        },\n        \"publicId\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/publicId\"\n        },\n        \"itemPublicId\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/publicId\"\n        },\n        \"packagePublicId\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/publicId\"\n        },\n        \"responseType\": {\n          \"enum\": [\"comment\", \"clarification\", \"evidence\", \"change_proposal\", \"change_evidence\", \"verification_note\", \"decision_note\"]\n        },\n        \"bodyDigest\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/digest\"\n        },\n        \"contentDigest\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/digest\"\n        },\n        \"summary\": {\n          \"type\": \"string\",\n          \"maxLength\": 4096\n        },\n        \"decisionPoint\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 512\n        },\n        \"assertedOutcome\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 128\n        },\n        \"decisionPublicId\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/publicId\"\n        }\n      },\n      \"unevaluatedProperties\": false\n    }\n  }\n}\n"},{"path":"contracts/review-exchange/v1/review-decision.schema.json","digest":"sha256:47c65a9df9f47377c23587881167aa997fc1841b30085c226cef9c6223871dfd","mediaType":"application/json","content":"{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\n    \"schemaVersion\",\n    \"entityType\",\n    \"exportedAt\",\n    \"exporter\",\n    \"entity\"\n  ],\n  \"$id\": \"https://schemas.orivelaiq.dev/review-exchange/v1/review-decision.schema.json\",\n  \"title\": \"OrivelaIQ Review Decision Exchange Envelope\",\n  \"properties\": {\n    \"schemaVersion\": {\n      \"const\": \"1.0.0\"\n    },\n    \"entityType\": {\n      \"const\": \"decision\"\n    },\n    \"exportedAt\": {\n      \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n    },\n    \"exporter\": {\n      \"$ref\": \"review-shared.schema.json#/$defs/installationId\"\n    },\n    \"entity\": {\n      \"type\": \"object\",\n      \"required\": [\n        \"publicId\",\n        \"revision\",\n        \"createdAt\",\n        \"updatedAt\",\n        \"origin\",\n        \"itemPublicId\",\n        \"outcome\",\n        \"summary\",\n        \"authorship\",\n        \"decidedAt\",\n        \"basedOn\"\n      ],\n      \"properties\": {\n        \"revision\": {\n          \"type\": \"integer\",\n          \"minimum\": 1\n        },\n        \"createdAt\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n        },\n        \"updatedAt\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n        },\n        \"origin\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/origin\"\n        },\n        \"outcome\": {\n          \"enum\": [\n            \"accepted\",\n            \"changed\",\n            \"deferred\",\n            \"rejected\",\n            \"out_of_scope\"\n          ]\n        },\n        \"summary\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 100000\n        },\n        \"decidedAt\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n        },\n        \"owner\": {\n          \"type\": \"string\",\n          \"maxLength\": 512\n        },\n        \"dueDate\": {\n          \"type\": \"string\",\n          \"format\": \"date\"\n        },\n        \"authorship\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/authorship\"\n        },\n        \"basedOn\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/basedOn\"\n        },\n        \"publicId\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/publicId\"\n        },\n        \"itemPublicId\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/publicId\"\n        }\n      },\n      \"unevaluatedProperties\": false\n    }\n  }\n}\n"},{"path":"contracts/review-exchange/v1/review-verification.schema.json","digest":"sha256:ce0fbff83fa9b6ff5eba1ce654dc089e21de6e54a709ac5ca9fb92a2cdf8e127","mediaType":"application/json","content":"{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\n    \"schemaVersion\",\n    \"entityType\",\n    \"exportedAt\",\n    \"exporter\",\n    \"entity\"\n  ],\n  \"$id\": \"https://schemas.orivelaiq.dev/review-exchange/v1/review-verification.schema.json\",\n  \"title\": \"OrivelaIQ Review Verification Exchange Envelope\",\n  \"properties\": {\n    \"schemaVersion\": {\n      \"const\": \"1.0.0\"\n    },\n    \"entityType\": {\n      \"const\": \"verification\"\n    },\n    \"exportedAt\": {\n      \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n    },\n    \"exporter\": {\n      \"$ref\": \"review-shared.schema.json#/$defs/installationId\"\n    },\n    \"entity\": {\n      \"type\": \"object\",\n      \"required\": [\n        \"publicId\",\n        \"revision\",\n        \"createdAt\",\n        \"updatedAt\",\n        \"origin\",\n        \"itemPublicId\",\n        \"result\",\n        \"summary\",\n        \"authorship\",\n        \"basedOn\"\n      ],\n      \"properties\": {\n        \"revision\": {\n          \"type\": \"integer\",\n          \"minimum\": 1\n        },\n        \"createdAt\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n        },\n        \"updatedAt\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n        },\n        \"origin\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/origin\"\n        },\n        \"result\": {\n          \"enum\": [\n            \"pending\",\n            \"passed\",\n            \"failed\",\n            \"not_applicable\"\n          ]\n        },\n        \"summary\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 100000\n        },\n        \"verifiedAt\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n        },\n        \"authorship\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/authorship\"\n        },\n        \"basedOn\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/basedOn\"\n        },\n        \"publicId\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/publicId\"\n        },\n        \"itemPublicId\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/publicId\"\n        }\n      },\n      \"unevaluatedProperties\": false\n    }\n  }\n}\n"},{"path":"contracts/review-exchange/v1/result-report.schema.json","digest":"sha256:b84df0ddf56e4726074dcdd363e2c2d8aba395787861184738941af60fa60603","mediaType":"application/json","content":"{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$id\": \"https://schemas.orivelaiq.dev/review-exchange/v1/result-report.schema.json\",\n  \"title\": \"OrivelaIQ Review Result Report Envelope\",\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\n    \"schemaVersion\",\n    \"entityType\",\n    \"exportedAt\",\n    \"exporter\",\n    \"entity\"\n  ],\n  \"properties\": {\n    \"schemaVersion\": {\n      \"const\": \"1.0.0\"\n    },\n    \"entityType\": {\n      \"const\": \"result_report\"\n    },\n    \"exportedAt\": {\n      \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n    },\n    \"exporter\": {\n      \"$ref\": \"review-shared.schema.json#/$defs/installationId\"\n    },\n    \"entity\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\n        \"publicId\",\n        \"packageRef\",\n        \"generatedBy\",\n        \"basedOn\",\n        \"outcome\",\n        \"summary\",\n        \"itemResults\",\n        \"violations\",\n        \"revision\",\n        \"createdAt\",\n        \"updatedAt\",\n        \"origin\"\n      ],\n      \"properties\": {\n        \"packageRef\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/entityRef\"\n        },\n        \"generatedBy\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/installationId\"\n        },\n        \"basedOn\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/basedOn\"\n        },\n        \"outcome\": {\n          \"enum\": [\n            \"accepted\",\n            \"changes_required\",\n            \"rejected\"\n          ]\n        },\n        \"summary\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 100000\n        },\n        \"itemResults\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"type\": \"object\",\n            \"additionalProperties\": false,\n            \"required\": [\n              \"itemRef\",\n              \"outcome\",\n              \"contributionRefs\"\n            ],\n            \"properties\": {\n              \"itemRef\": {\n                \"$ref\": \"review-shared.schema.json#/$defs/entityRef\"\n              },\n              \"outcome\": {\n                \"enum\": [\n                  \"accepted\",\n                  \"changes_required\",\n                  \"rejected\"\n                ]\n              },\n              \"contributionRefs\": {\n                \"type\": \"array\",\n                \"items\": {\n                  \"$ref\": \"review-shared.schema.json#/$defs/entityRef\"\n                }\n              }\n            }\n          }\n        },\n        \"violations\": {\n          \"type\": \"array\",\n          \"items\": {\n            \"$ref\": \"review-shared.schema.json#/$defs/violation\"\n          }\n        },\n        \"revision\": {\n          \"type\": \"integer\",\n          \"minimum\": 1\n        },\n        \"createdAt\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n        },\n        \"updatedAt\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n        },\n        \"origin\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/origin\"\n        },\n        \"publicId\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/publicId\"\n        }\n      }\n    }\n  }\n}\n"},{"path":"contracts/review-exchange/v1/review-audit_event.schema.json","digest":"sha256:df9b14ce63ed7dc6eef77e88c5a2327a708c2b1b6e8daa2111b3058919bc825d","mediaType":"application/json","content":"{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"type\": \"object\",\n  \"additionalProperties\": false,\n  \"required\": [\n    \"schemaVersion\",\n    \"entityType\",\n    \"exportedAt\",\n    \"exporter\",\n    \"entity\"\n  ],\n  \"$id\": \"https://schemas.orivelaiq.dev/review-exchange/v1/review-audit_event.schema.json\",\n  \"title\": \"OrivelaIQ Review Audit_Event Exchange Envelope\",\n  \"properties\": {\n    \"schemaVersion\": {\n      \"const\": \"1.0.0\"\n    },\n    \"entityType\": {\n      \"const\": \"audit_event\"\n    },\n    \"exportedAt\": {\n      \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n    },\n    \"exporter\": {\n      \"$ref\": \"review-shared.schema.json#/$defs/installationId\"\n    },\n    \"entity\": {\n      \"type\": \"object\",\n      \"required\": [\n        \"publicId\",\n        \"revision\",\n        \"createdAt\",\n        \"updatedAt\",\n        \"origin\",\n        \"packagePublicId\",\n        \"entityRef\",\n        \"eventType\",\n        \"authorship\",\n        \"occurredAt\"\n      ],\n      \"properties\": {\n        \"revision\": {\n          \"type\": \"integer\",\n          \"minimum\": 1\n        },\n        \"createdAt\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n        },\n        \"updatedAt\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n        },\n        \"origin\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/origin\"\n        },\n        \"entityRef\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/entityRef\"\n        },\n        \"eventType\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 128\n        },\n        \"occurredAt\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/timestamp\"\n        },\n        \"previousRevision\": {\n          \"type\": \"integer\",\n          \"minimum\": 1\n        },\n        \"resultingRevision\": {\n          \"type\": \"integer\",\n          \"minimum\": 1\n        },\n        \"payloadDigest\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/digest\"\n        },\n        \"authorship\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/authorship\"\n        },\n        \"publicId\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/publicId\"\n        },\n        \"packagePublicId\": {\n          \"$ref\": \"review-shared.schema.json#/$defs/publicId\"\n        }\n      },\n      \"unevaluatedProperties\": false\n    }\n  }\n}\n"},{"path":"contracts/review-exchange/v1/response-frontmatter.schema.json","digest":"sha256:019feb86e0092ffd64cb21103dda201631e8d2b335f2ee69685f49481cab1d09","mediaType":"application/json","content":"{\"$schema\":\"https://json-schema.org/draft/2020-12/schema\",\"$id\":\"https://schemas.orivelaiq.dev/review-exchange/v1/response-frontmatter.schema.json\",\"title\":\"Review response Markdown front matter\",\"type\":\"object\",\"additionalProperties\":false,\"required\":[\"schemaVersion\",\"publicId\",\"itemPublicId\",\"responseType\",\"status\",\"authorship\",\"basedOn\",\"createdAt\"],\"properties\":{\"schemaVersion\":{\"const\":\"1.0.0\"},\"publicId\":{\"$ref\":\"review-shared.schema.json#/$defs/publicId\"},\"itemPublicId\":{\"$ref\":\"review-shared.schema.json#/$defs/publicId\"},\"responseType\":{\"enum\":[\"comment\",\"clarification\",\"evidence\",\"change_proposal\",\"change_evidence\",\"verification_note\",\"decision_note\"]},\"status\":{\"enum\":[\"submitted\",\"accepted\",\"rejected\",\"superseded\",\"stale\",\"conflicting\"]},\"authorship\":{\"$ref\":\"review-shared.schema.json#/$defs/authorship\"},\"basedOn\":{\"$ref\":\"review-shared.schema.json#/$defs/basedOn\"},\"createdAt\":{\"$ref\":\"review-shared.schema.json#/$defs/timestamp\"}}}\n"},{"path":"contracts/review-exchange/v1/review-shared.schema.json","digest":"sha256:3b0d4ac332b3cd6f5c3d6d9621e055ac0d05ffa4904b38b5a1d3fc5258da36d9","mediaType":"application/json","content":"{\n  \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n  \"$id\": \"https://schemas.orivelaiq.dev/review-exchange/v1/review-shared.schema.json\",\n  \"title\": \"OrivelaIQ Review Exchange shared definitions\",\n  \"$defs\": {\n    \"installationId\": {\n      \"type\": \"string\",\n      \"format\": \"uuid\"\n    },\n    \"timestamp\": {\n      \"type\": \"string\",\n      \"format\": \"date-time\"\n    },\n    \"digest\": {\n      \"type\": \"string\",\n      \"pattern\": \"^sha256:[0-9a-f]{64}$\"\n    },\n    \"entityRef\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\n        \"installationId\",\n        \"entityType\",\n        \"publicId\"\n      ],\n      \"properties\": {\n        \"installationId\": {\n          \"$ref\": \"#/$defs/installationId\"\n        },\n        \"entityType\": {\n          \"enum\": [\n            \"package\",\n            \"item\",\n            \"contribution\",\n            \"response\",\n            \"decision\",\n            \"verification\",\n            \"result_report\",\n            \"audit_event\"\n          ]\n        },\n        \"publicId\": {\n          \"$ref\": \"#/$defs/publicId\"\n        }\n      }\n    },\n    \"origin\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\n        \"type\",\n        \"installationId\"\n      ],\n      \"properties\": {\n        \"type\": {\n          \"enum\": [\n            \"orivelaiq_ui\",\n            \"review_exchange\",\n            \"migration\",\n            \"system\"\n          ]\n        },\n        \"installationId\": {\n          \"$ref\": \"#/$defs/installationId\"\n        },\n        \"source\": {\n          \"$ref\": \"#/$defs/entityRef\"\n        },\n        \"importedAt\": {\n          \"$ref\": \"#/$defs/timestamp\"\n        }\n      }\n    },\n    \"context\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\n        \"artifactPath\",\n        \"revision\",\n        \"contextHash\"\n      ],\n      \"properties\": {\n        \"artifactId\": {\n          \"type\": \"string\",\n          \"maxLength\": 256\n        },\n        \"artifactPath\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 4096\n        },\n        \"headingId\": {\n          \"type\": \"string\",\n          \"maxLength\": 512\n        },\n        \"sectionTitle\": {\n          \"type\": \"string\",\n          \"maxLength\": 1024\n        },\n        \"excerpt\": {\n          \"type\": \"string\",\n          \"maxLength\": 16384\n        },\n        \"revision\": {\n          \"type\": \"integer\",\n          \"minimum\": 1\n        },\n        \"contextHash\": {\n          \"$ref\": \"#/$defs/digest\"\n        }\n      }\n    },\n    \"metadata\": {\n      \"type\": \"object\",\n      \"required\": [\n        \"revision\",\n        \"createdAt\",\n        \"updatedAt\",\n        \"origin\"\n      ],\n      \"properties\": {\n        \"revision\": {\n          \"type\": \"integer\",\n          \"minimum\": 1\n        },\n        \"createdAt\": {\n          \"$ref\": \"#/$defs/timestamp\"\n        },\n        \"updatedAt\": {\n          \"$ref\": \"#/$defs/timestamp\"\n        },\n        \"origin\": {\n          \"$ref\": \"#/$defs/origin\"\n        }\n      }\n    },\n    \"attachment\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\n        \"name\",\n        \"mediaType\",\n        \"digest\"\n      ],\n      \"oneOf\": [\n        {\n          \"required\": [\n            \"relativePath\"\n          ]\n        },\n        {\n          \"required\": [\n            \"uri\"\n          ]\n        }\n      ],\n      \"properties\": {\n        \"name\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 256\n        },\n        \"mediaType\": {\n          \"type\": \"string\",\n          \"pattern\": \"^[^/ ]+/[^/ ]+$\"\n        },\n        \"digest\": {\n          \"$ref\": \"#/$defs/digest\"\n        },\n        \"relativePath\": {\n          \"type\": \"string\",\n          \"pattern\": \"^(?!/)(?!.*(?:^|/)\\\\.\\\\.(?:/|$)).+$\",\n          \"maxLength\": 4096\n        },\n        \"uri\": {\n          \"type\": \"string\",\n          \"format\": \"uri\",\n          \"maxLength\": 4096\n        }\n      }\n    },\n    \"envelope\": {\n      \"type\": \"object\",\n      \"required\": [\n        \"schemaVersion\",\n        \"entityType\",\n        \"exportedAt\",\n        \"exporter\",\n        \"entity\"\n      ],\n      \"properties\": {\n        \"schemaVersion\": {\n          \"const\": \"1.0.0\"\n        },\n        \"entityType\": {\n          \"enum\": [\n            \"installation\",\n            \"package\",\n            \"item\",\n            \"contribution\",\n            \"response\",\n            \"decision\",\n            \"verification\",\n            \"result_report\",\n            \"audit_event\"\n          ]\n        },\n        \"exportedAt\": {\n          \"$ref\": \"#/$defs/timestamp\"\n        },\n        \"exporter\": {\n          \"$ref\": \"#/$defs/installationId\"\n        }\n      }\n    },\n    \"authorship\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\n        \"type\"\n      ],\n      \"properties\": {\n        \"type\": {\n          \"enum\": [\n            \"human\",\n            \"ai\",\n            \"ai_assisted\",\n            \"tool\",\n            \"system\",\n            \"unknown\"\n          ]\n        },\n        \"installationId\": {\n          \"$ref\": \"#/$defs/installationId\"\n        },\n        \"subjectId\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 512\n        },\n        \"displayName\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 256\n        },\n        \"toolName\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 256\n        },\n        \"modelName\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 256\n        },\n        \"humanReviewerId\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 512\n        }\n      },\n      \"allOf\": [\n        {\n          \"if\": {\n            \"properties\": {\n              \"type\": {\n                \"const\": \"ai_assisted\"\n              }\n            }\n          },\n          \"then\": {\n            \"required\": [\n              \"humanReviewerId\"\n            ]\n          }\n        },\n        {\n          \"if\": {\n            \"properties\": {\n              \"type\": {\n                \"enum\": [\n                  \"ai\",\n                  \"ai_assisted\"\n                ]\n              }\n            }\n          },\n          \"then\": {\n            \"required\": [\n              \"modelName\"\n            ]\n          }\n        },\n        {\n          \"if\": {\n            \"properties\": {\n              \"type\": {\n                \"const\": \"tool\"\n              }\n            }\n          },\n          \"then\": {\n            \"required\": [\n              \"toolName\"\n            ]\n          }\n        }\n      ]\n    },\n    \"basedOn\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\n        \"packagePublicId\",\n        \"packageRevision\",\n        \"exportedAt\"\n      ],\n      \"properties\": {\n        \"packagePublicId\": {\n          \"$ref\": \"#/$defs/publicId\"\n        },\n        \"packageRevision\": {\n          \"type\": \"integer\",\n          \"minimum\": 1\n        },\n        \"itemPublicId\": {\n          \"$ref\": \"#/$defs/publicId\"\n        },\n        \"itemRevision\": {\n          \"type\": \"integer\",\n          \"minimum\": 1\n        },\n        \"contextRevision\": {\n          \"type\": \"integer\",\n          \"minimum\": 1\n        },\n        \"contextHash\": {\n          \"$ref\": \"#/$defs/digest\"\n        },\n        \"exportedAt\": {\n          \"$ref\": \"#/$defs/timestamp\"\n        }\n      }\n    },\n    \"violation\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\n        \"code\",\n        \"severity\",\n        \"message\"\n      ],\n      \"properties\": {\n        \"code\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 128,\n          \"enum\": [\n            \"OPEN_MANDATORY_ITEMS\",\n            \"RISK_ACCEPTANCE_REQUIRED\",\n            \"FINDING_REJECTION_REASON_REQUIRED\",\n            \"DEFERRED_OWNER_REQUIRED\",\n            \"DEFERRED_DUE_DATE_REQUIRED\",\n            \"PARKING_LOT_REASON_REQUIRED\",\n            \"CONFLICTING_RESPONSES\",\n            \"STALE_RESPONSE\",\n            \"INVALID_TRANSITION\"\n          ]\n        },\n        \"severity\": {\n          \"enum\": [\n            \"error\",\n            \"warning\",\n            \"info\"\n          ]\n        },\n        \"message\": {\n          \"type\": \"string\",\n          \"minLength\": 1,\n          \"maxLength\": 4096\n        },\n        \"entityRef\": {\n          \"$ref\": \"#/$defs/entityRef\"\n        },\n        \"jsonPointer\": {\n          \"type\": \"string\",\n          \"maxLength\": 2048\n        },\n        \"ruleId\": {\n          \"type\": \"string\",\n          \"maxLength\": 256\n        }\n      }\n    },\n    \"policy\": {\n      \"type\": \"object\",\n      \"additionalProperties\": false,\n      \"required\": [\n        \"policyVersion\",\n        \"staleResponseHandling\",\n        \"conflictingResponseHandling\",\n        \"allowCompletionWithOpenItems\",\n        \"requireRiskAcceptanceForOpenMandatoryItems\",\n        \"requireReasonForFindingRejection\",\n        \"requireOwnerAndDueDateForDeferredMandatoryItems\",\n        \"requireReasonForParkingLot\"\n      ],\n      \"properties\": {\n        \"policyVersion\": {\n          \"const\": \"1.0\"\n        },\n        \"staleResponseHandling\": {\n          \"enum\": [\n            \"manual_review\",\n            \"reject\"\n          ]\n        },\n        \"conflictingResponseHandling\": {\n          \"const\": \"decision_required\"\n        },\n        \"allowCompletionWithOpenItems\": {\n          \"type\": \"boolean\"\n        },\n        \"requireRiskAcceptanceForOpenMandatoryItems\": {\n          \"const\": true\n        },\n        \"requireReasonForFindingRejection\": {\n          \"const\": true\n        },\n        \"requireOwnerAndDueDateForDeferredMandatoryItems\": {\n          \"const\": true\n        },\n        \"requireReasonForParkingLot\": {\n          \"const\": true\n        }\n      }\n    },\n    \"publicId\": {\n      \"type\": \"string\",\n      \"format\": \"uuid\"\n    }\n  }\n}\n"},{"path":"contracts/review-exchange/v1/README.md","digest":"sha256:2bc4187b53f9fc71725b8106866018976b1c5fdbf4035699c97de281bb418832","mediaType":"text/markdown","content":"---\nrole: authority\nlifecycle: frozen\nversion: \"1.0.0\"\nlanguage: en\n---\n# OrivelaIQ Review Exchange 1.0.0\n\n`manifest.json` is the normative schema inventory. Structured artifacts are YAML documents validated against the listed JSON Schema 2020-12 schemas after safe parsing. Response Markdown uses YAML front matter validated by `response-frontmatter.schema.json`; `context.md`, `evidence.md`, and response bodies are passive Markdown.\n\nThe normative tree begins at `installations/<installationId>/installation.yaml`, with packages below `review-packages/<packagePublicId>/`. Package and item metadata use `package.yaml` and `items/<itemPublicId>/item.yaml`; context/evidence are adjacent managed Markdown; each externally authored response contains `response.yaml` and `response.md` under one shared author authority; item attachments use `items/<itemPublicId>/attachments/**`; reports are exactly `current-status.md`, `result-report.md`, and `result-report.json`. Package-level `attachments/**` is an optional compatibility extension; `execution-results/**` and `sync/**` are governed package paths. Exchange IDs are UUID public IDs—never internal `rv*_` database IDs.\n\nConsumers must enforce path authority and byte/file limits before parsing, reject duplicate YAML keys and unknown fields, validate Unicode and references, and then apply local authorization and transition policy. Schema validity and authorship metadata are not authorization. Compatibility follows semantic versioning; producers emit exactly `1.0.0` for this slice.\n"}]},{"contextKind":"public_baseline","language":"en","id":"artifact-navigation","version":"1","contractDigest":"sha256:c7c7be4669d239d218f80f9056f6eacf946d8218fa30fe7e47bf00cd39b275c4","title":"Artifact Navigation","kind":"message-contract","files":[{"path":"docs/foundation/artifact-navigation-contract.md","digest":"sha256:f88fe3beb8cf136ca0cbde007bf510aa83f9eac9a05b5fabd546cad7732ca663","mediaType":"text/markdown","content":"---\nrole: authority\nlifecycle: current\nversion: \"1\"\nlanguage: en\n---\n# OrivelaIQ – Artifact Navigation Message Contract\n\n## Purpose\n\nThis document defines the client-side message contract through which an interactive HTML artifact can request navigation inside the current OrivelaIQ workspace.\n\nThis is not an HTTP endpoint. It is a versioned `window.postMessage` protocol available only to registered artifact frames whose effective source execution policy is `interactive`.\n\n## Protocol identifier\n\n```text\norivelaiq.artifact.v1\n```\n\nUnknown protocols and unknown message types are ignored silently.\n\n## Host handshake\n\nThe viewer sends this message after a registered interactive frame loads:\n\n```json\n{\n  \"protocol\": \"orivelaiq.artifact.v1\",\n  \"type\": \"host-ready\",\n  \"capabilities\": [\"navigate\"]\n}\n```\n\nThe artifact must not assume host integration before receiving the handshake. No handshake means standalone mode.\n\n## Navigation request\n\n```json\n{\n  \"protocol\": \"orivelaiq.artifact.v1\",\n  \"type\": \"navigate\",\n  \"requestId\": \"opaque-request-id\",\n  \"userActivated\": true,\n  \"target\": {\n    \"kind\": \"artifactPath\",\n    \"path\": \"docs/service-handover.md\"\n  }\n}\n```\n\n### Common fields\n\n| Field | Contract |\n|---|---|\n| `protocol` | Must equal `orivelaiq.artifact.v1`. |\n| `type` | Must equal `navigate`. |\n| `requestId` | Non-empty opaque string, maximum 64 characters. |\n| `userActivated` | Must be exactly `true`; requests during initial load are not honored. |\n| `target` | Must match one supported target shape. |\n\n### Supported targets\n\nArtifact path:\n\n```json\n{\n  \"kind\": \"artifactPath\",\n  \"path\": \"docs/service-handover.md\"\n}\n```\n\nArtifact ID:\n\n```json\n{\n  \"kind\": \"artifactId\",\n  \"id\": \"artifact-example\"\n}\n```\n\nPrefilled index search:\n\n```json\n{\n  \"kind\": \"search\",\n  \"query\": \"service handover\"\n}\n```\n\nSearch queries are limited to 200 characters. Path and artifact-ID bounds follow the centrally validated index contract.\n\nSearch requests open the existing index search with a prefilled query. They do not give the artifact access to search results or execute an independent search API.\n\n## Navigation result\n\n```json\n{\n  \"protocol\": \"orivelaiq.artifact.v1\",\n  \"type\": \"navigate-result\",\n  \"requestId\": \"opaque-request-id\",\n  \"status\": \"accepted\"\n}\n```\n\nAllowed status values:\n\n| Status | Meaning |\n|---|---|\n| `accepted` | The viewer accepted the request and performs the navigation or opens the prefilled search. |\n| `not-found` | The target is not resolvable in the current workspace, including cross-workspace targets. |\n| `denied` | The target exists but is not visible to the current user, or the registered source may not request navigation. |\n\nNegative replies carry no further detail.\n\n## Sender identification\n\nThe sandboxed artifact has an opaque origin, so `event.origin` is `\"null\"` and must not be used as the trust signal.\n\nThe viewer identifies the sender using exact `event.source` object identity against a lifecycle-managed frame registry containing at least:\n\n```text\ncontentWindow -> workspaceId, artifactId, sourceId, effectiveExecutionPolicy\n```\n\nOnly a currently mounted frame with effective policy `interactive` is eligible.\n\nRegister on mount and unregister on unmount. Messages from unregistered, foreign or stale windows are ignored silently.\n\n## Resolution and visibility\n\n- Resolve targets only against the current frame workspace.\n- A target from another workspace returns `not-found`.\n- Apply the same visibility semantics as protected index and artifact-content delivery.\n- A hidden target returns `denied` without metadata or reason detail.\n- The artifact receives no index, artifact, source, workspace or user data.\n\n## Validation and rate limiting\n\nThe viewer validates protocol, type, request ID, target kind, payload shape, length limits, user-activation marker, frame registration, effective policy, workspace and visibility.\n\nPer-frame baseline rate limit:\n\n```text\nmaximum 5 requests per 2000 milliseconds\n```\n\nThe current host behavior below distinguishes ignored messages from bounded negative replies. Unknown protocol/type, an absent or unusable reply request ID, and messages from unregistered frames are ignored silently. A recognized `navigate` message from a registered frame with a reply-safe request ID but invalid fields receives only `denied` while the per-frame reply budget permits; further malformed messages are ignored after that budget is exhausted. A valid-shaped navigation request exceeding the per-frame request limit receives only `denied`, without details.\n\nThe implementation must not add:\n\n- `allow-top-navigation`;\n- `allow-top-navigation-by-user-activation`;\n- `allow-same-origin`;\n- any other iframe capability for this protocol.\n\n## Reply transport\n\nOpaque-origin frames require:\n\n```js\nevent.source.postMessage(reply, \"*\")\n```\n\nThe viewer must send the reply only to the exact registered source window.\n\nAllowed reply data is limited to:\n\n- protocol;\n- type;\n- request ID;\n- status;\n- capability names in `host-ready`.\n\nNo reply may include content, tokens, credentials, user data, workspace metadata, resolved paths or authorization details.\n\n## Standalone degradation\n\nArtifacts must remain usable when:\n\n- no host handshake is received;\n- a request times out;\n- a result is `not-found`;\n- a result is `denied`.\n\nThe target reference should remain visible. Navigation is an enhancement, not the sole presentation of knowledge.\n\n## Out of scope\n\n- artifact-initiated search beyond prefilled query UI;\n- index or workspace read access;\n- artifact-to-artifact communication;\n- cross-workspace navigation;\n- persistent artifact state;\n- arbitrary viewer commands;\n- direct browser or top-level navigation.\n\n## Required tests\n\n- handshake after registered frame load;\n- accepted current-workspace path and ID navigation;\n- prefilled search navigation;\n- unknown target returns `not-found`;\n- hidden target returns `denied` without detail;\n- foreign window ignored;\n- stale frame ignored;\n- malformed and unknown payload ignored;\n- overlong request ID and query rejected;\n- load-time request not honored;\n- per-frame rate limit enforced;\n- cross-workspace target returns `not-found`;\n- reply contains no sensitive or contextual data;\n- artifact remains usable without host;\n- static frames receive no navigation capability;\n- iframe sandbox remains unchanged and contains no top-navigation allowance.\n\n## Current host behavior\n\nThe viewer implements the `orivelaiq.artifact.v1` contract as a mediated, workspace-local request channel for registered interactive HTML iframes only. Unknown protocol or message type payloads are ignored without a result reply. Recognized `navigate` payloads with a safe request ID but invalid fields receive only `denied`. The root `navigate` message shape is strict and contains exactly `protocol`, `type`, `requestId`, `userActivated` and `target`. Target shapes are exact: `artifactPath` carries `path`, `artifactId` carries `id`, and `search` carries `query`. `requestId` is 1–64 characters, artifact paths and IDs are 1–512 characters, and search queries are 1–200 characters; whitespace-only strings are invalid.\n\nArtifact paths are not URLs. They must not contain schemes, `//`, query strings, hash fragments, backslashes, absolute filesystem roots, traversal segments or encoded separators. Resolution is performed by a UI-free planner only against the currently loaded workspace index, using exact `path` or `logicalPath` matches. Ambiguous path matches are denied rather than guessed.\n\nThe viewer registry maps the exact `iframe.contentWindow` to `workspaceId`, `artifactId`, `sourceId`, effective `interactive` policy, a generation token and rate-limit state. Because sandboxed interactive frames have opaque origin and commonly send `event.origin === \"null\"`, origin is not a trust signal. The central message listener trusts only `event.source === registered contentWindow` plus the registry metadata, sent-handshake state, active artifact identity and current workspace state. Replies to the opaque frame use `targetOrigin: \"*\"` and contain only the minimal protocol fields. The per-frame limit is 5 navigation requests in 2 seconds; excess requests receive `denied` without details.\n\nThe host-ready handshake is sent only after successful registration and the frame load lifecycle is observed and is exactly `{ \"protocol\": \"orivelaiq.artifact.v1\", \"type\": \"host-ready\", \"capabilities\": [\"navigate\"] }`. Static HTML, Markdown, SVG, malformed policy values and frames without an exact protected `contentRef` for the active workspace/artifact receive no handshake. No index data, workspace metadata, user data, credentials or resolved artifact details are ever returned to an artifact.\n"}]},{"contextKind":"public_baseline","language":"en","id":"interactive-html","version":null,"contractDigest":"sha256:96433212233224233944eba6ba33eced1f1d2118ae574825df1b6426259894ba","title":"Interactive HTML authoring","kind":"current-guidance","files":[{"path":"docs/guides/authoring-interactive-html-artifacts.md","digest":"sha256:d3ae575507b237fbf41c0aec9dce233bb96c2fd2d94a833e9a73f42ecc70351d","mediaType":"text/markdown","content":"---\nrole: guidance\nlifecycle: current\nlanguage: en\n---\n# Authoring Interactive HTML Artifacts\n\n## Purpose\n\nThis guide defines the authoring contract for HTML knowledge views executed by OrivelaIQ under the source policy `interactive`.\n\nInteractive artifacts are executable repository content. They run JavaScript in every viewer's browser, but only inside an isolated sandbox. The optional `orivelaiq.artifact.v1` protocol provides mediated navigation into the current OrivelaIQ workspace.\n\n## Required artifact shape\n\nAn interactive artifact must be a self-contained single HTML file containing all required:\n\n- HTML;\n- CSS;\n- JavaScript;\n- data;\n- images;\n- fonts;\n- libraries.\n\nThe artifact must not depend on a CDN, external stylesheet, external font, remote image, API or other network resource.\n\n## Supported capabilities\n\nAuthors may use JavaScript to:\n\n- filter and sort embedded data;\n- implement local search;\n- switch categories and views;\n- expand details;\n- render embedded charts;\n- perform client-side calculations;\n- maintain transient in-memory UI state;\n- request viewer-mediated navigation through the versioned `orivelaiq.artifact.v1` message contract when a host handshake advertises the `navigate` capability.\n\nNative HTML and CSS should be preferred where they are sufficient.\n\n## Unsupported capabilities\n\nArtifacts must not depend on:\n\n- `fetch`, `XMLHttpRequest`, WebSocket or EventSource;\n- cookies;\n- `localStorage`, `sessionStorage` or IndexedDB;\n- form submission;\n- popup windows;\n- direct top-level navigation;\n- parent DOM, router, index or workspace-data access;\n- runtime credentials, secrets or tokens;\n- external scripts, styles, fonts, images or CDNs.\n\nA narrow `window.parent.postMessage()` request channel is permitted only through the `orivelaiq.artifact.v1` navigation contract. This does not grant parent DOM access or direct navigation rights.\n\nDo not embed secrets in source code, inline data, comments or generated output.\n\n## Asset strategy\n\n### Fonts\n\n- Use a system font stack as the default or fallback.\n- Embedded fonts must use a license that permits embedding.\n- Prefer subsetted WOFF2 data URIs.\n- Avoid embedding complete font families when only one or two weights are needed.\n\n### Images\n\n- Prefer inline SVG for diagrams and icons.\n- Use `data:` URIs for raster images when needed.\n- Provide meaningful alternative text.\n\n### Libraries\n\n- Vendor only the required production code.\n- Inline the library in the artifact.\n- Remove unused modules and development helpers.\n- Record the library name, version and license in a source comment or adjacent repository documentation.\n\n## Mediated navigation\n\nInteractive artifacts may act as maps, indexes or dashboards that request navigation into the current workspace.\n\nThe artifact must wait for this host handshake:\n\n```json\n{\n  \"protocol\": \"orivelaiq.artifact.v1\",\n  \"type\": \"host-ready\",\n  \"capabilities\": [\"navigate\"]\n}\n```\n\nIf no handshake arrives, the artifact must remain usable standalone.\n\nSupported navigation targets are:\n\n```js\n{ kind: \"artifactPath\", path: \"docs/service-handover.md\" }\n{ kind: \"artifactId\", id: \"artifact-example\" }\n{ kind: \"search\", query: \"service handover\" }\n```\n\nAuthoring rules:\n\n- Call navigation only from a real user event handler.\n- Always render the target reference as visible text where practical.\n- Treat host navigation as progressive enhancement, never as the only route to information.\n- On `not-found`, `denied`, `no-host` or timeout, show the visible reference or a local fallback instead of a blocking error dialog.\n- Prefer `search` when the exact artifact path is uncertain or likely to change.\n- Do not send requests automatically during load.\n- Do not create request loops or repeated retries.\n- Keep `requestId` opaque and at most 64 characters.\n- Keep search queries at most 200 characters.\n- Do not infer authorization or target existence beyond the returned status.\n\nArtifacts receive only `accepted`, `not-found` or `denied`. They must not expect content, user information, workspace metadata or resolved target details in the reply.\n\n## Accessibility requirements\n\n- Use semantic landmarks and controls.\n- Ensure complete keyboard operation.\n- Provide visible focus indicators.\n- Use table headers and captions for tabular content.\n- Do not communicate information through color alone.\n- Maintain sufficient contrast.\n- Respect `prefers-reduced-motion`.\n- Use ARIA only where native HTML does not provide the required semantics.\n- Ensure interactive controls have clear labels and state.\n- Navigation controls must expose a readable target or purpose independent of host availability.\n\n## Resilience and fallback\n\nThe initial HTML should contain meaningful structure and content before JavaScript enhancement where practical.\n\nA script failure should not produce an empty page. Prefer progressive enhancement and provide a controlled in-artifact error state for essential initialization failures.\n\nHost-integrated navigation is optional. A missing handshake, negative result or timeout must not make the artifact unusable.\n\n## Performance and size\n\nInteractive artifacts may be larger than Markdown or static HTML because libraries, fonts and images are embedded.\n\nAuthors must:\n\n- minimize and compress embedded code;\n- subset fonts;\n- avoid duplicate data and assets;\n- remove source maps and development bundles;\n- stay below the centrally configured artifact-size limit;\n- test loading and interaction on typical workspace devices.\n\nThe configured limit is authoritative. Oversized artifacts are treated fail-closed: their content is not persisted, truncated, or served for execution. A candidate rejected with controlled reason `too_large` is omitted from the new Artifact descriptors, Navigation and Search documents; no placeholder artifact is created. Controlled diagnostics appear in Index Job/report evidence so source owners can reduce the file, split the report, or adjust include patterns before rerunning the index job. Other unsafe loading or integrity failures remain fatal and preserve the previous successful projection.\n\n## Security review checklist\n\nBefore enabling or updating an interactive artifact, verify:\n\n1. The artifact is stored in a source explicitly configured as `interactive`.\n2. No external URLs are required for normal operation.\n3. No credentials or confidential runtime values are embedded.\n4. No parent DOM, router, index or workspace-data access is attempted.\n5. Any `postMessage` use conforms exactly to the `orivelaiq.artifact.v1` navigation contract.\n6. No browser storage is required.\n7. No forms, popups or direct top-level navigation are required.\n8. The artifact remains useful when network access is unavailable.\n9. The artifact remains useful when no host handshake is received.\n10. Navigation requests originate only from user event handlers and have visible fallback references.\n11. Keyboard and screen-reader behavior has been checked.\n12. Embedded third-party code and fonts have acceptable licenses.\n13. File size remains within the configured budget.\n\n## Repository governance\n\nInteractive HTML is code and must be reviewed accordingly.\n\nRecommended repository controls:\n\n- pull-request review;\n- protected branches;\n- explicit ownership for generated artifacts and generators;\n- reproducible generation where possible;\n- dependency/version records for embedded libraries;\n- validation against external references and prohibited patterns;\n- tests for standalone degradation and mediated navigation where used;\n- documented rollback to the previous artifact or to source policy `static`.\n\nAI-generated HTML is subject to the same review and trust requirements as manually authored HTML.\n\n## Requesting mediated viewer navigation\n\nInteractive artifacts may progressively enhance visible links or buttons by waiting for the host handshake and then sending `window.parent.postMessage()` messages using protocol `orivelaiq.artifact.v1`. Send requests only from real click/keyboard handlers and keep a standalone fallback when no `host-ready` message arrives.\n\n```js\nlet orivelaReady = false;\nwindow.addEventListener('message', (event) => {\n  if (window.parent === window || event.source !== window.parent) return;\n  const data = event.data;\n  if (data && data.protocol === 'orivelaiq.artifact.v1' && data.type === 'host-ready' && Array.isArray(data.capabilities) && data.capabilities.includes('navigate')) {\n    orivelaReady = true;\n  }\n});\n\ndocument.querySelector('[data-open-overview]')?.addEventListener('click', () => {\n  if (!orivelaReady) return;\n  window.parent.postMessage({\n    protocol: 'orivelaiq.artifact.v1',\n    type: 'navigate',\n    requestId: crypto.randomUUID().slice(0, 64),\n    userActivated: true,\n    target: { kind: 'artifactPath', path: 'docs/service-handover.md' }\n  }, '*');\n});\n```\n\nThe artifact does not receive index access, workspace data, user data, credentials, resolved paths, search results or detailed error reasons. Result statuses are only `accepted`, `not-found` and `denied`. Do not loop automatically on failures or timeouts. The parent DOM, router, top-level navigation, forms, popups and external network calls remain unavailable.\n\n## Source activation for authors\n\nAuthors cannot enable interactive execution from an artifact file. Interactive HTML is a source-level Admin opt-in. The source must include HTML artifacts through its configured include/exclude rules, an administrator must select `Interactive HTML`, and escalation from `static` requires a save-time confirmation. The confirmation is not an approval of artifact contents; it only activates isolated script execution for HTML artifacts indexed from that source.\n\nKeep authored HTML self-contained and portable. Do not rely on external network calls, Same-Origin access, forms, popups, downloads, top-level navigation or OrivelaIQ APIs. If a source is downgraded to `static`, scripts are disabled after the affected artifacts are represented in a refreshed index and viewer sessions reload that index.\n"}]}],"agentInstructions":{"contextKind":"public_baseline","language":"en","profileId":"orivelaiq-public-authoring","profileVersion":"1.3.0","profileDigest":"sha256:b901c3bab9f73e89956eb476819e0d1a341f40660ff43cb0cd8222273151da62","compatibleContracts":[{"id":"work-repository","version":"0.1","contractDigest":"sha256:c44422bb9dc074e87573e14b95feee6124d897b2f49481f5402748d012ef0bcc","url":"/api/public/contracts/work-repository"},{"id":"review-exchange","version":"1.0.0","contractDigest":"sha256:6b39cae0c6af595c7b3764919e5e7d327271961b0a0b7a3acefbd7f9bb87c68d","url":"/api/public/contracts/review-exchange"},{"id":"artifact-navigation","version":"1","contractDigest":"sha256:c7c7be4669d239d218f80f9056f6eacf946d8218fa30fe7e47bf00cd39b275c4","url":"/api/public/contracts/artifact-navigation"},{"id":"interactive-html","version":null,"contractDigest":"sha256:96433212233224233944eba6ba33eced1f1d2118ae574825df1b6426259894ba","url":"/api/public/contracts/interactive-html"}],"instruction":"Apply the pinned Public Authoring Profile and relevant canonical contracts. Resolve authenticated context separately. Preserve current limits and use the correct authoring channel. Human-facing naming: OrivelaIQ Home standalone, OIQ Home branded short, Home inside OIQ; Your Homes / Your Home, Deine Homes / Dein Home. Apply both Home glossary rules and both collaboration rules. Distinguish an Owner's Home from a Repository shared with a Collaborator; describe a shared write as in the shared Repository / im freigegebenen Repository, not as ownership of that Home. Say where you wrote (in your Home / in deinem Home) only after an authorized confirmed write. Written Markdown can be read in indexed Dynamic; an existing fixed Stable is unchanged until deliberately replaced; no Stable pin can mean Dynamic default. Never interpret this as invisible content or a new approval requirement. For Home repository writes, use the separately connected Home service and its current effectiveRole/capabilities. Participants require collaboratorProfile oiq-048/1; preserve oiq-045/1, managed_git, mgit.use, existing OAuth resources, mcp:access and the legacy REST envelope repository:owner. That scope never proves Owner authority. Do not require a scope rename or OAuth reconnect. Preserve requestId, expectedRevision, expectedFileHash and validation; after an uncertain result retry only the exact authorized request or recover its receipt/status under current access. A denied or conflicted write is not a blind retry. Do not infer OIQ Workspace, Indexer or Stable authority from Repository access.","offlineGuidance":"Give the Full Public Transfer JSON to an agent without Web/MCP access. It includes profile/contract identities, all canonical contract files and schema dependencies, complete examples, rules, limitations, generation time and release changes. Parse schema content from contracts[].files and resolve relative schema references against the included path/$id; the included schemas require no network lookup. Replace illustrative External Response values with exact authorized export context before any separately authorized Git write. This snapshot grants no access and cannot assert current Workspace capability.","integrityGuidance":"All digest values use SHA-256 over UTF-8 bytes, expressed as sha256: followed by lower-case hexadecimal. A raw file/source digest covers the exact UTF-8 bytes of its content, including whitespace and newlines, without text or Unicode normalization. For structured identities, canonical JSON recursively sorts object keys lexically, retains array order, and serializes compact JSON without text or Unicode normalization. The Public Authoring Profile hashes its complete projected object after removing only the top-level profileDigest field. The Contract Registry hashes its complete projected object after removing only the top-level registryDigest field. Each contract hashes exactly the canonical object {id,version,sources:[{path,digest}]}: use the contract id and version (including null where present), with sources in the order listed for that contract in the registry. Full Transfer hashes its complete projected object after removing only the top-level digest field; retain all nested profile, registry, contract and file digest fields. Evidence-only hashes cannot be independently rehashed offline when their raw bytes are omitted; this intentional boundary keeps implementation details private. Snapshot integrity does not establish publisher authenticity or currentness. The snapshot records its generation time; obtain a fresh profile before later connected use.","rules":[{"id":"profile-versioning","title":"Profile compatibility and exact snapshot identity","text":"profileVersion describes the semantic compatibility of this authoring guidance, independently of Product releases and the underlying contract versions. An incompatible profile shape or authoring rule requires a major increment; compatible capabilities or fields require a minor increment; clarifications or corrections that retain compatibility require a patch increment. Evidence-only changes may change profileDigest without changing profileVersion when the profile shape, authoring rules and compatible contract pins remain unchanged. Pin an exact snapshot with profileId + profileVersion + profileDigest; a version alone is not content identity. At one installation, Discovery profile.digest, Bootstrap profileDigest, the HTTP Public Profile profileDigest and MCP read_public_authoring_profile profileDigest must agree. Compare the representations available to your client; compare MCP only when connected. Public guidance requires no MCP authentication, and MCP-only or offline use requires no Web access. For offline use, pin the included identities and obtain a fresh profile before later connected use. If available representations differ, reread the compared representations once to refresh a potentially stale snapshot. If disagreement persists, stop and reject mixing those snapshots; do not infer compatibility or select one digest silently. Verify each pinned contract against its own contractDigest, not against profileDigest.","evidence":["docs/adr/0044-self-describing-guidance-and-operation-authority.md"]},{"id":"authority","title":"Public Baseline and contextual authority","text":"This Public Baseline explains generic compatible authoring without login or MCP. It grants no Workspace, Topic, administration or Git access. An authenticated Effective Workspace Profile refines safe available capabilities; Admin Configuration is a separate authorized view. Every protected operation checks current Human and resource authority. Tool discovery and client policy grant no server authority.","evidence":["docs/adr/0044-self-describing-guidance-and-operation-authority.md"]},{"id":"indexing","title":"Publish through a configured Source","text":"An authorized administrator configures source selection, artifact types, ordered include/exclude rules and navigation assignment. The current Git-backed content path supports Markdown (.md), SVG (.svg) and HTML (.html). Exclusions apply before a matched artifact is loaded. Authors should use simple supported patterns: **/*.md, **/*.svg, **/*.html, docs/**/*.md, docs/*.md or exact relative paths. Patterns are the current bounded source matcher, not a promise of every glob feature. Work repository JSON is separate structured import data, not indexed Knowledge.","evidence":["server/lib/source-patterns.ts","server/lib/github-source-adapter.ts","contracts/work-repository/work-repository-contract-v0.1.md"]},{"id":"index-failures","title":"Index availability and controlled failures","text":"Readers browse prepared indexes, not a live repository or whole-content search. Stable and Dynamic are immutable view selectors; display labels may vary. Successful indexing publishes a complete validated projection atomically. A failed run preserves the previous successful projection. A candidate above the configured artifact byte limit is omitted with a too_large diagnostic: no truncated content, placeholder artifact, navigation item or search document is created. Its Grounding targets remain unresolved. Other unsafe load, integrity, source/revision and persistence failures remain fatal. Ask an authorized administrator to inspect diagnostics, reduce content or correct rules, then reindex.","evidence":["docs/foundation/index-contract.md","docs/adr/0039-immutable-workspace-read-projections.md"]},{"id":"markdown","title":"Use the supported Markdown subset","text":"The current reader supports headings #, ## and ###, paragraphs, hyphen bullet lists, **bold**, inline `code`, triple-backtick fenced code, pipe tables, inline [label](reference) links and ![alt](reference) images. YAML front matter is hidden from the reader. A leading H1 matching the reader title is suppressed; H2/H3 headings provide the outline. Raw HTML is escaped. Do not depend on full CommonMark/GFM, ordered or nested lists, italics, task lists, block quotes, math or executable Markdown. Language tags on fences do not promise syntax highlighting.","evidence":["src/lib/markdown/render-markdown.ts"]},{"id":"links-assets","title":"Links, SVG and image references","text":"Use source-relative indexed paths for local Markdown/HTML/SVG links. Resolution uses the current authorized loaded index; unresolved local links remain passive text. Heading fragments are compatibility addresses, not stable semantic-node identity. Local image embedding currently resolves indexed SVG only, through its protected content reference and passive <img> rendering; SVG is never injected into the application DOM. Unresolved/blocked image references show a placeholder. HTTP(S) remote images currently render as images; prefer indexed SVG for portable authored content. HTTP(S) and mailto links open separately; unsafe schemes are blocked. Interactive HTML has stricter self-contained, no-network rules.","evidence":["src/lib/markdown/render-markdown.ts","docs/foundation/index-contract.md","docs/adr/0030-cross-variant-semantic-node-identity.md"]},{"id":"html","title":"Static and interactive HTML","text":"HTML defaults to static sandboxed rendering with scripts disabled. Interactive HTML requires explicit Source-level Admin opt-in; an artifact cannot enable its own policy. Author one self-contained HTML file with inline CSS/JavaScript/data, inline SVG or data images/fonts and a system-font fallback. No CDN, remote stylesheet/font/image/API, fetch/XHR/WebSocket, browser storage, form submission, popups, downloads, parent DOM/data or direct top-level navigation may be required. Scripts run only in an isolated allow-scripts frame without same-origin. Include semantic keyboard controls, visible focus, meaningful initial content, accessible labels, reduced-motion support where needed and usable standalone fallback.","evidence":["docs/guides/authoring-interactive-html-artifacts.md","docs/adr/0031-opt-in-interactive-html-artifacts.md","server/lib/html-execution-policy.ts"]},{"id":"navigation","title":"Request mediated navigation","text":"Use only protocol orivelaiq.artifact.v1. Wait for the parent host-ready handshake with capabilities [navigate]; verify event.source === window.parent. Send navigate only from a real click/keyboard handler, with exactly protocol,type,requestId,userActivated:true,target. Targets are artifactPath with path, artifactId with id, or search with query. Paths are current-Workspace relative paths, not URLs: no scheme, absolute root, traversal, backslash, query, fragment or encoded separator. requestId is 1–64 characters, path/id 1–512, query 1–200; whitespace-only values are invalid. Replies expose only accepted, not-found or denied and no content/context. Match requestId and parent source, use a bounded timeout, keep target/reference visible and preserve local content for no-host, negative result or timeout. Prefer search when the exact path is uncertain. Never auto-request during load or retry in a loop; at most five requests per frame in two seconds.","evidence":["docs/foundation/artifact-navigation-contract.md","src/lib/content/artifact-navigation-contract.ts"],"example":"interactive-html"},{"id":"identity","title":"Persist the right identity","text":"A source path and documentId are locators/aliases/evidence; artifact.id and projectionId are concrete runtime selectors, not durable Knowledge identity. Do not invent, persist or hard-code those runtime IDs into repository Work definitions. Source-owned knowledge_object_id establishes the current bounded canonical Markdown identity when explicitly declared. Keep it stable on move/rename/title edit and never reuse it for unrelated Knowledge. Review Exchange uses UUID public IDs, never internal rv* IDs. Work externalKey is configuration-scoped import identity, not internal Domain identity.","evidence":["docs/product-ux/01-product-domain-model-baseline-v1.6.md","docs/adr/0029-rendition-representation-and-knowledge-identity.md","docs/adr/0037-source-owned-current-knowledge-grounding.md","contracts/work-repository/work-repository-contract-v0.1.md","docs/architecture/review-exchange-contract-v1.md"]},{"id":"grounding","title":"Declare direct Current Grounding","text":"Canonical Git-backed Markdown in a non-companion canonical Source may declare top-level knowledge_object_id and optional grounded_by in YAML front matter. Use lower-case UUID URNs (UUID versions 1–8, RFC variant), and at most 128 unique grounded_by strings of the same syntax. References resolve directly within the same ContentSource Public ID and authorized projection; no cross-Source lookup or transitive inference occurs. grounded_by requires identity. Duplicate IDs/references, self-reference, malformed participating YAML or identity fail the indexing run. Use unique YAML mapping keys; no aliases, anchors, tags or merge keys. Unknown/excluded/unavailable targets remain generic unresolved. grounds is derived, never authored. Translation declarations do not establish graph authority.","evidence":["docs/adr/0037-source-owned-current-knowledge-grounding.md","docs/architecture/current-knowledge-grounding.md"],"example":"grounding"},{"id":"snapshot-metadata","title":"Optional whole-artifact snapshot evidence","text":"Canonical Git-backed Markdown may declare kind: snapshot and snapshotAt: an RFC-3339 timestamp in top-level YAML front matter. A participating declaration must be complete and valid; aliases, anchors, tags and merge keys are rejected. These fields describe a whole-artifact snapshot observation. They do not establish row/claim/section correctness, create a governed Knowledge Time State or confer authority. Invalid participating metadata fails indexing and preserves the previous successful projection.","evidence":["docs/foundation/index-contract.md"]},{"id":"localization","title":"Current localization and Rendition limits","text":"Durable translations stay externally owned and read-only to OrivelaIQ. The implemented Translation Manifest v1 maps document_id, source_path and target_path plus source revision/blob, locale, repository-owned status/currency, review evidence and source findings. A configured companion Source requires explicit canonical binding and manifest mapping; arbitrary translated filenames or similar titles do not establish equivalence. Keep status/currency claims distinct from technical source drift. Current UI can group document-level language variants and select an available preferred language. Translation is Rendition, not Knowledge State; meaning-changing localization is not a Rendition of the same Knowledge Object. Governed State binding remains unresolved without evidence. Use Translation Manifest v1 for current authoring. Manifest v1 requires schema_version: 1 and root pilot_id, canonical_repository, canonical_branch, canonical_language, target_locale, source_audit (repository/path/pull_request), terminology_version and a nonempty translations list. Each mapping requires document_id, source_path, target_path, source_commit, source_blob_sha, status, currency, review_evidence and a nonempty source_findings list; translation_commit is optional. target_path must start with target_locale/. Status is experimental, draft, reviewed, approved or rejected; currency is current, stale or unknown. review_evidence is a safe relative path with persistent fragment. Source/target paths must be matched by the configured canonical/companion rules. Unknown fields, duplicate document/path mappings and YAML aliases/anchors fail validation.","evidence":["server/lib/translation-manifest.ts","docs/foundation/translation-manifest-v2-contract.md","docs/foundation/multilingual-viewer-projection.md","docs/adr/0029-rendition-representation-and-knowledge-identity.md","docs/adr/0030-cross-variant-semantic-node-identity.md"],"example":"localization-v1"},{"id":"work","title":"Author portable Work Repository JSON","text":"Use Work Repository 0.1: one topic.json and items/*.json per configured root; Topic → Item → Entry, with stable externalKey values. Entry types are exactly INSIGHT, CLARIFICATION_POINT, DECISION and RESULT. Labels belong to Item; relatesTo links Entry externalKeys within the same Topic. Entry type is immutable: use a new key to retype. Clarification open/closed state, membership, internal IDs/revisions and receipts remain runtime-owned. Portable artifactRefs use workspaceAlias,sourceKey,path,view (stable or dynamic); omit references until an authorized configured target can resolve them. Manual Human PLAN → Preview → APPLY rechecks schema, cross-file links, access, exact projections, freshness and conflicts. Schema validity alone is not APPLY readiness. Reimport preserves clarification state; source removal does not delete Work. No automatic import or Git write is supplied.","evidence":["contracts/work-repository/work-repository-contract-v0.1.md","server/lib/work-repository-authoring.ts"],"example":"work-repository"},{"id":"feedback","title":"Contribution and External Response use different channels","text":"Capture a Contribution in Knowledge context through the available authorized product interaction. Contribution is raw provenance, not a typed Work Result and not the External Response write channel. A controlled Review Exchange produces a Review Package/Item and exact exported context. An external Human/AI authors an External Response in that exchange repository with separately authorized Git access, then the authorized import/review path brings it into Knowledge context. MCP Knowledge/Work access grants no Git write and is not a replacement feedback-response channel. Authorship claims are provenance, never authentication; repeated concerns do not by themselves become Findings.","evidence":["docs/product-ux/10-feedback-results-interaction-contract-v1.0.md","docs/adr/0026-feedback-results-ingress-and-normalization-domain-amendment.md","docs/adr/0027-feedback-results-interaction-projection-and-density.md","docs/adr/0044-self-describing-guidance-and-operation-authority.md"]},{"id":"external-response","title":"Author an External Response against an export","text":"Use Review Exchange 1.0.0. The response pair lives at installations/<ownerInstallationId>/review-packages/<packagePublicId>/items/<itemPublicId>/responses/<newResponsePublicId>/response.yaml and response.md. Use exact exported UUID v4 public IDs/revisions/context hash in basedOn; allocate a new response UUID. Both files share validated external authorship authority; the package owner has no implicit response write permission. Response metadata/bodies are create-only. Use the actual exported owner/package/item/context values, a distinct external exporter installation and matching authorship.installationId. Validate the envelope and Markdown front matter using the included schemas; preserve passive body content. Current import additionally requires complete item/context BasedOn. Stale/conflicting inputs receive controlled review treatment, never silent re-anchoring. Read canonical path/authority and import checks before any separately authorized Git write.","evidence":["docs/architecture/review-exchange-contract-v1.md","contracts/review-exchange/v1/README.md","server/lib/review-response-import.ts"],"example":"external-response"},{"id":"authorship-limit","title":"Known current Review import limitation","text":"The canonical Review Exchange schema accepts human, ai, ai_assisted, tool, system and unknown. The current External Response import allowlist accepts only human, ai, tool and system; ai_assisted and unknown are currently unsupported by that import path. Do not mislabel authorship to work around this. If the truthful type is unsupported, stop that import and ask the authorized reviewer to handle the limitation. AI authorship requires modelName; tool authorship requires toolName. No agent authentication/runtime or server-side agent execution is implied.","evidence":["docs/adr/0032-review-response-import-authorship-vocabulary-drift.md","contracts/review-exchange/v1/review-shared.schema.json","server/lib/review-response-import.ts"]},{"id":"home-naming-en","title":"OrivelaIQ Home · English","text":"OrivelaIQ Home is an optional OIQ-operated source alongside independent external GitHub. Inside OIQ and in Human-directed AI answers call it Home; OIQ Home is the branded short name. One Home pairs one canonical repository with its real home Workspace and default Source; one Human may have several Homes (Your Homes / Your Home). Home requires per-account administrator enablement. A separately authorized Home AI connection may write permitted Markdown source content; the OIQ Knowledge/Work MCP connection is independent and grants no Home write access. Writing does not update the fixed Stable view: committed Markdown may already be indexed and read in Dynamic. An existing pinned Stable remains unchanged until an authorized Human deliberately replaces the pin. Without a Stable pin, Dynamic may be the default. This is not a new approval workflow. Preserve technical managed_git, mgit.use, oiq-045/1, tool names, schemas and OAuth resources. No new consent, grant or reconnect is needed merely for the name. Connector display names belong to their App/client registration owner; Home OAuth and tool descriptions belong to the independently deployed M.Git service. Public guidance cannot verify a client title or its installed revision. Home ownership and a separately granted shared Repository are different: use the collaboration guidance below. Do not promise browser upload/editing, unrestricted export/delete, retention, hosting geography or legal ownership.","evidence":["docs/adr/0039-immutable-workspace-read-projections.md","docs/adr/0048-managed-git-identity-home-workspace-and-source-integration.md"]},{"id":"home-naming-de","title":"OrivelaIQ Home · Deutsch","text":"OrivelaIQ Home ist eine optionale, von OIQ betriebene Source neben unabhängigem externem GitHub. Innerhalb von OIQ und in AI-Antworten an Humans heißt sie Home; die kurze Markenform ist OIQ Home. Ein Home verbindet ein kanonisches Repository mit seinem echten Home-Workspace und der Standard-Source; ein Human kann mehrere Homes haben (Deine Homes / Dein Home). Die Administration muss Home für jedes Konto freischalten. Eine getrennt autorisierte Home-AI-Verbindung kann erlaubte Markdown-Quelldateien schreiben; die OIQ-Knowledge/Work-MCP-Verbindung ist unabhängig und erteilt keinen Home-Schreibzugriff. Schreiben ist nicht die Freigabe des festen Stands: Geschriebenes Markdown kann bereits indexiert und in Dynamic gelesen werden. Ein bestehender fester Stable-Stand bleibt unverändert, bis ein berechtigter Human den Pin ausdrücklich ersetzt. Ohne Stable-Pin kann Dynamic die Standardansicht sein. Das ist kein neuer Freigabeprozess. Technische managed_git, mgit.use, oiq-045/1, Tool-Namen, Schemas und OAuth-Ressourcen bleiben erhalten. Allein die Benennung erfordert keine neue Zustimmung, Berechtigung oder Verbindung. Den sichtbaren Connector-Namen verantwortet der App-/Client-Registrierungsinhaber; Home-OAuth und Tool-Beschreibungen verantwortet der unabhängig bereitgestellte M.Git-Dienst. Öffentliche Hilfe bestätigt keinen Client-Titel oder installierten Stand. Home-Eigentümerschaft und ein separat freigegebenes Repository sind verschieden: Beachte die folgende Anleitung zur Zusammenarbeit. Versprich keine Browser-Uploads oder Editoren, uneingeschränkten Export/Löschung, Aufbewahrung, Hosting-Geografie oder rechtliches Eigentum.","evidence":["docs/adr/0039-immutable-workspace-read-projections.md","docs/adr/0048-managed-git-identity-home-workspace-and-source-integration.md"]},{"id":"home-collaboration-en","title":"Shared Repository authoring · English","text":"An Owner can use Participants to grant Collaborator access to one specific existing active OIQ Human whose account is already administrator-enabled for Home (mgit.use). Enter the recipient's exact email, verify the displayed identity and confirm the grant. An unavailable match does not reveal whether an account exists. Collaborator means repository-scoped Markdown read/write access; the original Owner keeps ownership and alone manages Participants. The recipient uses their own separately authorized Home AI/MCP connection or authenticated Home REST access. A shared Repository is not the recipient's own Home and creates no OIQ Workspace membership, protected Knowledge/Work access, Source/Index rights or Stable publication rights. OIQ's existing independent Indexer grant can update Dynamic automatically after a valid commit; an existing Stable pin stays fixed. Current active-account eligibility and repository grants are checked on every protected operation. After revoke, the next protected read/write operation is denied even with an already connected client; an operation already admitted at the final pre-push authorization may finish and remains historical fact. Removing administrator enablement also blocks use; it does not erase the persisted grant. Restore access only through current explicit authority. No Deputy, new global role or browser Markdown editor is supplied. Availability depends on the connected Home service; older services keep existing Owner use without Participants.","evidence":["docs/architecture/oiq-048-collaborative-authoring-contract-v1.md","docs/adr/0048-managed-git-identity-home-workspace-and-source-integration.md","docs/adr/0039-immutable-workspace-read-projections.md"]},{"id":"home-collaboration-de","title":"Gemeinsam im Repository schreiben · Deutsch","text":"Ein Owner kann unter Teilnehmer einem bestimmten bestehenden, aktiven OIQ-Human Bearbeiter-Zugriff erteilen, dessen Konto die Administration bereits für Home (mgit.use) freigeschaltet hat. Gib die genaue E-Mail-Adresse ein, prüfe die angezeigte Identität und bestätige die Berechtigung. Ein nicht verfügbarer Treffer verrät nicht, ob ein Konto existiert. Bearbeiter bedeutet Markdown-Lese-/Schreibzugriff auf dieses Repository; der ursprüngliche Owner bleibt Eigentümer und verwaltet allein die Teilnehmer. Der Empfänger nutzt seine eigene, getrennt autorisierte Home-AI-/MCP-Verbindung oder authentifizierten Home-REST-Zugriff. Ein freigegebenes Repository ist nicht das eigene Home des Empfängers und erzeugt keine OIQ-Workspace-Mitgliedschaft, keinen geschützten Knowledge-/Work-Zugriff, keine Source-/Index-Rechte und kein Recht zur Stable-Veröffentlichung. OIQ kann Dynamic nach einem gültigen Commit über seine bestehende unabhängige Indexer-Berechtigung automatisch aktualisieren; ein bestehender Stable-Pin bleibt fest. Aktueller Kontostatus, Freischaltung und Repository-Berechtigung werden bei jeder geschützten Operation geprüft. Nach Widerruf wird die nächste geschützte Lese-/Schreiboperation auch bei bestehender Client-Verbindung verweigert; eine bei der letzten Prüfung vor dem Push bereits zugelassene Operation kann noch abschließen und bleibt Historie. Entzug der administrativen Freischaltung sperrt die Nutzung ebenfalls, löscht aber keine gespeicherte Berechtigung. Zugriff kehrt nur mit aktueller ausdrücklicher Berechtigung zurück. Es gibt keinen Stellvertreter, keine neue globale Rolle und keinen Browser-Markdown-Editor. Die Verfügbarkeit hängt vom verbundenen Home-Dienst ab; ältere Dienste erhalten die bestehende Owner-Nutzung ohne Teilnehmerverwaltung.","evidence":["docs/architecture/oiq-048-collaborative-authoring-contract-v1.md","docs/adr/0048-managed-git-identity-home-workspace-and-source-integration.md","docs/adr/0039-immutable-workspace-read-projections.md"]}],"limitations":["Knowledge content is read from configured Sources. Authors update repository files through separately authorized repository tools.","The product does not execute external agents.","Current Markdown is a bounded subset. Interactive HTML requires Source-level Admin opt-in and remains self-contained.","Current localization uses Translation Manifest v1. A translation does not establish a governed Knowledge State or semantic-node equivalence.","Review import authorship limitation: ai_assisted and unknown remain rejected by the current import path.","No public guidance, contract, identifier, discovery or transfer grants access."],"mcp":{"endpoint":"/api/mcp","resourceMetadata":"/.well-known/oauth-protected-resource","connectionScope":"mcp:access","steps":["MCP requires a personal AI connection authenticated as a current active Human. Connect to /api/mcp using the installation’s OAuth resource metadata. New consent uses mcp:access; valid legacy grants remain connection-compatible. Connection consent and tool visibility grant no Workspace, Topic, administration or Git rights.","A connected agent can read_public_authoring_profile, read_public_contract_registry and read_public_contract without Web access. read_public_changes supplies the same repository-owned release impacts, audiences, breaking and action-required information as the public Changes JSON.","Use list_visible_workspaces and read_workspace_authoring_profile for the current readable Workspace context. read_workspace_admin_profile additionally requires current Admin authority; a visible tool may return forbidden. These reads expose no authentication secrets.","For direct Work, use list_work_topics and read_work_topic. The Topic response identifies the current authority as admin, owner or member. Owners and Admins manage the Topic; current members may edit its children. Workspace read membership alone does not grant Topic mutation rights.","Only with current applicable Topic rights, invoke mutate_work with a fresh UUID requestId and the expectedRevision from a fresh read_work_topic result. Existing-topic actions also require topicId. create_topic omits topicId and expectedRevision. Select current artifacts through read_work_artifact_catalog before add_reference and retain the exact view/projectionId.","On an uncertain transport outcome, retry the identical request; read_work_receipt can recover its durable receipt. A revision_conflict applies no mutation: reread the Topic, reassess the action and use a deliberate new requestId. Current server authority is checked on every operation and receipt replay, without reconnect.","mutate_work edits Work only. It has no delete_item or delete_entry action; removal actions cover references and relations. Entry type remains immutable, and only CLARIFICATION_POINT has open/closed state. Topic lifecycle and Item knowledgeContextExposure are existing visibility controls, not deletion.","The Work Repository JSON route remains a separate external authoring/import channel. Neither direct Work mutation nor Knowledge access publishes Source content, imports Review responses, writes Git or executes external agents. A client may independently suppress or confirm writes; current server-side Human and resource rights remain the authorization boundary."]},"examples":[{"id":"interactive-html","title":"Self-contained interactive Knowledge map","path":"contracts/public-authoring/examples/interactive-map.html","purpose":"Open standalone to filter local content; a registered interactive host progressively enables mediated navigation.","digest":"sha256:608f21fcca71d23f472bfb72df0e528f6c136b35a99e6c35295d2a509e17f68a","mediaType":"text/html","content":"<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<title>Service handover knowledge map</title>\n<style>\n:root{color-scheme:light dark;font-family:system-ui,sans-serif;line-height:1.55}body{margin:0;background:#f4f7fa;color:#172b3a}main{max-width:52rem;margin:auto;padding:clamp(1rem,4vw,2.5rem)}h1{line-height:1.2}article{background:white;border:1px solid #cad5dd;border-radius:.8rem;padding:1rem;margin:1rem 0}label{display:block;font-weight:650}input,button{font:inherit;border:1px solid #526b7d;border-radius:.35rem;padding:.65rem;background:white;color:#172b3a}input{box-sizing:border-box;width:100%;max-width:34rem}button{cursor:pointer;margin:.5rem 0}button:hover{background:#e6f0f7}:focus-visible{outline:3px solid #176dad;outline-offset:3px}code{overflow-wrap:anywhere}small{display:block;color:#425b6c}[hidden]{display:none}#status{min-height:3rem}footer{border-top:1px solid #cad5dd;margin-top:2rem;padding-top:1rem}@media(prefers-color-scheme:dark){body{background:#12202b;color:#e6eef4}article,input,button{background:#1e3342;color:#e6eef4}small{color:#bdcfdb}button:hover{background:#2b4a61}}@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto}}\n</style>\n</head>\n<body>\n<main>\n<p>Self-contained interactive Knowledge view</p>\n<h1>Service handover knowledge map</h1>\n<p>Read the summaries here, filter them locally, and use the visible references to find supporting Knowledge. Host navigation is optional.</p>\n<label for=\"filter\">Filter the embedded summaries</label>\n<input id=\"filter\" type=\"search\" placeholder=\"Try contact or principles\" aria-controls=\"cards\">\n<p id=\"count\" aria-live=\"polite\">3 summaries</p>\n<section id=\"cards\" aria-label=\"Knowledge summaries\">\n<article data-search=\"handover guide contact\">\n<h2>Handover guide</h2><p>Record the service contact and explain when to use it. Keep responsibilities visible during a handover.</p>\n<small>Reference: <code>docs/service-handover.md</code></small>\n<button type=\"button\" data-path=\"docs/service-handover.md\">Open handover guide in host</button>\n</article>\n<article data-search=\"service principles ownership\">\n<h2>Service principles</h2><p>Assign clear ownership before extending procedures. Use these principles as the factual basis for the guide.</p>\n<small>Reference: <code>docs/service-principles.md</code></small>\n<button type=\"button\" data-path=\"docs/service-principles.md\">Open service principles in host</button>\n</article>\n<article data-search=\"contact catalogue search\">\n<h2>Find a contact</h2><p>If a precise file path is uncertain, use the current Workspace search to find the service contact.</p>\n<small>Search reference: <code>service contact</code></small>\n<button type=\"button\" data-query=\"service contact\">Search for service contact in host</button>\n</article>\n</section>\n<p id=\"empty\" hidden>No summaries match. Clear the filter to show all summaries.</p>\n<p id=\"status\" role=\"status\" aria-live=\"polite\">Standalone mode: all summaries and references remain available. Host navigation becomes available only after a supported handshake.</p>\n<noscript><p>JavaScript is disabled. All summaries and references remain visible; local filtering and host navigation are unavailable.</p></noscript>\n<footer>Example references are illustrative. Replace them with exact indexed current-Workspace paths or a meaningful search query before publishing.</footer>\n</main>\n<script>\n(() => {\n  'use strict';\n  const protocol = 'orivelaiq.artifact.v1';\n  const status = document.getElementById('status');\n  const pending = new Map();\n  let hostReady = false;\n  let sequence = 0;\n  const attempts = [];\n  const show = text => { status.textContent = text; };\n  const fallback = (reference, reason) => show(reason + ' Reference: ' + reference + '. The summary remains available here.');\n  window.addEventListener('message', event => {\n    if (window.parent === window || event.source !== window.parent) return;\n    const data = event.data;\n    if (!data || typeof data !== 'object' || data.protocol !== protocol) return;\n    if (data.type === 'host-ready' && Array.isArray(data.capabilities) && data.capabilities.includes('navigate')) {\n      hostReady = true;\n      show('Host navigation is available. Choose a Knowledge reference to request navigation.');\n      return;\n    }\n    if (data.type !== 'navigate-result' || !['accepted', 'not-found', 'denied'].includes(data.status)) return;\n    const request = pending.get(data.requestId);\n    if (!request) return;\n    clearTimeout(request.timer);\n    pending.delete(data.requestId);\n    if (data.status === 'accepted') show('The host accepted navigation to ' + request.reference + '.');\n    else fallback(request.reference, data.status === 'not-found' ? 'The host could not resolve this reference.' : 'The host did not allow this request.');\n  });\n  document.querySelectorAll('button[data-path],button[data-query]').forEach(button => {\n    button.addEventListener('click', () => {\n      const target = button.dataset.path ? {kind:'artifactPath',path:button.dataset.path} : {kind:'search',query:button.dataset.query};\n      const reference = button.dataset.path || button.dataset.query;\n      if (!hostReady) { fallback(reference, 'Host navigation is unavailable.'); return; }\n      const now = Date.now();\n      while (attempts.length && now - attempts[0] >= 2000) attempts.shift();\n      if (attempts.length >= 5) { fallback(reference, 'Please wait before requesting another navigation.'); return; }\n      attempts.push(now);\n      const requestId = 'map-' + (++sequence) + '-' + now;\n      const timer = setTimeout(() => {\n        pending.delete(requestId);\n        fallback(reference, 'The host request timed out.');\n      }, 2000);\n      pending.set(requestId, {reference, timer});\n      show('Requesting host navigation to ' + reference + '…');\n      window.parent.postMessage({protocol,type:'navigate',requestId,userActivated:true,target}, '*');\n    });\n  });\n  const filter = document.getElementById('filter');\n  const cards = Array.from(document.querySelectorAll('article[data-search]'));\n  filter.addEventListener('input', () => {\n    const query = filter.value.trim().toLowerCase();\n    let visible = 0;\n    cards.forEach(card => {\n      card.hidden = !((card.dataset.search + ' ' + card.textContent).toLowerCase().includes(query));\n      if (!card.hidden) visible++;\n    });\n    document.getElementById('count').textContent = visible + (visible === 1 ? ' summary' : ' summaries');\n    document.getElementById('empty').hidden = visible !== 0;\n  });\n})();\n</script>\n</body>\n</html>\n"},{"id":"work-repository","title":"Complete Work Topic and Item","path":"contracts/public-authoring/examples/work-repository.json","purpose":"Schema-valid repository files without runtime Artifact references.","digest":"sha256:5b5d6eb1c5aee5aa7a56349d4e068741b23a9636b41704b788b2af85a6d4ece7","mediaType":"application/json","content":"{\n  \"files\": [\n    {\n      \"path\": \"topic.json\",\n      \"content\": {\n        \"schemaVersion\": \"0.1\",\n        \"externalKey\": \"service-handover\",\n        \"title\": \"Improve service handover\",\n        \"description\": \"Continue useful findings and clarification.\"\n      }\n    },\n    {\n      \"path\": \"items/01-handover.json\",\n      \"content\": {\n        \"schemaVersion\": \"0.1\",\n        \"externalKey\": \"handover-guide\",\n        \"topicExternalKey\": \"service-handover\",\n        \"title\": \"Make the handover guide usable\",\n        \"labels\": [\n          \"handover\"\n        ],\n        \"knowledgeContextExposure\": \"include\",\n        \"entries\": [\n          {\n            \"externalKey\": \"contact-observation\",\n            \"type\": \"INSIGHT\",\n            \"text\": \"The handover guide does not explain the first contact.\"\n          },\n          {\n            \"externalKey\": \"contact-question\",\n            \"type\": \"CLARIFICATION_POINT\",\n            \"text\": \"Clarify which contact belongs in the guide.\",\n            \"relatesTo\": [\n              \"contact-observation\"\n            ]\n          },\n          {\n            \"externalKey\": \"contact-approach\",\n            \"type\": \"DECISION\",\n            \"text\": \"Record the service contact before extending the guide.\"\n          },\n          {\n            \"externalKey\": \"review-result\",\n            \"type\": \"RESULT\",\n            \"text\": \"The review identified the contact as the next clarification.\",\n            \"relatesTo\": [\n              \"contact-question\"\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}\n"},{"id":"external-response","title":"External Response file pair","path":"contracts/public-authoring/examples/external-response.json","purpose":"Schema/runtime-valid illustrative values. Replace identities and BasedOn with exact authorized export context before authoring.","digest":"sha256:8d0ee43f7e22f69c8cef396f1914c41687f2e24501d63fc5ca280c4a7c09a656","mediaType":"application/json","content":"{\n  \"illustrativeOnly\": true,\n  \"ownerInstallationId\": \"11111111-1111-4111-8111-111111111111\",\n  \"replacementRule\": \"Use exact public IDs, revisions, exportedAt and contextHash from the authorized current export; allocate a new response UUID and supply truthful separately authorized external installation/authorship. Recompute the bodyDigest for exact response.md bytes ending in one newline.\",\n  \"files\": [\n    {\n      \"path\": \"installations/11111111-1111-4111-8111-111111111111/review-packages/22222222-2222-4222-8222-222222222222/items/33333333-3333-4333-8333-333333333333/responses/44444444-4444-4444-8444-444444444444/response.yaml\",\n      \"content\": \"{\\n  \\\"schemaVersion\\\": \\\"1.0.0\\\",\\n  \\\"entityType\\\": \\\"response\\\",\\n  \\\"exportedAt\\\": \\\"2026-10-07T00:00:00Z\\\",\\n  \\\"exporter\\\": \\\"55555555-5555-4555-8555-555555555555\\\",\\n  \\\"entity\\\": {\\n    \\\"publicId\\\": \\\"44444444-4444-4444-8444-444444444444\\\",\\n    \\\"revision\\\": 1,\\n    \\\"createdAt\\\": \\\"2026-10-07T00:00:00Z\\\",\\n    \\\"updatedAt\\\": \\\"2026-10-07T00:00:00Z\\\",\\n    \\\"origin\\\": {\\n      \\\"type\\\": \\\"review_exchange\\\",\\n      \\\"installationId\\\": \\\"55555555-5555-4555-8555-555555555555\\\"\\n    },\\n    \\\"packagePublicId\\\": \\\"22222222-2222-4222-8222-222222222222\\\",\\n    \\\"itemPublicId\\\": \\\"33333333-3333-4333-8333-333333333333\\\",\\n    \\\"responseType\\\": \\\"clarification\\\",\\n    \\\"authorship\\\": {\\n      \\\"type\\\": \\\"ai\\\",\\n      \\\"installationId\\\": \\\"55555555-5555-4555-8555-555555555555\\\",\\n      \\\"displayName\\\": \\\"External review assistant\\\",\\n      \\\"modelName\\\": \\\"example-model\\\"\\n    },\\n    \\\"basedOn\\\": {\\n      \\\"packagePublicId\\\": \\\"22222222-2222-4222-8222-222222222222\\\",\\n      \\\"packageRevision\\\": 1,\\n      \\\"itemPublicId\\\": \\\"33333333-3333-4333-8333-333333333333\\\",\\n      \\\"itemRevision\\\": 1,\\n      \\\"contextRevision\\\": 1,\\n      \\\"contextHash\\\": \\\"sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\",\\n      \\\"exportedAt\\\": \\\"2026-10-07T00:00:00Z\\\"\\n    },\\n    \\\"bodyDigest\\\": \\\"sha256:c714ced7caa298250f53039c6addc5614e3bec559cc6a50658f0faaf573876d9\\\"\\n  }\\n}\\n\"\n    },\n    {\n      \"path\": \"installations/11111111-1111-4111-8111-111111111111/review-packages/22222222-2222-4222-8222-222222222222/items/33333333-3333-4333-8333-333333333333/responses/44444444-4444-4444-8444-444444444444/response.md\",\n      \"content\": \"---\\n{\\n  \\\"schemaVersion\\\": \\\"1.0.0\\\",\\n  \\\"publicId\\\": \\\"44444444-4444-4444-8444-444444444444\\\",\\n  \\\"itemPublicId\\\": \\\"33333333-3333-4333-8333-333333333333\\\",\\n  \\\"responseType\\\": \\\"clarification\\\",\\n  \\\"status\\\": \\\"submitted\\\",\\n  \\\"authorship\\\": {\\n    \\\"type\\\": \\\"ai\\\",\\n    \\\"installationId\\\": \\\"55555555-5555-4555-8555-555555555555\\\",\\n    \\\"displayName\\\": \\\"External review assistant\\\",\\n    \\\"modelName\\\": \\\"example-model\\\"\\n  },\\n  \\\"basedOn\\\": {\\n    \\\"packagePublicId\\\": \\\"22222222-2222-4222-8222-222222222222\\\",\\n    \\\"packageRevision\\\": 1,\\n    \\\"itemPublicId\\\": \\\"33333333-3333-4333-8333-333333333333\\\",\\n    \\\"itemRevision\\\": 1,\\n    \\\"contextRevision\\\": 1,\\n    \\\"contextHash\\\": \\\"sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\",\\n    \\\"exportedAt\\\": \\\"2026-10-07T00:00:00Z\\\"\\n  },\\n  \\\"createdAt\\\": \\\"2026-10-07T00:00:00Z\\\"\\n}\\n---\\n# Clarification\\n\\nThe guide should name the service contact and explain when to use it.\\n\"\n    }\n  ]\n}\n"},{"id":"grounding","title":"Canonical Markdown Grounding","path":"contracts/public-authoring/examples/grounding.md","purpose":"A direct same-Source declaration; the referenced target must declare the matching identity.","digest":"sha256:626ad08d2419a238670a0d4ff240d2b17aee22a6488127af17b0a7cac3db6129","mediaType":"text/markdown","content":"---\nknowledge_object_id: urn:uuid:11111111-1111-4111-8111-111111111111\ngrounded_by:\n  - urn:uuid:22222222-2222-4222-8222-222222222222\n---\n# Service handover\n\nThis guide is grounded by the separately identified service principles in the same canonical ContentSource.\n"},{"id":"localization-v1","title":"Translation Manifest v1","path":"contracts/public-authoring/examples/localization-v1.json","purpose":"Runtime-valid document-level companion mapping with illustrative repository/ref/path evidence. Configuration must match the canonical and companion Sources; translations remain externally owned.","digest":"sha256:1cd0c45939296d6463c22283a0eac87b2f285e138e61b491bea818f8178f0c48","mediaType":"application/json","content":"{\n  \"illustrativeOnly\": true,\n  \"replacementRule\": \"Use actual canonical repository, configured ref, source revision/blob and persistent review evidence. Do not copy illustrative hashes as evidence. Keep source/target paths matched by authorized Source rules.\",\n  \"files\": [\n    {\n      \"path\": \"translation-manifest.yml\",\n      \"content\": \"schema_version: 1\\npilot_id: service-guide-de-DE\\ncanonical_repository: example/service-knowledge\\ncanonical_branch: main\\ncanonical_language: en\\ntarget_locale: de-DE\\nsource_audit:\\n  repository: example/service-knowledge\\n  path: governance/source-audit.md\\n  pull_request: 1\\nterminology_version: \\\"1.0\\\"\\ntranslations:\\n  - document_id: service.handover\\n    source_path: docs/service-handover.md\\n    target_path: de-DE/docs/service-handover.md\\n    source_commit: aaaaaaaa\\n    source_blob_sha: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\n    status: draft\\n    currency: unknown\\n    review_evidence: governance/translation-review.md#handover\\n    source_findings:\\n      - canonical-source-review-pending\\n\"\n    },\n    {\n      \"path\": \"docs/service-handover.md\",\n      \"content\": \"# Service handover\\n\\nRecord the service contact before extending the guide.\\n\"\n    },\n    {\n      \"path\": \"de-DE/docs/service-handover.md\",\n      \"content\": \"# Serviceübergabe\\n\\nErfasse den Servicekontakt, bevor du den Leitfaden erweiterst.\\n\"\n    }\n  ]\n}\n"}],"links":{"discovery":"/.well-known/orivelaiq","humanGuidance":"/guidance","agentGuidance":"/guidance/agents","registry":"/api/public/registry","profile":"/api/public/profile","bootstrap":"/api/public/bootstrap","transfer":"/api/public/transfer","agentInstructions":"/api/public/agent-instructions","releases":"/releases","changes":"/api/public/changes","contracts":"/api/public/contracts/{id}","mcp":"/api/mcp"}},"examples":[{"id":"interactive-html","title":"Self-contained interactive Knowledge map","path":"contracts/public-authoring/examples/interactive-map.html","purpose":"Open standalone to filter local content; a registered interactive host progressively enables mediated navigation.","digest":"sha256:608f21fcca71d23f472bfb72df0e528f6c136b35a99e6c35295d2a509e17f68a","mediaType":"text/html","content":"<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<title>Service handover knowledge map</title>\n<style>\n:root{color-scheme:light dark;font-family:system-ui,sans-serif;line-height:1.55}body{margin:0;background:#f4f7fa;color:#172b3a}main{max-width:52rem;margin:auto;padding:clamp(1rem,4vw,2.5rem)}h1{line-height:1.2}article{background:white;border:1px solid #cad5dd;border-radius:.8rem;padding:1rem;margin:1rem 0}label{display:block;font-weight:650}input,button{font:inherit;border:1px solid #526b7d;border-radius:.35rem;padding:.65rem;background:white;color:#172b3a}input{box-sizing:border-box;width:100%;max-width:34rem}button{cursor:pointer;margin:.5rem 0}button:hover{background:#e6f0f7}:focus-visible{outline:3px solid #176dad;outline-offset:3px}code{overflow-wrap:anywhere}small{display:block;color:#425b6c}[hidden]{display:none}#status{min-height:3rem}footer{border-top:1px solid #cad5dd;margin-top:2rem;padding-top:1rem}@media(prefers-color-scheme:dark){body{background:#12202b;color:#e6eef4}article,input,button{background:#1e3342;color:#e6eef4}small{color:#bdcfdb}button:hover{background:#2b4a61}}@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto}}\n</style>\n</head>\n<body>\n<main>\n<p>Self-contained interactive Knowledge view</p>\n<h1>Service handover knowledge map</h1>\n<p>Read the summaries here, filter them locally, and use the visible references to find supporting Knowledge. Host navigation is optional.</p>\n<label for=\"filter\">Filter the embedded summaries</label>\n<input id=\"filter\" type=\"search\" placeholder=\"Try contact or principles\" aria-controls=\"cards\">\n<p id=\"count\" aria-live=\"polite\">3 summaries</p>\n<section id=\"cards\" aria-label=\"Knowledge summaries\">\n<article data-search=\"handover guide contact\">\n<h2>Handover guide</h2><p>Record the service contact and explain when to use it. Keep responsibilities visible during a handover.</p>\n<small>Reference: <code>docs/service-handover.md</code></small>\n<button type=\"button\" data-path=\"docs/service-handover.md\">Open handover guide in host</button>\n</article>\n<article data-search=\"service principles ownership\">\n<h2>Service principles</h2><p>Assign clear ownership before extending procedures. Use these principles as the factual basis for the guide.</p>\n<small>Reference: <code>docs/service-principles.md</code></small>\n<button type=\"button\" data-path=\"docs/service-principles.md\">Open service principles in host</button>\n</article>\n<article data-search=\"contact catalogue search\">\n<h2>Find a contact</h2><p>If a precise file path is uncertain, use the current Workspace search to find the service contact.</p>\n<small>Search reference: <code>service contact</code></small>\n<button type=\"button\" data-query=\"service contact\">Search for service contact in host</button>\n</article>\n</section>\n<p id=\"empty\" hidden>No summaries match. Clear the filter to show all summaries.</p>\n<p id=\"status\" role=\"status\" aria-live=\"polite\">Standalone mode: all summaries and references remain available. Host navigation becomes available only after a supported handshake.</p>\n<noscript><p>JavaScript is disabled. All summaries and references remain visible; local filtering and host navigation are unavailable.</p></noscript>\n<footer>Example references are illustrative. Replace them with exact indexed current-Workspace paths or a meaningful search query before publishing.</footer>\n</main>\n<script>\n(() => {\n  'use strict';\n  const protocol = 'orivelaiq.artifact.v1';\n  const status = document.getElementById('status');\n  const pending = new Map();\n  let hostReady = false;\n  let sequence = 0;\n  const attempts = [];\n  const show = text => { status.textContent = text; };\n  const fallback = (reference, reason) => show(reason + ' Reference: ' + reference + '. The summary remains available here.');\n  window.addEventListener('message', event => {\n    if (window.parent === window || event.source !== window.parent) return;\n    const data = event.data;\n    if (!data || typeof data !== 'object' || data.protocol !== protocol) return;\n    if (data.type === 'host-ready' && Array.isArray(data.capabilities) && data.capabilities.includes('navigate')) {\n      hostReady = true;\n      show('Host navigation is available. Choose a Knowledge reference to request navigation.');\n      return;\n    }\n    if (data.type !== 'navigate-result' || !['accepted', 'not-found', 'denied'].includes(data.status)) return;\n    const request = pending.get(data.requestId);\n    if (!request) return;\n    clearTimeout(request.timer);\n    pending.delete(data.requestId);\n    if (data.status === 'accepted') show('The host accepted navigation to ' + request.reference + '.');\n    else fallback(request.reference, data.status === 'not-found' ? 'The host could not resolve this reference.' : 'The host did not allow this request.');\n  });\n  document.querySelectorAll('button[data-path],button[data-query]').forEach(button => {\n    button.addEventListener('click', () => {\n      const target = button.dataset.path ? {kind:'artifactPath',path:button.dataset.path} : {kind:'search',query:button.dataset.query};\n      const reference = button.dataset.path || button.dataset.query;\n      if (!hostReady) { fallback(reference, 'Host navigation is unavailable.'); return; }\n      const now = Date.now();\n      while (attempts.length && now - attempts[0] >= 2000) attempts.shift();\n      if (attempts.length >= 5) { fallback(reference, 'Please wait before requesting another navigation.'); return; }\n      attempts.push(now);\n      const requestId = 'map-' + (++sequence) + '-' + now;\n      const timer = setTimeout(() => {\n        pending.delete(requestId);\n        fallback(reference, 'The host request timed out.');\n      }, 2000);\n      pending.set(requestId, {reference, timer});\n      show('Requesting host navigation to ' + reference + '…');\n      window.parent.postMessage({protocol,type:'navigate',requestId,userActivated:true,target}, '*');\n    });\n  });\n  const filter = document.getElementById('filter');\n  const cards = Array.from(document.querySelectorAll('article[data-search]'));\n  filter.addEventListener('input', () => {\n    const query = filter.value.trim().toLowerCase();\n    let visible = 0;\n    cards.forEach(card => {\n      card.hidden = !((card.dataset.search + ' ' + card.textContent).toLowerCase().includes(query));\n      if (!card.hidden) visible++;\n    });\n    document.getElementById('count').textContent = visible + (visible === 1 ? ' summary' : ' summaries');\n    document.getElementById('empty').hidden = visible !== 0;\n  });\n})();\n</script>\n</body>\n</html>\n"},{"id":"work-repository","title":"Complete Work Topic and Item","path":"contracts/public-authoring/examples/work-repository.json","purpose":"Schema-valid repository files without runtime Artifact references.","digest":"sha256:5b5d6eb1c5aee5aa7a56349d4e068741b23a9636b41704b788b2af85a6d4ece7","mediaType":"application/json","content":"{\n  \"files\": [\n    {\n      \"path\": \"topic.json\",\n      \"content\": {\n        \"schemaVersion\": \"0.1\",\n        \"externalKey\": \"service-handover\",\n        \"title\": \"Improve service handover\",\n        \"description\": \"Continue useful findings and clarification.\"\n      }\n    },\n    {\n      \"path\": \"items/01-handover.json\",\n      \"content\": {\n        \"schemaVersion\": \"0.1\",\n        \"externalKey\": \"handover-guide\",\n        \"topicExternalKey\": \"service-handover\",\n        \"title\": \"Make the handover guide usable\",\n        \"labels\": [\n          \"handover\"\n        ],\n        \"knowledgeContextExposure\": \"include\",\n        \"entries\": [\n          {\n            \"externalKey\": \"contact-observation\",\n            \"type\": \"INSIGHT\",\n            \"text\": \"The handover guide does not explain the first contact.\"\n          },\n          {\n            \"externalKey\": \"contact-question\",\n            \"type\": \"CLARIFICATION_POINT\",\n            \"text\": \"Clarify which contact belongs in the guide.\",\n            \"relatesTo\": [\n              \"contact-observation\"\n            ]\n          },\n          {\n            \"externalKey\": \"contact-approach\",\n            \"type\": \"DECISION\",\n            \"text\": \"Record the service contact before extending the guide.\"\n          },\n          {\n            \"externalKey\": \"review-result\",\n            \"type\": \"RESULT\",\n            \"text\": \"The review identified the contact as the next clarification.\",\n            \"relatesTo\": [\n              \"contact-question\"\n            ]\n          }\n        ]\n      }\n    }\n  ]\n}\n"},{"id":"external-response","title":"External Response file pair","path":"contracts/public-authoring/examples/external-response.json","purpose":"Schema/runtime-valid illustrative values. Replace identities and BasedOn with exact authorized export context before authoring.","digest":"sha256:8d0ee43f7e22f69c8cef396f1914c41687f2e24501d63fc5ca280c4a7c09a656","mediaType":"application/json","content":"{\n  \"illustrativeOnly\": true,\n  \"ownerInstallationId\": \"11111111-1111-4111-8111-111111111111\",\n  \"replacementRule\": \"Use exact public IDs, revisions, exportedAt and contextHash from the authorized current export; allocate a new response UUID and supply truthful separately authorized external installation/authorship. Recompute the bodyDigest for exact response.md bytes ending in one newline.\",\n  \"files\": [\n    {\n      \"path\": \"installations/11111111-1111-4111-8111-111111111111/review-packages/22222222-2222-4222-8222-222222222222/items/33333333-3333-4333-8333-333333333333/responses/44444444-4444-4444-8444-444444444444/response.yaml\",\n      \"content\": \"{\\n  \\\"schemaVersion\\\": \\\"1.0.0\\\",\\n  \\\"entityType\\\": \\\"response\\\",\\n  \\\"exportedAt\\\": \\\"2026-10-07T00:00:00Z\\\",\\n  \\\"exporter\\\": \\\"55555555-5555-4555-8555-555555555555\\\",\\n  \\\"entity\\\": {\\n    \\\"publicId\\\": \\\"44444444-4444-4444-8444-444444444444\\\",\\n    \\\"revision\\\": 1,\\n    \\\"createdAt\\\": \\\"2026-10-07T00:00:00Z\\\",\\n    \\\"updatedAt\\\": \\\"2026-10-07T00:00:00Z\\\",\\n    \\\"origin\\\": {\\n      \\\"type\\\": \\\"review_exchange\\\",\\n      \\\"installationId\\\": \\\"55555555-5555-4555-8555-555555555555\\\"\\n    },\\n    \\\"packagePublicId\\\": \\\"22222222-2222-4222-8222-222222222222\\\",\\n    \\\"itemPublicId\\\": \\\"33333333-3333-4333-8333-333333333333\\\",\\n    \\\"responseType\\\": \\\"clarification\\\",\\n    \\\"authorship\\\": {\\n      \\\"type\\\": \\\"ai\\\",\\n      \\\"installationId\\\": \\\"55555555-5555-4555-8555-555555555555\\\",\\n      \\\"displayName\\\": \\\"External review assistant\\\",\\n      \\\"modelName\\\": \\\"example-model\\\"\\n    },\\n    \\\"basedOn\\\": {\\n      \\\"packagePublicId\\\": \\\"22222222-2222-4222-8222-222222222222\\\",\\n      \\\"packageRevision\\\": 1,\\n      \\\"itemPublicId\\\": \\\"33333333-3333-4333-8333-333333333333\\\",\\n      \\\"itemRevision\\\": 1,\\n      \\\"contextRevision\\\": 1,\\n      \\\"contextHash\\\": \\\"sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\",\\n      \\\"exportedAt\\\": \\\"2026-10-07T00:00:00Z\\\"\\n    },\\n    \\\"bodyDigest\\\": \\\"sha256:c714ced7caa298250f53039c6addc5614e3bec559cc6a50658f0faaf573876d9\\\"\\n  }\\n}\\n\"\n    },\n    {\n      \"path\": \"installations/11111111-1111-4111-8111-111111111111/review-packages/22222222-2222-4222-8222-222222222222/items/33333333-3333-4333-8333-333333333333/responses/44444444-4444-4444-8444-444444444444/response.md\",\n      \"content\": \"---\\n{\\n  \\\"schemaVersion\\\": \\\"1.0.0\\\",\\n  \\\"publicId\\\": \\\"44444444-4444-4444-8444-444444444444\\\",\\n  \\\"itemPublicId\\\": \\\"33333333-3333-4333-8333-333333333333\\\",\\n  \\\"responseType\\\": \\\"clarification\\\",\\n  \\\"status\\\": \\\"submitted\\\",\\n  \\\"authorship\\\": {\\n    \\\"type\\\": \\\"ai\\\",\\n    \\\"installationId\\\": \\\"55555555-5555-4555-8555-555555555555\\\",\\n    \\\"displayName\\\": \\\"External review assistant\\\",\\n    \\\"modelName\\\": \\\"example-model\\\"\\n  },\\n  \\\"basedOn\\\": {\\n    \\\"packagePublicId\\\": \\\"22222222-2222-4222-8222-222222222222\\\",\\n    \\\"packageRevision\\\": 1,\\n    \\\"itemPublicId\\\": \\\"33333333-3333-4333-8333-333333333333\\\",\\n    \\\"itemRevision\\\": 1,\\n    \\\"contextRevision\\\": 1,\\n    \\\"contextHash\\\": \\\"sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\\",\\n    \\\"exportedAt\\\": \\\"2026-10-07T00:00:00Z\\\"\\n  },\\n  \\\"createdAt\\\": \\\"2026-10-07T00:00:00Z\\\"\\n}\\n---\\n# Clarification\\n\\nThe guide should name the service contact and explain when to use it.\\n\"\n    }\n  ]\n}\n"},{"id":"grounding","title":"Canonical Markdown Grounding","path":"contracts/public-authoring/examples/grounding.md","purpose":"A direct same-Source declaration; the referenced target must declare the matching identity.","digest":"sha256:626ad08d2419a238670a0d4ff240d2b17aee22a6488127af17b0a7cac3db6129","mediaType":"text/markdown","content":"---\nknowledge_object_id: urn:uuid:11111111-1111-4111-8111-111111111111\ngrounded_by:\n  - urn:uuid:22222222-2222-4222-8222-222222222222\n---\n# Service handover\n\nThis guide is grounded by the separately identified service principles in the same canonical ContentSource.\n"},{"id":"localization-v1","title":"Translation Manifest v1","path":"contracts/public-authoring/examples/localization-v1.json","purpose":"Runtime-valid document-level companion mapping with illustrative repository/ref/path evidence. Configuration must match the canonical and companion Sources; translations remain externally owned.","digest":"sha256:1cd0c45939296d6463c22283a0eac87b2f285e138e61b491bea818f8178f0c48","mediaType":"application/json","content":"{\n  \"illustrativeOnly\": true,\n  \"replacementRule\": \"Use actual canonical repository, configured ref, source revision/blob and persistent review evidence. Do not copy illustrative hashes as evidence. Keep source/target paths matched by authorized Source rules.\",\n  \"files\": [\n    {\n      \"path\": \"translation-manifest.yml\",\n      \"content\": \"schema_version: 1\\npilot_id: service-guide-de-DE\\ncanonical_repository: example/service-knowledge\\ncanonical_branch: main\\ncanonical_language: en\\ntarget_locale: de-DE\\nsource_audit:\\n  repository: example/service-knowledge\\n  path: governance/source-audit.md\\n  pull_request: 1\\nterminology_version: \\\"1.0\\\"\\ntranslations:\\n  - document_id: service.handover\\n    source_path: docs/service-handover.md\\n    target_path: de-DE/docs/service-handover.md\\n    source_commit: aaaaaaaa\\n    source_blob_sha: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\n    status: draft\\n    currency: unknown\\n    review_evidence: governance/translation-review.md#handover\\n    source_findings:\\n      - canonical-source-review-pending\\n\"\n    },\n    {\n      \"path\": \"docs/service-handover.md\",\n      \"content\": \"# Service handover\\n\\nRecord the service contact before extending the guide.\\n\"\n    },\n    {\n      \"path\": \"de-DE/docs/service-handover.md\",\n      \"content\": \"# Serviceübergabe\\n\\nErfasse den Servicekontakt, bevor du den Leitfaden erweiterst.\\n\"\n    }\n  ]\n}\n"}],"releaseCommunication":{"contextKind":"public_baseline","modelVersion":"1","productBaseline":{"id":"release-2-current","label":"Release 2 — aktueller Fähigkeitenstand","productVersion":null,"publicationState":"unpublished","date":"2026-10-07","previousPublishedVersion":"v0.1.0-internal","summary":"OrivelaIQ verbindet geschütztes Knowledge mit nachvollziehbarem Feedback und gemeinsamer Work-Kontinuität. Dieser Fähigkeitenstand ist die Grundlage für Release 2; eine konkrete Produktversion wurde noch nicht veröffentlicht oder als Tag festgelegt.","knownLimitations":["OrivelaIQ-Zugriff erteilt keine Git-Schreibrechte. Änderungen an Quelldateien benötigen separat autorisierten Repository-Zugriff.","Die verfügbaren Funktionen hängen vom lesbaren Workspace und den aktuellen Rechten ab. Das Workspace-Profil beschreibt den jeweiligen Nutzungskontext.","Externe Antworten verwenden Review Exchange und separat autorisierten Git-Zugriff. Eine Contribution oder Work-Mutation ersetzt diesen Kanal nicht.","Produktversionen und die bestehenden Vertragsversionen sind voneinander unabhängig. Das Release-2-Label wählt keine neue Vertragsversion."],"changes":[{"id":"release-2-knowledge","date":"2026-10-07","category":"improvement","availability":"integrated","audiences":["Readers","Authors"],"areas":["Knowledge","Grounding","Workspace projections"],"contracts":[{"id":"artifact-navigation","version":"1"}],"summary":"Knowledge bietet eine ruhigere responsive Leseoberfläche, sichere Markdown-/SVG-/HTML-Ausgabe, direkte Grounding-Beziehungen und getrennte Stable-/Dynamic-Lesestände. Sichtbarer Work-Kontext erweitert keine Source-Rechte.","actionRequired":false,"action":null,"breaking":false,"language":"de","profiles":[]},{"id":"release-2-work","date":"2026-10-07","category":"feature","availability":"integrated","audiences":["Work participants","Authors","AI agents"],"areas":["Work","Repository import","Topic Overflight"],"contracts":[{"id":"work-repository","version":"0.1"}],"summary":"Gemeinsame Work Topics enthalten Items und typisierte Einträge. Browser und MCP verwenden dieselben fachlichen Regeln. Repository-Definitionen werden ausdrücklich über PLAN, Vorschau und APPLY eingelesen; Topic Overflight führt in zugewiesenes Knowledge.","actionRequired":false,"action":null,"breaking":false,"language":"de","profiles":[]},{"id":"release-2-feedback","date":"2026-10-07","category":"feature","availability":"integrated","audiences":["Readers","Reviewers","AI agents"],"areas":["Feedback","Review Exchange","Markdown input material"],"contracts":[{"id":"review-exchange","version":"1.0.0"}],"summary":"Feedback an Seiten und Abschnitten erhält nachvollziehbare externe Antworten über Review Exchange. Optionales Markdown-Eingabematerial erläutert Feedback und neue Work-Einträge und wird dadurch kein veröffentlichtes Knowledge.","actionRequired":false,"action":null,"breaking":false,"language":"de","profiles":[]},{"id":"release-2-authentication","date":"2026-10-07","category":"breaking","availability":"integrated","audiences":["Humans","Administrators","AI connection owners"],"areas":["Sign-in","Personal AI connections","Administration"],"contracts":[],"summary":"Humans melden sich mit einem E-Mail-Einmalcode an. Bestehende Rollen und Ressourcenrechte bleiben maßgeblich. Persönliche AI-Verbindungen sind unabhängig widerrufbar; die Administration ist Workspace-zentriert.","actionRequired":true,"action":"Zum Anmelden den Einmalcode an der registrierten E-Mail-Adresse abrufen; ein bisheriges Passwort kann nicht mehr verwendet werden.","breaking":true,"language":"de","profiles":[]},{"id":"oiq-039-canonical-change-removal","date":"2026-10-07","category":"removal","availability":"integrated","audiences":["Administrators","Reviewers","Source owners","Integrators"],"areas":["CanonicalChange","Review","Source writes"],"contracts":[],"summary":"CanonicalChange mit eigener Ausführung, Repository-Mutation und Recovery wurde entfernt. Änderungsentscheidungen verwenden weiterhin den generischen Review-Pfad: extern umsetzen, Änderungsnachweis dokumentieren, Verification durchführen. Eine Decision löst keinen Source-Schreibzugriff aus.","actionRequired":true,"action":"Eigene Automatisierungen für CanonicalChange nicht weiter verwenden. Änderungen durch den zuständigen Source-Prozess umsetzen und im generischen Review mit Änderungsnachweis bestätigen.","breaking":true,"language":"de","profiles":[]},{"id":"oiq-040-public-guidance","date":"2026-10-07","category":"feature","availability":"integrated","audiences":["Authors","Readers","Administrators","AI agents"],"areas":["Public guidance","Authoring profiles","Release communication"],"contracts":[{"id":"work-repository","version":"0.1"},{"id":"review-exchange","version":"1.0.0"},{"id":"artifact-navigation","version":"1"}],"summary":"Öffentliche Anleitungen, Agent Bootstrap und vollständiger Offline-Transfer erklären die aktuellen Regeln. Nach Anmeldung verfeinern ein sicheres Workspace-Profil und ein getrenntes Admin-Profil den Kontext. Releases und Änderungen erklären Auswirkungen für Humans und Agents.","actionRequired":false,"action":null,"breaking":false,"profiles":[{"id":"orivelaiq-public-authoring","version":"1.2.0"}],"language":"de"},{"id":"oiq-040-mcp-discovery-authority","date":"2026-10-07","category":"compatibility","availability":"integrated","audiences":["AI agents","AI connection owners","Integrators"],"areas":["MCP discovery","OAuth","Work authorization"],"contracts":[],"summary":"Alle verbundenen Humans sehen die vom Server unterstützten Tools mit korrekten Effekthinweisen. Auch ein bisher enger OAuth-Grant kann Schreibtools anzeigen. Jeder Aufruf wird gegen die aktuellen Human-, Workspace-, Topic- und Ressourcenrechte geprüft; die Tool-Liste erteilt keine Rechte.","actionRequired":true,"action":"Clients mit ausschließlich lesender Nutzung sollen Schreibaufrufe durch ihre eigene Tool-Policy unterlassen oder bestätigen lassen. Neue Verbindungen verwenden mcp:access; gültige Legacy-Grants bleiben kompatibel. Bestehende Domain-Rechte gelten bei jedem Aufruf, unabhängig vom OAuth-Scope.","breaking":true,"language":"de","profiles":[]},{"id":"oiq-049-home-naming","language":"de","date":"2026-10-14","category":"improvement","availability":"candidate","audiences":["Humans","AI agents","Administrators"],"areas":["Home","Public guidance"],"contracts":[],"profiles":[{"id":"orivelaiq-public-authoring","version":"1.2.0"}],"summary":"OrivelaIQ Home heißt innerhalb von OIQ Home: Deine Homes / Dein Home. Die optionale, pro Konto freigeschaltete Markdown-Source bleibt neben GitHub verfügbar. Geschriebenes Home-Markdown kann in Dynamic lesbar sein; ein bestehender fester Stable-Pin bleibt bis zur ausdrücklichen Ersetzung unverändert. Ohne Stable-Pin kann Dynamic Standard sein. Technische Verträge, Identitäten, Berechtigungen und bestehende Verbindungen bleiben erhalten. Diese Benennung ist ein Kandidat; OIQ, M.Git und Connector-Präsentation werden unabhängig veröffentlicht.","actionRequired":false,"action":null,"breaking":false},{"id":"oiq-049-home-naming-en","language":"en","date":"2026-10-14","category":"improvement","availability":"candidate","audiences":["Humans","AI agents","Administrators"],"areas":["Home","Public guidance"],"contracts":[],"profiles":[{"id":"orivelaiq-public-authoring","version":"1.2.0"}],"summary":"OrivelaIQ Home is called Home inside OIQ: Your Homes / Your Home. This optional, per-account enabled Markdown source remains an alternative to independent GitHub. Written Home Markdown may be readable in Dynamic; an existing fixed Stable pin stays unchanged until deliberately replaced. Without a Stable pin, Dynamic may be the default. Technical contracts, identities, permissions and existing connections are unchanged. This naming is a candidate; OIQ, M.Git and connector presentation are published independently.","actionRequired":false,"action":null,"breaking":false},{"id":"oiq-048-collaborative-authoring","language":"de","date":"2026-10-17","category":"feature","availability":"integrated","audiences":["Home Owners","Repository collaborators","AI agents","Administrators"],"areas":["Home","Repository participants","Markdown authoring","Public guidance"],"contracts":[],"profiles":[{"id":"orivelaiq-public-authoring","version":"1.3.0"}],"actionRequired":false,"action":null,"breaking":false,"summary":"Ein Owner kann einem bestehenden aktiven, für Home freigeschalteten Human nach genauer Empfängerprüfung Bearbeiter-Zugriff auf ein Repository erteilen und widerrufen. Der Bearbeiter liest und schreibt Markdown mit seiner eigenen Home-Verbindung. OIQ kann Dynamic über seine unabhängige Indexer-Berechtigung automatisch aktualisieren; ein bestehender Stable-Pin bleibt unverändert. Die Repository-Berechtigung erzeugt keine OIQ-Workspace-, Source-/Index- oder Verwaltungsrechte. Widerruf sperrt die nächste geschützte Operation; ein bereits abschließend zugelassener Push kann noch abschließen. Das zusätzliche Kollaborationsprofil oiq-048/1 bewahrt oiq-045/1, bestehende Owner-/MCP-Clients und OAuth-Verbindungen ohne erzwungene Neuanmeldung. Profile 1.3.0 ergänzt kompatible Human-/Agent-Anleitung; bestehende Authoring-Vertragsversionen bleiben erhalten. Die Verfügbarkeit erfordert den passenden Home-Dienst."},{"id":"oiq-048-collaborative-authoring-en","language":"en","date":"2026-10-17","category":"feature","availability":"integrated","audiences":["Home Owners","Repository collaborators","AI agents","Administrators"],"areas":["Home","Repository participants","Markdown authoring","Public guidance"],"contracts":[],"profiles":[{"id":"orivelaiq-public-authoring","version":"1.3.0"}],"actionRequired":false,"action":null,"breaking":false,"summary":"An Owner can grant and revoke repository-scoped Collaborator access for an existing active, Home-enabled Human after exact recipient verification. The collaborator reads and writes Markdown through their own Home connection. OIQ can update Dynamic automatically through its independent Indexer grant; an existing Stable pin stays fixed. Repository access creates no OIQ Workspace, Source/Index or administration rights. Revocation denies the next protected operation; a push already admitted at final authorization may finish. The additive collaborator profile oiq-048/1 preserves oiq-045/1, existing Owner/MCP clients and OAuth connections without forced reconnection. Profile 1.3.0 adds compatible Human/Agent guidance while existing authoring contract versions remain unchanged. Availability requires the matching Home service."}],"language":"de"},"historical":[{"id":"v0.1.0-internal","productVersion":"v0.1.0-internal","publicationState":"published","date":"2026-07-09","summary":"Erster geschützter interner Knowledge Viewer mit Workspace-/Nutzerverwaltung, GitHub Sources, verschlüsselten Credentials, serverseitiger Indexierung und sicherer Markdown-/SVG-/HTML-Ausgabe.","releaseNotesPath":"docs/release/v0.1.0-internal-release-notes.md","language":"de"}],"language":"de","changes":[{"id":"release-2-knowledge","date":"2026-10-07","category":"improvement","availability":"integrated","audiences":["Readers","Authors"],"areas":["Knowledge","Grounding","Workspace projections"],"contracts":[{"id":"artifact-navigation","version":"1"}],"summary":"Knowledge bietet eine ruhigere responsive Leseoberfläche, sichere Markdown-/SVG-/HTML-Ausgabe, direkte Grounding-Beziehungen und getrennte Stable-/Dynamic-Lesestände. Sichtbarer Work-Kontext erweitert keine Source-Rechte.","actionRequired":false,"action":null,"breaking":false,"language":"de","profiles":[]},{"id":"release-2-work","date":"2026-10-07","category":"feature","availability":"integrated","audiences":["Work participants","Authors","AI agents"],"areas":["Work","Repository import","Topic Overflight"],"contracts":[{"id":"work-repository","version":"0.1"}],"summary":"Gemeinsame Work Topics enthalten Items und typisierte Einträge. Browser und MCP verwenden dieselben fachlichen Regeln. Repository-Definitionen werden ausdrücklich über PLAN, Vorschau und APPLY eingelesen; Topic Overflight führt in zugewiesenes Knowledge.","actionRequired":false,"action":null,"breaking":false,"language":"de","profiles":[]},{"id":"release-2-feedback","date":"2026-10-07","category":"feature","availability":"integrated","audiences":["Readers","Reviewers","AI agents"],"areas":["Feedback","Review Exchange","Markdown input material"],"contracts":[{"id":"review-exchange","version":"1.0.0"}],"summary":"Feedback an Seiten und Abschnitten erhält nachvollziehbare externe Antworten über Review Exchange. Optionales Markdown-Eingabematerial erläutert Feedback und neue Work-Einträge und wird dadurch kein veröffentlichtes Knowledge.","actionRequired":false,"action":null,"breaking":false,"language":"de","profiles":[]},{"id":"release-2-authentication","date":"2026-10-07","category":"breaking","availability":"integrated","audiences":["Humans","Administrators","AI connection owners"],"areas":["Sign-in","Personal AI connections","Administration"],"contracts":[],"summary":"Humans melden sich mit einem E-Mail-Einmalcode an. Bestehende Rollen und Ressourcenrechte bleiben maßgeblich. Persönliche AI-Verbindungen sind unabhängig widerrufbar; die Administration ist Workspace-zentriert.","actionRequired":true,"action":"Zum Anmelden den Einmalcode an der registrierten E-Mail-Adresse abrufen; ein bisheriges Passwort kann nicht mehr verwendet werden.","breaking":true,"language":"de","profiles":[]},{"id":"oiq-039-canonical-change-removal","date":"2026-10-07","category":"removal","availability":"integrated","audiences":["Administrators","Reviewers","Source owners","Integrators"],"areas":["CanonicalChange","Review","Source writes"],"contracts":[],"summary":"CanonicalChange mit eigener Ausführung, Repository-Mutation und Recovery wurde entfernt. Änderungsentscheidungen verwenden weiterhin den generischen Review-Pfad: extern umsetzen, Änderungsnachweis dokumentieren, Verification durchführen. Eine Decision löst keinen Source-Schreibzugriff aus.","actionRequired":true,"action":"Eigene Automatisierungen für CanonicalChange nicht weiter verwenden. Änderungen durch den zuständigen Source-Prozess umsetzen und im generischen Review mit Änderungsnachweis bestätigen.","breaking":true,"language":"de","profiles":[]},{"id":"oiq-040-public-guidance","date":"2026-10-07","category":"feature","availability":"integrated","audiences":["Authors","Readers","Administrators","AI agents"],"areas":["Public guidance","Authoring profiles","Release communication"],"contracts":[{"id":"work-repository","version":"0.1"},{"id":"review-exchange","version":"1.0.0"},{"id":"artifact-navigation","version":"1"}],"summary":"Öffentliche Anleitungen, Agent Bootstrap und vollständiger Offline-Transfer erklären die aktuellen Regeln. Nach Anmeldung verfeinern ein sicheres Workspace-Profil und ein getrenntes Admin-Profil den Kontext. Releases und Änderungen erklären Auswirkungen für Humans und Agents.","actionRequired":false,"action":null,"breaking":false,"profiles":[{"id":"orivelaiq-public-authoring","version":"1.2.0"}],"language":"de"},{"id":"oiq-040-mcp-discovery-authority","date":"2026-10-07","category":"compatibility","availability":"integrated","audiences":["AI agents","AI connection owners","Integrators"],"areas":["MCP discovery","OAuth","Work authorization"],"contracts":[],"summary":"Alle verbundenen Humans sehen die vom Server unterstützten Tools mit korrekten Effekthinweisen. Auch ein bisher enger OAuth-Grant kann Schreibtools anzeigen. Jeder Aufruf wird gegen die aktuellen Human-, Workspace-, Topic- und Ressourcenrechte geprüft; die Tool-Liste erteilt keine Rechte.","actionRequired":true,"action":"Clients mit ausschließlich lesender Nutzung sollen Schreibaufrufe durch ihre eigene Tool-Policy unterlassen oder bestätigen lassen. Neue Verbindungen verwenden mcp:access; gültige Legacy-Grants bleiben kompatibel. Bestehende Domain-Rechte gelten bei jedem Aufruf, unabhängig vom OAuth-Scope.","breaking":true,"language":"de","profiles":[]},{"id":"oiq-049-home-naming","language":"de","date":"2026-10-14","category":"improvement","availability":"candidate","audiences":["Humans","AI agents","Administrators"],"areas":["Home","Public guidance"],"contracts":[],"profiles":[{"id":"orivelaiq-public-authoring","version":"1.2.0"}],"summary":"OrivelaIQ Home heißt innerhalb von OIQ Home: Deine Homes / Dein Home. Die optionale, pro Konto freigeschaltete Markdown-Source bleibt neben GitHub verfügbar. Geschriebenes Home-Markdown kann in Dynamic lesbar sein; ein bestehender fester Stable-Pin bleibt bis zur ausdrücklichen Ersetzung unverändert. Ohne Stable-Pin kann Dynamic Standard sein. Technische Verträge, Identitäten, Berechtigungen und bestehende Verbindungen bleiben erhalten. Diese Benennung ist ein Kandidat; OIQ, M.Git und Connector-Präsentation werden unabhängig veröffentlicht.","actionRequired":false,"action":null,"breaking":false},{"id":"oiq-049-home-naming-en","language":"en","date":"2026-10-14","category":"improvement","availability":"candidate","audiences":["Humans","AI agents","Administrators"],"areas":["Home","Public guidance"],"contracts":[],"profiles":[{"id":"orivelaiq-public-authoring","version":"1.2.0"}],"summary":"OrivelaIQ Home is called Home inside OIQ: Your Homes / Your Home. This optional, per-account enabled Markdown source remains an alternative to independent GitHub. Written Home Markdown may be readable in Dynamic; an existing fixed Stable pin stays unchanged until deliberately replaced. Without a Stable pin, Dynamic may be the default. Technical contracts, identities, permissions and existing connections are unchanged. This naming is a candidate; OIQ, M.Git and connector presentation are published independently.","actionRequired":false,"action":null,"breaking":false},{"id":"oiq-048-collaborative-authoring","language":"de","date":"2026-10-17","category":"feature","availability":"integrated","audiences":["Home Owners","Repository collaborators","AI agents","Administrators"],"areas":["Home","Repository participants","Markdown authoring","Public guidance"],"contracts":[],"profiles":[{"id":"orivelaiq-public-authoring","version":"1.3.0"}],"actionRequired":false,"action":null,"breaking":false,"summary":"Ein Owner kann einem bestehenden aktiven, für Home freigeschalteten Human nach genauer Empfängerprüfung Bearbeiter-Zugriff auf ein Repository erteilen und widerrufen. Der Bearbeiter liest und schreibt Markdown mit seiner eigenen Home-Verbindung. OIQ kann Dynamic über seine unabhängige Indexer-Berechtigung automatisch aktualisieren; ein bestehender Stable-Pin bleibt unverändert. Die Repository-Berechtigung erzeugt keine OIQ-Workspace-, Source-/Index- oder Verwaltungsrechte. Widerruf sperrt die nächste geschützte Operation; ein bereits abschließend zugelassener Push kann noch abschließen. Das zusätzliche Kollaborationsprofil oiq-048/1 bewahrt oiq-045/1, bestehende Owner-/MCP-Clients und OAuth-Verbindungen ohne erzwungene Neuanmeldung. Profile 1.3.0 ergänzt kompatible Human-/Agent-Anleitung; bestehende Authoring-Vertragsversionen bleiben erhalten. Die Verfügbarkeit erfordert den passenden Home-Dienst."},{"id":"oiq-048-collaborative-authoring-en","language":"en","date":"2026-10-17","category":"feature","availability":"integrated","audiences":["Home Owners","Repository collaborators","AI agents","Administrators"],"areas":["Home","Repository participants","Markdown authoring","Public guidance"],"contracts":[],"profiles":[{"id":"orivelaiq-public-authoring","version":"1.3.0"}],"actionRequired":false,"action":null,"breaking":false,"summary":"An Owner can grant and revoke repository-scoped Collaborator access for an existing active, Home-enabled Human after exact recipient verification. The collaborator reads and writes Markdown through their own Home connection. OIQ can update Dynamic automatically through its independent Indexer grant; an existing Stable pin stays fixed. Repository access creates no OIQ Workspace, Source/Index or administration rights. Revocation denies the next protected operation; a push already admitted at final authorization may finish. The additive collaborator profile oiq-048/1 preserves oiq-045/1, existing Owner/MCP clients and OAuth connections without forced reconnection. Profile 1.3.0 adds compatible Human/Agent guidance while existing authoring contract versions remain unchanged. Availability requires the matching Home service."}],"source":{"canonicalPath":"docs/release/release-records.json","digest":"sha256:c3ffbec541186f71e02088b153dbf98c2e429bfb3f0aee709f9d12684ea5f678"}},"digestMethod":"sha256 over UTF-8 canonical JSON of the complete payload before adding digest; object keys lexically sorted, array order retained","offlineUse":"Give the Full Public Transfer JSON to an agent without Web/MCP access. It includes profile/contract identities, all canonical contract files and schema dependencies, complete examples, rules, limitations, generation time and release changes. Parse schema content from contracts[].files and resolve relative schema references against the included path/$id; the included schemas require no network lookup. Replace illustrative External Response values with exact authorized export context before any separately authorized Git write. This snapshot grants no access and cannot assert current Workspace capability.","digest":"sha256:12f0e53fbd97082ea7721bf20f097673831d08fa7354471940905a9a04ed97a6"}