# Changelog All notable changes to Agnes AI Data Analyst. Format: [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html), pre-1.0 — public surface (CLI flags, REST endpoints, `instance.yaml` schema, `extract.duckdb` contract) may shift between minor versions; breaking changes called out under **Changed** or **Removed** with the **BREAKING** marker. CalVer image tags (`stable-YYYY.MM.N`, `dev-YYYY.MM.N`) are produced for every CI build; semver tags (`v0.X.Y`) are cut at release boundaries and reference the same commit as a `stable-*` tag from the same day. --- ## [Unreleased] ## [0.55.1] — 2026-05-19 ### Added - `/home` install-hero lead now includes a short "What leaves your machine" privacy callout: explains that prompts / tool-calls / tool-responses travel back to the central catalog while raw data rows stay local, and points at `/agnes-private` as the per-session opt-out. - `agnes init` now accepts `--token-file ` and `AGNES_TOKEN` env-var fallback alongside `--token`. Precedence: `--token` > `--token-file` > `AGNES_TOKEN`. The file-/env-var paths dodge Claude Code's auto-classifier, which sometimes flags a long bearer token in an `--token "eyJ..."` command line as a credential-exfil pattern. The pasted setup script now uses `--token-file ~/.agnes/token` (token written via single-quoted heredoc, umask 077) for the same reason. ### Changed - `/home` onboarding install-hero reordered: folder creation is now Step 2 (was Step 3) and starting Claude with `claude --dangerously-skip-permissions` is the new Step 3, rendered with the same `.install-cmd` + copy-button affordance as the other steps. Step 4 paste runs ~20 shell commands that auto-accept-edits would not cover (Bash still prompts), so the YOLO flag is the default recommendation (session-scoped, drops on next plain `claude`). Shift + Tab → auto-accept-edits kept as the strict- review fallback; persistent YOLO allowlist link to `/setup-advanced#yolo` opens in a new tab so users don't lose their `/home` install context. Setup script's "Verify cwd" warning copy refreshed to reference "/home Step 2". - `agnes init` adds `Bash(agnes *)` to the default `permissions.allow` list in the seeded `.claude/settings.json`. Without it, Claude Code was blocking subsequent `agnes ` invocations (`agnes catalog`, `agnes pull`, …) inside the workspace it had just bootstrapped. - `agnes init` and `agnes refresh-marketplace --bootstrap` now `chmod +x` every `.sh` they land on disk (`/.claude/hooks/*.sh` after init; every `.sh` under `~/.agnes/marketplace` after a clone/pull). Git checkout doesn't always preserve the file-mode bit (filemode=false repos, ZIP extractions), so hooks were firing with "Permission denied" — silent `SessionStart` / `PreToolUse` breakage. Best-effort: no-op on Windows NTFS. - Setup script step 3 now uses `--token-file ~/.agnes/token` plus a single-quoted heredoc for the token write, and includes an explicit note about the `!` prefix fallback when Claude Code's classifier blocks an `agnes ` invocation (e.g. `! agnes init …`). - Setup script step 1 (no-CA install path) now emits a robust `grep -qF + ||` snippet for the optional `~/.local/bin` PATH persistence so re-runs don't append a duplicate entry to the user's rc file (fixed-string match + short-circuit per the dedup bug report). ## [0.55.0] — 2026-05-19 ### Added - **Extended Data Packages content (v56 schema)** backing the rewritten `/catalog/p/` package detail page per the extended-descriptions admin extended-descriptions spec. Eight new schema fields, validated API, per-section template rendering, Browse-grid card augmentation: * **`data_packages`** gains owner_name + owner_team (rendered as "Owned by X · Team" line on hero + Browse card), tags (JSON list of category strings), long_description (markdown body for the "What it is" section), when_to_use + when_not_to_use (paired "Use it when / Skip it when" panels), example_questions (package- level flagship list as a one-click prompt panel). * **`table_registry`** gains grain, platforms, partition_col, history, gotchas — structured per-table documentation surfaced in the collapsible per-table row on the package detail page. First `gotcha` with `key=true` renders as a distinct "Key gotcha" block. * **Virtual badges** (`curated` / `new`) derived render-time from creator Admin-group membership + 30-day created_at window — no extra DB column needed. Surfaced on Browse-grid cards (`data-badge="…"` hooks) + the detail-page hero. - **`PUT/POST /api/admin/data-packages`** and **`PATCH /api/admin/registry/{id}/docs`** accept the new fields with per-field validation matching the extended-descriptions admin spec checklist (tags ≤8 × ≤30 chars, long_description ≤4000, bullets ≤8 × ≤200, example_questions ≤12, gotchas ≤8). PATCH echoes the fresh state for round-trip rendering. - **CI guard `test_data_packages_no_vendor_content.py`** scans `app/` + `src/` + `cli/` + `config/` + `scripts/` for vendor-specific tokens from the colleague's spec MD; fails CI if any leak into OSS surfaces. Vendor content stays in the private infra repo's admin- import flow. - **`+ New Memory Item`** button on `/admin/corporate-memory` for admin-seeded items (rules, playbooks, decisions). Modal chains POST `/api/memory` → optional PATCH `domain_ids` → POST `/admin/batch?action=approve|mandate`, so admin-created items land directly as Approved (or Mandatory if the Required checkbox is ticked) without going through Pending review. - **`domains: list[str]`** field on every memory-item API response. The bulk + single-item hydration paths now emit the full slug list, in addition to the legacy `domain` single-slug surface kept for back-compat. The admin queue renders all chips with a `+N` overflow past three. - **GET `/api/memory/admin/{id}`** — single-item fetch for admin. Powers the `#item-` deep link from `/memory/d/`'s Edit affordance: the page now fetches the row directly (no pagination racing) and injects it into `_itemsById` so the edit modal opens reliably even when the item is beyond page 1 of All Items. - **PATCH /api/memory/admin/{id}** accepts a new `domain_ids: list[str]` field that atomically replaces the item's full memory-domain membership via `knowledge_item_domains`. The admin item-edit modal now sends this on save so chip-input domain selections actually persist — previously the chip-input was decorative (legacy single-domain `` removed.** The chip-input is now the canonical domain control on `/admin/corporate-memory`; PATCH writes `domain_ids` (list) to the junction. The hidden `` to native `` swatch picker. Server now validates the hex format too (`^#[0-9a-fA-F]{6}$`) — admins can no longer save malformed values like `#ff5733#e0f2fe` that broke the card layout downstream. ### Fixed - **Memory admin modals were dead — duplicate `let _cmdNewDomainId`** in `admin_corporate_memory.html`. The deprecated step-2 RBAC modal left stub `let` declarations that collided with the live state vars declared earlier in the same `