From b423afd7a9edcc73b5cbc5e8d5195553043b5f93 Mon Sep 17 00:00:00 2001 From: Edwin Amirian Date: Thu, 13 Aug 2026 10:31:09 -0700 Subject: [PATCH 1/4] release: prepare ACE 0.8.1 product experience --- .github/workflows/publish.yml | 2 +- CHANGELOG.md | 16 ++++- Dockerfile | 2 +- README.md | 23 +++++++- ROADMAP.md | 23 ++++---- ace/__init__.py | 2 +- ace_mcp_client/__init__.py | 2 +- core/engine/version.py | 2 +- docs/capability-maturity.md | 8 +-- docs/evidence/README.md | 1 + ...lligence-os-v0.8.1-release-candidate-v1.md | 58 +++++++++++++++++++ docs/faq.md | 4 +- extensions/reference/extension.py | 2 +- infra/docker-compose.yml | 10 ++-- pyproject.toml | 2 +- tests/test_package_identity.py | 10 ++-- tests/test_public_roadmap_positioning.py | 6 +- uv.lock | 2 +- 18 files changed, 133 insertions(+), 42 deletions(-) create mode 100644 docs/evidence/intelligence-os-v0.8.1-release-candidate-v1.md diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f9b0ea9..7c1daee 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -8,7 +8,7 @@ on: tag: description: Git tag to publish required: true - default: v0.8.0 + default: v0.8.1 permissions: contents: read diff --git a/CHANGELOG.md b/CHANGELOG.md index 70769fb..3639900 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,9 @@ Notable user- and contributor-visible changes are recorded here. -## Unreleased +## 0.8.1 -### Atrium live onboarding binding +### Intelligence Builder product experience - Project declarative, non-authorizing onboarding profiles and every append-only Intelligence Builder session revision through the existing authenticated resource plane. The projection adds @@ -15,6 +15,18 @@ Notable user- and contributor-visible changes are recorded here. when the exact session reaches `first_briefing_ready`. - Add the paired World AI Command Center acceptance journey over four real builder agent roles and two already-admitted recorded official-source lineages. +- Make Atrium the Intelligence OS command center with Intelligence, Opportunities, Agents, + Connections, and Strategy as first-class destinations while keeping downstream Work outside the + product center. +- Define Opportunities as evidence-backed decision openings across Cases, material Shifts, and + early Signals rather than as leads or tasks. +- Establish the ACE design system with cognitive blue as the primary identity, cyan reserved for + live intelligence, violet for agent/memory composition, and green for verified outcomes. +- Add a local-only immutable resource replay for the World AI Command Center demo without adding a + second persistence, authority, or domain state path. + +The patch preserves schema head v177, exactly eleven public MCP tools, the Core 0.8 compatibility +line, and the existing reference action adapter 0.4.0 boundary. ## 0.8.0 diff --git a/Dockerfile b/Dockerfile index a4b496a..247dd12 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ FROM python:3.12-slim -ARG ACE_VERSION=0.8.0 +ARG ACE_VERSION=0.8.1 LABEL org.opencontainers.image.title="ace-core" \ org.opencontainers.image.version="${ACE_VERSION}" \ org.opencontainers.image.source="https://github.com/augmented-cognition-engine/core" diff --git a/README.md b/README.md index 6226ad3..b78860a 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ monitors, and an intelligence system that improves with governed feedback. ACE i provenance, authority, durable state, and exact receipts stay built into the result instead of becoming infrastructure every product team must recreate. -![version 0.8.0](https://img.shields.io/badge/version-0.8.0-blue) +![version 0.8.1](https://img.shields.io/badge/version-0.8.1-blue) ![Python 3.12](https://img.shields.io/badge/python-3.12-blue) ![License Apache-2.0](https://img.shields.io/badge/license-Apache--2.0-green) ![status: developer preview](https://img.shields.io/badge/status-developer%20preview-orange) @@ -386,7 +386,24 @@ transforms only), `ace.intelligence.personas/v1alpha1` (personas plus signal-rou --- -## What 0.8.0 adds +## What 0.8.1 adds + +0.8.1 turns the Intelligence OS foundation into a clearer first-run product experience without +changing the 0.8 public architecture or widening authority. + +- **Live onboarding state.** Atrium projects the exact append-only Intelligence Builder session + and shows proposal, working, blocked, retrying, and complete states from durable records. +- **A decision-oriented command center.** Intelligence, Opportunities, Agents, Connections, and + Strategy are first-class destinations. An Opportunity is intelligence awaiting a decision: a + Case, material Shift, or early Signal with evidence and a next decision window. +- **An ACE-owned visual identity.** Cognitive blue leads the shared product, cyan marks live + intelligence, violet is reserved for agent and memory composition, and green means verified + success. Customer branding remains a replaceable deployment overlay. +- **A reproducible World AI demonstration.** The paired World release supplies the guided + Connect → Map → Watch → Brief journey and an immutable local replay through the same governed + resource plane. + +### What 0.8.0 added 0.8.0 makes the **Intelligence Operating System** the coherent product experience rather than an architecture users have to assemble themselves. @@ -824,7 +841,7 @@ stay host-free, and host adapters are the only `core.engine` edge into the publi ## Maturity and limitations -**0.8.0 is a published developer-preview release.** Its Intelligence OS claim is bounded to +**0.8.1 is a published developer-preview release.** Its Intelligence OS claim is bounded to the provider-free and installed-artifact journeys recorded in the evidence archive and the single-node topology below. Read this section before you build on it. diff --git a/ROADMAP.md b/ROADMAP.md index 53e072c..4b3a233 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -77,7 +77,7 @@ Roadmap outcome states are used strictly: ## Current release checkpoint -The latest published release is `ace-core` 0.8.0 on PyPI and GitHub. +The latest published release is `ace-core` 0.8.1 on PyPI and GitHub. The 0.8 release makes the existing Builder, composition, memory, authority, action, and outcome capabilities coherent as one **Intelligence Operating System**. One governed point-in-time resource @@ -88,23 +88,26 @@ thin MCP surface remains exactly eleven tools. The exact pre-publication source, proof, verification, and limitations are bound by the [Intelligence OS release closeout](docs/evidence/intelligence-os-v0.8.0-release-closeout-v1.md). -The [0.8.0 GitHub Release](https://github.com/augmented-cognition-engine/core/releases/tag/v0.8.0) -and public [`ace-core==0.8.0`](https://pypi.org/project/ace-core/0.8.0/) package are the current -developer-preview release line. Atrium is a repository-delivered optional workspace rather than a -second state or authority path. +The [0.8.1 GitHub Release](https://github.com/augmented-cognition-engine/core/releases/tag/v0.8.1) +and public [`ace-core==0.8.1`](https://pypi.org/project/ace-core/0.8.1/) package are the current +developer-preview release line. The patch binds live onboarding state into Atrium, defines +Opportunities as evidence-backed decision openings, establishes the ACE design system, and adds a +reproducible World AI resource replay. Atrium remains a repository-delivered optional workspace +rather than a second state or authority path. -### Passed hardening — Atrium live onboarding binding +### Passed hardening — Atrium live onboarding and product experience -The post-0.8 candidate closes one experience gap without creating a new product layer. Core now +The 0.8.1 patch closes one experience gap without creating a new product layer. Core now projects one inert onboarding profile plus the exact append-only Intelligence Builder session history through the same authenticated resource plane Atrium already consumes. Atrium renders proposal, working, blocked, retrying, and complete states from those durable records and opens the first Brief only after `first_briefing_ready`. World AI supplies the paired domain profile and a four-agent `Connect -> Map -> Watch -> Brief` acceptance journey over admitted official-source evidence. Core PR #145 and World PR #24 landed after repository, installed-artifact, browser, -naked-kernel, and package checks passed. The follow-on demo-polish packet adds a local-only replay -of an immutable domain resource page and replaces internal persistence language with user-facing -setup status. It does not change the 0.9 Collaborative Intelligence promise. +naked-kernel, and package checks passed. Follow-on work adds a local-only replay of an immutable +domain resource page, replaces internal persistence language with user-facing setup status, +defines the Opportunity experience, and introduces the ACE-owned design system. It does not +change the 0.9 Collaborative Intelligence promise. The prior [0.7.0 GitHub Release](https://github.com/augmented-cognition-engine/core/releases/tag/v0.7.0) and [`ace-core==0.7.0`](https://pypi.org/project/ace-core/0.7.0/) package remain the passed diff --git a/ace/__init__.py b/ace/__init__.py index cb672a8..96f4a58 100644 --- a/ace/__init__.py +++ b/ace/__init__.py @@ -1,3 +1,3 @@ """Public Python package identity for ACE.""" -__version__ = "0.8.0" +__version__ = "0.8.1" diff --git a/ace_mcp_client/__init__.py b/ace_mcp_client/__init__.py index 6b085ae..b0c07a0 100644 --- a/ace_mcp_client/__init__.py +++ b/ace_mcp_client/__init__.py @@ -1,4 +1,4 @@ # ace_mcp_client — standalone MCP thin client for ACE # Zero engine imports. Pure HTTP calls to the ACE API. -__version__ = "0.8.0" +__version__ = "0.8.1" diff --git a/core/engine/version.py b/core/engine/version.py index c0571e8..2d148bd 100644 --- a/core/engine/version.py +++ b/core/engine/version.py @@ -1,3 +1,3 @@ """Single source of truth for the ACE distribution version.""" -VERSION = "0.8.0" +VERSION = "0.8.1" diff --git a/docs/capability-maturity.md b/docs/capability-maturity.md index dcf5c7c..40da5cf 100644 --- a/docs/capability-maturity.md +++ b/docs/capability-maturity.md @@ -1,6 +1,6 @@ -# ACE 0.8.0 capability maturity +# ACE 0.8.1 capability maturity -ACE 0.8.0 is a developer preview. This page distinguishes the public contract from implemented +ACE 0.8.1 is a developer preview. This page distinguishes the public contract from implemented surfaces that remain experimental. ## Preview contract @@ -12,13 +12,13 @@ install ace-core → configure SurrealDB and an optional provider → start ACE → connect → map → watch → receive a cited brief → activate → inspect resources → stop cleanly ``` -The 0.8.0 public identities are: +The 0.8.1 public identities are: - Python distribution: `ace-core` - Python import: `ace` - CLI command: `ace` - thin MCP command: `ace-mcp-client` -- version: `0.8.0` +- version: `0.8.1` The thin MCP surface contains exactly eleven tools: diff --git a/docs/evidence/README.md b/docs/evidence/README.md index 2f98723..cd012ad 100644 --- a/docs/evidence/README.md +++ b/docs/evidence/README.md @@ -28,6 +28,7 @@ superseded by later work and is kept for audit trail only. - [ace-core 0.6.0 Measured Intelligence release closeout](measured-intelligence-v0.6.0-release-closeout-v1.md) — public, passed - [ace-core 0.7.0 Intelligence Builder Foundation release closeout](intelligence-builder-foundation-v0.7.0-release-closeout-v1.md) — public, passed - [ace-core 0.8.0 Intelligence OS release closeout](intelligence-os-v0.8.0-release-closeout-v1.md) +- [ace-core 0.8.1 Intelligence Builder product-experience release candidate](intelligence-os-v0.8.1-release-candidate-v1.md) — public, passed; exact tag, trusted publication, hashes, and checkout-free install - [ace-core 0.8.0 Intelligence OS release candidate](intelligence-os-v0.8.0-release-candidate-v1.md) — historical pre-publication candidate; cumulative Core, Atrium, World, Market, and package gate diff --git a/docs/evidence/intelligence-os-v0.8.1-release-candidate-v1.md b/docs/evidence/intelligence-os-v0.8.1-release-candidate-v1.md new file mode 100644 index 0000000..4373f9b --- /dev/null +++ b/docs/evidence/intelligence-os-v0.8.1-release-candidate-v1.md @@ -0,0 +1,58 @@ +# ACE 0.8.1 Intelligence Builder product-experience release candidate + +Status: **candidate — publication and public-index reproduction pending** + +## Promise + +ACE 0.8.1 makes the released Intelligence Operating System easier to experience without changing +its architecture or granting new authority. A user can enter Atrium, see durable onboarding +progress, understand which intelligence needs a decision, inspect the exact underlying resources, +and reproduce the paired World AI Command Center demonstration. + +## Candidate coordinates + +- base release: `ace-core==0.8.0` at tag `v0.8.0`; +- release branch: `codex/v0.8.1-product-experience-closeout`; +- candidate distribution: `ace-core==0.8.1`; +- paired domain candidate: `ace-domain-world-intelligence==0.11.0`; +- schema head: v177; +- public MCP surface: exactly eleven tools; +- reference action adapter: unchanged distribution 0.4.0 with `ace-core>=0.8.0,<0.9`. + +## Included product changes + +1. Atrium projects an inert onboarding profile and the exact append-only Builder session history + through the existing authenticated Intelligence resource plane. +2. Atrium renders proposed, working, blocked, retrying, and complete states from durable records + and opens the first Brief only after `first_briefing_ready`. +3. Intelligence, Opportunities, Agents, Connections, and Strategy are first-class product + destinations; Work remains downstream. +4. Opportunities are evidence-backed decision openings represented by Cases, material Shifts, and + early Signals. They are not sales leads, tasks, or autonomous recommendations. +5. ACE uses its own blue-led design system. Customer identity remains a replaceable deployment + overlay rather than the Core or public-domain identity. +6. A local-only immutable resource replay supports the paired World AI Command Center demo without + becoming a new durable store or authority path. + +## Required acceptance before publication + +- Core lint, fast tests, naked-kernel, Canvas, security, and Docker gates pass at the exact + candidate head. +- Package identity, roadmap, evidence-index, and build-backend gates pass. +- The Core wheel builds reproducibly, passes strict Twine validation, installs outside the + checkout, reports version 0.8.1, and preserves the 24-kind resource plane and eleven-tool MCP + boundary. +- The paired World 0.11.0 wheel installs with public Core 0.8.1 and reproduces + Connect → Map → Watch → Brief plus the Atrium AI Command Center resource page. +- Browser acceptance covers desktop and mobile command-center states without horizontal overflow + or uncaught console errors. + +## Boundaries + +This patch does not claim collaborative multi-tenancy, hostile-code isolation, distributed +operation, autonomous source authorization, arbitrary web access, autonomous publication, +general real-world causal accuracy, or general beneficial impact. Domain Packs remain inert; +source and effect access remain separately reviewed and authorized. + +After publication, a separate immutable closeout will bind the tagged commit, trusted workflow, +artifact hashes, public-index reproduction, paired World release, and any observed limitations. diff --git a/docs/faq.md b/docs/faq.md index 6d441a3..0f2a16a 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -4,7 +4,7 @@ This FAQ answers the operational questions that tend to appear after the archite what happens when part of a committee fails, how conflicting claims are handled, what confidence means, and how multiple products share SurrealDB without becoming one undifferentiated memory. -ACE 0.8.0 is a developer preview. Answers below distinguish the supported Intelligence OS contract +ACE 0.8.1 is a developer preview. Answers below distinguish the supported Intelligence OS contract from broader engine capabilities whose APIs and end-to-end journeys remain experimental. See [capability maturity](capability-maturity.md) for the authoritative boundary and [architecture](architecture.md) for the as-built system map. @@ -369,7 +369,7 @@ end-to-end operating journeys remain experimental in 0.8. ### What is the stable public contract today? -ACE 0.8.0 is a developer-preview contract: the self-hosted CLI, exactly eleven thin MCP tools, +ACE 0.8.1 is a developer-preview contract: the self-hosted CLI, exactly eleven thin MCP tools, documented provider routes, schema migrations, public Core/Intelligence/Application packages, inert Domain Pack boundary, and authorized Intelligence resource plane. Atrium is a supported, optional repository-delivered preview over that same plane; it is not included in the Python diff --git a/extensions/reference/extension.py b/extensions/reference/extension.py index 38f8796..75c3f8b 100644 --- a/extensions/reference/extension.py +++ b/extensions/reference/extension.py @@ -56,7 +56,7 @@ class ProductExtension: """The open `product` extension — copy this file to start your own.""" name = "product" - version = "0.8.0" + version = "0.8.1" def register(self, reg: "Registry") -> None: # This must remain the first operation. A current reference extension diff --git a/infra/docker-compose.yml b/infra/docker-compose.yml index cf13ea9..7331603 100644 --- a/infra/docker-compose.yml +++ b/infra/docker-compose.yml @@ -40,7 +40,7 @@ services: context: .. dockerfile: Dockerfile args: - ACE_VERSION: "0.8.0" + ACE_VERSION: "0.8.1" depends_on: surrealdb: condition: service_healthy @@ -61,9 +61,9 @@ services: context: .. dockerfile: Dockerfile args: - ACE_VERSION: "0.8.0" + ACE_VERSION: "0.8.1" labels: - org.opencontainers.image.version: "0.8.0" + org.opencontainers.image.version: "0.8.1" depends_on: surrealdb: condition: service_healthy @@ -98,9 +98,9 @@ services: context: .. dockerfile: Dockerfile args: - ACE_VERSION: "0.8.0" + ACE_VERSION: "0.8.1" labels: - org.opencontainers.image.version: "0.8.0" + org.opencontainers.image.version: "0.8.1" depends_on: surrealdb: condition: service_healthy diff --git a/pyproject.toml b/pyproject.toml index c480d31..3ac027d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ace-core" -version = "0.8.0" +version = "0.8.1" description = "Open Intelligence Operating System with a guided Intelligence Builder" readme = "README.md" license = "Apache-2.0" diff --git a/tests/test_package_identity.py b/tests/test_package_identity.py index 0afbd7c..374250a 100644 --- a/tests/test_package_identity.py +++ b/tests/test_package_identity.py @@ -20,7 +20,7 @@ def test_distribution_import_cli_and_version_identities() -> None: project = tomllib.loads((ROOT / "pyproject.toml").read_text(encoding="utf-8"))["project"] assert project["name"] == "ace-core" - assert project["version"] == ace.__version__ == ace_mcp_client.__version__ == VERSION == "0.8.0" + assert project["version"] == ace.__version__ == ace_mcp_client.__version__ == VERSION == "0.8.1" assert ProductExtension.version == project["version"] assert project["scripts"]["ace"] == "core.engine.cli.main:cli" assert "aiohttp>=3.14.3" in project["dependencies"] @@ -43,7 +43,7 @@ def test_package_copy_and_public_links_are_release_ready() -> None: def test_release_workflow_defaults_to_and_guards_current_version() -> None: workflow = (ROOT / ".github" / "workflows" / "publish.yml").read_text(encoding="utf-8") - assert "default: v0.8.0" in workflow + assert "default: v0.8.1" in workflow assert "Validate release tag matches package version" in workflow assert 'if [ "$RELEASE_TAG" != "v$package_version" ]' in workflow assert "ace-core-python-distributions" in workflow @@ -58,13 +58,13 @@ def test_release_workflow_defaults_to_and_guards_current_version() -> None: def test_docker_image_includes_public_cli_package() -> None: dockerfile = (ROOT / "Dockerfile").read_text(encoding="utf-8") assert "COPY ace/ ace/" in dockerfile - assert "ARG ACE_VERSION=0.8.0" in dockerfile + assert "ARG ACE_VERSION=0.8.1" in dockerfile assert 'org.opencontainers.image.version="${ACE_VERSION}"' in dockerfile assert "uv sync --frozen --no-dev --no-editable --no-cache" in dockerfile compose = (ROOT / "infra" / "docker-compose.yml").read_text(encoding="utf-8") - assert compose.count('ACE_VERSION: "0.8.0"') == 3 - assert compose.count('org.opencontainers.image.version: "0.8.0"') == 2 + assert compose.count('ACE_VERSION: "0.8.1"') == 3 + assert compose.count('org.opencontainers.image.version: "0.8.1"') == 2 def test_lock_tracks_the_distribution_identity() -> None: diff --git a/tests/test_public_roadmap_positioning.py b/tests/test_public_roadmap_positioning.py index d947ed2..ddb45c0 100644 --- a/tests/test_public_roadmap_positioning.py +++ b/tests/test_public_roadmap_positioning.py @@ -5,13 +5,13 @@ ROADMAP = (Path(__file__).resolve().parents[1] / "ROADMAP.md").read_text(encoding="utf-8") ROADMAP_ONE_LINE = " ".join(ROADMAP.split()) -# The current-release assertions are the coordinated 0.8 closeout gate. Historical 0.4.1 GI2, +# The current-release assertions are the coordinated 0.8.1 patch closeout gate. Historical 0.4.1 GI2, # 0.4.2 builder-surface, 0.4.4 GC1, 0.5.0 T1/B1, and P1/P2 identities remain exact point-in-time # evidence. Keep these aligned with test_evidence_index_integrity.py. def test_current_release_and_passed_milestone_are_not_conflated() -> None: - assert "latest published release is `ace-core` 0.8.0 on PyPI and GitHub" in ROADMAP + assert "latest published release is `ace-core` 0.8.1 on PyPI and GitHub" in ROADMAP assert ROADMAP.count("| 0.4.x | Governed Cognition | **Passed** |") == 1 assert "| 0.4.0 | Governed Cognition | **Delivered** |" not in ROADMAP assert "| 0.4.0 | Governed Cognition | **Now** |" not in ROADMAP @@ -19,7 +19,7 @@ def test_current_release_and_passed_milestone_are_not_conflated() -> None: assert "| 0.6.0 | Measured Intelligence | **Passed** |" in ROADMAP assert "| 0.7.0 | Intelligence Builder Foundation | **Passed** |" in ROADMAP readme = (Path(__file__).resolve().parents[1] / "README.md").read_text(encoding="utf-8") - assert "0.8.0 is a published developer-preview release" in " ".join(readme.split()) + assert "0.8.1 is a published developer-preview release" in " ".join(readme.split()) assert "| 0.8.0 | Intelligence OS Realignment | **Passed** |" in ROADMAP assert "| 0.9.0 | Collaborative Intelligence | **Now** |" in ROADMAP assert "| 1.0.0 | Intelligence Operating System | **Later** |" in ROADMAP diff --git a/uv.lock b/uv.lock index 1b9280e..a3c39b0 100644 --- a/uv.lock +++ b/uv.lock @@ -4,7 +4,7 @@ requires-python = "==3.12.*" [[package]] name = "ace-core" -version = "0.8.0" +version = "0.8.1" source = { editable = "." } dependencies = [ { name = "aiohttp" }, From 641631a9b41491d04d0df598a9f87fb992268299 Mon Sep 17 00:00:00 2001 From: Edwin Amirian Date: Thu, 13 Aug 2026 10:44:09 -0700 Subject: [PATCH 2/4] fix: keep Brief details warning-free --- CHANGELOG.md | 2 ++ .../src/design/shadcn/ui/sheet.test.tsx | 28 +++++++++++++++++ core/ui/canvas/src/design/shadcn/ui/sheet.tsx | 31 ++++++++++--------- ...lligence-os-v0.8.1-release-candidate-v1.md | 2 ++ 4 files changed, 48 insertions(+), 15 deletions(-) create mode 100644 core/ui/canvas/src/design/shadcn/ui/sheet.test.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 3639900..16de2cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,8 @@ Notable user- and contributor-visible changes are recorded here. live intelligence, violet for agent/memory composition, and green for verified outcomes. - Add a local-only immutable resource replay for the World AI Command Center demo without adding a second persistence, authority, or domain state path. +- Forward the shared resource-detail sheet overlay ref through its Radix boundary so opening cited + Brief details remains free of React runtime warnings on desktop and mobile. The patch preserves schema head v177, exactly eleven public MCP tools, the Core 0.8 compatibility line, and the existing reference action adapter 0.4.0 boundary. diff --git a/core/ui/canvas/src/design/shadcn/ui/sheet.test.tsx b/core/ui/canvas/src/design/shadcn/ui/sheet.test.tsx new file mode 100644 index 0000000..0237a11 --- /dev/null +++ b/core/ui/canvas/src/design/shadcn/ui/sheet.test.tsx @@ -0,0 +1,28 @@ +import { render } from '@testing-library/react' +import { afterEach, describe, expect, test, vi } from 'vitest' + +import { Sheet, SheetContent, SheetDescription, SheetTitle } from './sheet' + +describe('Sheet', () => { + afterEach(() => { + vi.restoreAllMocks() + }) + + test('forwards the overlay ref required by the dialog portal', () => { + const consoleError = vi.spyOn(console, 'error').mockImplementation(() => undefined) + + render( + + + Evidence detail + Inspect the cited resource lineage. + + , + ) + + const refWarnings = consoleError.mock.calls.filter(([message]) => + String(message).includes('Function components cannot be given refs'), + ) + expect(refWarnings).toEqual([]) + }) +}) diff --git a/core/ui/canvas/src/design/shadcn/ui/sheet.tsx b/core/ui/canvas/src/design/shadcn/ui/sheet.tsx index f60acd2..2ddfebe 100644 --- a/core/ui/canvas/src/design/shadcn/ui/sheet.tsx +++ b/core/ui/canvas/src/design/shadcn/ui/sheet.tsx @@ -29,21 +29,22 @@ function SheetPortal({ return } -function SheetOverlay({ - className, - ...props -}: React.ComponentProps) { - return ( - - ) -} +const SheetOverlay = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + +)) + +SheetOverlay.displayName = SheetPrimitive.Overlay.displayName function SheetContent({ className, diff --git a/docs/evidence/intelligence-os-v0.8.1-release-candidate-v1.md b/docs/evidence/intelligence-os-v0.8.1-release-candidate-v1.md index 4373f9b..48a33b3 100644 --- a/docs/evidence/intelligence-os-v0.8.1-release-candidate-v1.md +++ b/docs/evidence/intelligence-os-v0.8.1-release-candidate-v1.md @@ -33,6 +33,8 @@ and reproduce the paired World AI Command Center demonstration. overlay rather than the Core or public-domain identity. 6. A local-only immutable resource replay supports the paired World AI Command Center demo without becoming a new durable store or authority path. +7. The shared resource-detail sheet forwards its overlay ref through the Radix boundary, keeping + cited Brief inspection free of React runtime warnings at desktop and mobile breakpoints. ## Required acceptance before publication From 2e0b19458a8ac24b47a496e7a56dcba6de3a2fc0 Mon Sep 17 00:00:00 2001 From: Edwin Amirian Date: Thu, 13 Aug 2026 10:54:53 -0700 Subject: [PATCH 3/4] feat: make intelligence decision-readable --- CHANGELOG.md | 3 + README.md | 3 + ROADMAP.md | 5 +- .../ui/canvas/src/app/atrium/ResourceCard.tsx | 43 +++++++-- .../src/app/atrium/experienceModel.test.ts | 36 +++++++- .../canvas/src/app/atrium/experienceModel.ts | 89 +++++++++++++++++++ ...lligence-os-v0.8.1-release-candidate-v1.md | 2 + 7 files changed, 172 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16de2cc..da7eba3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,9 @@ Notable user- and contributor-visible changes are recorded here. second persistence, authority, or domain state path. - Forward the shared resource-detail sheet overlay ref through its Radix boundary so opening cited Brief details remains free of React runtime warnings on desktop and mobile. +- Project canonical Brief sections into a visual **What changed / Why it matters / How we know / + When it changed** grammar in Atrium, while keeping unknowns, limitations, receipts, and lineage + available in the same governed resource detail. The patch preserves schema head v177, exactly eleven public MCP tools, the Core 0.8 compatibility line, and the existing reference action adapter 0.4.0 boundary. diff --git a/README.md b/README.md index b78860a..6e212a9 100644 --- a/README.md +++ b/README.md @@ -396,6 +396,9 @@ changing the 0.8 public architecture or widening authority. - **A decision-oriented command center.** Intelligence, Opportunities, Agents, Connections, and Strategy are first-class destinations. An Opportunity is intelligence awaiting a decision: a Case, material Shift, or early Signal with evidence and a next decision window. +- **Decision-readable intelligence.** Canonical Brief sections become visual What / Why / How / + When blocks in Atrium so the intelligence leads and its evidence, timing, unknowns, and limits + remain inspectable rather than overwhelming the answer. - **An ACE-owned visual identity.** Cognitive blue leads the shared product, cyan marks live intelligence, violet is reserved for agent and memory composition, and green means verified success. Customer branding remains a replaceable deployment overlay. diff --git a/ROADMAP.md b/ROADMAP.md index 4b3a233..ff368a2 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -106,8 +106,9 @@ four-agent `Connect -> Map -> Watch -> Brief` acceptance journey over admitted o evidence. Core PR #145 and World PR #24 landed after repository, installed-artifact, browser, naked-kernel, and package checks passed. Follow-on work adds a local-only replay of an immutable domain resource page, replaces internal persistence language with user-facing setup status, -defines the Opportunity experience, and introduces the ACE-owned design system. It does not -change the 0.9 Collaborative Intelligence promise. +defines the Opportunity experience, introduces the ACE-owned design system, and projects canonical +Brief sections into a visual What / Why / How / When grammar. It does not change the 0.9 +Collaborative Intelligence promise. The prior [0.7.0 GitHub Release](https://github.com/augmented-cognition-engine/core/releases/tag/v0.7.0) and [`ace-core==0.7.0`](https://pypi.org/project/ace-core/0.7.0/) package remain the passed diff --git a/core/ui/canvas/src/app/atrium/ResourceCard.tsx b/core/ui/canvas/src/app/atrium/ResourceCard.tsx index 33be044..12a2ece 100644 --- a/core/ui/canvas/src/app/atrium/ResourceCard.tsx +++ b/core/ui/canvas/src/app/atrium/ResourceCard.tsx @@ -15,7 +15,11 @@ import { import { Separator } from '@/design/shadcn/ui/separator' import { compactReference, kindLabel } from './intelligenceModel' -import { payloadNumber, payloadText } from './experienceModel' +import { + intelligenceStorySections, + payloadNumber, + payloadText, +} from './experienceModel' function availabilityLabel(record: IntelligenceResourceRecord): string { if (record.availability === 'degraded') return 'Needs context' @@ -42,6 +46,8 @@ export function ResourceCard({ readonly compact?: boolean }) { const whyItMatters = payloadText(record.payload, 'why_it_matters') + const storySections = intelligenceStorySections(record.payload) + const whatChanged = storySections.find((section) => section.id === 'what_changed') const confidence = payloadNumber(record.payload, 'confidence') const confidencePercent = confidence !== null && confidence >= 0 && confidence <= 1 ? Math.round(confidence * 100) @@ -90,7 +96,7 @@ export function ResourceCard({ > {record.title} - {record.summary !== null && ( + {record.summary !== null && (!featured || storySections.length === 0) && (

)} - {featured && whyItMatters !== null && ( + {featured && storySections.length > 0 && ( +

+ {storySections.map((section) => ( +
+
+ {section.label} +
+

{section.body}

+
+ ))} +
+ )} + {featured && storySections.length === 0 && whyItMatters !== null && (
Why it matters

{whyItMatters}

@@ -127,13 +145,26 @@ export function ResourceCard({
{record.title} - - {record.summary ?? 'This resource does not include a narrative summary.'} + 0 ? 'sr-only' : 'leading-relaxed'}> + {whatChanged?.body ?? record.summary ?? 'This resource does not include a narrative summary.'}
- {whyItMatters !== null && ( + {storySections.length > 0 && ( +
+ {storySections.map((section) => ( +
+
+ {section.label} +
+

{section.body}

+
+ ))} +
+ )} + + {storySections.length === 0 && whyItMatters !== null && (
Why it matters diff --git a/core/ui/canvas/src/app/atrium/experienceModel.test.ts b/core/ui/canvas/src/app/atrium/experienceModel.test.ts index fc51ac6..0da35fd 100644 --- a/core/ui/canvas/src/app/atrium/experienceModel.test.ts +++ b/core/ui/canvas/src/app/atrium/experienceModel.test.ts @@ -1,6 +1,11 @@ import { describe, expect, it } from 'vitest' -import { payloadNumber, payloadText, productDisplayName } from './experienceModel' +import { + intelligenceStorySections, + payloadNumber, + payloadText, + productDisplayName, +} from './experienceModel' describe('Atrium experience model', () => { it('orients the shell from a domain-owned product identity', () => { @@ -19,4 +24,33 @@ describe('Atrium experience model', () => { expect(payloadNumber({ confidence: 0.92 }, 'confidence')).toBe(0.92) expect(payloadNumber({ confidence: 'high' }, 'confidence')).toBeNull() }) + + it('projects the canonical What / Why / How / When intelligence grammar', () => { + const bodyMarkdown = [ + '# Brief', + '', + '## What Changed', + '', + '- A directive moved to reported operation\\. (inference supports: case:1; uncertainty: bounded)', + '', + '## Why It Matters', + '', + '- An operating mechanism now exists\\. (inference supports: signal:1; uncertainty: bounded)', + '', + '## How We Know', + '', + '- Two admitted records support the change\\. (cited supports: observation:1, observation:2)', + '', + '## When It Changed', + '', + '- The second report arrived 39 days later\\. (cited supports: observation:1, observation:2)', + ].join('\n') + + expect(intelligenceStorySections({ value_json: JSON.stringify({ body_markdown: bodyMarkdown }) })).toEqual([ + { id: 'what_changed', label: 'What changed', body: 'A directive moved to reported operation.' }, + { id: 'why_it_matters', label: 'Why it matters', body: 'An operating mechanism now exists.' }, + { id: 'how_we_know', label: 'How we know', body: 'Two admitted records support the change.' }, + { id: 'when_it_changed', label: 'When it changed', body: 'The second report arrived 39 days later.' }, + ]) + }) }) diff --git a/core/ui/canvas/src/app/atrium/experienceModel.ts b/core/ui/canvas/src/app/atrium/experienceModel.ts index 58c5d65..2ce4b16 100644 --- a/core/ui/canvas/src/app/atrium/experienceModel.ts +++ b/core/ui/canvas/src/app/atrium/experienceModel.ts @@ -47,3 +47,92 @@ export function payloadNumber(payload: unknown, key: string): number | null { const value = (payload as Record)[key] return typeof value === 'number' && Number.isFinite(value) ? value : null } + +export type IntelligenceStorySectionId = + | 'what_changed' + | 'why_it_matters' + | 'how_we_know' + | 'when_it_changed' + +export interface IntelligenceStorySection { + readonly id: IntelligenceStorySectionId + readonly label: string + readonly body: string +} + +const STORY_SECTIONS: readonly { + readonly id: IntelligenceStorySectionId + readonly label: string +}[] = [ + { id: 'what_changed', label: 'What changed' }, + { id: 'why_it_matters', label: 'Why it matters' }, + { id: 'how_we_know', label: 'How we know' }, + { id: 'when_it_changed', label: 'When it changed' }, +] + +function displayPayload(payload: unknown): Record | null { + if (typeof payload !== 'object' || payload === null || Array.isArray(payload)) return null + return payload as Record +} + +function unescapeCanonicalMarkdown(value: string): string { + return value.replace(/\\([\\`*{}[\]()#+\-.!_>])/g, '$1').trim() +} + +function claimBody(value: string): string { + const supportMarkers = [' (cited supports:', ' (inference supports:'] + const markerIndexes = supportMarkers + .map((marker) => value.indexOf(marker)) + .filter((index) => index >= 0) + const end = markerIndexes.length === 0 ? value.length : Math.min(...markerIndexes) + return unescapeCanonicalMarkdown(value.slice(0, end)) +} + +/** Project the stable What / Why / How / When grammar from an opaque resource payload. */ +export function intelligenceStorySections(payload: unknown): IntelligenceStorySection[] { + const root = displayPayload(payload) + if (root === null) return [] + + const direct = STORY_SECTIONS.flatMap(({ id, label }) => { + const body = payloadText(root, id) + return body === null ? [] : [{ id, label, body }] + }) + if (direct.length > 0) return direct + + const encoded = payloadText(root, 'value_json') + if (encoded === null) return [] + + let material: Record | null = null + try { + material = displayPayload(JSON.parse(encoded)) + } catch { + return [] + } + const markdown = material === null ? null : payloadText(material, 'body_markdown') + if (markdown === null) return [] + + const byId = new Map() + let active: IntelligenceStorySectionId | null = null + for (const line of markdown.split('\n')) { + const heading = /^##\s+(.+?)\s*$/.exec(line) + if (heading !== null) { + const normalized = heading[1]?.trim().toLocaleLowerCase().replace(/\s+/g, '_') + active = STORY_SECTIONS.some(({ id }) => id === normalized) + ? (normalized as IntelligenceStorySectionId) + : null + continue + } + if (active === null || !line.startsWith('- ')) continue + const definition = STORY_SECTIONS.find(({ id }) => id === active) + const body = claimBody(line.slice(2)) + if (definition !== undefined && body.length > 0) { + byId.set(active, { id: active, label: definition.label, body }) + } + active = null + } + + return STORY_SECTIONS.flatMap(({ id }) => { + const section = byId.get(id) + return section === undefined ? [] : [section] + }) +} diff --git a/docs/evidence/intelligence-os-v0.8.1-release-candidate-v1.md b/docs/evidence/intelligence-os-v0.8.1-release-candidate-v1.md index 48a33b3..ad5d994 100644 --- a/docs/evidence/intelligence-os-v0.8.1-release-candidate-v1.md +++ b/docs/evidence/intelligence-os-v0.8.1-release-candidate-v1.md @@ -35,6 +35,8 @@ and reproduce the paired World AI Command Center demonstration. becoming a new durable store or authority path. 7. The shared resource-detail sheet forwards its overlay ref through the Radix boundary, keeping cited Brief inspection free of React runtime warnings at desktop and mobile breakpoints. +8. Atrium turns canonical Brief sections into visual What / Why / How / When blocks. Unknowns, + limitations, receipts, and lineage remain visible in the same governed resource detail. ## Required acceptance before publication From aad34c50b82490b40966eb2970014e743134faaa Mon Sep 17 00:00:00 2001 From: Edwin Amirian Date: Thu, 13 Aug 2026 11:09:26 -0700 Subject: [PATCH 4/4] feat: make every intelligence record decision-readable --- CHANGELOG.md | 8 +- README.md | 7 +- ROADMAP.md | 4 +- .../ui/canvas/src/app/atrium/ResourceCard.tsx | 24 ++-- .../src/app/atrium/experienceModel.test.ts | 34 ++++++ .../canvas/src/app/atrium/experienceModel.ts | 109 ++++++++++++++++-- ...lligence-os-v0.8.1-release-candidate-v1.md | 6 +- 7 files changed, 164 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index da7eba3..b7d63a8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,9 +26,11 @@ Notable user- and contributor-visible changes are recorded here. second persistence, authority, or domain state path. - Forward the shared resource-detail sheet overlay ref through its Radix boundary so opening cited Brief details remains free of React runtime warnings on desktop and mobile. -- Project canonical Brief sections into a visual **What changed / Why it matters / How we know / - When it changed** grammar in Atrium, while keeping unknowns, limitations, receipts, and lineage - available in the same governed resource detail. +- Project canonical Brief sections and every decision-facing Signal, Shift, Case, Decision, + Action, Outcome, and Feedback record into a visual **What changed / Why it matters / How we know / + When it changed** grammar in Atrium. Generic fallbacks disclose missing materiality or event time + instead of inventing it; unknowns, limitations, receipts, and lineage remain available in the + same governed resource detail. The patch preserves schema head v177, exactly eleven public MCP tools, the Core 0.8 compatibility line, and the existing reference action adapter 0.4.0 boundary. diff --git a/README.md b/README.md index 6e212a9..196a63b 100644 --- a/README.md +++ b/README.md @@ -396,9 +396,10 @@ changing the 0.8 public architecture or widening authority. - **A decision-oriented command center.** Intelligence, Opportunities, Agents, Connections, and Strategy are first-class destinations. An Opportunity is intelligence awaiting a decision: a Case, material Shift, or early Signal with evidence and a next decision window. -- **Decision-readable intelligence.** Canonical Brief sections become visual What / Why / How / - When blocks in Atrium so the intelligence leads and its evidence, timing, unknowns, and limits - remain inspectable rather than overwhelming the answer. +- **Decision-readable intelligence.** Briefs and every decision-facing Signal, Shift, Case, + Decision, Action, Outcome, and Feedback record use a visual What / Why / How / When grammar. + Missing materiality or event time stays visibly missing, while evidence, unknowns, limits, + receipts, and lineage remain inspectable rather than overwhelming the answer. - **An ACE-owned visual identity.** Cognitive blue leads the shared product, cyan marks live intelligence, violet is reserved for agent and memory composition, and green means verified success. Customer branding remains a replaceable deployment overlay. diff --git a/ROADMAP.md b/ROADMAP.md index ff368a2..3a1a27e 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -106,8 +106,8 @@ four-agent `Connect -> Map -> Watch -> Brief` acceptance journey over admitted o evidence. Core PR #145 and World PR #24 landed after repository, installed-artifact, browser, naked-kernel, and package checks passed. Follow-on work adds a local-only replay of an immutable domain resource page, replaces internal persistence language with user-facing setup status, -defines the Opportunity experience, introduces the ACE-owned design system, and projects canonical -Brief sections into a visual What / Why / How / When grammar. It does not change the 0.9 +defines the Opportunity experience, introduces the ACE-owned design system, and applies a truthful +visual What / Why / How / When grammar across Briefs and decision-facing intelligence. It does not change the 0.9 Collaborative Intelligence promise. The prior [0.7.0 GitHub Release](https://github.com/augmented-cognition-engine/core/releases/tag/v0.7.0) diff --git a/core/ui/canvas/src/app/atrium/ResourceCard.tsx b/core/ui/canvas/src/app/atrium/ResourceCard.tsx index 12a2ece..3ceea6f 100644 --- a/core/ui/canvas/src/app/atrium/ResourceCard.tsx +++ b/core/ui/canvas/src/app/atrium/ResourceCard.tsx @@ -16,7 +16,7 @@ import { Separator } from '@/design/shadcn/ui/separator' import { compactReference, kindLabel } from './intelligenceModel' import { - intelligenceStorySections, + intelligenceStoryForRecord, payloadNumber, payloadText, } from './experienceModel' @@ -46,7 +46,7 @@ export function ResourceCard({ readonly compact?: boolean }) { const whyItMatters = payloadText(record.payload, 'why_it_matters') - const storySections = intelligenceStorySections(record.payload) + const storySections = intelligenceStoryForRecord(record) const whatChanged = storySections.find((section) => section.id === 'what_changed') const confidence = payloadNumber(record.payload, 'confidence') const confidencePercent = confidence !== null && confidence >= 0 && confidence <= 1 @@ -96,7 +96,7 @@ export function ResourceCard({ > {record.title} - {record.summary !== null && (!featured || storySections.length === 0) && ( + {record.summary !== null && storySections.length === 0 && (

)} - {featured && storySections.length > 0 && ( -

+ {storySections.length > 0 && ( +
{storySections.map((section) => ( -
-
+
+
{section.label}
-

{section.body}

+

+ {section.body} +

))}
diff --git a/core/ui/canvas/src/app/atrium/experienceModel.test.ts b/core/ui/canvas/src/app/atrium/experienceModel.test.ts index 0da35fd..485089f 100644 --- a/core/ui/canvas/src/app/atrium/experienceModel.test.ts +++ b/core/ui/canvas/src/app/atrium/experienceModel.test.ts @@ -1,11 +1,13 @@ import { describe, expect, it } from 'vitest' import { + intelligenceStoryForRecord, intelligenceStorySections, payloadNumber, payloadText, productDisplayName, } from './experienceModel' +import type { IntelligenceResourceRecord } from '@/api/intelligenceResourcesApi' describe('Atrium experience model', () => { it('orients the shell from a domain-owned product identity', () => { @@ -53,4 +55,36 @@ describe('Atrium experience model', () => { { id: 'when_it_changed', label: 'When it changed', body: 'The second report arrived 39 days later.' }, ]) }) + + it('keeps the grammar visible for decision-facing resources without inventing facts', () => { + const signal: IntelligenceResourceRecord = { + contract: 'ace.intelligence.resource-record/v1alpha1', + reference: { + contract: 'ace.intelligence.resource-reference/v1alpha1', + product_id: 'product:test', + resource_kind: 'signal', + resource_id: 'signal:1', + resource_digest: 'sha256:signal', + resource_contract: 'ace.intelligence.signal/v1alpha1', + revision: 1, + as_of: '2026-08-13T12:00:00Z', + available_at: '2026-08-13T12:05:00Z', + }, + availability: 'available', + title: 'A new signal arrived', + summary: 'An official report followed an issued directive.', + subject_refs: [], + provenance: [], + supersedes: null, + payload: {}, + degraded_reason_refs: [], + } + + expect(intelligenceStoryForRecord(signal)).toEqual([ + { id: 'what_changed', label: 'What changed', body: 'An official report followed an issued directive.' }, + { id: 'why_it_matters', label: 'Why it matters', body: 'It met the configured relevance and routing criteria, so it now warrants attention.' }, + { id: 'how_we_know', label: 'How we know', body: 'No upstream evidence link is projected for this record.' }, + { id: 'when_it_changed', label: 'When it changed', body: 'The evidence picture is current as of 2026-08-13T12:00:00Z; a distinct event time was not supplied.' }, + ]) + }) }) diff --git a/core/ui/canvas/src/app/atrium/experienceModel.ts b/core/ui/canvas/src/app/atrium/experienceModel.ts index 2ce4b16..c97082f 100644 --- a/core/ui/canvas/src/app/atrium/experienceModel.ts +++ b/core/ui/canvas/src/app/atrium/experienceModel.ts @@ -1,4 +1,7 @@ -import type { IntelligenceResourcePage } from '@/api/intelligenceResourcesApi' +import type { + IntelligenceResourcePage, + IntelligenceResourceRecord, +} from '@/api/intelligenceResourcesApi' const INITIALISMS = new Map([ ['ace', 'ACE'], @@ -75,6 +78,18 @@ function displayPayload(payload: unknown): Record | null { return payload as Record } +function canonicalPayloadMaterial(payload: unknown): Record | null { + const root = displayPayload(payload) + if (root === null) return null + const encoded = payloadText(root, 'value_json') + if (encoded === null) return root + try { + return displayPayload(JSON.parse(encoded)) + } catch { + return root + } +} + function unescapeCanonicalMarkdown(value: string): string { return value.replace(/\\([\\`*{}[\]()#+\-.!_>])/g, '$1').trim() } @@ -99,15 +114,7 @@ export function intelligenceStorySections(payload: unknown): IntelligenceStorySe }) if (direct.length > 0) return direct - const encoded = payloadText(root, 'value_json') - if (encoded === null) return [] - - let material: Record | null = null - try { - material = displayPayload(JSON.parse(encoded)) - } catch { - return [] - } + const material = canonicalPayloadMaterial(root) const markdown = material === null ? null : payloadText(material, 'body_markdown') if (markdown === null) return [] @@ -136,3 +143,85 @@ export function intelligenceStorySections(payload: unknown): IntelligenceStorySe return section === undefined ? [] : [section] }) } + +const DECISION_FACING_KINDS = new Set([ + 'signal', + 'shift', + 'case', + 'brief', + 'decision', + 'action', + 'outcome', + 'feedback', +]) + +const INVARIANT_MATERIALITY: Readonly> = { + signal: 'It met the configured relevance and routing criteria, so it now warrants attention.', + shift: 'The watched state no longer matches its prior baseline, so the current picture may need reassessment.', + case: 'ACE has bounded the question and assembled its evidence so it is ready for investigation.', + brief: 'It brings the material change, evidence, timing, and uncertainty into one reviewable picture.', + decision: 'A governed choice is now on record and can be traced to its evidence.', + action: 'An authorized response is now part of the accountable decision path.', + outcome: 'A result is now observable and can be compared with the intended decision.', + feedback: 'This result can inform future ranking only through the governed learning path.', +} + +const EVENT_TIME_KEYS = [ + 'detected_at', + 'assembled_at', + 'decided_at', + 'authorized_at', + 'occurred_at', + 'observed_at', + 'generated_at', +] as const + +function recordedTimeStory(record: IntelligenceResourceRecord): string { + const material = canonicalPayloadMaterial(record.payload) + const eventTime = material === null + ? null + : EVENT_TIME_KEYS + .map((key) => payloadText(material, key)) + .find((value) => value !== null) ?? null + if (eventTime !== null) return `ACE detected or assembled this at ${eventTime}.` + return `The evidence picture is current as of ${record.reference.as_of}; a distinct event time was not supplied.` +} + +/** + * Give every decision-facing resource the same readable story without inventing + * domain facts. Explicit domain material wins; generic fallbacks disclose when + * materiality or event time has not yet been supplied. + */ +export function intelligenceStoryForRecord( + record: IntelligenceResourceRecord, +): IntelligenceStorySection[] { + const explicit = intelligenceStorySections(record.payload) + if (explicit.length > 0) return explicit + if (!DECISION_FACING_KINDS.has(record.reference.resource_kind)) return [] + + const what = record.summary ?? record.title + const why = payloadText(record.payload, 'why_it_matters') + ?? INVARIANT_MATERIALITY[record.reference.resource_kind] + const evidenceCount = record.provenance.length + + return [ + { id: 'what_changed', label: 'What changed', body: what }, + { + id: 'why_it_matters', + label: 'Why it matters', + body: why ?? 'Its decision relevance has not yet been established.', + }, + { + id: 'how_we_know', + label: 'How we know', + body: evidenceCount === 0 + ? 'No upstream evidence link is projected for this record.' + : `${evidenceCount} governed evidence link${evidenceCount === 1 ? '' : 's'} support this record.`, + }, + { + id: 'when_it_changed', + label: 'When it changed', + body: recordedTimeStory(record), + }, + ] +} diff --git a/docs/evidence/intelligence-os-v0.8.1-release-candidate-v1.md b/docs/evidence/intelligence-os-v0.8.1-release-candidate-v1.md index ad5d994..407d1ec 100644 --- a/docs/evidence/intelligence-os-v0.8.1-release-candidate-v1.md +++ b/docs/evidence/intelligence-os-v0.8.1-release-candidate-v1.md @@ -35,8 +35,10 @@ and reproduce the paired World AI Command Center demonstration. becoming a new durable store or authority path. 7. The shared resource-detail sheet forwards its overlay ref through the Radix boundary, keeping cited Brief inspection free of React runtime warnings at desktop and mobile breakpoints. -8. Atrium turns canonical Brief sections into visual What / Why / How / When blocks. Unknowns, - limitations, receipts, and lineage remain visible in the same governed resource detail. +8. Atrium turns canonical Brief sections into visual What / Why / How / When blocks and applies + the same truthful display grammar to every decision-facing Signal, Shift, Case, Decision, + Action, Outcome, and Feedback record. Missing materiality or event time stays visibly missing; + unknowns, limitations, receipts, and lineage remain in the governed resource detail. ## Required acceptance before publication