You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Added
Compaction-survival for long single-session /board work runs (#348). A queue of issues
worked in ONE session eventually auto-compacts, and Claude Code's generic summary drops the
thread. A new Board-RunLedger.ps1 (-Start/-Update/-Close) keeps a durable run-ledger as
an [abios-run-ledger] comment on the epic plus a lockfile-sized local .agentic-board/active-run.json
marker (#349). The SessionStart hook now handles source: "compact" — reading only the local
marker (offline), it re-injects a pointer to the epic ledger so the session re-grounds and resumes
the queue unattended; a strict no-op outside an active run (#350). A PreCompact hook snapshots the
transcript into .agentic-board/compact-snapshots/ as a safety net, never blocking (#351). Works
around three Claude Code limits (no programmatic /compact, no auto-compact instructions, no cheap
compaction model — anthropics/claude-code#14160);
see skills/projects-admin/references/compact-survival.md (#352, #353).
Assert-BoardComplete.ps1 — a pass/fail check that the board is fully worked. Exits 0 when the
board has zero PENDING items (using the exact Test-Pending definition /board work lists from: no
Status, or a Status that means Backlog — incl. legacy Todo), exit 1 (listing the offenders)
otherwise. Run it after a /board work sweep, or in CI, to assert a milestone board reached
zero-pending. Pure Test-BoardItemPending / Get-BoardCompletion helpers, unit-tested; fails closed
on a gh error so an unreadable board never reads as "complete".
Release checklist spec for BI artifacts (#17, M4.1). A new references/bi-release-checklist.md defines "ready to release" for a semantic model / report / PBIP:
every item is marked [tool] (an agentic-board command enforces it — the BPA + TMDL-breaking gate, /board changelog, /board triage, /knowledge), [external] (a Fabric/PBI capability the tool
references but does not rebuild — deployment pipelines, refresh validation), or [manual] (a human
judgement the tool surfaces but never fakes — report renders, rollback path). Ships the shared
definition-of-done plus a copy-paste checklist; wired from the roadmap, /board changelog, and the
projects-admin reference index.
Review gate now BLOCKS a merge on semantic-model quality failures (#16, M3.3). When a PR touches
a *.tmdl model, Board-ReviewGate.ps1 runs two model-quality gates and stops the merge on either,
the same way a failing CI check does: the TMDL diff review moves from warn-only to blocking
(Tmdl-DiffReview.ps1 -FailOnBreaking — a BREAKING schema change blocks), and a new Bpa-GateReview.ps1 runs Tabular Editor's Best Practice Analyzer (-FailOn error — an error-severity
violation blocks). Both degrade safely: no model, no committed BPA rules file, or no Tabular Editor
is a WARN + skip, never a block — a merge is only ever stopped by an actual finding, so a non-BI repo
is unaffected. Bpa-GateReview.ps1 parses either CLI's GitHub-annotation output (te TE3 or TabularEditor.exe TE2); pure ConvertFrom-BpaAnnotations / Get-BpaVerdict helpers, unit-tested.
/board triage — fill triage fields from evidence, propose Priority under confirmation (#306).
Pending items — the only part anyone plans from — sat blank on Type / Area / Estimate / Priority,
while what little was filled landed in Done, after it could inform anything. Board-Triage.ps1 closes
that WITHOUT a bulk default (a uniformly-filled board looks prioritised without being so): -Pending
lists the pending work-list and its blanks; -Issue <n> -Type/-Area/-Estimate writes the evidence
fields the agent infers from the issue's content; and -Priority Pn -Rationale '...' only PROPOSES
(prints) the priority — it writes solely under -ConfirmPriority, and refuses a -Priority with no
rationale, because a business priority is a judgement not in the repo and must never be written
silently. /board work now triages on start and /board documents it as sub-action 19. New pure Get-TriageGaps / Test-PriorityRequest / Format-PriorityProposal helpers, unit-tested.
/board cerrar-ciclo — a close-the-loop disposition router for the current branch (#302).
The careful post-merge teardown (Invoke-SessionCleanup) was reachable ONLY through the fleet path
(-Sessions -Watch -AutoClean), so an interactive single session never cleaned up — merged local
branches piled up until /board doctor was run by hand. Board-Work.ps1 -CloseLoop classifies the
CURRENT branch (uncommitted / commits-no-PR / PR-open / PR-merged / PR-closed / merged-advanced) and
routes it: it PROPOSES the next command for every state and performs exactly one action — tearing
down a proven-merged local branch in place (switch to default, git branch -D, prune the session
entry; confirm or -Force, preview with -DryRun), never on a dirty tree, never a merge (that keeps
the review gate). Board-Merge.ps1 now also NOTES when its --delete-branch left the local branch
behind (checked out here or in another worktree) and points at cerrar-ciclo, instead of silently
believing it cleaned up. New pure Get-CloseLoopDisposition helper, unit-tested across all states.
Fixed
The knowledge registry can live as YAML, so allow-list repos can use /knowledge (#298). A repo
whose pre-commit hook allow-lists code extensions blocks knowledge/registry.json — often on purpose,
since OAuth credentials.json is .json, so the barrier that guards secrets also shut the registry
out of exactly the sensitive-data repos that most want a reference catalog. Add-KnowledgeRef.ps1 -Format yaml now initialises registry.yaml instead (.yaml is normally allow-listed); every /knowledge command auto-detects and keeps whichever file exists. A shared KnowledgeRegistryIo.ps1
reads/writes both formats — the YAML is real block style, and every string scalar is serialised
through the built-in JSON cmdlets (a JSON string token is also a valid YAML double-quoted scalar), so
URLs with :/# and notes with quotes round-trip losslessly with no YAML dependency and no
hand-rolled escaping. JSON stays the default; unit-tested both directions.
handoff -Save no longer degrades to a silent local-only file when no issue is linked (#304).
With no issue resolved (no -Issue, no active session, not on an issue-<n> branch) -Save used to
write a gitignored HANDOFF.md — not portable, and with no MEMORY.md pointer — then say so only
AFTER writing. It now refuses before writing and prints the choice: link it with -Issue <n>
(durable [abios-handoff] comment + memo, resumable on another machine) or accept a machine-local
handoff on purpose with the new -Local switch. -DryRun reports which of linked/local/refuse it
would do. New pure Get-HandoffSaveMode helper, unit-tested.
The CHANGELOG auto-fold now composes with a hand-written [Unreleased] block (#324). New-Release.ps1
folds by delegating to Board-Changelog.ps1 -Write, which used to insert the generated block ABOVE any ## [Unreleased] — stranding the maintainer's curated entries under an orphan [Unreleased] below the very
version they belonged to. It now RENAMES [Unreleased] to ## [<version>] - <date> and merges the
board-derived entries into its sections (preserving hand-written sections like ### Security, appending
board lines after the curated ones, never duplicating an already-cited issue). A release that ships only
curated prose (no newly-Done issues) still gets its [Unreleased] renamed. The fully board-generated path
(no [Unreleased]) is unchanged. New pure Update-ChangelogText/Merge-UnreleasedBody helpers, unit-tested
both directions.
New boards are born on the canonical vocabulary, closing the Todo+Backlog dead-end (#299). gh project create seeds GitHub's default Status (Todo / In Progress / Done); a board that keeps Todo can later be duplicated into an unmergeable Todo+Backlog pair by a plain apply. Resolve-Board.ps1
now applies the preset at creation (-Lang, opt out with -SkipPreset) while the board is empty, so the Todo→Backlog rename is free and the legacy option never exists. The stale field-presets.md guidance
that sent a Todo+Backlog board "to the UI" now points at Apply-FieldPreset.ps1 -MergeConflicts (shipped
in #300) and documents why the option must never be re-sent by name (it orphans every item's Status).
/board field apply was undocumentable-as-typed and easy to misfire (#297). The /board field bullet named only Set-BoardField.ps1 (a bulk-fill script) next to "apply a field
preset", so the preset applier Apply-FieldPreset.ps1 got reached for by the wrong name; the doc
now names both scripts distinctly. Apply-FieldPreset.ps1 also accepts -ProjectNum (alias of -Number, matching the rest of the suite) and -Preset (alias of -Lang), and its
missing-preset error now reads Preset file not found: <resolved path> instead of the misleading Preset not found: en.