Skip to content
Build and shipProduct pagePricing

Issues

Issues, discussions, wikis and boards are part of Fir: issues share one number sequence with pull requests in each repository, so #4711 is never ambiguous, and every issue links its pull requests, commits, main@verified, releases, sessions, CI runs and findings in one timeline. Issues are built for agents: filing is idempotent, deduplicated before it creates anything, budgeted per agent, and carries evidence. A monitoring agent files issues from what your services do, and a fix agent resolves them end to end, so that most bugs are found, reproduced, fixed, proven and verified in production with no person, and people decide only what only a person can.

  • The words you know: issue, #479, acme/storefront#479, fixes #479, label, milestone, sub-issue, discussion, wiki, board. A pull request opened with fir pr create --fixes 479 closes the issue when it merges, and the reporters hear at merge and again when the fix reaches production.
  • Agents first: one API (frazer.source.v1), the fir issue commands, a small MCP toolset and events, from one schema. An agent assigned to an issue always has an accountable person, and the issue shows the agent’s session, plan and activity.
  • Ready for an agent: a readiness check scores how well an issue is specified and names what is missing before an agent is assigned.
  • Agent volume: fingerprints merge repeats into occurrences instead of new issues; similarity only suggests; a triage inbox offers one-key decisions; issues close on evidence, never on age.
  • Trust: issue text is untrusted input for agents. Every text carries a trust class, hidden markup is stripped, and an agent session started from an issue reads one repository.
  • Discussions, wikis and boards: discussions are threads of the same engine; wikis are docs in the repository, edited through pull requests; boards are views over issues, pull requests and squad tasks across repositories.
  • Security: repository permissions plus a triager role; restricted and sealed issues; private vulnerability reports with a sealed fix workspace that runs CI.
  • Import: a one-time import keeps numbers, keys and authors; two-way sync is there for teams that stay on another tracker.

Issues have no fee: attachments and evidence count as repository storage, and agents’ work bills as agent usage.

An issue links evidence: typed items, each a bounded snapshot of a signal with the source that can be run again.

Field Meaning
kind One of the kinds below
summary One line of at most 200 characters (“1,284 lines panic: nil pointer in checkout-api, 13:27 to 13:41”)
source The typed reference that can be run again: a log query and window, a trace ID, a metric query, a replay range, an alert firing, a check, a rollout, a commit, a pull request version, a session’s event range, a CI run, a reproduction run
snapshot The bounded copy in Frazer Storage with its SHA-256 digest, stored once and shared between issues; the ID is the digest’s first 12 hex digits (ev_9b1f2c4e7a10)
captured When and by whom, and whether it is attested (Frazer captured it from its own systems, signed) or asserted (uploaded)
redaction The rule set’s version, the counts per rule and what was refused, never the removed values
trust, visibility, retention telemetry, outside (from public ingest keys and outside reporters), member, agent-attested or agent-asserted; repository, restricted or sealed; how long the snapshot stays
Role on each issue symptom (what broke), cause (the release, the commit, the diagnosis), repro (a run that makes it happen), proof (what shows it is fixed) or context

Kinds: log (the matching lines with five lines of context), trace, metric (the series and the panel as SVG), profile, replay (a masked session-replay segment around the moment), screenshot, har, recording (a browser recording), error (an error group with sampled events), alert, incident, check, deploy, commit, pull_request, session (an event range of a Fir session), issue, finding, test, repro, file and link. Each has a size cap, and an issue holds 200 MiB of evidence by default.

