Skip to content

feat(herald): add the Lore decisions-on-PR capability [roadmap:decisions-on-pr]#3

Merged
tcballard merged 2 commits into
mainfrom
claude/herald-decisions-on-pr-r2ucnb
Jul 18, 2026
Merged

feat(herald): add the Lore decisions-on-PR capability [roadmap:decisions-on-pr]#3
tcballard merged 2 commits into
mainfrom
claude/herald-decisions-on-pr-r2ucnb

Conversation

@tcballard

@tcballard tcballard commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Delivers the Herald capability — the decisions-on-PR advisory comment — implementing the pr-decision-surfacing design and the decisions-on-pr roadmap in the rac-core corpus. Epic: itsthelore/rac-core#351.

What it does

herald/github/action.yml is a composite action, consumed as uses: itsthelore/rac-ci/herald/github@<ref>, that:

  • computes the PR's changed paths from the merge base (triple-dot diff, fetch-depth: 0 required, like Watchkeeper);
  • runs rac decisions-for --json per changed path — the engine's live-decisions lookup (decision-to-code-proximity) — and merges the results by decision id via herald/github/render.py;
  • posts ONE advisory comment (id, title, matched scope, changed paths), found by its marker and updated in place on re-runs. No comment when nothing governs; an existing comment updates even to the empty state so it never goes stale.

Posture

  • Facts, never verdicts (ADR-034/067): the comment names what governs and recommends review; it never gates the merge. The action succeeds whatever it finds — only operational breakage fails the step, and a read-only token (forks) degrades to the step summary.
  • Thin client (ADR-063): matching and liveness live entirely in the engine; the wrapper only joins, sorts, and formats. No wall-clock input — the same corpus and diff render the same bytes.
  • Follows the repo's capability × platform layout alongside watchkeeper/gatekeeper/registrar; README capability table updated.

Tests

  • tests/test_herald_action.py — structural contract tests in the house style: composite wiring, exact input set, triple-dot diff, renderer hand-off, and the never-gate comment step.
  • tests/test_herald_renderer.py — behavioral battery against the published engine: sorted/deduplicated rendering with scope and link assertions, the empty state, survivability of a bad changed path, the <details> overflow at max-inline, and byte-determinism under reversed input order.
  • .github/workflows/tests.yml — the structural job now excludes the behavioral file; a new herald-renderer job installs the published rac-core and runs the battery, keeping the structural tier engine-free.

Full suite: 23 passed.

@tcballard
tcballard merged commit 4527f5a into main Jul 18, 2026
2 checks passed
tcballard added a commit to asdecided/core that referenced this pull request Jul 18, 2026
… rac-ci [roadmap:decisions-on-pr]

Implements rac/roadmaps/decisions-on-pr.md (epic #351): the Herald
capability merged as asdecided/ci#3 — the advisory
governing-decisions comment on pull requests, thin client over
rac decisions-for --json, facts never a merge gate. Records the
delivered answers to the design's three Open Questions and the v1-tag
note (the tag predates Herald; consumers reference @main until a tag
that includes it is cut).
tcballard added a commit to asdecided/core that referenced this pull request Jul 18, 2026
… rac-ci [roadmap:decisions-on-pr]

Implements rac/roadmaps/decisions-on-pr.md (epic #351): the Herald
capability merged as asdecided/ci#3 — the advisory
governing-decisions comment on pull requests, thin client over
rac decisions-for --json, facts never a merge gate. Records the
delivered answers to the design's three Open Questions and the v1-tag
note (the tag predates Herald; consumers reference @main until a tag
that includes it is cut).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant