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
77 changes: 77 additions & 0 deletions .github/workflows/release-validation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
name: Release validation

on:
pull_request:
branches: [main]

permissions:
contents: read

concurrency:
group: release-validation-${{ github.event.pull_request.number }}
cancel-in-progress: true

jobs:
tests:
name: Tests and types (${{ matrix.os }})
runs-on: ${{ matrix.os }}
timeout-minutes: 15
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest]
steps:
- uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
with:
persist-credentials: false
fetch-depth: 0
- uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5
with:
node-version: '24'
cache: npm
- name: Install locked dependencies without lifecycle scripts
run: npm ci --ignore-scripts --no-audit --no-fund
- name: Full automated suite
run: npm test
- name: TypeScript
run: npm run typecheck
- name: Lockfile and source whitespace
shell: bash
env:
BASE_SHA: ${{ github.event.pull_request.base.sha }}
run: |
git diff --exit-code -- package.json package-lock.json
git diff --check "$BASE_SHA" HEAD

package:
name: Build and package (Ubuntu)
runs-on: ubuntu-latest
timeout-minutes: 15
env:
BB_TELEMETRY: 'false'
steps:
- uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5
with:
persist-credentials: false
- uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5
with:
node-version: '24'
cache: npm
- name: Install locked project dependencies
run: npm ci --ignore-scripts --no-audit --no-fund
- name: Prepare separate official BB 0.46.0 build tools
shell: bash
run: |
npm install --prefix "$RUNNER_TEMP/bb-tools" --ignore-scripts --no-audit --no-fund bb-app@0.46.0
cd "$RUNNER_TEMP/bb-tools"
npm rebuild better-sqlite3
- name: Official full plugin production build
shell: bash
env:
BB_DATA_DIR: ${{ runner.temp }}/agent-board-build-data
BB_SERVER_URL: http://127.0.0.1:50886
run: node "$RUNNER_TEMP/bb-tools/node_modules/bb-app/dist/bb.js" plugin build
- name: Inspect actual release package and metadata
run: npm run verify:package
- name: Ensure build/install did not alter locked source
run: git diff --exit-code -- package.json package-lock.json
31 changes: 30 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,42 @@
# Changelog

## 0.7.0 — prepared 2026-10-12 (unpublished)

- Show the latest observed public activity and distinguish recent from quiet
reporting, without changing task status or the indeterminate activity strips.
- Add structured completion outcome/result/failure sections, explicitly labeled
agent-reported verification and access to the original bounded output preview.
- Filter and group the bounded dashboard by project, repository, provider and
status. Project metadata lookup is optional, bounded and credential-safe.
- Separate transport connection, refresh/change timestamps and watcher health.
Contain watcher callback/publication errors and surface degraded monitoring.
- Reduce empty Needs attention to a compact line; actionable items remain visible.
- Add bundled What's New highlights with per-version local dismissal and a
persistent Release notes control. No telemetry or remote release fetching.
- Retain explicit result/check labels before truncating the original output preview.
- Qualify cached watcher health when disconnected, a refresh fails or becomes overdue.
- Keep terminal duration unknown when the source supplies no completion timing.
- Bound package contents to runtime source, assets and user documentation;
exclude tests, validation helpers, reports and temporary evidence from npm packs.
- Make public-SDK test paths portable to Windows and use a serial Vitest thread
pool for reliable startup on the development laptop.

- Add Node 24 Ubuntu/Windows PR tests/typecheck and an Ubuntu official build/package gate.
- Patch Hono, Undici and source-map-js development dependencies; the updated graph audits clean.
- Prebundle the large icon data dependency in Vitest without relaxing hook limits or mocking the UI.

No storage migration or settings reset is required. BB >=0.40 and SDK >=0.4.21
remain declared; BB 0.46.0 is recommended. See [upgrade notes](docs/upgrade-0.7.0.md)
and [release convention](docs/release-convention.md). Version 0.7.0 is prepared on the PR branch and is not published.