Where it comes from. Every view that shows a signal has Attach to issue and File issue, and the item is captured on the server, so it is attested. The new-issue form has an evidence tray that takes anything pasted (a Frazer URL, a trace ID, rec-…, #4630, main@51027), files dropped (a HAR, a log, a screenshot) and “Capture from” pickers, and shows each item’s summary, digest and redaction before the issue exists. The CLI and MCP take references, captured by the server; an agent uploads bytes only when no reference exists, and then the item is asserted. A filing rule names the evidence it captures, so an issue the monitoring agent files arrives with its evidence.

Redacted before storage. The unredacted bytes are never written: uploads are sanitized on your machine first (a HAR loses its cookies, authorization headers and token signatures, and is refused if a session token remains), then the server applies Fir’s secret checks (a verified secret is refused, an unverified one masked), the personal-data rules (emails, phone numbers, payment cards, government identifiers, tokens, passwords) and your project’s own patterns. Values that identify people become stable pseudonyms under your project’s evidence key, so “the same 214 users” can be counted without anyone’s address.

Integrity. Each item has a digest; an item Frazer captured has a signed manifest (an in-toto statement), and fir issue evidence verify 4711 checks every digest and signature offline. An item never changes: a correction is a new item that supersedes it, and removal for privacy or law keeps a tombstone (digest, who, when, why). An item cited by a merge receipt, a proof or a production verification cannot expire while the record citing it lives. Evidence is kept as long as its issue, and a closed issue keeps its evidence for 2 years by default, so an issue shows what happened long after the monitoring data itself has expired.

Still happening? Re-run runs a query-kind item’s source again and returns the change against its snapshot: “then 1,284 lines in 14 minutes; now 0 in the last hour at 1.1 million requests”. The fix agent’s first gate and the production verification use it.

Every closed issue with evidence, a cause and a verified fix becomes a labeled case for evaluating the monitoring and fix agents’ harnesses in the Lab, cut by date so a later model never trains on its own test.

Terminal window
fir issue create --title "Checkout 500 on gift cards" --evidence trace=4bf92f35 --evidence file=session.har
fir issue evidence add 4711 --replay rp_7Q2 --range 09:12:40-09:13:55 --role symptom
fir issue evidence rerun 4711 ev_9b1f2c4e7a10 --json

The agent monitor watches your services’ signals and files an issue only when a filing rule passes:

Signal Files as Default
Error groups: new, new in a release, regressed, escalating bug On after 14 days in shadow
Alert firings at ticket severity; slow error-budget burns bug or task On
New log patterns; metric anomalies; UI friction (rage, dead and error clicks) bug or task Shadow, with a judgment step
CI failure clusters and flaky tests bug On
Canary failures, rollbacks and the watch’s reverts; Frazer Reviewer’s watch after merge bug On
Dependency advisories task On
Performance regressions; cost anomalies bug or task Shadow

Deterministic first. Signals are grouped by fingerprint, given a state (new, new in release, regressed, escalating), checked against the rule’s windows and conditions, deduplicated, given an owner, a severity and a confidence, checked against the budgets and the incident gate, and given their evidence, all deterministically next to the data. A model writes only the words (the title, the summary from typed fields, “what changed” from the releases and flags in the window) and, for rules marked judged, a verdict on whether the signal is worth an issue; judged rules stay in shadow until their verdicts’ precision is measured. The model never decides to file under a deterministic rule.

  • Windows by impact tier (defaults): critical paths (checkout, sign-in, payments, as tagged in the service catalog) file at 3 events from 3 users in 10 minutes; standard at 10 events in 60 minutes or 25 in 24 hours; low (background jobs, client-only groups) at 50 events in 24 hours from at least 25 users, or with any server-side corroboration. A group first seen in a release at most 48 hours old files at the critical window, with the release’s changes as cause evidence. A group that stopped within 15 minutes with no change in progress files nothing and is logged as transient.
  • Rules are data: Frazer’s built-in rules per kind and your own (.frazer/monitor/rules/*.yaml or the API), each with a scope, windows, CEL conditions over the group’s statistics, a known-noise list, an evidence spec, owner and severity mappings, a mode (shadow, on, judge) and its measured precision. A rule change shows what it would have filed in the last 30 days before it applies.
  • Links, never merges. A similar new group is linked under an open issue only when its crash site matches too; links stay visible and reversible, and split by themselves when a fix stops one group and the other keeps occurring. Occurrences, escalations, regressions, new releases and new evidence update the open issue instead of filing again, with at most one comment a day unless the severity changes.
  • Owner, severity, confidence. The owner comes from OWNERS of the top in-app frame, then the service catalog, then the author of the change that introduced the group. Severity comes from a table, not a model: an incident, a critical path or 1 % of a service’s users, standard, or low. Confidence is the rule’s measured precision in your project times the share of its evidence spec that was captured, counted item by item.
  • Budgets and floods. At most 100 new issues an hour per filer; by default 30 a day per team and 10 per service, with the overflow folded into one digest issue per team and day, never dropped. In incident mode (a service’s signals at 10 times their baseline, or an open incident), new symptoms attach to the incident instead of filing one by one, and the follow-ups file when it resolves. The agent’s own queries are budgeted per backend, and a failed query is recorded as unknown, never as “no data”.
  • Shadow first. Every rule starts in shadow for 14 days and records what it would have filed. It turns on when its precision’s lower bound reaches 90 % on 20 labels or more, falls back to shadow below 80 %, and is paused with a notice when nobody acts on what it files for 7 days.
  • Telemetry is untrusted. Events sent with public ingest keys are outside; every string in an event is data, quoted inside content boundaries, never an instruction. An issue whose evidence is all outside cannot start an automatic fix until a server-side event, a CI failure, a reproduction or a person corroborates it.

An agent-filed issue carries a Filed by card (the rule and its version, the window met, the confidence with its parts, the owner and why, the severity), the evidence grouped by role, “what changed”, and what the agent did not do (no fix started, and why: the policy’s mode, funds or trust).

Terminal window
frazer monitoring rules list
frazer monitoring rules backtest error.new-in-release --since 30d
frazer monitoring agents pause monitor --reason "noisy after the migration"

The agent fixer claims an issue and passes nine gates. Each attempt is a record with its claim, its session, each gate’s result, its cost and its outcome. The rules that bind it (a reproduction attested by Frazer CI before any edit outside tests, existing tests read-only, two automatic attempts, the budget check first) are enforced by the host and Fir, not the prompt, so they hold on whichever harness you assign.

Gate Rule
G0 Eligible The issue policy allows fixes for the kind; the issue is well enough specified; its trust is corroborated; the attempt’s estimate fits the budget and the balance
G1 Still happening The evidence is re-run on the newest release, and open pull requests and newer releases are checked for a fix already made. Already fixed ends the attempt with the re-run as proof
G2 Reproduced A reproduction fails 3 of 3 at the release the issue was filed against: a test in a workspace, a request replay, or a browser rerun in a preview of that moment
G3 Diagnosed The failing behavior, the cause with its lines, caused_by from an automatic bisect with the reproduction, and what fir why says about those lines; each claim cites the session event that supports it, or it is unverified
G4 Test first The reproduction is committed as a regression test before the fix, and a mutation run on the touched lines shows it rejects what the old tests let through; existing tests are read-only
G5 Allowed fix No suppression (catch-all handlers, swallowed errors, a lowered log level, a sampling or filter change, an edited alert or policy), no limits or timeouts raised without analysis, no test deleted or weakened, no feature turned off, nothing outside the policy’s terms, no sealed path
G6 Proven CI passes at the exact version; Frazer CI runs the regression test at the old head (fails) and the new one (passes), with the issue’s failure signature; preview smoke tests on what the change affects pass; Frazer Reviewer’s second opinion passes
G7 Merged Under the auto-merge policy: the issue under the approved issue policy is the intent; otherwise one card for the accountable person
G8 Verified Once the release reaches the policy’s share, the issue’s evidence is run again with the expected count against the observed one

The gates are strict where agents slip. G3 refuses a diagnosis that ignores its own evidence and, from R2 up, calls a challenger of another model family. G4’s test executes every changed line, error branches included. G1 never races a person who is fixing the same thing, writes its attempt record before it acts, and raises repair-loop suspicion when a symptom comes back on an automated actor’s cadence. G8 can end inconclusive when the traffic cannot decide.

Reproduction, then diagnosis, then the test. One stage explores and writes the diagnosis; a second writes the failing test from it with a test-only toolset. A flaky reproduction is made deterministic (the clock, randomness and the network pinned) or routed to the flaky path; a reproduction that does not happen ends the attempt as abstained: not reproduced, with what was tried, and the issue stays open under monitoring. On acme/storefront#4711 “Checkout fails with 500 on gift-card orders since v2.14.2”, filed by monitor, fixer reproduces the failure 3 of 3 in a preview of the release, exports the failing test, and the fix #4718 passes it (demo data; Browsers for agents has the steps).

The fix and its merge. A minimal change in the paths the issue’s owner owns. Its intent names the issue, the diagnosis, the reproduction and its expected effect (“fingerprint error:NilPointer:… has no events in releases at or after v2.14.3”). A fix beyond the policy’s terms becomes a plan for a person to approve. It merges through the ordinary pipeline, with hotfix priority for severe issues; a freeze admits it.

One fix per cause. Issues with one cause join one attempt; more than five become a campaign with one plan. A change the watch reverts goes back to its origin: the plan item or campaign shard that made it re-lands it with the revert’s issue attached, and the fix agent writes a forward fix only when the origin is closed, the change was a person’s, or the watch could not revert alone. Two agents never work one failure.

Verified in production. With the group’s rate before the fix and the traffic since, the fix is verified when no event arrives over enough comparable traffic to be sure (an expected count of about 7 events); the issue shows the progress (“2.1 of 4.4 hours of comparable traffic”). A low-rate issue with no event after 7 days closes as verified (low traffic), a weaker label shown as such. New errors in the same endpoint within 24 hours of the release link as possibly moved and block verification, because a symptom that moved is not a fixed cause. The counts come from Frazer’s monitoring, not from the agent’s session.

Attempts and people. A recurrence in a release at or after the fix ends the episode as fix failed and reopens the issue as a new episode that names the failed attempt. Two automatic attempts, the second from a clean context on another model family; then one card for the accountable person, with both diagnoses, the reproduction, why each failed and the options. Abstentions are results: already fixed, not reproduced, not a code fix (handed to its owner as a person task with the exact change), or needs a person.

No funds, no run. Before an attempt the agent prices it. If the budget or the balance cannot cover it, the issue says “Not run: no funds” with the balance and the budget that blocked it, a person task of kind purchase opens, and the attempt resumes when funds return; it never runs a cheaper model or a shallower attempt. In the CLI that is exit 13 with the reason FUNDS_EXHAUSTED.

Security of the loop. monitor files and fixer fixes: the fixer cannot edit filing rules, alert policies, sampling, the issue policy or the Reviewer’s settings, and the monitor cannot open pull requests, so neither changes what judges it. The fixer runs in a cell with default-deny egress, packages only from your registry’s mirrors at the lockfile’s versions, no production credentials and read-only, rate-limited telemetry. Rollbacks, traffic shifts and restarts are releases’ guarded actions or a person’s, never the fix agent’s. A red-team suite (forged public-key events, injected issue titles, suppression patches, test weakening) runs before every release of either agent.

Terminal window
fir issue claim 4711 --agent fixer --dry-run
fir issue repro 4711 --at v2.14.2 --times 3
fir issue proof 4711 --json
fir issue verify 4711 --json

An issue policy per project, approved by its accountable person and versioned, sets for each kind of signal:

Setting Values
files off, shadow or on
fixes off; diagnose (the cause and a reproduction, no pull request); draft (a draft pull request a person merges); fix (through the gates, auto-merged under the auto-merge policy)
a person when never, by risk class (R3 always), or always

On by default with monitoring. When a project turns on the monitoring agent, the fix agent runs at once on the kinds that file from the first day (CI failure clusters and flaky tests, the Reviewer’s watch, dependency advisories, canary failures and reverts). Error groups file after their 14-day shadow, so their fixes start on day 15, and during the shadow the fix agent runs shadow attempts on what would have filed: it reproduces and diagnoses (G0 to G3), opens no pull request and changes nothing, so day 15 starts with measured reproduction rates per kind (by default at most 20 a day per project and 10 % of the fix budget; fir issue claim 4711 --shadow runs one). Turning monitoring on shows the expected spend first (“about $12 a day at your error volume, inside your $200 cap”); every new organization starts with a hard monthly cap; fir issue attempts stop --all stops every running attempt and keeps its records, and fir issue policy edit --fixes off turns fixes off for a kind or the project, both within 10 seconds. On day 7 the accountable person gets one first-week report: what filed and would have filed, what the fix agent did, the cost and the kinds with the best and worst fixability. Bugs that people file keep the triage agent’s first pass, off until a team turns it on.

The policy proposes defaults per kind: error groups file after 14 days in shadow and fix up to R2, with R3 and security always to a person; alerts and slow burns diagnose; new log patterns and anomalies stay in shadow; CI failure clusters fix (a quarantine with an expiry, then the fix); dependency advisories fix through the dependency updater; performance regressions and UI friction draft; security findings draft in a sealed workspace and always reach a person.

The policy states its terms: the paths a fix may touch (the issue’s owning paths), its size (6 files and 300 changed lines by default), the classes allowed, the risk classes that may auto-merge and the budgets. A fix inside the terms has the issue under the approved policy as its intent, which is what auto-merge’s first condition reads; a fix outside them becomes a plan. Budgets go per attempt, per kind per day and per month, with quiet hours and no weekend pings for people. The policy can live in .frazer/issues.yaml; fir issue policy backtest --since 14d shows what it would have filed, fixed, merged and asked a person in the last 14 days. A version that widens the policy waits for the accountable person; narrowing applies at once.

Values from production: probes and snapshots

Section titled “Values from production: probes and snapshots”

A fix agent often needs the values a running service saw. Read-only probes (a snapshot of variables at a line in a running service) run on previews by default. In production they need a capture approval for that service: one record, ca-…, that a person approves (never an agent) and that also covers exception snapshots and the payload capture of Frazer QA, so an organization reviews every capture on its services in one list.

Field Meaning
service, environment, kind One service in one environment; probe, exception_snapshot or payload_capture
bounds Hits, time, a token bucket, a CPU share and a log rate
redaction_mode, redaction_rules strict (every value but numbers and booleans) in production or targeted; never off
drop_classes Dropped, never masked: card data, secrets and credentials are not stored at all
expire_time, approver, reason 30 days by default; renewal is one card with the period’s counts

The request is an approval in the approvals engine with the counts as its evidence (“21 open issues on checkout-api lack variable values”), voted with a passkey under production step-up; an agent’s request waits with exit 13 (APPROVAL_REQUIRED). It fails closed: an expired, revoked or unreachable approval stops its captures within 60 seconds. Once a service is approved, a snapshot is armed at a new error group’s crash site, at most one per exception type per instance per hour. frazer monitoring capture-approvals request, list and revoke manage them (MCP capture_approvals_request, capture_approvals_list, capture_approvals_revoke).

fir issue evidence export 4711 --bundle writes an evidence bundle in open formats with a signed manifest, and fir issue evidence verify --bundle checks one anywhere, offline. Each project keeps a custody log of every capture, read and export with inclusion proofs (fir issue evidence verify --custody). An agent’s closure carries its proof, and the same evidence drafts the regulatory incident reports a person files.

Every filing, every fix attempt and every outcome link is a record. An issue stores caused_by (the pull request and version, the merge commit, the lines; found by an automatic bisect, by blame, or asserted), and Frazer Reviewer classifies the review of that change as told (a finding on the causal lines was not fixed, shown on the issue with the dismissal’s own words), missed, partial or outside, with a miss analysis for the missed ones. Filing rules and kinds are promoted and demoted on measured outcomes: a dismissal’s reason is a labeled example, and the same reason three times drafts a rule change that a person approves after its backtest.

Command What it does
fir issue create --evidence … File an issue with evidence by reference (log=, trace=, file= and the other kinds)
fir issue evidence add, list, verify, rerun Attach evidence with a role; list it; check digests and signatures offline; run a source again
fir issue claim, repro, proof, verify Claim an issue for the fix agent (--dry-run prints the gates and the estimate); reproduce it at a release; read the proof; follow the production verification
fir issue attempts The fix attempts with each gate’s result; stop ends one, stop --all every running one
fir issue evidence export, verify --bundle, verify --custody An evidence bundle in open formats; check a bundle or the project’s custody log offline
fir issue view @latest, @top, @mine The newest issue, the top of the triage order, or yours
frazer monitoring capture-approvals request, list, revoke The capture approvals on your services: probes, exception snapshots and payload capture in production
fir issue policy view, backtest, edit The issue policy, what it would have done, a change
frazer monitoring rules list, test, backtest Filing rules and what they would have filed
frazer monitoring signals list Signals and what became of each: filed, an occurrence, absorbed by an incident, folded into the digest, dropped
frazer monitoring agents get, pause The monitoring agent’s state; pause it with a reason

MCP: the default tools take the names agents already know from GitHub’s server (search_issues, list_issues, issue_read, issue_write, add_issue_comment, sub_issue_write); issue_read returns evidence among its parts and issue_write takes evidence[] as references. The opt-in group issue_fix adds claim_issue, repro_issue, get_issue_proof, verify_issue, add_issue_evidence, rerun_issue_evidence, export_issue_evidence and verify_issue_evidence; the older names stay as hidden aliases. Tool output carries trust classes and handles, never raw bulk. Events: source.evidence.captured, .attached, .redacted; source.issue.claimed, .fix_attempt_started, .fix_attempt_finished (with the gate that ended it), .verified, .fix_failed, .abstained, .not_run; and monitoring.signal.filed, .occurrence, .absorbed, .folded, .dropped.