Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
108 commits
Select commit Hold shift + click to select a range
3ccc52f
feat: spec-grounded review (rebased onto 0.13.0)
sblattj Sep 23, 2026
e6fa841
fix: pass the spec/Jira config keys from _run_review into orchestrate…
sblattj Sep 23, 2026
5b09a6d
fix: log spec grounding outcome so unposted runs are not silent
sblattj Sep 23, 2026
be13ed1
fix: the hedge gate no longer reads a spec finding's quoted constraint
sblattj Sep 23, 2026
41a9cf2
fix: make _run_worker's spec_digest keyword-only; pin the orchestrate…
sblattj Sep 23, 2026
2c39c95
test: make the reviewer contract stubs an opt-in conftest fixture
sblattj Sep 23, 2026
1c88059
chore: keep docs/issues/ out of git and the sdist, and test it
sblattj Sep 23, 2026
76fb5dc
merge: seat/F0-REBASE into release/0.14.0 (0.14.0 stage A, seat F0-RE…
sblattj Sep 23, 2026
de0ab9b
docs: scrub dangling docs/issues/ and skill/session citations
sblattj Sep 23, 2026
77dfed0
fix: send Jira credentials only to PRXREF_JIRA_BASE_URL; widen ticket…
sblattj Sep 23, 2026
af9a0dc
feat: LLM factory foundation for #61, #66 and #67
sblattj Sep 23, 2026
b10b194
fix: spec digest counts ticket lines, goes empty when nothing was kep…
sblattj Sep 23, 2026
743ea15
test: let the real-Response Jira fixture serve its body through iter_…
sblattj Sep 23, 2026
e16cd3c
feat: shared text loader, cost helpers, glyph table and scope vocabulary
sblattj Sep 23, 2026
0572347
merge: seat/F1-LEAF into release/0.14.0 (0.14.0 stage B, seat F1-LEAF)
sblattj Sep 23, 2026
0ec228f
merge: seat/F1-LLM into release/0.14.0 (0.14.0 stage B, seat F1-LLM)
sblattj Sep 23, 2026
ea69c05
fix: spec units group wrapped blocks, sentence-split, standalone pins…
sblattj Sep 23, 2026
6a1cef3
merge: seat/F1-SPEC-UNITS into release/0.14.0 (0.14.0 stage B, seat F…
sblattj Sep 23, 2026
eb54785
merge: seat/F1-SPEC-DIGEST into release/0.14.0 (0.14.0 stage B, seat …
sblattj Sep 23, 2026
e4d0294
merge: seat/F1-SPEC-JIRA into release/0.14.0 (0.14.0 stage B, seat F1…
sblattj Sep 23, 2026
4767932
merge: seat/F1-HYGIENE into release/0.14.0 (0.14.0 stage B, seat F1-H…
sblattj Sep 23, 2026
f320397
feat: PromptContext plumbing, single-pass template fill, Finding.scope
sblattj Sep 23, 2026
27b8d4c
fix(specs): confine local spec sources, bound their reads, path-free …
sblattj Sep 23, 2026
8bef057
feat(config): land the 13 new 0.14 keys on all four surfaces (CNV-1 5…
sblattj Sep 23, 2026
716903e
merge: seat/F2-SPEC-LOCAL into release/0.14.0 (0.14.0 stage C, seat F…
sblattj Sep 23, 2026
611a599
merge: seat/F2-DATA into release/0.14.0 (0.14.0 stage C, seat F2-DATA)
sblattj Sep 23, 2026
aed3a7c
docs(env-vars): list cost_usd and cost_source in the trace meta.json …
sblattj Sep 23, 2026
b556b6d
merge: seat/F2-CFG into release/0.14.0 (0.14.0 stage C, seat F2-CFG)
sblattj Sep 23, 2026
b5c1361
fix(specs): bound spec fetches by a wall-clock budget, decode charset…
sblattj Sep 23, 2026
f00d914
fix(specs): map urllib3 read errors as iter_content does
sblattj Sep 23, 2026
cf92ded
merge: seat/F2-SPEC-READER into release/0.14.0 (0.14.0 stage C, seat …
sblattj Sep 23, 2026
f6567b2
fix(specs): hand PRXREF_SPEC_MAX_CHARS to Jira sources
sblattj Sep 23, 2026
56138e6
feat(render): one glyph table, grey minor, single-pass summary fill
sblattj Sep 23, 2026
cfeccbc
merge: seat/F3-RENDER into release/0.14.0 (0.14.0 stage D, seat F3-RE…
sblattj Sep 23, 2026
e6a7257
feat(cli): 0.14 JSON/text outputs, compare-range declaration, docs sk…
sblattj Sep 23, 2026
e0ea69b
merge: seat/F3-OUT into release/0.14.0 (0.14.0 stage D, seat F3-OUT)
sblattj Sep 23, 2026
10b1d8e
feat: stamp the 0.14 run-record keys on every orchestrate_review exit
sblattj Sep 23, 2026
260f58e
merge: seat/F3-GLUE-RECORD into release/0.14.0 (0.14.0 stage E, seat …
sblattj Sep 23, 2026
5584d20
feat: glue team review rules and ticket context into the orchestrator
sblattj Sep 23, 2026
75ebaf4
merge: seat/F3-GLUE-INPUTS into release/0.14.0 (0.14.0 stage F, seat …
sblattj Sep 23, 2026
3c2500d
fix: hedge gate exempts only the Spec quote text the digest really holds
sblattj Sep 23, 2026
855dc4c
merge: seat/F4-SPEC-HEDGE into release/0.14.0 (0.14.0 stage G, seat F…
sblattj Sep 23, 2026
600e9bd
feat: wire review inputs through the CLI; rules, ticket and replay fa…
sblattj Sep 23, 2026
07aa7e1
merge: seat/F4-CLI-IN into release/0.14.0 (0.14.0 stage G, seat F4-CL…
sblattj Sep 23, 2026
f3ef1ae
feat: ground the spec severity — relabel ungrounded spec, inject only…
sblattj Sep 23, 2026
585dc3d
merge: seat/F4-SPEC-GROUND into release/0.14.0 (0.14.0 stage H, seat …
sblattj Sep 24, 2026
727553d
feat(spec): record the spec stage in logs, run record and trace (S12)
sblattj Sep 24, 2026
1fbfceb
test(spec): prove a post-digest crash leaves the run ungrounded
sblattj Sep 24, 2026
bff1c1f
merge: seat/F5-SPEC-RECORD into release/0.14.0 (0.14.0 stage I, seat …
sblattj Sep 24, 2026
195349e
feat(cost): total the run's dollar cost from every review unit (#67)
sblattj Sep 24, 2026
2f9e1ac
merge: seat/W67B into release/0.14.0 (0.14.0 stage W1, seat W67B)
sblattj Sep 24, 2026
b6158b8
feat(llm): carry the provider-reported dollar cost on every HTTP back…
sblattj Sep 24, 2026
befc006
feat: Azure DevOps service-hook webhook and ADO docs (#62)
sblattj Sep 24, 2026
74910be
feat(render): out-of-ticket scope markers on every surface (#64)
sblattj Sep 24, 2026
a75905f
feat: PR size advisory body (#68)
sblattj Sep 24, 2026
c906494
merge: seat/W64B into release/0.14.0 (0.14.0 stage W1, seat W64B)
sblattj Sep 24, 2026
70ad289
feat(forges): replay forges for evaluation runs (#65)
sblattj Sep 24, 2026
af045ea
merge: seat/W68 into release/0.14.0 (0.14.0 stage W1, seat W68)
sblattj Sep 24, 2026
f46407a
merge: seat/W67A into release/0.14.0 (0.14.0 stage W1, seat W67A)
sblattj Sep 24, 2026
b4e1088
merge: seat/W62B into release/0.14.0 (0.14.0 stage W1, seat W62B)
sblattj Sep 24, 2026
806b94c
merge: seat/W65B into release/0.14.0 (0.14.0 stage W1, seat W65B)
sblattj Sep 24, 2026
55bfc88
docs: spec-grounded review user docs and as-built design record
sblattj Sep 24, 2026
93668bb
feat: load the ticket context and ask every unit for a finding scope …
sblattj Sep 24, 2026
b46a0e3
feat: claude-cli backend and the shared CLI chain (#66)
sblattj Sep 24, 2026
36f50ee
feat: Azure DevOps forge adapter (#62)
sblattj Sep 24, 2026
ee2840e
merge: seat/W-SPECDOCS into release/0.14.0 (0.14.0 stage W1, seat W-S…
sblattj Sep 24, 2026
52966d0
merge: seat/W64A into release/0.14.0 (0.14.0 stage W1, seat W64A)
sblattj Sep 24, 2026
740d87f
feat(forges): get_compare_diff on GitHub, GitLab, Bitbucket Cloud and…
sblattj Sep 24, 2026
ea08172
merge: seat/W62A into release/0.14.0 (0.14.0 stage W1, seat W62A)
sblattj Sep 24, 2026
f214f1a
merge: seat/W66A into release/0.14.0 (0.14.0 stage W1, seat W66A)
sblattj Sep 24, 2026
dd8912d
feat: team review rules file with a front-matter severity map (#63)
sblattj Sep 24, 2026
1a6995a
merge: seat/W63 into release/0.14.0 (0.14.0 stage W1, seat W63)
sblattj Sep 24, 2026
09f9960
merge: seat/W65A into release/0.14.0 (0.14.0 stage W1, seat W65A)
sblattj Sep 24, 2026
81c6772
test: hold Azure DevOps get_compare_diff to the #65 compare contract
sblattj Sep 24, 2026
a1fa6c9
merge: seat/W65-ADO into release/0.14.0 (0.14.0 stage W2, seat W65-ADO)
sblattj Sep 24, 2026
54687b2
feat: wire replay mode into the review CLI (#65)
sblattj Sep 24, 2026
adfba55
fix: page GitLab MR diffs past 20 files; time out GitHub API calls
sblattj Sep 24, 2026
d7b4e89
feat: kiro-cli subscription backend and the #66 docs
sblattj Sep 24, 2026
24a1161
merge: seat/FIX-FORGE into release/0.14.0 (0.14.0 stage W2, seat FIX-…
sblattj Sep 24, 2026
847d39e
merge: seat/W65C into release/0.14.0 (0.14.0 stage W2, seat W65C)
sblattj Sep 24, 2026
db7b702
merge: seat/W66B into release/0.14.0 (0.14.0 stage W2, seat W66B)
sblattj Sep 24, 2026
5e8fabf
fix: GitLab MR header-only warning and stale 0.14 docs (REL-W2)
sblattj Sep 24, 2026
f7f4d3b
test: 0.14.0 cross-seat seam tests (#63, #64, #67, #68, spec)
sblattj Sep 24, 2026
6bbd809
docs: 0.14.0 stale-docs sweep — exit codes, webhook table, spec units…
sblattj Sep 24, 2026
a3d5131
merge: seat/REL-W2 into release/0.14.0 (0.14.0 stage W3, seat REL-W2)
sblattj Sep 24, 2026
71d22cb
test: cross-seat seams for the 0.14 wave-2 features
sblattj Sep 24, 2026
486e225
merge: seat/REL-T into release/0.14.0 (0.14.0 stage W3, seat REL-T)
sblattj Sep 24, 2026
cf9644c
merge: seat/REL-T2 into release/0.14.0 (0.14.0 stage W3, seat REL-T2)
sblattj Sep 24, 2026
ddd47fc
merge: seat/REL-A into release/0.14.0 (0.14.0 stage W3, seat REL-A)
sblattj Sep 24, 2026
c594abb
release: 0.14.0 — version, lockfile, CHANGELOG and HANDOFF
sblattj Sep 24, 2026
03c936f
docs: 0.14.0 stale-doc follow-ups (evals runner, CLI backend knobs, g…
sblattj Sep 24, 2026
448d7a8
merge: seat/REL-B into release/0.14.0 (0.14.0 stage W3, seat REL-B)
sblattj Sep 24, 2026
6b6d7f6
merge: seat/REL-FIX into release/0.14.0 (0.14.0 stage W3, seat REL-FIX)
sblattj Sep 24, 2026
9f7b19d
docs: release links for 0.12.2-0.14.0; HANDOFF follow-ups after REL-FIX
sblattj Sep 24, 2026
14c549f
fix: PRXREF_FAIL_ON=error|any exits 1 on a verdict-Error review
sblattj Sep 24, 2026
c0eedef
merge: seat/REL-FAILON into release/0.14.0 (0.14.0 stage W3, seat REL…
sblattj Sep 24, 2026
6979eb8
fix: show "scope" in the Output Format example while a ticket is active
sblattj Sep 24, 2026
c4a3dc9
feat(costs): label claude-cli cost "API-equivalent" on -v and the att…
sblattj Sep 24, 2026
314ed09
fix: true counts on a total LLM failure; drop access_raw_diffs on GitLab
sblattj Sep 24, 2026
a97e367
merge: seat/REL-SCOPE into release/0.14.0 (0.14.0 stage W3, seat REL-…
sblattj Sep 24, 2026
353e5d2
merge: seat/REL-COST into release/0.14.0 (0.14.0 stage W3, seat REL-C…
sblattj Sep 24, 2026
f5ae61c
merge: seat/REL-GLF1 into release/0.14.0 (0.14.0 stage W3, seat REL-G…
sblattj Sep 24, 2026
1e4fe69
fix: trace get_diff span in UTF-8 bytes; last 0.14 doc corrections
sblattj Sep 24, 2026
b929aea
docs: 0.14.0 release notes and handoff after the live checks
sblattj Sep 24, 2026
e758aa5
merge: seat/REL-DOCS-A into release/0.14.0 (0.14.0 stage W3, seat REL…
sblattj Sep 24, 2026
14e1aa3
merge: seat/REL-DOCS-B into release/0.14.0 (0.14.0 stage W3, seat REL…
sblattj Sep 24, 2026
6427a83
docs: final release-tip count and the env-vars exit-0 wording
sblattj Sep 24, 2026
a91133f
docs: GitHub refuses a pull-request diff past 20,000 lines
sblattj Sep 24, 2026
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
127 changes: 121 additions & 6 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,23 @@
# LLM / Pipeline Configuration
# ------------------------------------------------------------------------------

# LLM backend: openai-compat (aliases: ferry, http) | litellm
# LLM backend: openai-compat (aliases: ferry, http) | litellm | claude-cli | kiro-cli
# Read case-insensitively; any other value is a configuration error (exit 2).
PRXREF_LLM_BACKEND=openai-compat

# Base URL for any OpenAI-compatible /chat/completions endpoint. REQUIRED.
# Base URL for any OpenAI-compatible /chat/completions endpoint. REQUIRED for
# openai-compat/ferry/http. Not used by litellm (it resolves each model's own
# provider endpoint), claude-cli or kiro-cli: a set value is ignored there with
# one INFO line. A LiteLLM proxy is OpenAI-compatible, so point openai-compat
# at it.
PRXREF_LLM_BASE_URL=https://openrouter.ai/api/v1

# API key for that endpoint. Leave empty for a local no-auth server.
# API key for that endpoint (openai-compat only). Leave empty for a local
# no-auth server.
PRXREF_LLM_API_KEY=

# Comma-separated fallback chain, cheapest first. REQUIRED.
# Fallback chain, cheapest first, comma- or whitespace-separated. REQUIRED by
# every backend.
PRXREF_LLM_MODELS=z-ai/glm-5.3-flash

# Reasoning effort for models that cannot disable reasoning (e.g. low|high|max
Expand Down Expand Up @@ -52,10 +59,21 @@ PRXREF_LLM_REASONING_EFFORT=

# Optional integer sampling seed, sent as top-level "seed" to
# OpenAI-compatible backends. Must be >= 0 (0 is a valid seed). Empty or
# unset omits it from the request entirely, leaving the provider's own
# seed behaviour in place.
# unset does not omit it: one random seed is derived per process, sent on
# every call of the run, and reported as sampling.seed in the run record.
# PRXREF_LLM_SEED=

# claude-cli / kiro-cli only: the CLI binary to run (~ is expanded). Empty =
# "claude" or "kiro-cli" found on PATH. The CLI must already be installed and
# logged in (your own subscription, your own machine: see docs/llm.md). A path
# that cannot be found is a configuration error (exit 2).
# PRXREF_LLM_CLI_PATH=

# claude-cli / kiro-cli only: how many CLI processes one client may run at
# once. Each call is a full CLI process, and subscription limits are per
# account. Must be > 0.
# PRXREF_LLM_CLI_CONCURRENCY=2

# Findings below this confidence floor are dropped (default 0.6).
# A probability: must be within [0.0, 1.0] inclusive.
PRXREF_CONFIDENCE_FLOOR=0.6
Expand Down Expand Up @@ -128,6 +146,92 @@ PRXREF_MAX_CHUNKS=8
# total-failure notice always names its status regardless.
# PRXREF_POST_VERDICT=1

# Fallback price table, used only when the backend reports no dollar cost
# (OpenRouter's usage.cost, a LiteLLM gateway's x-litellm-response-cost
# header, litellm's response_cost, claude-cli's total_cost_usd). Inline JSON
# (starting with "{") or a path to a JSON file; USD per MILLION tokens, keyed
# on the exact model name prxref reports (model=). A run priced from it is
# flagged cost_estimated. A malformed table is a configuration error (exit 2).
# Local or free models behind a gateway that reports nothing: give them a zero
# entry, or the run reads "cost unknown" (null), never $0.
# PRXREF_PRICE_TABLE={"openai/gpt-4o-mini": {"input": 0.15, "output": 0.60}}
# PRXREF_PRICE_TABLE=./prxref-prices.json

# Set to exactly 1 to append the run's cost to the posted summary attribution
# line ("… · 3.1s · $0.0007"; "~$0.0007 (est.)" when estimated, else
# "$0.0007 (API-equivalent)" when every reported cost came from claude-cli;
# "cost unknown"). Default off; the cost is always in the run record and the JSON.
# PRXREF_POST_COST=0

# Advisory-only threshold on lines changed (added + removed, excluding
# lock/generated files): above it, the summary gets one non-blocking heads-up
# line at the top. Unset (default) disables it. Must be >= 0; 0 is a legal,
# extreme value, distinct from unset, not the "off" spelling. Never affects
# the verdict or the exit code.
# PRXREF_SIZE_WARN_LINES=

# Same contract as PRXREF_SIZE_WARN_LINES, thresholding files instead.
# PRXREF_SIZE_WARN_FILES=

# Extra glob patterns (fnmatch, case-sensitive, matched against the full diff
# path; * crosses /) excluded from both size counts above, ADDED to the
# built-in lock/generated-file detection. Comma- or whitespace-separated, so
# a literal space in a glob is written ?. Empty (default) adds nothing.
# PRXREF_SIZE_IGNORE_GLOBS=

# Spec/ticket sources to review against: web URLs, local file or directory
# paths, or Jira ticket URLs. Comma- or whitespace-separated when set here;
# repeatable `--spec` flags replace this list entirely (no merge). In CI, a
# local path inside the PR's checkout is content the PR itself controls.
# PRXREF_SPEC_SOURCES=

# Raw fetched characters kept per spec source before pruning. Must be > 0.
# Truncation at the cap is announced in the fetched text, never silent.
# PRXREF_SPEC_MAX_CHARS=120000

# Token budget for the spec digest injected into worker prompts. Must be > 0.
# PRXREF_SPEC_DIGEST_TOKENS=3000

# Team review-rules file (Markdown, optional front matter with a severity:
# map) added to every review prompt. A missing, unreadable or malformed file
# is a configuration error (exit 2). `--rules-file PATH` wins for one run;
# `--rules-file ""` turns it off. Read it from a trusted checkout: in CI the
# workspace is usually the PR's own code, so a rules file inside it lets the
# PR rewrite its own review rules. See docs/review-rules.md.
# PRXREF_REVIEW_RULES=

# Characters of the rules body (after the front matter) kept in the prompt;
# a longer body is truncated with a warning. Must be > 0.
# PRXREF_REVIEW_RULES_MAX_CHARS=12000

# Plain-text or Markdown file holding the ticket this PR implements. When set,
# every finding is marked in, out of, or of unknown ticket scope. An empty
# file means "this PR has no ticket". A missing or non-UTF-8 file is a
# configuration error (exit 2). Ignored by `prxref serve`.
# `--context-file PATH` wins for one run; `--context-file ""` turns it off.
# PRXREF_TICKET_CONTEXT_FILE=

# Characters of ticket text kept in the prompt; longer text is truncated with
# a visible marker. Must be > 0.
# PRXREF_TICKET_CONTEXT_MAX_CHARS=6000

# Jira base URL (scheme://host plus any context path) that ticket fetches are
# looked up on, overriding a ticket URL's own base (a self-hosted board often
# sits behind a different REST host than its browse URL). Jira credentials
# are only ever sent here. Empty uses the ticket URL's own base, anonymously.
# PRXREF_JIRA_BASE_URL=

# Jira account email for HTTP basic auth on ticket fetches, used only together
# with PRXREF_JIRA_BASE_URL: set without it, the fetch stays anonymous and a
# warning is logged. Leave empty for anonymous access to public boards.
# Missing credentials are a fetch failure (the review proceeds un-grounded
# with a note), never a configuration error.
# PRXREF_JIRA_EMAIL=

# Jira API token paired with PRXREF_JIRA_EMAIL for HTTP basic auth, sent only
# to PRXREF_JIRA_BASE_URL.
# PRXREF_JIRA_API_TOKEN=

# ------------------------------------------------------------------------------
# Per-Forge Authentication Tokens
# ------------------------------------------------------------------------------
Expand Down Expand Up @@ -159,6 +263,12 @@ PRXREF_MAX_CHUNKS=8
# GitLab token (Personal, project, or group access token with API access)
# PRXREF_GITLAB_TOKEN=

# Azure DevOps personal access token (Code (Read) to review; Code (Read & write)
# to post). Sent as Basic ":PAT". When empty, the Pipelines SYSTEM_ACCESSTOKEN
# is used as a Bearer token; when both are empty, requests are anonymous
# (public projects, read-only).
# PRXREF_AZURE_DEVOPS_TOKEN=

# ------------------------------------------------------------------------------
# Webhooks Configuration
# ------------------------------------------------------------------------------
Expand All @@ -172,6 +282,11 @@ PRXREF_MAX_CHUNKS=8
# Secret token / HMAC secret for GitLab webhook payloads (X-Gitlab-Token)
# PRXREF_GITLAB_WEBHOOK_SECRET=

# Azure DevOps service-hook secret: compared in constant time with the
# PASSWORD of the hook's Basic auth (the user name is ignored). Empty rejects
# Azure DevOps webhooks with 401 unless PRXREF_ALLOW_UNSIGNED=1.
# PRXREF_AZURE_DEVOPS_WEBHOOK_SECRET=

# Set to exactly 1 to accept unsigned webhooks (default off; insecure).
# Only the literal "1" works — true/yes/on are intentionally NOT accepted.
PRXREF_ALLOW_UNSIGNED=0
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,4 @@ dist/
docs/superpowers/
docs/configurability/
docs/release-hardening/
docs/issues/
Loading
Loading