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
2 changes: 1 addition & 1 deletion .github/ISSUE_TEMPLATE/bug_report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ body:
attributes:
label: adrkit version
description: Output of `adr --version` (or the package version you installed).
placeholder: '0.19.0'
placeholder: '0.20.0'
validations:
required: true
- type: dropdown
Expand Down
4 changes: 2 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

Decision memory for human- and agent-authored plans — machine-readable ADRs
that are enforceable in CI and legible to agents, without leaving git.
Status: early — phases 0–6 landed and v0.19.0 is public. `@adrkit/core`,
Status: early — phases 0–6 landed and v0.20.0 is public. `@adrkit/core`,
`@adrkit/evaluator`, `@adrkit/cli` (`lint`, `new`, `graph`, `explain`,
`check`, `queue`, `accept`, `approve`, `object`, `resolve`, `migrate --from madr`,
`evaluate`) are published on npm, as is
the independently versioned `@adrkit/spec-kit` Spec Kit extension (0.1.5); the
repository-backed CI Action is available at `mbeacom/adrkit/packages/ci@v0`,
and the build-only decision-portal Action at
`mbeacom/adrkit/packages/ci/portal@v0.19.0` (pin an immutable tag, never `@v0`).
`mbeacom/adrkit/packages/ci/portal@v0.20.0` (pin an immutable tag, never `@v0`).
The governing-decisions Action also has a root `action.yml` alias for GitHub
Marketplace beginning with v0.13.0. Root
Marketplace guidance uses immutable release tags; never advertise
Expand Down
186 changes: 112 additions & 74 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,21 +9,77 @@ Until `1.0.0`, minor releases may include breaking changes

## [Unreleased]

### Changed

