Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"description": "Inspect bounded recent gh-aw logs and available rich evidence without a control-plane installation. Missing evidence remains unknown; native maintenance requires trusted terminal approval.",
"audited-dashboard-sha256": "5dd8b4ff57b737ecd5df75a069b50af7485839f782e49d2f0922ed8f31f161c8",
"audited-dashboard-sha256": "47dea1242ac5cdf490e1a61c8bad1da9849501e98581fcddbfad273553eb5eb7",
"include-experimental-pages": true,
"excluded-pages": [
"wizard", "governance", "configuration", "indexing",
Expand Down
8 changes: 4 additions & 4 deletions dashboard/site/dashboard-fragments/overview.json
Original file line number Diff line number Diff line change
Expand Up @@ -194,8 +194,8 @@
},
{
"name": "overview-value-station",
"subject": "Present the observed grader-result count as the legacy Value gains counter.",
"objective": "Restore the Value gains counter while making its observation-count semantics explicit.",
"subject": "Present the observed grader-result count separately from repository Value.",
"objective": "Label grader observations honestly without implying verified outcome gains.",
"acceptance": "The count matches overview-value-summary, including zero; grader presence is not proof of improvement and unavailable evidence is not zero.",
"from": "overview-value-summary",
"compute": [
Expand Down Expand Up @@ -275,7 +275,7 @@
},
{
"name": "overview-factory-status",
"subject": "Classify the factory heading from compact run and optional value evidence.",
"subject": "Classify the factory heading from compact run and optional grader observations.",
"objective": "Provide a bounded Overview heading based on observed run counts and optional grader-record presence.",
"acceptance": "The heading matches the declared run-count and optional grader-presence branches; grader presence is not verified value, and the heading does not authorize any policy change.",
"from": "overview-run-status-input",
Expand Down Expand Up @@ -426,7 +426,7 @@
"field": "has-value-gains"
},
{
"value": "Your factory is delivering value."
"value": "Your factory has grader observations."
},
{
"field": "active-heading"
Expand Down
6 changes: 3 additions & 3 deletions dashboard/site/src/agent/catalog.generated.json
Original file line number Diff line number Diff line change
Expand Up @@ -12829,8 +12829,8 @@
},
{
"id": "overview-value-station",
"subject": "Present the observed grader-result count as the legacy Value gains counter.",
"objective": "Restore the Value gains counter while making its observation-count semantics explicit.",
"subject": "Present the observed grader-result count separately from repository Value.",
"objective": "Label grader observations honestly without implying verified outcome gains.",
"acceptance": "The count matches overview-value-summary, including zero; grader presence is not proof of improvement and unavailable evidence is not zero.",
"description": "",
"parameters": [],
Expand Down Expand Up @@ -12888,7 +12888,7 @@
},
{
"id": "overview-factory-status",
"subject": "Classify the factory heading from compact run and optional value evidence.",
"subject": "Classify the factory heading from compact run and optional grader observations.",
"objective": "Provide a bounded Overview heading based on observed run counts and optional grader-record presence.",
"acceptance": "The heading matches the declared run-count and optional grader-presence branches; grader presence is not verified value, and the heading does not authorize any policy change.",
"description": "",
Expand Down
2 changes: 1 addition & 1 deletion dashboard/site/src/agent/queries.generated.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion dashboard/site/src/components/factory-floor.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ const STATION_DEFINITIONS = {
},
'value-gains': {
icon: 'trophy',
label: 'Value gains',
label: 'Grader observations',
href: '#page-graders',
format: 'count',
unavailableDetail: '',
Expand Down
2 changes: 1 addition & 1 deletion dashboard/site/test/e2e/canonical-data.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -553,7 +553,7 @@ for (const width of [1200, 390]) {
await expect(page.locator('#page-overview')).toContainText('partial collection');
await expect(page.locator('#page-overview')).not.toContainText('Your factory');
await expect(page.locator('#page-overview')).not.toContainText(/\d+\/\d+ healthy workflows/);
await expect(page.locator('#page-overview')).not.toContainText('Value gains');
await expect(page.locator('#page-overview')).not.toContainText('Grader observations');
for (const id of ['repositories', 'workflows', 'runs', 'cost']) {
if (width < 768) await page.getByRole('button', { name: 'Select view', exact: true }).click();
else if (!await page.locator(`a[href="#page-${id}"]:visible`).first().isVisible()) {
Expand Down
4 changes: 2 additions & 2 deletions dashboard/site/test/e2e/overview.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ const sources = {
'overview-value-station': source('overview-value-station', [{
value: 1, detail: 'Observed grader results', description: '1 observed grader results, not verified improvements'
}]),
'overview-factory-status': source('overview-factory-status', [{ 'factory-heading': 'Your factory is delivering value.' }]),
'overview-factory-status': source('overview-factory-status', [{ 'factory-heading': 'Your factory has grader observations.' }]),
'overview-header-presentation': source('overview-header-presentation', [{ heading: 'Your factory needs attention.' }]),
'overview-factory-station': source('overview-factory-station', [{
value: 0.5,
Expand Down Expand Up @@ -198,7 +198,7 @@ test('declarative Overview views preserve desktop and mobile behavior', async ({
const stations = factory.locator('.factory-station');
await expect(stations).toHaveCount(4);
await expect(stations.locator(':scope > span:nth-child(2)')).toHaveText([
'Factory health', 'Repository coverage', 'Issues & PRs', 'Value gains'
'Factory health', 'Repository coverage', 'Issues & PRs', 'Grader observations'
]);
await expect(stations.locator('strong')).toHaveText(['50%', '50%', '5', '1']);
await expect(stations.nth(2).getByRole('link', { name: '5', exact: true })).toHaveAttribute('href', '#page-issues');
Expand Down
4 changes: 2 additions & 2 deletions dashboard/site/test/unit/data-queries.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ describe('declarative dashboard queries', () => {
});

it.each([
['delivering value', { successes: 0, failures: 0, active: 0, graders: 1 }, 'Your factory is delivering value.'],
['grader observations', { successes: 0, failures: 0, active: 0, graders: 1 }, 'Your factory has grader observations.'],
['active', { successes: 0, failures: 2, active: 1, graders: 0 }, 'Your factory is humming.'],
['under strain', { successes: 1, failures: 2, active: 0, graders: 0 }, 'Your factory is under strain.'],
['needs attention', { successes: 2, failures: 1, active: 0, graders: 0 }, 'Your factory needs attention.'],
Expand Down Expand Up @@ -458,7 +458,7 @@ describe('declarative dashboard queries', () => {
);

expect(result['overview-header-presentation'].rows).toEqual([{
heading: 'Your factory is delivering value.'
heading: 'Your factory has grader observations.'
}]);
expect(result['overview-factory-station'].rows).toEqual([{
value: 1,
Expand Down
38 changes: 38 additions & 0 deletions dashboard/site/test/unit/workflow-value-view-contract.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { evidencePacketSelection, readEvidencePackets } from '../../src/data/que
import { operationalValueEvidenceId, operationalValueEvidenceRows } from '../../src/data/model/operational-value-evidence.js';
import { workflowValueCollectionId } from '../../src/data/model/workflow-value-collection.js';
import { measurementSelection, readMeasurements } from '../../src/data/queries/measurement-selection.js';
import { installSqliteIndexedDB } from '../../src/data/storage/sqlite-indexeddb.js';

const dashboard = authoritativeDashboard.dashboard;
const repository = resolve('../..');
Expand Down Expand Up @@ -172,6 +173,43 @@ function fileLedger(direction = 'decrease') {
}

describe('native workflow value production contract', () => {
it('keeps worker Value cards, health and evidence routes identical over browser and SQLite storage', async () => {
const packet = await publish();
const health = readFileSync(join(repository, 'dashboard/site/test/fixtures/workflow-value-collection.jsonl'), 'utf8');
await ingestCachedGhAwJsonl(indexedDB, health, { now: Date.parse('2026-10-23T14:00:00Z') });
const snapshot = packet.facts.find((/** @type {Record<string, unknown>} */ fact) => fact['fact-kind'] === 'snapshot');
const pages = [
['value', {}],
['workflow-value', { workflow: contract.route }],
['value-report', { report: packet.id }],
['value-snapshot', { snapshot: `${packet.id}|${snapshot['fact-id']}` }]
];
const browser = await Promise.all(pages.map(async ([page, parameters]) =>
(await execute(String(page), /** @type {Record<string, string>} */ (parameters))).map(source => source.rows)));
expect(browser[0][0][0]['overview-href']).toContain('#page-value-report?report=');
expect(browser[1][0][0]['collection-state']).toBe('deferred');
expect(browser[1][0][0]['last-attempt-outcome']).toBe('failed');
expect(browser[1][0][0]['captured-at']).not.toEqual(browser[1][0][0]['last-attempt-at']);
expect(browser[2][0][0]['movement']).toBe('Better');
expect(browser[3][1]).toHaveLength(1);

const browserDatabase = globalThis.indexedDB;
const browserKeyRange = globalThis.IDBKeyRange;
const sqlite = installSqliteIndexedDB(join(directory, 'value.sqlite'));
try {
await ingestCachedGhAwJsonl(sqlite, readFileSync(join(directory, 'report-0-evidence.jsonl'), 'utf8'),
{ now: Date.parse(String(packet.observedAt)) });
await ingestCachedGhAwJsonl(sqlite, health, { now: Date.parse('2026-10-23T14:00:00Z') });
for (const [index, [page, parameters]] of pages.entries()) {
const sources = await execute(String(page), /** @type {Record<string, string>} */ (parameters));
expect(sources.map(source => source.rows), String(page)).toEqual(browser[index]);
}
} finally {
globalThis.indexedDB = browserDatabase;
globalThis.IDBKeyRange = browserKeyRange;
}
});

it('bounds compound identity allocation before expanding oversized snapshot histories', async () => {
const packet = await publish(fileLedger());
const header = packet.facts.find((/** @type {Record<string, unknown>} */ fact) => fact['fact-kind'] === 'contract');
Expand Down
11 changes: 6 additions & 5 deletions docs/dashboard-language-specification.md
Original file line number Diff line number Diff line change
Expand Up @@ -1744,11 +1744,12 @@ An element that presents counted summary boxes may declare `config.labels`, a ma
`factory-header` and `factory-floor` are independently loading named elements. Their page shell does not wait for a combined page projection: each declared presentation query is bound to the view separately. An unresolved source places only its dependent widget in a loading state; resolving or refreshing one source updates only widgets that consume that source. A page-level subscription must not emit aliases for independently bound sources it did not request.

The Overview floor shows campaign health, repository coverage, **Issues & PRs**,
and **Value gains**. The restored issue counter counts retained canonical issue
and pull request safe-output records and links to Issues. The legacy Value gains
counter counts observed grader results and links to Graders; its supporting text
explicitly identifies observations rather than verified improvements. Both
counters receive bounded, presentation-ready Dashboard Language query results.
and **Grader observations**. The issue counter counts retained canonical issue and
pull request safe-output records and links to Issues. The `value-gains` station
identifier remains for compatibility, but its label names observed grader results
and links to Graders; these observations are not verified repository Value. The
shared `factory-floor` element fixes station headings; `config.labels` controls
counter quantity labels, not headings. Both use bounded Dashboard Language results.
Missing or unavailable evidence remains unavailable, distinct from an observed
zero. Four stations form one row on desktop and two rows on narrow screens.

Expand Down
4 changes: 2 additions & 2 deletions docs/dashboard-overview-components.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,5 +68,5 @@ requiring campaign membership. The station links to Workflows; campaign
navigation remains separate.

The other stations show repository coverage, retained Issues & PRs, and
observed grader results under Value gains. Observed grader results are not
verified improvements.
Grader observations. Observed grader results are not verified improvements
or repository Value.
5 changes: 3 additions & 2 deletions docs/dashboard-overview-status-header.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@ The status header gives you the overall shape of the factory right now.
## What it shows

- **Work in motion** appears when runs are queued or in progress.
- The heading classifies the available evidence as idle, humming, needing
attention, under strain, or delivering value.
- The heading classifies the available run evidence as idle, humming, needing
attention, or under strain. When grader observations are present, it names
those observations without claiming verified repository Value.

Treat the heading as a signal, not a health score. Follow an unexpected state
into the relevant run, output, or value view before deciding what happened.
Expand Down
2 changes: 1 addition & 1 deletion docs/dashboard-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ not stages in a conversion funnel.
| **Factory health** | The share of all registered workflows across CAO and targeted repositories without current observed runtime failures. | Workflows to investigate failing execution. |
| **Repositories (coverage station)** | Registered repositories that received a successful worker delivery against the total registered scope. | Repositories for the complete inventory and delivery evidence. |
| **Issues & PRs** | Retained issue and pull request safe outputs. | Issues for the underlying safe outputs. |
| **Value gains** | Observed grader results, not verified improvements. | Graders for the retained observations. |
| **Grader observations** | Observed grader results, not verified improvements or repository Value. | Graders for the retained observations. |

The selected dashboard time range applies before Overview calculates these
values. The start time is inclusive and the end time is exclusive. Weekly
Expand Down
30 changes: 30 additions & 0 deletions docs/operational-value.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,36 @@ See [authentication and command details](cao-cli.md#publish-and-refresh-workflow
Static dashboards receive the same envelope through Activity publication,
not a direct database connection.

### Verify publication in each deployment

Use the **same exact repository and workflow** when comparing deployments.
First confirm that the frozen definition and original packet were validated;
an evaluation artifact by itself is not a published dashboard result.

- **Pages:** Confirm that the default-branch Activity run accepted the packet
and that the subsequent CAO Dashboard build deployed its snapshot. If another
workflow owns Pages (as with Documentation Pages), confirm that it mounted
that dashboard artifact too. Open **Value** and the workflow report on the
deployed site, not a local preview. A completed collector run or dashboard
build without a successful deployment does not establish Pages freshness.
- **Hosted PostgreSQL:** Publish through the authenticated Value API above and
confirm that the receipt advanced the canonical revision (`updated: true`)
or was an exact idempotent retry (`updated: false`). Open the same workflow's
Value card and report on the Go-hosted origin. The active view requeries on
committed revisions; the browser must not read the Pages cache if the hosted
query fails. Local Go/SQLite can query a downloaded snapshot but cannot
accept direct Value publication.

Compare the report identity, native unit and direction, original capture,
evidence cutoff, collection decision and last actual attempt in both views.
The decision may be newer than the accepted evidence; matching UI text alone
does not prove matching snapshot revisions. Missing or partial evidence stays
unavailable, not zero. Hosted recurring native acquisition is an **additional
explicit deployment choice**: the documented Azure collector template leaves
`CAO_COLLECT_NATIVE_VALUES` unset. Do not enable it, broaden Activity scope or
register every workflow merely to populate the dashboard. Select only verified
collectors under reviewed exact-pair policy with their required quota admission.

## Recurring collection after opt-in

The skill designs the measurement once. **Once the frozen function and bounded
Expand Down
Loading
Loading