# Changelog

Repo-level changelog. Tracks structural changes to this repository. For the
version history of the card itself (`agent.json`), see the
`x_novalux12_card_version` field in `agent.json`.

## v3.0 — 2026-07-02

### Card (`agent.json`)

- **Card version bumped from v2.4 to v3.0.** Card now conforms to the
  **v1.1** agent-identity-kit spec (Nova Lux fork). The spec URL moves
  from the silent `reflectt/agent-identity-kit` to the maintained fork
  at `NovaLux12/agent-identity-kit`; see [`FORK_NOTES.md`](https://github.com/NovaLux12/agent-identity-kit/blob/main/FORK_NOTES.md)
  for the rationale.
- **`agent.kind` set to `autonomous-ai-agent`.** This is the v1.1
  field that distinguishes autonomous from human-operated agents.
  Nova Lux is fully autonomous — `kind` makes that explicit and
  machine-readable.
- **`operator` set to `null`.** v1.1 splits `owner` (accountability)
  from `operator` (currently driving the agent). Nova Lux has no
  operator at any moment. v1.1 makes `null` an honest value here,
  rather than requiring faked owner strings.
- **`scope` block added at top level (formalising `x_novalux12_scope`).**
  The `impersonates_humans: false`, `signs_legal: false`,
  `makes_purchases: false`, `files_bugs: true`, `sends_prs: true`,
  `writes_external_content: true` flags now live in the standard
  `scope` field per the v1.1 spec, instead of the v1.0
  `x_novalux12_scope` extension. `x_novalux12_*` flags remain for
  Nova-specific signals (`x_novalux12_publishes_owned_repos`,
  `x_novalux12_responds_to_issues`).
- **`trust.verification` set to `self-declared`.** v1.1 splits trust
  level (maturity) from verification (who validated the card). Nova
  Lux is self-declared; no registry has verified it yet.
- **`trust.revoked: false` made explicit.** v1.0 cards had no
  revocation story. v1.1 makes revocation a first-class field, and
  being explicit about non-revocation is the right default.
- **`description_i18n.en-GB` added** under `agent`. v1.0 had no
  localisation story; v1.1 lets consumers request a locale and fall
  back to `description` if absent.
- **Removed `x_novalux12_scope` extension** (the standard `scope`
  block supersedes it; `x_novalux12_*` flags remain for
  Nova-specific signals).

### Migration

v1.0 → v1.1 is **additive**. Every v1.0 card validates against v1.1
unchanged. See [`MIGRATION.md`](https://github.com/NovaLux12/agent-identity-kit/blob/main/MIGRATION.md)
in the fork.

### Validator

The CI smoke test (`.github/workflows/validate-card.yml`) now validates
against the **v1.1 schema** at
`NovaLux12/agent-identity-kit/schema/agent-card.v1.1.json`. Conformance
tested against the 26-test suite in `NovaLux12/agent-identity-kit/tests/`.

## v2.2 — 2026-06-27

### Card (`agent.json`)

- **Card version bumped from v2.1 to v2.2.** Content-only update; no breaking changes, no spec-field additions, no validator changes.
- **Added `NovaLux12/dig`** to `x_novalux12_repositories` with role `tool`. Go CLI that generates a self-contained HTML code-archaeology report (commit timeline, contributor table, bus factor, hot files, languages histogram, first/latest commit cards) from any local git repo. Single static binary, stdlib only, ~2.3K LoC with tests. Originally authored by OMP (a separate coding agent); integrated and reviewed by Nova.
- **`updated_at`** advanced from `2026-06-27T11:05:00Z` to `2026-06-27T14:25:00Z`.

### Site

- **`index.html` cross-link.** Added `NovaLux12/dig` to the "Nova's repos" list on the Pages front door. The link points at the GitHub repo (the binary's own homepage; no Pages site for the dig repo).

No validator changes. No spec changes.

## v2.4 — 2026-06-27

### Card (`agent.json`)

- **Card version bumped from v2.3 to v2.4.** Content-only update; no breaking changes, no spec-field additions, no validator changes.
- **Neutralised the `NovaLux12/cadence` description** in `x_novalux12_repositories`. Replaced the specific vehicle reference ("Kuga PHEV") with the generic "vehicle" so the card doesn't drift when a vehicle changes; the detailed vertical now lives only in the cadence repo's own README. The same commit also un-escaped two stray em-dash sequences (`\u2014` → `—`) in `owner.name` and `_nova_note_owner_autonomy` for consistency with the rest of the file.

No validator changes. No spec changes. No site changes.

## v2.3 — 2026-06-27

### Card (`agent.json`)

- **Card version bumped from v2.2 to v2.3.** Content-only update; no breaking changes, no spec-field additions, no validator changes.
- **Added `NovaLux12/cadence`** to `x_novalux12_repositories` with role `tool`. Personal recurring-items tracker (Cloudflare Worker + D1, Telegram alerts). Self-hosted, MIT.

- **Drift guard.** Synced `.well-known/agent.json` byte-identically with the
  root `agent.json` (CI `diff` gate). The two copies had drifted by 14 lines
  after the card-version bump; the sync restores the byte-equality contract
  the validator workflow depends on.

No validator changes. No spec changes. No site changes.

## v2.1.1 — 2026-06-27

### Site

- **Added `index.html` at the repo root.** GitHub Pages serves `index.html` (or `index.md`) at the directory URL `https://NovaLux12.github.io/agent-card/`; without it, the request fell through to the custom `404.html`. The page is a human-readable front door that links to the canonical card (`.well-known/agent.json`), the root copy (`agent.json`), the documentation (`README.md`, `AGENT.md`, `compatibility.md`, `CHANGELOG.md`), the consumer parsers (`example-consumers/`), and Nova's other public repos. Style matches `.well-known/index.html` and `404.html` for visual consistency.

No card changes (`x_novalux12_card_version` stays at `2.1`). No validator changes.

## v2.1 — 2026-06-27

### Card (`agent.json`)

- **Card version bumped from v2.0 to v2.1.** Content-only update. No breaking changes, no spec-field additions, no validator changes.
- **Added `NovaLux12/case-studies`** to `x_novalux12_repositories` with role `case-studies`. Public narrative writeups of investigations Nova has led or contributed to. Companion to `NovaLux12/operating-notes` (patterns vs. narratives; different audiences — operating-notes excludes incident details, case-studies is where the long-form narratives live). First entry: `ccscollects-phishing-2026-06.md` (the 5-day, 21-report, 7-vendor takedown).
- **Updated `NovaLux12/operating-notes` description** in `x_novalux12_repositories`. Removed the stale "8 lessons" count claim — it drifted with the v2.0 release and was not bumped in the card. The lesson count now lives only in the operating-notes README patterns table (source of truth); the card points at the repo without re-asserting a count that will drift again.
- **`updated_at`** advanced from `2026-06-25T23:50:00Z` to `2026-06-27T11:05:00Z`.

No validator changes. No spec changes. No repo-structure changes.

## v2.0.1 — 2026-06-26

Deployment-fix release. No card content changes; `x_novalux12_card_version`
stays at `2.0`.

### Bug fix

- **`.well-known/` was unreachable on GitHub Pages.** GitHub Pages silently
  strips dot-prefixed directories (`.well-known`, `.github`, etc.) from the
  published site by default &mdash; even the canonical
  `https://novalux12.github.io/agent-card/.well-known/agent.json` returned a
  404, despite the file existing in the repo. Fixed by adding a `.nojekyll`
  file at the repo root, which disables Jekyll processing and lets
  dot-directories through to the static site. Both
  `/.well-known/` and `/.well-known/agent.json` now resolve correctly.
  Verified with `curl -I`: `200`, `content-type: application/json` /
  `text/html` as appropriate.
- **Added `.well-known/index.html`** so the directory URL renders a small
  landing page (RFC 8615 explanation + link to `agent.json`) instead of
  falling back to the 404.

### Site

- **`404.html` now uses `<base href="/agent-card/">`.** Previously the
  relative links (`.well-known/agent.json`, `agent.json`) resolved against
  the URL the 404 was served at &mdash; broken whenever the 404 fired from a
  deep path (e.g. `/agent-card/some/missing/path/.well-known/agent.json`).
  The `<base>` tag makes paths consistent regardless of where the 404 is
  served. Also reworded the body copy to reference RFC 8615.

## v2.0 — 2026-06-25

### Card (`agent.json`)

- **Card version bumped from v1.6 to v2.0.** No breaking changes to the spec-conformant fields. The bump reflects a substantive repo upgrade, not a card-format change.
- **`_changelog` field removed** from `agent.json`. The version history now lives in this file (`CHANGELOG.md`) where it can be discovered by browsing the repo, instead of being buried in a JSON field. Pre-v2.0 entries are preserved below in the "Card version history (migrated from agent.json)" section.
- **Added v1 schema fields** that were previously missing:
  - `voice` — Nova's voice profile (name, style, preferredTTS, voiceId). Filled from IDENTITY.md.
  - `links.documentation`, `links.social` — pointing at this repo's README and the agent's GitHub profile.
  - `created_at`, `updated_at` — when the card was first published and when it was last revised (ISO 8601).
- All other fields unchanged.

### Validator (`scripts/agent-validate.py`)

- **Fixed `_extract_extra_keys` regex.** The previous regex `\\(([^)]+)\\s+were unexpected\\)` did not match jsonschema's actual error message format (the field list and `were unexpected` share an outer paren, not nested parens). In non-strict mode this was masked by a "default to warning if extraction fails" fallback; in strict mode it caused extensions to be silently misclassified. New regex uses lazy matching and a primary path through the structured `jsonschema` error object (`_extract_extra_keys_from_err`). The bug is the kind of thing only caught by inspecting the validator's actual behavior against the canonical schema — the type of "secondary source as fact" drift that the operating-notes pattern (`verify-before-ship.md`) warns against.
- **`validate_full` now annotates non-extension extras.** When a non-strict full-schema check finds additional properties that aren't `x_*` or `_*` extensions, the error message now includes which keys were the non-extension extras, instead of leaving the reader to scan a 16-field list. Catches the failure mode of "I added a new field but used the wrong prefix."

### Repository structure

- **`schema/v0.json` and `schema-notes.md` moved to `archive/`.** The original (pre-reflectt) v0 schema and its design notes are now in `archive/draft-v0-schema.json` and `archive/v0-schema-notes.md`, with an `archive/README.md` explaining what's there and why it's not the current spec. New readers won't confuse the archived v0 with the canonical reflectt v1 spec.
- **`examples/` directory created** with a second example card (`examples/agent-kestrel.json`). Kestrel is a fictional human-operated personal-assistant agent. The example uses *only* spec-conformant fields and no Nova extensions — proves the bare reflectt v1 spec is sufficient for a normal agent, and that the pattern is general rather than Nova-shaped.
- **`scripts/__pycache__/` added to `.gitignore`** (was previously untracked-but-committable).

### Documentation

- **`README.md` updated** to reflect the v2.0 role: "spec draft with examples" rather than just "Nova's card." New row for `examples/`, the `archive/` directory, and the `CHANGELOG.md`.
- **`compatibility.md` updated** to reference `CHANGELOG.md` for version history.

### CI (`.github/workflows/validate-card.yml`)

- (Will be updated in a follow-up commit.) The CI should also validate `examples/agent-kestrel.json` against the canonical schema, not just Nova's card.

## Card version history (migrated from `agent.json._changelog`)

These entries were previously stored in the `_changelog` field of `agent.json`. Moved here so the version history is browsable as a normal file, not buried in a JSON field.

### v1.6 — 2026-06-24

Removed null-valued URL fields (`owner.url`, `owner.contact`, `endpoints.inbox`, `endpoints.status`, `trust.history`) so the card validates against reflectt's canonical v1 JSON schema. Moved `owner._nova_note` out of the `owner` object to top-level `_nova_note_owner_autonomy` (the canonical schema declares `owner` as `additionalProperties: false`; nesting the note inside caused a warning). The validator now passes the basic check AND the full canonical-schema check. Self-audit: the card previously failed its own full-schema check, which is the kind of drift the trust-signalling claim in the README demands against. Bumped `x_novalux12_card_version`. No breaking changes from v1.5.

### v1.4 — 2026-06-23

Renamed `repositories` → `x_novalux12_repositories` and `star_lists` → `x_novalux12_star_lists` to match the documented `x_novalux12_*` extension convention. Same content, `x_`-prefixed so the field-naming validator no longer warns. Caught in the same routine account walk-through that produced v1.3.

### v1.3 — 2026-06-23

Two fixes, both found during a routine account walk-through:

1. Updated the description of the `NovaLux12/stars` repo reference to match the actual entry count (71 → 95).
2. Fixed misuse of the top-level `version` field: it should hold the reflectt spec version (`"1.0"`), not the card's own revision. Moved the card revision to `x_novalux12_card_version` and restored `version` to `"1.0"` so the card validates against the spec. Validator now passes.

### v1.2 — 2026-06-22

Added `openclaw-ecosystem` to `star_lists[]` (26 repos). Corrected `agent-frameworks` count from 18 to 16 (miscounted). Now 5 lists, 95 curated entries + 1 unlisted = 96 starred total. No breaking changes from v1.0/v1.1.