git blame tells you who and when. This tells you why.

Why is this line here?

Understory reconstructs the reasoning behind a line of code — tracing commits, pull requests, and issues back to the decision that introduced it.

Understorycode archaeologypayments-service / src/billing/charge.ts line 96 artifacts · 3 clauses · 1 silence
  1. Line 8.export async function chargeCustomer(req) {
  2. Line 9, investigated line. for (let attempt = 0; attempt < 3; attempt++) {
  1. A, commit 92f6a3f, 15 Mar 2023, cited by clause 1, quote verified
  2. B, review review·dmitri-k, 14 Mar 2023, cited by clause 3, quote verified
  3. C, review review·ana-l, 12 Mar 2023, cited by clause 3
  4. D, pull request pr:812, open 9 → 15 Mar 2023, cited by clause 1 and 2. first revision: for (let attempt = 0; attempt < 5; attempt++) {
  5. E, issue issue:1187, 2 Mar 2023, cited by clause 2, quote verified
  6. F, commit 7be210e, 18 Jun 2021, not cited by any clause. Line read: while (true) {
  7. Not recorded: no pull request, review or issue before commit 7be210e
The line’s origin is silentBlame reaches 7be210e, but no pull request, review or issue explains it. Understory does not infer a reason here.
asked of the token 3 · line 9

Why exactly 3 retries?

reconstructed why · read downward

  1. Supported by A, commit 92f6a3f; D, pull request pr:812. 1 quote verified.
  2. Supported by E, issue issue:1187; D, pull request pr:812. 1 quote verified.
  3. Supported by B, review review·dmitri-k; C, review review·ana-l. 1 quote verified.
Understorypayments-service / src/billing/charge.ts line 96 artifacts · 3 clauses · 1 silence
asked of the token 3 · line 9

Why exactly 3 retries?

reconstructed why · read downward

  1. Supported by A, commit 92f6a3f; D, pull request pr:812. 1 quote verified.
  2. Supported by E, issue issue:1187; D, pull request pr:812. 1 quote verified.
  3. Supported by B, review review·dmitri-k; C, review review·ana-l. 1 quote verified.
  1. Line 8.export async function chargeCustomer(req) {
  2. Line 9, investigated line. for (let attempt = 0; attempt < 3; attempt++) {
  1. A, commit 92f6a3f, 15 Mar 2023, cited by clause 1, quote verified
  2. B, review review·dmitri-k, 14 Mar 2023, cited by clause 3, quote verified
  3. C, review review·ana-l, 12 Mar 2023, cited by clause 3
  4. D, pull request pr:812, open 9 → 15 Mar 2023, cited by clause 1 and 2. first revision: for (let attempt = 0; attempt < 5; attempt++) {
  5. E, issue issue:1187, 2 Mar 2023, cited by clause 2, quote verified
  6. F, commit 7be210e, 18 Jun 2021, not cited by any clause. Line read: while (true) {
  7. Not recorded: no pull request, review or issue before commit 7be210e
The line’s origin is silentBlame reaches 7be210e, but no pull request, review or issue explains it. Understory does not infer a reason here.

Not a chat about your repo. A record you can audit.

evidence > assertions
  • After 212 customers were charged twice

    • E · issue:1187
    • D · pr:812

    Every clause points to its sources

    Each statement carries the letters of the artifacts behind it. The conclusion is an index to the record.

  • Stripe returned 504s and 212 customers were charged twice.
    ✓ Quote found verbatim in issue:1187pr:9999 · not in evidence, rejected

    Citations are checked, not trusted

    A deterministic check finds every quote in its source. A fabricated reference is caught before you see it.

  • 7be210e · direct commit∅ no pull request, review or issuereason: not recorded

    It admits a cold trail

    When history doesn't explain a line, the gap is shown as a gap, never filled with a plausible story.

From a line you don't understand to the decision behind it.

    1. Line 8.export async function chargeCustomer(req) {
    2. Line 9, investigated line. for (let attempt = 0; attempt < 3; attempt++) {
    3. Line 10. try {

    01Point at a line

    Open a GitHub repo, find a file by name or symbol, and select the exact line in question.

  1. 02Follow the trail down

    Blame finds the commit; the pull request, reviews and issues behind it carry the reasoning, placed at their real depth in time.

  2. Capped at 3, with backoff

    Why it retries at all: not recorded

    03Read the reconstruction

    A reconstructed why, each clause tied to a source you can open, or an honest “the record is silent.”

Interrogate your own code.

Point it at a repository and a line. See what the history really says.

Explain a line →