## 0.6.1 — first public beta

- Fix managed Git installation when BB omits development dependencies: keep the
shared RPC contract SDK import type-only while preserving schema inference.
- 0.6.0 remained an unpublished release candidate.

Dates are omitted because these milestones were local development commits.
0.6.0 is the first planned public beta.
0.6.1 is the first public beta; 0.6.0 remained unpublished.

## 0.6.0
- Optional Ollama Fleet public observability integration.
Expand Down
12 changes: 11 additions & 1 deletion PLUGIN_OVERVIEW.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,19 @@ completion. Open a thread's Agent Board action for automatic single-agent focus
or a multi-agent Kanban view. Inspect the bounded execution timeline to see
public operational updates, actual models, and tools as sources report them.

See how recently an agent reported public activity. Quiet reporting keeps the
source's task status intact. Review completion outcomes, results, failures and
explicitly agent-reported checks, then open the original thread or timeline for
details. Filter and group visible work by project, repository, provider or status.
Needs Attention stays visible across filters. Connection, refresh and watcher
health help you distinguish an observation problem from quiet execution.

What's New shows bundled version highlights. Dismiss an announcement once and
reopen its notes from the dashboard whenever needed.

## Requirements

Requires BB. Ollama Fleet 0.6.0 or newer and Redteam's public observability RPC
Requires BB 0.40 or newer; BB 0.46.0 is recommended. Ollama Fleet 0.6.0 or newer and Redteam's public observability RPC
are optional integrations. Missing integrations leave native BB observation
available. Mobile layouts and reduced-motion preferences are supported.
Hidden reasoning is excluded. System/push notifications are unavailable in
Expand Down
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ focus and the global dashboard offer other views of the same bounded state.
- **Multi-Agent Kanban:** live state for concurrent agents and workers.
- **Needs Attention:** structured waiting/failure states and persistent dismissal.
- **Execution Timeline:** bounded operational events, loaded when opened.
- **Activity freshness:** recent or quiet public reporting without inferring a stall.
- **Completion summaries:** outcomes, results, failures and agent-reported checks.
- **Filters and grouping:** project, repository, provider and status over visible work.
- **Monitoring health:** connection, successful refresh and watcher status.
- **What's New:** version highlights with persistent dismissal and later viewing.
- Native BB threads, workflows, delegations, models and tools.
- Optional Ollama Fleet and Redteam observation.
- Mobile layouts, keyboard controls, and reduced-motion support.
Expand Down Expand Up @@ -64,6 +69,7 @@ bb plugin install .
Neither Fleet nor Redteam is required. Declared compatibility is BB >=0.40 and
SDK >=0.4.21; the development SDK is pinned to 0.4.34. See the honest
[compatibility matrix](RELEASE_AUDIT.md), including historical runtime evidence.
For the prepared, unpublished 0.7.0 source, see [compatibility and upgrade notes](docs/upgrade-0.7.0.md).

## Usage

Expand Down Expand Up @@ -144,6 +150,13 @@ This is a bounded latest view, not a persistent history database.

## Development

The prepared, unpublished 0.7.0 source is documented in [vnext launch/testing](docs/vnext-testing.md),
[design](docs/vnext-design.md) and [release convention](docs/release-convention.md).
Use a separate BB data directory and ports for development; keep your stable
installation untouched. `0.7.0` on this PR branch is not a published release.
See [dependency assessment](docs/dependency-security-0.7.0.md) and the PR
Release validation checks before approving a merge.