- **The adrkit.dev site builds on Starlight 0.42.** Every 0.42 bump had failed
`astro build` with `Cannot find native binding`: under the site's isolated
linker (ADR-0010) Vite could not resolve Starlight's `satteri` from the site
root, so it inlined the napi loader into the prerender bundle, where the
platform binding could not be found. The site now lists `satteri` as a direct
dependency so Vite keeps it external, with no hoisting and no linker change,
and Dependabot updates it together with Starlight
([#224](https://github.com/mbeacom/adrkit/issues/224)). The site also picks up
Starlight 0.42's reworked mobile menu, which is meant to open without
JavaScript.
## [0.20.0] - 2026-10-10

This release adds a read-only REST server to the OCI image:
`adrkit-container server` (the image's `server` selector) serves the records,
graph, review queue, issues, and path governance of one or more corpora, and the
decision portal, over `GET` and `HEAD` only
([ADR-0055](docs/adr/0055-serve-a-read-only-rest-api-over-the-sdk-in-the-oci-image-and-reach-mcp-clients-t.md)).
It authenticates no one: run it on localhost or behind a gateway that
authenticates every request. adrkit.dev now serves this repository's own
decision portal at [`/decisions/`](https://adrkit.dev/decisions/), and the
decision-portal Action, `mbeacom/adrkit/packages/ci/portal@v0.20.0`, accepts an
ISO datetime with an explicit timezone as `as-of`. The portal page ships its own
tab icon and, when the REST server hosts it, names the server's
`governing?path=` route. On
npm, `@adrkit/core`, `@adrkit/evaluator`, `@adrkit/cli`, and `@adrkit/mcp` move
to 0.20.0.

**One CLI JSON contract change is not additive, and it can change an exit code.** `adr lint` now
reports a log-qualified `relatesTo` or `conflictsWith` (such as
`payments:0012`) as `federated-ref-unresolved` at `info` instead of
`dangling-relatesTo` (`error`) or `dangling-conflictsWith` (`warn`), so a corpus
whose only error was a qualified `relatesTo` moves from exit `1` to `0` under
`adr lint` and `adr explain`. That is
[ADR-0059](docs/adr/0059-aggregate-decision-corpora-across-an-organization-s-repositories-as-a-pinned-rea.md)
clause 5, which amends
[ADR-0031](docs/adr/0031-publish-a-narrow-consumer-sdk-as-the-contract-and-document-the-cli-json-as-its-s.md)
clause 5's additive-only CLI JSON contract for exactly this case; a
log-qualified `supersedes` or `supersededBy` stays an error, and `adr evaluate`
now fails a qualified `supersedes` too. Separately, a `repo`-qualified `affects` matcher that cannot
apply in a single-repository corpus is reported as an `info` finding,
`affects-repo-not-applicable`, instead of being skipped silently
([#300](https://github.com/mbeacom/adrkit/issues/300)); it changes no exit code.

`@adrkit/core` gains public exports: `todayUtcDate()`, the `--as-of` default
the CLI, the queue Action, and the SDK now share; the `adr explain`, `adr lint`,
and `adr new` JSON builders and formatters, whose output is byte-identical to
the CLI's before; and the repository-qualifier validator. Its unused `log` input on `resolveAffects` and `checkChanges` is
replaced by `member: { log, repo }`. `@adrkit/sdk` closes the publication
gates this release could close (ADR-0031 action items 4, 5, 6, and 8; ADR-0053
action items 3, 5, and 8), and it is still not published: there is no npm
package, and ADR-0053 action item 9 and a publication record come first.
Dependency bumps that touch only the documentation site (#313) and
maintainer-only publishing notes (#306) are not listed.

### Added

- **A read-only REST server in the OCI image, `adrkit-container server`.**
This server authenticates no one: run it on localhost or behind a gateway
that authenticates every request. It serves `GET` and `HEAD` only, under
`/api/v1/corpora/{corpus}`: `records`, `records/{id}`, `graph?kinds=`,
`queue?asOf=`, `issues`, and `governing?path=`, plus `/api/v1/corpora`,
`/openapi.json`, `/healthz`, and the decision portal at `/`
([ADR-0055](docs/adr/0055-serve-a-read-only-rest-api-over-the-sdk-in-the-oci-image-and-reach-mcp-clients-t.md)).
Every answer is `{ corpus, commit, data }`, with the commit read from the
`.adrkit-corpus.json` file the populator writes next to the records; a corpus
without one is not served. Configure it with `ADRKIT_SERVER_CORPORA`
(`key[=dir],...` or a JSON object), `ADRKIT_SERVER_ROOT`,
`ADRKIT_SERVER_HOST` (default `127.0.0.1`), and `ADRKIT_SERVER_PORT`
(default `8080`); see [Container usage](README.md#the-read-only-rest-server).
It runs no `git`, spawns no process, and opens no outbound connection.
`governing` matches `affects` only: it never reads the file at the path, so
it has no `@adr` marker evidence.
- **The server-hosted decision portal points at the server's own
`governing?path=` route** ([#315](https://github.com/mbeacom/adrkit/issues/315),
ADR-0055 clause 9). The governance-by-path view still says this host has no
path table, and now names the route, relative to the page, with an example
such as `../../api/v1/corpora/demo/governing?path=src/index.ts`. The page
shows it as text and never requests it, so the renderer, its CSP, and the
GitHub Pages host are unchanged. `portal-data.json` grows one additive
top-level field, `pathLookup` (`{ route }` or `null`); `version` stays `"1"`,
and a Pages bundle carries `"pathLookup": null`.
- adrkit.dev serves this repository's own decision portal at
[`/decisions/`](https://adrkit.dev/decisions/), built on every site deploy by
the nested portal Action from the same checkout, and linked from the
Expand All @@ -33,6 +89,38 @@ Until `1.0.0`, minor releases may include breaking changes
would break under a subpath
([ADR-0054](docs/adr/0054-publish-a-static-decision-portal-for-github-pages-built-outside-the-cli-from-the.md)
action item 8, #294).
- **`@adrkit/core` exports `todayUtcDate()`, the `--as-of` default.** When
`--as-of` is absent, `adr queue`, the queue Action, and `adr new` now take
today's UTC date from this one function instead of three inline copies. So
does the unpublished `@adrkit/sdk`, and the decision-portal Action now takes
its default from the SDK rather than computing a fifth copy.
- **The decision-portal Action's `as-of` accepts an ISO datetime with an
explicit timezone**, as `adr queue --as-of` does, and resolves it to the UTC
calendar date. A timezone-less datetime is still refused. Underneath, the
unpublished `@adrkit/sdk`'s `queue({ asOf })` takes the same grammar and
echoes the resolved date. A library consumer can now default the
queue exactly as CI does, instead of risking a local-date default that
disagrees near midnight
([ADR-0031](docs/adr/0031-publish-a-narrow-consumer-sdk-as-the-contract-and-document-the-cli-json-as-its-s.md)
action item 8). No output changes.
- **`@adrkit/core` owns the `adr explain`, `adr lint`, and `adr new` JSON
shapes.** `buildExplainReport`/`formatExplainReportJson`,
`buildLintReport`/`formatLintReportJson`, and
`buildNewAdrReport`/`formatNewAdrReportJson` join `formatQueueReportJson` and
`renderJsonGraph`, and the CLI prints their output (ADR-0031 action item 4).
The bytes are unchanged, which goldens captured before the change pin.
- **A conformance fixture for the CLI JSON contract.** A fixed corpus with
golden `adr queue --format json` and `adr check --json` output, at
`packages/core/test/conformance/golden/`. The CLI and `@adrkit/sdk` are
tested against it, and a downstream repository can run its `manifest.json`
against the `adr` it pins
([ADR-0030](docs/adr/0030-keep-extension-surfaces-that-carry-a-dependency-tree-outside-this-repository.md)
clause 5).
- **`docs/RELEASING.md` documents the two consumer contracts**: the
`@adrkit/sdk` surface (still unpublished) and the CLI JSON, each with the
additive-only obligation stated (ADR-0031 action item 5).

### Changed

- **Behavior change: `adr lint` no longer fails on a log-qualified `relatesTo`
or `conflictsWith`.** A reference such as `relatesTo: ["payments:0012"]` names
Expand Down Expand Up @@ -62,33 +150,16 @@ Until `1.0.0`, minor releases may include breaking changes
supplied (before, it was inert without a snapshot and passed when the snapshot
listed the id), and a log-qualified `supersededBy` names clause 4 in its
existing failure.

- **A read-only REST server in the OCI image, `adrkit-container server`.**
This server authenticates no one: run it on localhost or behind a gateway
that authenticates every request. It serves `GET` and `HEAD` only, under
`/api/v1/corpora/{corpus}`: `records`, `records/{id}`, `graph?kinds=`,
`queue?asOf=`, `issues`, and `governing?path=`, plus `/api/v1/corpora`,
`/openapi.json`, `/healthz`, and the decision portal at `/`
([ADR-0055](docs/adr/0055-serve-a-read-only-rest-api-over-the-sdk-in-the-oci-image-and-reach-mcp-clients-t.md)).
Every answer is `{ corpus, commit, data }`, with the commit read from the
`.adrkit-corpus.json` file the populator writes next to the records; a corpus
without one is not served. Configure it with `ADRKIT_SERVER_CORPORA`
(`key[=dir],...` or a JSON object), `ADRKIT_SERVER_ROOT`,
`ADRKIT_SERVER_HOST` (default `127.0.0.1`), and `ADRKIT_SERVER_PORT`
(default `8080`); see [Container usage](README.md#the-read-only-rest-server).
It runs no `git`, spawns no process, and opens no outbound connection.
`governing` matches `affects` only: it never reads the file at the path, so
it has no `@adr` marker evidence.

- **The server-hosted decision portal points at the server's own
`governing?path=` route** ([#315](https://github.com/mbeacom/adrkit/issues/315),
ADR-0055 clause 9). The governance-by-path view still says this host has no
path table, and now names the route, relative to the page, with an example
such as `../../api/v1/corpora/demo/governing?path=src/index.ts`. The page
shows it as text and never requests it, so the renderer, its CSP, and the
GitHub Pages host are unchanged. `portal-data.json` grows one additive
top-level field, `pathLookup` (`{ route }` or `null`); `version` stays `"1"`,
and a Pages bundle carries `"pathLookup": null`.
- **The adrkit.dev site builds on Starlight 0.42.** Every 0.42 bump had failed
`astro build` with `Cannot find native binding`: under the site's isolated
linker (ADR-0010) Vite could not resolve Starlight's `satteri` from the site
root, so it inlined the napi loader into the prerender bundle, where the
platform binding could not be found. The site now lists `satteri` as a direct
dependency so Vite keeps it external, with no hoisting and no linker change,
and Dependabot updates it together with Starlight
([#224](https://github.com/mbeacom/adrkit/issues/224)). The site also picks up
Starlight 0.42's reworked mobile menu, which is meant to open without
JavaScript.

### Fixed

Expand All @@ -109,7 +180,6 @@ Until `1.0.0`, minor releases may include breaking changes
is replaced by an explicit `member: { log, repo }` identity, and
`matcherAppliesToMember` applies a qualified matcher when it equals either
name. No surface passes a member yet; that is ADR-0059's federation work.

- **The decision portal ships its own tab icon**
([#309](https://github.com/mbeacom/adrkit/issues/309)). Without one, every
load also requested `/favicon.ico` at the host root and logged a 404 on a
Expand All @@ -120,39 +190,6 @@ Until `1.0.0`, minor releases may include breaking changes
`/portal/{corpus}/page/icon.svg` as `image/svg+xml` (operation
`getPortalIcon`).

### Added

- **`@adrkit/core` exports `todayUtcDate()`, the `--as-of` default.** When
`--as-of` is absent, `adr queue`, the queue Action, and `adr new` now take
today's UTC date from this one function instead of three inline copies. So
does the unpublished `@adrkit/sdk`, and the decision-portal Action now takes
its default from the SDK rather than computing a fifth copy.
- **The decision-portal Action's `as-of` accepts an ISO datetime with an
explicit timezone**, as `adr queue --as-of` does, and resolves it to the UTC
calendar date. A timezone-less datetime is still refused. Underneath, the
unpublished `@adrkit/sdk`'s `queue({ asOf })` takes the same grammar and
echoes the resolved date. A library consumer can now default the
queue exactly as CI does, instead of risking a local-date default that
disagrees near midnight
([ADR-0031](docs/adr/0031-publish-a-narrow-consumer-sdk-as-the-contract-and-document-the-cli-json-as-its-s.md)
action item 8). No output changes.
- **`@adrkit/core` owns the `adr explain`, `adr lint`, and `adr new` JSON
shapes.** `buildExplainReport`/`formatExplainReportJson`,
`buildLintReport`/`formatLintReportJson`, and
`buildNewAdrReport`/`formatNewAdrReportJson` join `formatQueueReportJson` and
`renderJsonGraph`, and the CLI prints their output (ADR-0031 action item 4).
The bytes are unchanged, which goldens captured before the change pin.
- **A conformance fixture for the CLI JSON contract.** A fixed corpus with
golden `adr queue --format json` and `adr check --json` output, at
`packages/core/test/conformance/golden/`. The CLI and `@adrkit/sdk` are
tested against it, and a downstream repository can run its `manifest.json`
against the `adr` it pins
([ADR-0030](docs/adr/0030-keep-extension-surfaces-that-carry-a-dependency-tree-outside-this-repository.md)
clause 5).
- **`docs/RELEASING.md` documents the two consumer contracts**: the
`@adrkit/sdk` surface (still unpublished) and the CLI JSON, each with the
additive-only obligation stated (ADR-0031 action item 5).

## [0.19.0] - 2026-10-10

This release ships the decision portal: a third, build-only nested Action,
Expand Down Expand Up @@ -2430,7 +2467,8 @@ against live Spec Kit, rather than reasoning about it:
- Node-targeted published distribution of all packages, smoke-tested under Node
22 and 24.

[Unreleased]: https://github.com/mbeacom/adrkit/compare/v0.19.0...HEAD
[Unreleased]: https://github.com/mbeacom/adrkit/compare/v0.20.0...HEAD
[0.20.0]: https://github.com/mbeacom/adrkit/compare/v0.19.0...v0.20.0
[0.19.0]: https://github.com/mbeacom/adrkit/compare/v0.18.0...v0.19.0
[0.18.0]: https://github.com/mbeacom/adrkit/compare/v0.17.0...v0.18.0
[0.17.0]: https://github.com/mbeacom/adrkit/compare/v0.16.0...v0.17.0
Expand Down
9 changes: 5 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -465,7 +465,7 @@ answer where the next decision is actually being made.
It never approves anything. It routes, and humans decide.

The root Marketplace entry point has shipped with every release since
`v0.13.0`. Pin its immutable root reference — currently `v0.19.0` — for the
`v0.13.0`. Pin its immutable root reference — currently `v0.20.0` — for the
complete governing-decisions workflow (see
[Use in CI](https://adrkit.dev/ci/)):

Expand All @@ -484,7 +484,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: mbeacom/adrkit@v0.19.0
- uses: mbeacom/adrkit@v0.20.0
```

Existing consumers of the nested form can stay on
Expand Down Expand Up @@ -531,10 +531,11 @@ table is the short version:
| Available now | `@adrkit/core`, `@adrkit/cli`, `@adrkit/evaluator`, `@adrkit/mcp` | Published on npm for Node 22+ |
| Available now | `@adrkit/spec-kit` | Published separately for current Spec Kit releases |
| Available now | `adr queue`, `adr approve`, `adr object`, `adr resolve`, `adr accept`, and the governing-decisions GitHub Action | Queue reporting, recorded review state, ratification from the queue, and PR comments are part of the shipped workflow |
| Available now | Decision portal Action (`packages/ci/portal`) | Builds a static, read-only portal for GitHub Pages, beginning with `v0.19.0`; the private `@adrkit/portal` generator ships only inside it |
| Available now | Decision portal Action (`packages/ci/portal`) | Builds a static, read-only portal for GitHub Pages, beginning with `v0.19.0`; its `as-of` accepts an ISO datetime with an explicit timezone beginning with `v0.20.0`; the private `@adrkit/portal` generator ships only inside it |
| Available now | Read-only REST server in the OCI image (`adrkit-container server`, the `server` selector) | Serves a read-only REST API and the decision portal over one or more corpora, beginning with `v0.20.0`; it authenticates no one, so run it on localhost or behind an authenticating gateway; the private `@adrkit/server` ships only inside the image |
| Available now | `adrkit` agent plugin | Install from this repository or marketplace; shells out to `adr` |
| In development | Later evaluator passes | Passes 1–3 and calibration remain design targets; Pass 0 is the implemented evaluator surface |
| In development | `@adrkit/sdk` | Implemented over `@adrkit/core` and used by the portal, but unpublished at `0.0.0`; there is no npm package |
| In development | `@adrkit/sdk` | Implemented over `@adrkit/core` and used by the portal and the REST server, but unpublished at `0.0.0`; there is no npm package |
| In development | Catalog packages | `@adrkit/catalog-envelope` and `@adrkit/catalog-backstage` exist in the workspace at `0.0.0` and are not released |
| Planned | Additional downstream integrations | Future integrations will build on the current typed corpus and read-only retrieval model |

Expand Down
8 changes: 4 additions & 4 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading