Repository navigation
Releases: unified-systems-com/tap
Releases · unified-systems-com/tap
Release list
v0.3.0
0.3.0 (2026-10-07)
Features
- cares: one PRODUCED_BATCH edge per (job, batch), and a claim on a batch another job imported is refused [via edge-updates] (ddefc9a)
- cares: one PRODUCED_BATCH edge per (job, batch), and at most one job holds a batch as imported (96986ec)
- cares: reconcile a stale RUNNING CollectionJob a dead worker left behind (6972202)
- cares: reconcile a stale RUNNING CollectionJob a dead worker left behind (7926af2)
- ci: admit the org-bots fork bot by id and recorded account type (d3c3269)
- ci: admit the org-bots fork bot by id and recorded account type [via bom-bom] (5aab218)
- cicd: add the product-health reusable workflow [via bom-bom-support] (#893) (a17a554)
- cicd: plugins inherit one nightly instead of copying a reporter 15 times (4bfffd1)
- cicd: plugins inherit one nightly; the plugin CVE gate stops ignoring unfixed [via demo-dev] (57a7cb4)
- dev: a pre-push hook refuses the pushes CI rejects for bookkeeping (4c33149)
- dev: a pre-push hook refuses the pushes CI rejects for bookkeeping [via demo-dev] (e86d386)
- grid: a deletes target may name its edge by identity and ends the live match (ae56627)
- grid: a deletes target may name its edge by identity and ends the live match [via edge-updates] (ac092bc)
- grid: a hotlink's edge type must be a defined edge; register tap_viz's six [via highbar] (bad2f95)
- grid: a hotlink's edge type must be a defined edge; register tap_viz's six [via highbar] (1da9bb3)
- grid: a NATURAL_KEY entry may name a path into a JSON field (d5a8810)
- grid: a NATURAL_KEY entry may name a path into a JSON field [via git-serious] (3ebcab4)
- grid: a service write that mints a batch must say what the change is (021165a)
- grid: a service write that mints a batch must say what the change is [via highbar] (32148e0)
- grid: edge authority dry-run: a batch claims a scope's edges are total, and the importer records what that would remove (932b6f7)
- grid: edge authority dry-run: a batch claims a scope's edges are total, and the importer records what that would remove [via edge-updates] (c799308)
- grid: edge endpoints by natural key, and a skip event for an endpoint that names nothing (691e073)
- grid: edge endpoints by natural key, and a skip event for an endpoint that names nothing [via edge-updates] (7b4092e)
- grid: edge identity: edge types declare it and the importer finds edges by it [via edge-updates] (983806c)
- grid: edge types declare their identity; every core edge type does (6cd5f55)
- grid: entity_liveness says whether each id is live, tombstoned or missing, in one query (76ff04a)
- grid: entity_liveness says whether each id is live, tombstoned or missing, in one query (+1 more) [via edge-updates] (cfde42f)
- grid: export_grift carries retired entities, subset selectors and a contents declaration (aadf52a)
- grid: export_grift carries retired entities, subset selectors and a contents declaration [via highbar] (8e015d3)
- grid: find a ref-addressed edge by its type's declared identity at import (e0dd158)
- grid: FLIP records the batch that retired an object (06fc85b)
- grid: FLIP records the batch that retired an object [via highbar] (c1aea29)
- grid: internal-only edge types: the generic verbs and GRIFT refuse four bookkeeping edges (007144b)
- grid: internal-only edge types: the generic verbs and GRIFT refuse four bookkeeping edges [via edge-updates] (53463d2)
- grid: let service-layer writes name the batch they mint (40c9d3e)
- grid: let service-layer writes name the batch they mint (4e3e3af)
- gryphon: ReadScope part 1 — every read scoped at root, joins and endpoints (5f3fe8e)
- gryphon: ReadScope part 1 — tombstone liveness at every relation of every read [via highbar] (0487fbc)
- plugin-ci: scan the plugin's own closure with Trivy; no job holds contents: write (5e0df54)
- plugin-ci: Trivy-scan the plugin's own closure; no job holds contents: write [via bom-bom] (d0e3991)
- plugins: the caller must grant security-events, not repository write (3d7e1a1)
- plugins: the conformance checker reaches the repository shell, opt-in (f275005)
- plugins: the conformance checker reaches the repository shell, opt-in [via demo-dev] (a6209d7)
- pr-tooling: detect merge conflicts on open PRs and say how to resolve them (caf3bd0)
- pr-tooling: detect merge conflicts on open PRs and say how to resolve them [via bom-bom] (6f716c5)
- validate: a missing nightly fails; core runs no central sweep (Q107) (d025e3e)
- validate: refuse a git source that pins a tag with no commit (493-D) [via double-tap-git-serious] (e2089dd)
- viz: graph nodes carry their model fields as node.data("fields") (e51c8aa)
- viz: graph nodes carry their model fields as node.data("fields") [via highbar] (0ff1a86)
- viz: status-badge info-window rows can link out via row_url_template (7f1fadb)
- viz: status-badge info-window rows can link out via row_url_template ([383a32e](383a32e21abae1660463c2dc3be5a...
v0.2.2
0.2.2 (2026-09-24)
Features
- dev: --lite / --promote — a running stack is no longer the price of a worktree (45228bd)
- dev: --lite / --promote — a running stack is no longer the price of a worktree [via gsdt] (99270c5)
- dev: derive each session's port band from its name [via gsdt] (6c9e501)
- dev: derive each session's port band from its name, not from a scan at 1 (b7e4f33)
- gryphon:
$p IS [NOT] NULL— a predicate on an input alone (tap#360) (f0299ff) - web: NESTS_UNDER page-to-page edge for an explicit nav parent [via highbar] (84131eb)
- web: NESTS_UNDER page-to-page edge nests a page under an explicit nav parent (efafd54)
Bug Fixes
- auth: owner_only alone was not enough — bind the owner grant by provider TYPE (3746c2e)
- auth: the owner grant claimed (provider, uid) and compared only uid (d314f8b)
- ci: a markdown change is not a bill-of-materials change (1be1c33)
- ci: a markdown change is not a bill-of-materials change [via gsdt] (75a424a)
- ci: bound the exclusion to skill prose, on an existing ruling (1b07232)
- ci: bound the markdown exclusion to tap_boot, and to the declared globs (60fc508)
- ci: redact gate-lean's container logs — an argument is not a control (b3cdda0)
- ci: the BOM declaration named a Dockerfile that does not exist (b8f6d32)
- ci: the BOM declaration named a Dockerfile that does not exist [via gsdt] (7b69642)
- codespaces:
command: sleep infinityis required — the previous fix had it backwards (57cd4b1) - codespaces: a visitor can sign in and a maintainer can SSH in [via demo-dev] (e72cc2a)
- codespaces: devbox never started sshd —
command:displaced its entrypoint (577bc24) - codespaces: pass the Codespaces inputs to
web, not just the attach target (e32de7a) - codespaces: tag@digest is unparseable — and the failure is SILENT, not loud (28271c9)
- codespaces: the login wall sent Codespace visitors to a passkey they cannot use (7ba650c)
- codespaces: the owner gets a role, the boot runs, and the page says what to do (f47fd2c)
- codespaces: trust the localhost origin too, and stop reporting a 403 as unreachable (227cb98)
- dc: check what compose RESOLVES, not what was typed (44a96bc)
- dc: escape seven — pipefail made the fail-closed sentinel fail open (3288020)
- dc: strip quotes like compose does, and stop AC2 claiming an untested boot (c3c9822)
- dc: the gate on the root check was itself an input inspection (ad16504)
- deps: update dependency htmx.org to v2.0.11 (aef89e8)
- deps: update dependency htmx.org to v2.0.11 (4b985de)
- dev: don't source the lite marker; keep it until promote actually succeeds (2e20292)
- dev: validate the promote name; verify the .env.local patch landed (d8f0ced)
- docker: the web container serves unprivileged [via demo-dev] (d96abb9)
- gryphon: a dotted path into
dimensionssilently returned 0 rows (08290cf) - gryphon: a variable reused inside ONE pattern was not unified (8960049)
- gryphon: refuse a multi-step path into
dimensions(reverses the B2 design) (b2a2947) - gryphon: the param-null fold subscripts
inputs, so an absent param fails closed (bd3e153) - gryphon: two wrong-answer defects, one new input predicate, and the judge that agreed with both bugs [via gryphon] (1bd183d)
- tests: clear the mypy ratchet and re-stamp two stale implementation claims (76db0f9)
- web: cookie-name cleaning never collides distinct labels (58e30d6)
- web: only row_url_template sets a projection row's _url (01b6943)
- web: per-stack session and CSRF cookie names; scripts read the CSRF token from base.html (8708c9b)
- web: per-stack session/CSRF cookie names; scripts read CSRF from base.html [via highbar] (51f6a08)
- web: row links are judged on the URL the browser parses (9eedf53)
- web: row_url_template's same-origin rule holds at use, not only on save (03a75e3)
- web: the standard table renders a projection search's rows (df1a8c3)
- web: the standard table renders a projection search's rows [via highbar] (1016ad5)
Documentation
- dev: state the invariants; stop citing this PR's own review in the code (9c3762c)
- dimension keys are queried by bracket; a dotted path is refused (tap#781) (96a34d4)
- dimension keys are queried by bracket; a dotted path is refused (tap#781) [via highbar] (0347149)
- drop a citation to a requirement that is not on main yet (5881b91)
- grid: param-null is
In Development, notImplemented— it never cleared its gates (db004d4) - grid: req-grid-dimension-query-form is Implemented (b4bab8f)
- grid: req-grid-dimension-query-form is Implemented [via highbar] ([ebf3034](https:/...
v0.2.1
0.2.1 (2026-09-22)
Features
- auth: a device-flow provider carries a public client_id and no secret (bcda354)
- auth: device-flow login views — the browser polls, the pipeline decides (e3905b0)
- auth: GitHub device-flow token acquisition — a secretless public client (bdb6c72)
- cares: operator arming switch for a collector's reconcile authority — cares.arm_reconcile, audited, off by default (Issue# 655) [via double-tap-git-serious] (17d4a61)
- cares: the operator arming switch — cares.arm_reconcile gates tap_cares.services.arm_reconcile, which sets a collector's reconcile authority and budget as the collector program actor through the trusted-internal patch on an audit batch of its own (operator, before, after, when); manage.py arm_reconcile <registry> --on|--off [--budget N] --as <username>; off stays the default (2246d86)
- cicd: a version tag requires no fixable High/Critical vulnerability [re-target to main] (be8eccb)
- cicd: plugin CI submits the plugin's own dependency closure, so Dependabot can see it (c51bd46)
- cicd: plugin CI submits the plugin's own dependency closure, so Dependabot can see it (69fee0c)
- grid: manage.py export_grift — serialise a live grid to a re-importable GRIFT batch (0ca266b)
- grid: manage.py export_grift — serialise a live grid to a re-importable GRIFT batch (b3114e0)
- grid: the cascade corpus drives the reconcile verb — a
reconcileoperation (observed, dropped, budget) builds the run's write batch, completeness statement, candidate record and armed authority from the scenario graph, a fake source answers the probe, and the model oracle and the runner both check applied / contradicted / not_applicable outcomes; four scenarios pin the contradiction rule beside the cascade it would trigger (Issue# 662 - tap) (1be584d) - grid: the cascade corpus drives the reconcile verb — contradiction, cap, applied and present scenarios (Issue# 662) [via double-tap-git-serious] (8d0ef6c)
- guards,skills: architecture.md gets a fitness guard and an update-architecture walkthrough (b621d36)
- tap_cares: generic run_with_ceiling() for any collector's blocking calls (06b8e73)
- tap_cares: generic run_with_ceiling() for any collector's blocking calls [via gsdt] (ff7dee1)
- tap_cares: name the run_with_ceiling worker thread per caller (5d04cf9)
Bug Fixes
- auth: authorize GitHub accounts by numeric id only, never the login (daaa001)
- auth: keep exception detail in the log, not in the device-flow response (65c624e)
- auth: make both identity writes unconditional, and turn PKCE on (6c15062)
- auth: no empty-secret literal; narrow nosec on two false positives (379321a)
- auth: redact the refusal path; report an unruled route as a security FLAW (a3cd50a)
- auth: report an unrecognised client_id as such, not as a malformed response (68cc6ac)
- auth: rule on provider routes too — the last inherit-by-default path (765e798)
- boot: bump github_core to v0.10.0 with git_core v0.1.1 — the dependencies and the dependent move together (afef58e)
- boot: profiles carry github_core's sibling plugins, in dependency order (ab4cf87)
- boot: profiles carry github_core's sibling plugins, in dependency order (97eda72)
- cares: the arming switch is one locked transaction (Collector row FOR UPDATE, audit batch closed with the write); the audit names the shell's OS user beside the claimed operator; a call with no actor is refused before any read; the requirement row is -12 (the -11 id was already taken) (review round 1, PR# 665 - tap) (96e0511)
- cicd: drop the snapshot CLI's --out — an argv-supplied write path it never needed (dcb1d94)
- grid: drop the TYPE_CHECKING
Edgethe runtime imports already bind (9b7ef92) - grid: export_grift — a derived serialisation time, and close the skip ledger over edge spine rows (caa4621)
- grid: export_grift — one snapshot, a clean stdout, and tests for the command (57581e1)
- grid: export_grift writes the snapshot 0600, not at the ambient umask (87f78d2)
- grid: the reconcile corpus runner holds every batch but the lifecycle batch to the exact-state invariant, allows exactly the verb's one write batch as new, asserts the present scenario probed the source exactly once, checks the contradiction's count, and raises instead of asserting (review round 1 + Codacy, PR# 673 - tap) (757784e)
- guards: drop the illustrative RID from the architecture guard — check-rids reads it as a citation (3e8141e)
- guards: the architecture guard raises AssertionError instead of asserting (6ef1faf)
- guards: the vacuity detector learns the raise-based no-op shape (d6585fb)
- health: bound probe
detailto the exception type, never its message (90c8503) - health: bound probe
detailto the exception type, never its message (f6c0b8d) - health: close two AI-review findings on the leak guard (481c7a0)
- health: give the raising test probe a real probe signature (mypy ratchet) (32e47c0)
- plugins: only the absent tap_plugin namespace reads as not-installed — an import error from inside an installed namespace still raises; the module's implements claim re-stamped (review round 1, PR# 667 - tap) (c4d6c87)
- plugins: validate_plugin reads a missing tap_plugin namespace as "dependency not installed here" instead of crashing — find_spec on a dotted name imports the parent first, and the conformance lane's tooling venv holds no plugin at all (found on PR# 154 - tap-plugin-github-core under tap v0.2.0) (834bbda)
- plugins: validate_plugin treats a missing tap_plugin namespace as a dependency not installed here, not a crash (Issue# 666) [via double-tap-git-serious] (832d910)
- tap_cares: name the idempotency constraint the ceiling contract was missing ([5c27aef](https://github.c...
v0.2.0
0.2.0 (2026-09-20)
⚠ BREAKING CHANGES
- grid: derive the natural key as UUIDv8 over SHA-256, retiring SHA-1 from the identity layer
Features
- boot: adopting a plugin release writes rev + resolved commit as one pair (3588f10)
- boot: adopting a plugin release writes rev + resolved commit as one pair (bc628d4)
- boot: install git plugins by pinned commit; report tag drift as a security Flaw (916aa1b)
- boot: install git plugins by pinned commit; report tag drift as a security Flaw (2ffaef8)
- ci: api-fuzz-nightly fails loudly; plugin-ci gains the after-tests hooks the fuzz campaign rides (9c9e189)
- cicd: a version tag requires verified attestations, and :latest moves last (45cfc93)
- cicd: a version tag requires verified attestations, and :latest moves last (50ccab0)
- cicd: Renovate watches the boot-record plugin pins, moving rev and commit together (9d6b4a2)
- cicd: Renovate watches the boot-record plugin pins, moving rev and commit together (af8c5cc)
- ci: hand the after-tests command both commits so a ledger row can stamp its provenance (e5c45cc)
- ci: one reusable nightly reporter — a red or unobserved nightly becomes one owner issue (e0acc55)
- fips: plugin conformance derives the boot gate's verdict for the plugin's own ci stack — one classifier, one waiver matching, one answer (a582978)
- fips: plugin conformance derives the boot gate's verdict for the plugin's own ci stack (one classifier, one waiver matching) (958c119)
- grid,cares,web: the completeness statement — six evidence attributes per surface on the run's Batch (phase 4 slice 1) (b286ad7)
- grid,cares,web: the completeness statement — six evidence attributes per surface on the run's Batch, authority off (adc7d15)
- grid,plugins: every declared edge type must resolve — a boot-time check and its validate_plugin mirror (8ceb302)
- grid,plugins: every declared edge type must resolve — boot-time check tap_grid.E004 and its validate_plugin mirror (d15f04e)
- grid: batch playground, second pass — reload and schedule families, five authored datasets, three-truths checker, symbolic ids, metamorphic checks (Issue# 613 - tap) (2052f36)
- grid: batch playground, second pass — reload and schedule families, five authored datasets, three-truths checker, symbolic ids, metamorphic checks (Issue# 613 - tap) (637fa2a)
- grid: batch-local refs on the GRIFT envelope — entity_id XOR ref, endpoint refs, one resolution pass before preflight, the ref→id map on the result (gate slice 1) (cac1a68)
- grid: batch-local refs on the GRIFT envelope — gate slice 1 (entity_id XOR ref, endpoint refs, one resolution pass, ref→id map) (92d0445)
- grid: candidate derivation for reconciliation — fan-out minus observed, per-parent prerequisite, withdrawal distinct, authority off (12475f4)
- grid: cascade as a declared walk — CONTAINMENT_EDGES on the model, delete_node(cascade="contained"), reason and metadata on delete (b2852b6)
- grid: classify all fifteen core entity types, and guard that none stays undeclared (554173e)
- grid: derive the natural key as UUIDv8 over SHA-256, retiring SHA-1 from the identity layer (59563ef)
- grid: each node declares how it is found, and the search is generated (93288c9)
- grid: Entity.natural_key — the column and the spine surface, inert (b9eb217)
- grid: Entity.natural_key — the column and the spine surface, inert (phase 1.1) (0e5e54a)
- grid: Entity.natural_key becomes a text placeholder; the hashed derivation and its backfill go (5c9be64)
- grid: identity phase 2 — placeholder column, declared search, contained cascade (2.1–2.3 to main) (61f7995)
- grid: per-type falsifiers, authority off — [falsifiers] manifest table, Falsifier base + registry, five verdicts, pure probe classification, verdicts recorded on the run Batch, coverage ratchet (phase 4 slice 3, Issue# 644 - tap) (deffe1b)
- grid: per-type falsifiers, authority off — manifest [falsifiers] table, Falsifier base + registry, five verdicts, pure probe classification, verdicts recorded on the run Batch, coverage ratchet (phase 4 slice 3) (699c3b1)
- grid: reconcile contradiction detector — a tombstone never cascades over a node the run observed live (Issue# 656) (0837b4f)
- grid: resolve_identity — a ref node finds its existing row or keeps its assigned id, under a declaration-keyed lock inside the batch transaction; ambiguity fails the batch with one Flaw (gate slice 2) (4703a78)
- grid: resolve_identity — gate slice 2 (find-or-assign under a declaration-keyed lock inside the batch transaction; ambiguity fails the batch with one Flaw) (3d06470)
- grid: the batch playground — a known-answer corpus for the GRIFT import path (Issue# 603 - tap) (53cb4fd)
- grid: the batch playground — a known-answer corpus for the GRIFT import path with a reference oracle, a checker proven against corrupted runs, and a two-writer timing family (6cfc3d9)
- grid: the cascade confirmation corpus — 63 known-answer scenarios, a reference oracle, and a timing family (a3c223c)
- grid: the cascade confirmation corpus — 76 known-answer scenarios, a set-based reference oracle, and a timing family (46305db)
- grid: the natural-key backfill — report, apply, check (b1d1baa)
- grid: the natural-key derivation and the declaration contract (f1af769)
- grid: the natural-key derivation, the fifteen classifications, and the backfill (phase 1.2-1.4) (54ab567)
- grid: the reconcile contradiction detector — a candidate whose contained closure holds a node the same run observed live is recorded
contradictionon the candidate record, refused unprobed by the dispatch whatever the authority, and never applied; a tombstone whose closure holds a node observed by any committed batch since derivation iscontradictedat apply with the closure locked first; the closure is read through a new service gatew...
v0.1.6
0.1.6 (2026-09-10)
Features
- plugin-ci: fail closed without a
cirecord, and test the plugin's declared floor (8e69971) - plugin-ci: fail closed without a ci record; the plugin's declared floor is the harness (f64030e)
- web,boot: the landing page is the operator's decision — web.landing_entity_id + web.landing_slug in the boot profile; LandingPage node retired (#340) (7c52f71)
- web,boot: the landing page is the operator's decision — web.landing_entity_id + web.landing_slug in the boot profile; LandingPage node retired with row cleanup (da2f6ad)
- web: table columns take align (cell + heading together) and a capitalized formatter; toneBadge capitalizes under capitalize: true (0abaf58)
- web: table columns take align; a capitalized formatter; toneBadge capitalize (02251f5)
- web: table panel — minimal chrome for one-row tables, a toneBadge formatter (value → good/bad/warn/muted), one-level column groups, and quiet links (no blue, no underline) (95e5ed3)
- web: table panel — minimal chrome, toneBadge formatter, column groups, quiet links (the identity-row affordances) (d214c1e)
- web: USES_PANEL carries fixed panel inputs — a page pins a shared panel's variable instead of copying the panel (c0ec72c)
- web: USES_PANEL carries fixed panel inputs — a page pins a shared panel's variable instead of copying the panel (1030aba)
Bug Fixes
- ci: bom-boot parses pytest's collected-count line; the change-tier test names its interpreter (d31040d)
- ci: bom-boot survives a plugin whose tests package is empty, and says so (f346bae)
- ci: check-issue-link exempts a PR by authenticated bot identity (id + Bot) from a declared allowlist; tap-renovate[bot] approved, stock renovate[bot] removed (#342) (16a3f45)
- ci: check-issue-link exempts a PR by its authenticated bot IDENTITY (numeric id + type Bot) from a declared, schema-validated allowlist — not by login; tap-renovate[bot] approved, stock renovate[bot] and github-actions[bot] removed (4a6be3b)
- deps: update dependency cytoscape to v3.34.3 (bc976a7)
- deps: update dependency cytoscape to v3.34.3 (f8de92c)
- docs-trace: check-rids carves out the /new-plugin pre-canon staging path — docs/misc/preplugin-*.md is excluded from the citation scan BY NAME (req-docs-rid-integrity-5), so a planning doc's self-defined RIDs no longer red the docs tier (PR# 346 - tap) (05a77e8)
- docs-trace: check-rids carves out the /new-plugin pre-canon staging path (docs/misc/preplugin-*.md) — req-docs-rid-integrity-5, re-lands the git_core planning doc (142907b)
- docs-trace: the pre-canon carve-out matches the skill's exact grammar
preplugin-<slug>-v<N>.md, not a bare prefix — apreplugin-x-backup.mdgets no ride (Codex seat on PR# 348 - tap) (1c11275) - grid: the retired-type strip fails closed on an identity collision — a retired node reusing a retained node's or a live entity's id refuses the seed instead of dropping that node's edges (Codex on PR# 341) (eb73ac9)
- plugin-ci: --no-build on the tooling sync and runs (Sonar S8541) (a88e25e)
- plugin-ci: ls-remote through the house git runner, validated at the sink; mark the lockfile-derived pins (e61930a)
- plugin-ci: refuse non-ref overrides and non-manifest paths; lock the runner's uv --with to the lockfile (4a17b73)
- plugin-ci: run the validator from the workflow's tooling; the harness contributes only its version (93bff28)
- plugin-ci: the runner's extra packages come from a requirements file exported from the lockfile (b45965e)
- plugin-ci: the runner's tooling is a locked dependency group synced --frozen (06eb225)
- plugin-ci: the tooling checkout is job.workflow_sha — github.workflow_sha is the caller's commit (96ce0e9)
- promote: drop the never-read CI_DISPATCH_ARGS array (6070f99)
- test: resolve the canary's distribution through tap.plugin_identity, not a guessed name (ff07965)
- test: the core_ci bound fails closed in its own lane, and catches only the not-installed case (21c327f)
- web,grid: unified-review follow-ups on PR# 341 — parenthesized except, protocol-relative slugs rejected in schema + resolver, guard failure renders the placeholder, a retired entity type cannot be re-registered (01b18fc)
- web: guard the landing redirect with url_has_allowed_host_and_scheme; rebuild the query string from request.GET (CodeQL: URL redirection from remote source, PR# 341) (f8215c5)
- web: type the layout processor's dicts and re-stamp _render_page's claims — lane guards (e0bc60a)
Documentation
- preplugin: git_core planning spec for the /new-plugin spec-first road — three neutral nodes (repository, ref, commit), identity helpers, shared-write rules, kernel fixture, consumer contract (416bcbd)
v0.1.5
0.1.5 (2026-09-03)
Features
- boot: graceful fail on a boot profile absent from core (97cfb99)
- boot: preflight the record's install credentials before anything installs (bf4facc)
- ci: plugin-ci boots the in-package
cirecord and derives the editable flip (01fc511) - dev: consent expires when the hooks change; cooling-off on this tier (a534fa3)
- dev: installing git hooks becomes an explicit human decision (47e58c6)
- dev: own the local-execution surface; hook logic leaves settings.json (23c704a)
- dev: own the local-execution surface; hook logic leaves settings.json (cac2db7)
- dev: promote runs AI-review triage — the step stops depending on memory (96e4c37)
- domain-articles: a per-concept background layer, and the ratchet that keeps it honest (b08a32c)
- fips: scripts/verify-openssl-release — re-assert the OpenSSL pins against upstream (ada3634)
- fips: verify-openssl-release — check the pins against upstream, and help the next bump (37f0440)
- plugins: adopt the <slug>-tap distribution convention (tap#145) (ca90218)
- plugins: adopt the <slug>-tap distribution convention (tap#145) [via git-serious] (07e6020)
- policy: conduct + governance move to the org .github repo; PR-triage hook (8eda520)
- preboot: pin wheelhouse wheels by digest, not just by coordinate (e37122f)
- sbom: declare a CPE for the FIPS provider — the compliance-critical binary no scanner could see (78003e8)
- sbom: declare a CPE for the FIPS provider so it is legible to vulnerability scanners (183dd08)
- sbom: scan the declared components with Grype — the FIPS provider enters a scanner's view (760edcc)
- sbom: scan the declared out-of-band components — Grype, because Trivy cannot see them (a5337be)
- search: input_schema
defaultfills an absent input (req-grid-search-obj-5-2) (e411aeb) - search: inputs_from_query — page parameters reach a search as its declared inputs, coerced by its schema (9b33436)
- skills: build-domain-vocabulary — decide which models and edges a new domain needs (369b8b1)
- skills: gryphon-fix-bug — the repair cycle, extracted from #196 while hot (5cc11ea)
- validate: edge slugs must name an action and its object (req-tap-plugin-edge-naming) (a06351e)
- validate: edge slugs must name an action and its object; baseline fixture vocabulary made executable; pr-review-triage reads all three reviewer surfaces [via cleanup-git-serious] (b737c01)
- validation: boot preflights are Validation Map surfaces (70a708e)
- validation: make the core suite's baseline fixture vocabulary an executable invariant (a1df6b4)
- viz:
rankednatural layout — columns by an integer stage, mirrored by direction (tap#293) (c832046) - viz: flow natural layout for nested projection — wrapping variable-size cells (tap#292) (c8906c2)
- viz: ranked columns may flow — a stage with many children packs into rows, not a tower (tap#293) (beb1267)
- viz: shared chrome module + per-side container padding — labels anchored upper-left (d60b2e0)
- web: baselineRatio, baselineN and sparkline table formatters; elapsed.require_field (3789331)
- web: conclusionBadge + externalLink table formatters; fr-sized page rows scroll their content (93d79df)
- web: link, elapsed and iconMap table formatters with formatter_params; CI trigger glyphs (35a2b72)
- web: table auto-refresh affordance is a ↻ button + interval selector, not a countdown (00dcf72)
- web: table auto-refresh with a countdown pill, heading pop-overs, tailSegment; Gryphon results paged with a true total; every formatter escapes (4550f40)
- web: viewport-fraction row heights, fixed-height tables, and the elapsed outlier ratio (6f666fe)
Bug Fixes
- auth: constrain the enrollment public id at the route (CWE-117) (c261062)
- auth: the deploy gate compares SECRET_KEY against the constant, not a copy (017f775)
- boot: post-merge triage batch for PR #169 — twin-message lockstep (14b098d)
- boot: post-merge triage batch for PR #169 — twin-message lockstep [via samsite] (892f386)
- cicd: enable the npm manager — the js-vendor closure was unwatched (c93c540)
- ci: drop checkout credentials from the job that runs plugin code (99ac98d)
- clear the three Codacy findings this wave introduced (662785c)
- deps: update browser libraries (package-lock.json) (f51f0a4)
- deps: update browser libraries (package-lock.json) (bc98252)
- dev: _consent_check.sh is sourced, not executed — drop the exec bit (02335c5)
- dev: close the six defects the AI review found in the consent model (f941312)
- dev: derived promote titles keep session attribution (c26f378)
- dev: despawn --purge-image review nits from PR #279 ([54...
v0.1.4
0.1.4 (2026-08-24)
Features
- cicd: deterministic source-built marking — sbom-12 complete (3465ba2)
- cicd: plugin release SBOM lane — reusable workflow + generator (req-cicd-sbom-10) (970c151)
- cicd: release-artifact conventions + generalized release lane (req-cicd-release-artifacts) (99f817d)
- cicd: reviewer-seat credential patterns + manage-secret record for OPENAI_API_KEY / XAI_API_KEY (4b0a7f1)
- cicd: SBOM generation lane — implement req-cicd-sbom-1..7 + -11 (dadbee9)
- cicd: sbom-12 COMPLETE — unknowns budget fail-closed + source-built marking [via aws-fix] (8960f06)
- cicd: sbom-13 JS lockfile seam + sbom-12 out-of-band detection gate (490b822)
- cicd: two-account code-owner review — @criticalsec co-owns all plumbing paths (318927b)
- cicd: Unified AI Review shims — two-stage harness live on tap (advisory) (47f7561)
- cicd: unknowns budget fail-closed — the req-cicd-sbom-12 flip (0bf52b7)
- cicd: verified wheel-cache seed — implement req-cicd-supply-chain-provenance-2 (391b590)
- dev: [via <session>] PR-title attribution for ad-hoc PRs (George, via sam-dev relay) (330e4b6)
- dev: PR-based plugin releases — release-plugin.sh never direct-pushes a branch (c49adef)
- dev: pr-review-triage --watch emits per-check reds as they land (b81ccfa)
- dev: pr-review-triage — read the AI review before the merge lands (4660285)
- dev: pr-review-triage — read the AI review before the merge lands (076f2e7)
- dev: promote hardening — auto-resolve generated-report conflicts + derived PR bodies [via aws-fix] (8510f5c)
- dev: promote hardening — auto-resolve the generated-report conflict + derived PR bodies (9dc6ba5)
- dev: Requirement Burndown Dashboard — the Renovate pattern for the traceability campaign (0214c48)
- secrets: F4a — JSON scanner skips the store; store-shape relief valve (602ad23)
- skills: resolve-traceability-conflict — the merge-resolution playbook (ac8638a)
- specs: administrivia surface fully accounted — Unaccounted 353 → 342 (316cda2)
- specs: cares-secrets + import-grift backfill waves — and the first Verified cohort (d6dc082)
- specs: claims fingerprint the code end — the Doorstop model (d882578)
- specs: dupes-campaign surfaces join the traceability accounting (1405827)
- specs: five ledger rulings land — the review ledger empties (5068ce8)
- specs: panel-entity-resolution mapped via the backwards test walk — Unaccounted 287 → 279 (0045404)
- specs: plugin-architecture accounted — Unaccounted 259 → 247, first Disputed opened (54f09c1)
- specs: plugin-validation spec fully mapped — Unaccounted 342 → 335 (08bb061)
- specs: the testability floor + the first ACID-backfill wave (spec-fips) (d660436)
- specs: traceability report fragmentation — per-spec files, no committed aggregates (89e7f20)
- specs: viz family fully accounted — Unaccounted 335 → 287 (9cb76b2)
- specs: Wave A — the Definition of Done and its accounting model (64be039)
- specs: Wave B — dispositions, accounting, and the Unaccounted ratchet (899a1c6)
- specs: Wave C batch 1 — Unaccounted 1,072 -> 509, and the triage skill (4e9b024)
- specs: Wave C batch 2 — the guard-rid harvest, Unaccounted 509 -> 495 (c200772)
- specs: Wave C batch 4 — the gryphon claim batch, Unaccounted 467 -> 447 (0784bcc)
- specs: Wave C batch 5 — boot + cares-secrets sweeps, Unaccounted 446 -> 434 (f4b894e)
- specs: Wave C batch 6 — the backwards test walk, Unaccounted 434 -> 396 (a86b4fd)
- specs: Wave C batch 7 — cares + plugins claims-first, Unaccounted 396 -> 371 (58a8e12)
- specs: web-navigation fully accounted — Unaccounted 279 → 269 (f5d43f4)
- specs: web-rendering fully accounted — Unaccounted 269 → 260 (f181a6b)
- specs: zero-ACID floor exempts documented-excluded requirements — baseline 142 → 96 (2ff6d6d)
- validation: F4c — committed baselines may only name in-repo territory (9d4f9ae)
- web: shared fallback-banner partial — the template requirement drains via test evidence (c7b9d7e)
Bug Fixes
- boot: guards sync flags compose — combined invocation ran only the first (70f27fe)
- cicd: attest sbom-path takes concrete paths, not globs (e75ee7d)
- cicd: bounded retry on every apk add — Wolfi repo flakes twice in five days (5b04dc9)
- cicd: bounded retry on every apk add — Wolfi repo flakes twice in five days (c3f233d)
- cicd: Copilot triage on #86 — shape-robust parsing + spec status sync (ba9f052)
- cicd: derivation inputs are constants, not CLI knobs (SonarCloud S8707, root-caused) (758d457)
- cicd: derivation inputs stay inside the working tree (SonarCloud agentic path rule) (f115c82)
- cicd: disjoint identity namespaces + complete path validation (Grok round 2) ([f2a5865](f2a586567a437b9f76760127163e7...
v0.1.3
0.1.3 (2026-08-20)
Features
- cicd: consumers pin a version instead of tracking :latest (60f2093)
- cicd: digest-threaded publish pipeline (req-cicd-supply-chain-provenance-1) (0c4c953)
- dco: remediation commits — certify retroactively without rewriting history (026b1f9)
- grid: EntityType.kind — discriminate node vs edge in the type catalog (0ab001a)
- health: probe selection sets — liveness/readiness, declared and mandatory (fdfe4c3)
- health: serving, grid-table and plugins-loaded probes (3394ad0)
- policy: CONTRIBUTING + DCO land as approved policy; sign-off enforcement ON (90d5a14)
Bug Fixes
- auth: enrollment link origin IS the ceremony origin (sweep S2) (3cca3ac)
- cicd: base compose is pull-only — building is an explicit opt-in overlay (fdd6139)
- cicd: CI rides tap-db:latest — the version pin is a consumer contract (f734c2f)
- cicd: release-commit publishes survive newest-main-wins cancellation (2dc00c1)
- nine duplicate-fact collapses + four boot/auth precision fixes (0becf1a)
Documentation
- grid: backlog req for first-party types in the type catalog (3a3704a)
- grid: sharpen the stale-catalog-rows gap — accumulated state, not fresh-instance behaviour (7f75fe6)
- health: correct the entity-type catalog non-goal — measured causes, not a classification issue (2ea3117)
- misc: duplicate-derivation backlog — the open ~30, with the detectors (0baae29)
- plugins: lifecycle v1 — define the departure contract (req-plugin-lifecycle-v1-departure) (2852990)
- policy: correct the approval provenance recorded in 90d5a14 (a28419b)
v0.1.2
0.1.2 (2026-08-12)
Features
- grid: grid-table classification single source (req-grid-table-classification.sec) (e805865)
- specs: TAP-KNOWN-DUPE convention for intentional duplicates (req-tap-known-dupes) (24767b3)
Bug Fixes
- auth: built-in actor keys collapse to one code home (audit #2) (264e899)
- auth: request identity derived once, at the middleware (audit #4) (a0c977a)
- secrets: secrets-root resolution collapses to two canonical lookups (audit #3) (b92a168)
Documentation
- plugins: spec-plugin-lifecycle-v1 DRAFT — transactional plugin load/update wrapper (af77348)
v0.1.1
0.1.1 (2026-08-12)
Features
- grid: edge property lanes — central hotlink check + schema-required warn mode (871f7f7)
Bug Fixes
- boot: TAP_PLUGINS is authoritative — collapse the two-source plugin-set race (e4183c3)
- cicd: wire the release lane to the real app — tap-release-please (d345c62)
- ci: gate api-fuzz boot on migrations APPLIED, not just health — the real flake root (625ae08)
- grid: annotate migration functions + registry fixture — mypy ratchet clean (8d942f9)
- health: diversify readiness with a critical 'migrations' probe — the real flake fix (b70d7f9)
Documentation
- dev-validation: close the api-fuzz known-flake ledger row — two-source INSTALLED_APPS divergence, root-caused + fixed (f242cf9)
- dev-validation: correct the known-flake ledger — the real root was migrate-vs-boot, fixed by the migrations readiness probe (d02b444)
- health: probes-4 ACID — add migrations to the enumerated critical set (2cbd947)
- health: record the migrations probe in spec-tap-health-v0 — the first readiness-class probe (3bbfa8f)
- spec: api-fuzz flake ESCALATED — recurred same day; investigation owned by session/unified (cd70a1b)
- spec: api-fuzz known-flake ledger — track setup-phase reds across sessions (4b6104f)