```sh
npm ci
npm test
Expand Down
46 changes: 46 additions & 0 deletions RELEASE_NOTES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,49 @@
# Agent Board v0.7.0 — prepared release notes

Version **0.7.0** is prepared on the development PR branch, unpublished and
awaiting final merge review. No public tag, release, marketplace update or
installed stable-plugin update has occurred.

Agent Board gives you a clearer view of live agent work and completed outcomes.

- **Activity freshness:** see the age of the latest public activity and whether
reporting is recent or quiet. Long tasks keep their authoritative status and
the existing animated activity bars.
- **Completion outcomes:** review results, failures and explicitly agent-reported
checks in separate sections. Open the original thread or bounded timeline for details.
- **Filters and grouping:** organize visible work by project, repository, provider
or status. Needs Attention and operational counts remain visible across filters.
- **Monitoring health:** distinguish transport connection, snapshot refresh and
source-watcher health. Cached watcher status is qualified when it cannot be confirmed.
- **What's New:** read bundled version highlights, persist dismissal for that
version, and reopen its notes from the dashboard. Empty Needs Attention is compact.

Reliability fixes preserve explicit result/check metadata before output truncation,
qualify cached health during disconnects and failed/overdue refreshes, and avoid
inventing elapsed duration for terminal tasks without completion timing.

Release hardening adds hosted Node 24 Linux/Windows tests and typecheck, an
Ubuntu official BB build/package gate, and fixed development Hono/Undici/source-map-js
patches. See [dependency assessment](docs/dependency-security-0.7.0.md).

Existing settings and attention dismissals are preserved. No manual data migration
or configuration change is required. BB >=0.40 and public SDK >=0.4.21 remain
declared; BB **0.46.0 is recommended**. Optional Fleet >=0.6.0 and a Redteam
runtime exposing the public observability contract remain optional.

BB installs tracking `^0.6.1` do not include 0.7.0. After publication, users must
select the new marketplace release or change their Git selector to `^0.7.0`.
Pinned tags/commits remain pinned. See [compatibility and upgrade notes](docs/upgrade-0.7.0.md).

Filters cover the bounded visible snapshot. Quiet reporting does not prove a
stall, and reported checks are not independent test evidence. Release notes in
the UI are bundled highlights; GitHub hosts the full release notes. There are
no new push notifications, automatic-install promises or Phase 2 features.

Candidate checks, coverage provenance and remaining limits are recorded in
[the validation summary](docs/validation-0.7.0.md). Detailed machine-specific
reports and live screenshots remain local development evidence.

# Agent Board v0.6.1

First public beta: live execution observability for BB.
Expand Down
11 changes: 11 additions & 0 deletions components/board/activity-freshness.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import type { BoardCard } from "@/contract/rpc";
import { activityFreshness } from "@/lib/dashboard-view";
import { formatElapsed } from "@/lib/board-model";

export function ActivityFreshness({ card, now }: { card: BoardCard; now: number }) {
const freshness = activityFreshness(card, now);
return <p data-part="activity-freshness" data-freshness={freshness.state} className="mt-2 text-[11px] text-muted-foreground" title={freshness.at === null ? undefined : new Date(freshness.at).toLocaleString()}>
{freshness.ageMs === null ? "Activity time unavailable" : `Last observed activity ${formatElapsed(freshness.ageMs)} ago`}
{freshness.state === "quiet" && (card.status === "running" || card.status === "starting") ? <span> · Quiet reporting; task may still be running.</span> : freshness.state === "recent" ? <span> · Recent reporting</span> : null}
</p>;
}
8 changes: 6 additions & 2 deletions components/board/board-card-view.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import { Icon } from "@/components/ui/icon";
import { cn } from "@/lib/utils";
import { StatusChip } from "@/components/board/status-chip";
import { LiveIndicator, LiveStrip } from "@/components/board/live-execution-cue";
import { ActivityFreshness } from "./activity-freshness";
import { CompletionSummary } from "./completion-summary";
import { ExecutionTimelineDialog, timelineTargetForCard } from "@/components/timeline/execution-timeline-dialog";

/** Kind → icon hint (core Icon names). */
Expand Down Expand Up @@ -141,14 +143,14 @@ export function BoardCardView({
) : null}

{/* Failure text — failures stay visible, not hidden. */}
{card.errorPreview !== null ? (
{card.errorPreview !== null && card.column !== "output" ? (
<p className="mt-1.5 rounded bg-destructive/10 px-2 py-1 text-xs text-destructive line-clamp-3">
{card.errorPreview}
</p>
) : null}

{/* Output preview for finished work. */}
{card.outputPreview !== null ? (
{card.outputPreview !== null && card.column !== "output" ? (
<p className="mt-1.5 text-xs text-muted-foreground line-clamp-2">
{card.outputPreview}
</p>
Expand All @@ -167,6 +169,8 @@ export function BoardCardView({
) : null}

{/* Footer: elapsed, tokens/tool calls, actions. */}
{executing ? <ActivityFreshness card={card} now={now} /> : null}
{card.column === "output" && card.kind !== "plan-step" ? <CompletionSummary card={card} /> : null}
<div className="mt-2 flex items-center gap-2 text-[11px] text-muted-foreground">
{elapsedMs !== null ? <span className="font-mono">{formatElapsed(elapsedMs)}</span> : null}
{card.tokens !== null ? <span>{card.tokens.toLocaleString()} tok</span> : null}
Expand Down
14 changes: 14 additions & 0 deletions components/board/completion-summary.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import type { BoardCard } from "@/contract/rpc";
import { completionSummary } from "@/lib/dashboard-view";

export function CompletionSummary({ card }: { card: BoardCard }) {
const summary = completionSummary(card);
return <div data-part="completion-summary" className="mt-2 space-y-1 text-xs [overflow-wrap:anywhere]">
<p><span className="font-medium">Outcome:</span> {summary.outcome}</p>
{summary.failure ? <p data-part="recent-summary" className="min-w-0 max-w-full line-clamp-2 text-destructive [overflow-wrap:anywhere]"><span className="font-medium">Failure:</span> {summary.failure}</p> : null}
<p data-part={summary.failure ? undefined : "recent-summary"} className="min-w-0 max-w-full line-clamp-2 text-muted-foreground [overflow-wrap:anywhere]"><span className="font-medium">Result:</span> {summary.result}</p>
<p className="text-muted-foreground"><span className="font-medium">Reported verification:</span> {summary.reportedChecks.length ? summary.reportedChecks.join(" · ") : "Not supplied"}</p>
{summary.reportedChecks.length ? <p className="text-[10px] text-muted-foreground">Reported by the agent; not independently verified.</p> : null}
{summary.originalPreview ? <details><summary className="cursor-pointer text-muted-foreground">Original output preview</summary><p className="mt-1 whitespace-pre-wrap">Source preview: {summary.originalPreview}</p><p className="mt-1 text-muted-foreground">Preview is bounded. Use Open for the detailed source output.</p></details> : null}
</div>;
}
2 changes: 2 additions & 0 deletions components/board/single-agent-focus.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { cn } from "@/lib/utils";
import { StatusChip } from "@/components/board/status-chip";
import { PipelineTrack } from "@/components/board/pipeline-track";
import { BoardCardView } from "@/components/board/board-card-view";
import { ActivityFreshness } from "./activity-freshness";
import { usePrefersReducedMotion } from "@/components/ui/hooks/use-media-query";
import { ExecutionTimelineDialog, timelineTargetForCard } from "@/components/timeline/execution-timeline-dialog";

Expand Down Expand Up @@ -241,6 +242,7 @@ export function SingleAgentFocus({
) : null}

{/* Truthful stats; unavailable fields are simply omitted. */}
<ActivityFreshness card={hero} now={now} />
{stats.length > 0 ? (
<dl className="mt-2.5 grid grid-cols-2 gap-x-4 gap-y-1.5" data-testid="hero-stats">
{stats.map((stat) => (
Expand Down
Loading
Loading