[0.5.0] - 2026-06-21
The "showcase & hands-off adoption" release: a static HTML report for finished
runs, headless/CI output hardening, a reference GitHub Action that posts a
single updatable PR comment, bundled expert profiles, and public DevEx polish.
Full Tier 2 of REVREM-PLAN-005; TUI live-run launch remains deferred to
v0.6.0.
Added
revrem report <run-dir>: renders a finished run'ssummary.json+
events.jsonlinto a single self-contained HTML file (plain HTML5 + inline
CSS, no JavaScript or external assets, safe to upload as a CI artifact and
open offline). Never invokes a model or touches the network. Redacted by
default;--no-redactrequires--i-understand-the-risks.--format json
prints a machine-readable index to stdout (the--outputflag is ignored in
that mode). Truncated or malformed events render what is available and warn
rather than failing — the report is diagnostic.report-index-v1JSON schema: the frozen cross-boundary contract describing
the machine index's fields and nullability (cost_usdnull for dry-runs /
fake harnesses;top_findingsempty when none;artifact_pathsempty when
unavailable).finding_countsnow machine-enforces the baseline severity keys
(critical,high,medium,low) that the prose contract already
promised. Added with a_history/baseline.- Reference GitHub Action (
action.yml): runs a revrem profile on a pull
request, uploads the redacted HTML report, and posts a single updatable PR
comment. Composite action with inputs for base, profile, budgets, checks,
comment/upload/fail-on-findings toggles, and install-mode (pypi|
local). Runs revrem headless, discovers the run directory from the JSON
artifact_diron stdout, and maps the exit code last (after artifacts and
comment land). Its setup-crash diagnostic fallback uses Python/pathlib rather
than GNU-onlyfind -printf, so macOS runners can still print the latest
diagnostics.json. Fork-PR safe and least-privilege. revrem reportloads referenced triage artifacts only when the resolved path
remains inside the run directory; absolute paths and..traversal are
ignored so a crafted run summary cannot make the renderer read arbitrary
files. Report path normalization also converts Windows-style\separators
to/before rendering HTML or JSON, preserving the POSIX-normalized report
contract across platforms.--no-ttyflag: forces non-interactive (headless) output — suppresses ANSI
escape sequences, progress spinners, and terminal-title writes on stderr.
Auto-triggered when theCIenvironment variable is set (GitHub Actions,
CircleCI, Travis, Jenkins), so a standard CI run needs no RevRem-specific
flag. Also exposed as an additive profile key[output] no_tty.- Finished-run fixture catalogue under
tests/fixtures/runs/<scenario>/(8
terminal-state scenarios: clear, findings_remediated, findings_remaining,
timeout, check_failure, cost_ceiling, cancelled, all_suppressed), co-locating
summary.json+events.jsonlfor read-only consumers. - Bundled expert profiles:
security,performance,refactor,test-gap,
anddocs, resolved as read-only built-ins that user and project profiles can
shadow. Built-ins enable no ecosystem checks by default; use
revrem checks suggestand examples for stack-specific verification. revrem completions bash|zsh|fishfor dependency-free shell completion
scripts.- Copyable profiles under
examples/for Python, TypeScript, Go, triage
routing, commit-after-remediation, and CI hands-off usage. - Maintained demo regeneration via
scripts/record-demoand
docs/assets/revrem-demo.cast. REVREM-GUIDE-001, the failure diagnostics guide, covering exit codes,
diagnostic families, CI triage, and artifact-first debugging.- Three governed good-first-issue TASK stubs for GitLab CI, fish completions,
and a migration expert profile.
Changed
- The recommended CI invocation is
revrem --no-tty --progress-style compact --summary-format json— compact
progress is line-oriented and greppable, and--summary-format jsonprints
canonicalsummary.jsonto stdout for downstream tooling.
Fixed (corrective, post-peer-review)
- Findings now render from their authoritative source
(triage-N.json::confirmed_findings, keyed bysummary.artifact_paths.triage)
instead of an inventedstatus_classificationseverity payload that does not
exist in the engine. Before this, the findings section,finding_counts, and
top_findingswere empty on every real run and the PR comment reported zero
findings. (P0-1) - The GitHub Action now wires
GITHUB_TOKENvia agithub-tokeninput
instead of an unsetenv.GITHUB_TOKEN, so the PR comment step actually
authenticates and posts. (P0-3; default-token handling refined below.) - Checks now render from
summary.iterations[].checks[](the engine's record),
withcheck_resultevents as a fallback. - The PR comment deep-links the uploaded report artifact
(REVREM_ARTIFACT_URL) rather than always linking the workflow run. - Added
tests/test_report_real_findings.py— a standing gate that renders a
real-engine-shaped fixture (astatus_classificationpayload of
{message, summary}plus atriage-N.jsonwith a confirmed finding) and
asserts the finding surfaces. This gate exists because the initial T0 fixtures
were hand-authored against the renderer's assumptions rather than the engine's
contract, producing self-confirming green tests. Registered in REVREM-TEST-001.
Fixed (corrective, second peer-review iteration)
- Reverted the P0-2 removal of the "Phase configuration" section — the
premise was wrong.summary.phase_configis written on every run by
reporting.add_summary_contract_fields(present on 106/156 local runs, all
recent ones), carrying per-phaseharness/model/reasoning_effortfor
review/triage/remediation/commit_message. Deleting the section dropped
a section that renders real data on every run. The section is restored,
filtered to the model-bearing phases (checks/runtimecarry no
harness/model and are skipped, not rendered as blank rows), and now also
surfaces reasoning-effort, timeout, and sandbox. - Documented
phase_configinsummary-v1.schema.json(additive,
non-breaking;additionalPropertieswas alreadytrue). The undocumented
schema/engine drift is what led P0-2 to wrongly conclude the key did not
exist. History baseline updated. - Fixed the inert fork-PR guard in
action.yml:head.repo.fork != 'true'
always evaluated true under GitHub Actions' type coercion (boolean→1,
'true'→NaN), so the comment step never actually skipped on fork PRs. Now
== false. (Pending live verification on a real fork PR.) - Findings rendering now also surfaces triage
rejected_findingsand
needs_more_info, which were silently dropped; the outcome section surfaces
per-iterationiterations[].review_status. - The PR comment now labels the artifact deep-link
[Report](it was
mislabelled[Run]while pointing at the artifact); the workflow-run link is
used and labelled[Run]only as a fallback. findings_with_triagefixture is now representative of a real run (carries
phase_config+external_review_coverage/invocation/phase_failures/
phase_observations/triage_diagnosticsin their real shapes), closing the
self-confirming-fixture gap for the renderer paths under gate.
Security & robustness (corrective, external review)
- Script-injection hardening in the reference Action: every workflow input
is passed throughenv:and read as a shell variable, never interpolated as
${{ inputs.x }}into arun:script (the latter is expanded into the script
text before bash parses it). Budget inputs are validated as numeric; a test
asserts no input is interpolated into any run script. - Token resolution no longer depends on expression evaluation inside an
input default: thegithub-tokendefault is empty (not${{ github.token }})
and the comment step uses${{ inputs.github-token || github.token }}, so the
fallback resolves the automatic token in the step context. A non-empty literal
default would be truthy and silently defeat the fallback. raw-artifactshonesty: documented as uploading the run directory
verbatim and unredacted (the prior "still-redacted" wording was false).- Report index preserves array-valued
artifact_paths(was flattening lists
to repr strings) and redacts path values whenredact=True. - PR comment escapes Markdown table cells so a model-derived finding title
containing|, a newline, or a backtick cannot break or inject formatting. - Dogfood-found report/comment correctness fixes: error reports now display the
documented exit code for budget/setup/cancelled stops, outcome check counters
count summary-sourced checks instead of only event-sourced checks, and the PR
comment's severity-count summary row escapes its internal|separators. - Dogfood-found stale-triage fix:
revrem reportnow uses only the latest
triage-N.jsonartifact, so reports and PR comments do not resurrect stale
findings from earlier triage passes. - CLI JSON summaries are now emitted for typed failure outcomes such as
review_failedinstead of returning after stderr only. The composite Action
can therefore parseartifact_dir, render the failed report, and upload the
phase diagnostics for ordinary provider subprocess failures that still map to
process exit code1. - Failed-run HTML reports now render a bounded
Phase failuressection from
summary.phase_failures, including the diagnostic artifact and retry command
metadata that was previously present insummary.jsonbut invisible in the
uploaded report. Review failure diagnostics now also carry bounded, redacted
stdout/stderr excerpts so provider CLI errors can be diagnosed without
uploading raw run artifacts, and the Codex Action proxy's quota-exceeded
wording is classified as non-retryableprovider_quota_exhausted. The report
index now carries a bounded redactedfailure_summary, and the PR comment /
GitHub Actions error annotation surface quota or billing exhaustion explicitly
instead of requiring operators to open the full report. The Action now maps
exit code1explicitly as a documented RevRem error instead of labelling it
an unexpected code. - Dogfood Action workflow now bootstraps Codex through
openai/codex-action@v1before invoking RevRem, so GitHub-hosted runners
have thecodexexecutable/proxy that preflight requires. It also creates
the repo-local.venvand passes explicit check commands for the dogfood
gate, so preflight does not depend on tools that only exist on a developer
workstation. The Action now has a constrainedroutinginput for CI jobs
that need to force routing on/off, and setup failures print the latest
preflightdiagnostics.jsonwhen RevRem writes one. The dogfood workflow
configures a Git author before running RevRem so commit-mode remediation can
create verified commits on GitHub-hosted runners, and now has both a RevRem
wall-clock budget and GitHub job timeout so nested Codex execution is bounded
in CI. It also carries amax-usdceiling because provider-backed GitHub CI
makes paid model API calls and can become too expensive for non-commercial
hobby use. The credentialed dogfood job skips fork PRs where provider secrets
are intentionally unavailable. - The Action exit-code mapper now tolerates a missing
REVREM_STDERRexport
underset -u, so setup failures before scratch-file creation report the
action error instead of being masked by an unbound-variable shell failure.
Stability
- Frozen (additive-only within v1): the artifact JSON schemas (
summary-v1,
events-v1,report-index-v1, and the others underdocs/52-api/schemas/),
the suppression-file surface, and thesummary.json/events.jsonl
artifacts. - Preview (may change before the 0.9.0 freeze): the
revrem reportHTML
layout and CSS are explicitly not a stable contract yet; only the
report-index-v1fields are versioned. The expert-profile surface is
deferred to v0.5.x and is also Preview.
Deferred
- T12 (TUI launches real runs) is deferred to v0.6.0 per the plan's decision
gate; the TUI keeps its current replay-from-events default.