Change and defect lineage

Every change should carry its proof.

A Proof change record connects the reason for a change to what actually moved, what it affected, how it was tested, and why the result was accepted.

01 / The comparison

A commit is not an explanation

A commit says what text moved. A Proof change record says why the behavior moved, which components and requirements were affected, what code and documentation changed, and which evidence made the result acceptable.

GIT

  • what changed

PROOF

  • why it changed
  • what intent moved
  • what was affected
  • what evidence was required
  • who approved it
  • what remains uncertain

The sixth line

A change record that only prints good news is not evidence. Proof writes down what the change did not settle: the obligations that still need to run, the sibling cases nobody has swept yet, the class that is still open.

The rest of this page is the shape of that record, field by field. The short version is on the landing page.

02 / Kind: feature

Feature changes

A feature change is a change record with the kind set to feature. It is the same object as a fix, and it answers the same questions: what new behavior was intended, which requirements moved, and what made the result acceptable.

CHANGE-1042 Verified

KINDfeature

INTENT

Support nested array updates.

COMPONENTS

parser

REQUIREMENTS

2 added · 3 affected

IMPLEMENTATION

4 files

DOCUMENTATION

1 document updated

EVIDENCE

8 tests · 2 properties · hazard review

APPROVED BY

maintainer

Worked exampleAn illustrative record, drawn to shape. The fields are the schema every feature change fills in; a real one is opened field by field in section 04.

A feature change records

  1. why the behavior changed
  2. which component owns it
  3. which requirements were introduced, changed, or affected
  4. the implementation diff
  5. documentation changes
  6. blast radius
  7. tests and other evidence
  8. review and approval
  9. final verification state

A refactor and a behavior change use the same record with a different kind. The fields do not change; the evidence the record demands does.

03 / Unresolved

Open issues

A known issue is an unresolved problem. It carries everything the next person needs to reproduce it and everything Proof needs to judge the fix. An issue remains open while the problem remains unresolved.

KNOWN ISSUE Open

STATEunresolved

WHAT IS WRONG

the problem, in one statement

VIOLATED REQUIREMENT

the intent this breaks

SEVERITY AND HAZARD

what it can cause downstream

AFFECTED COMPONENT

who owns the behavior

EXECUTABLE REPRODUCER

a test that pins the break today

RELEVANT CODE

where the behavior lives

EXPECTED BEHAVIOR

what the requirement promises

CURRENT OBSERVED BEHAVIOR

what the code does instead

Blank formEvery value here is a slot, not a claim. This is the shape an open issue has to fill, so no identifier and no values are filled in.

Why the reproducer is the point

An issue without an executable reproducer is a report. An issue with one is a measurement, and the same test decides later whether the fix worked.

The reproducer is kept after closure, so the case can never quietly come back.

Counting rule

A known issue is not a defect record. Proof never mixes unresolved issues and verified defect records into one number, because the two say opposite things about the software.

04 / Kind: defect fix

Verified defect records

When the issue is fixed, Proof creates a verified defect record that preserves the fix and its evidence. It uses the same evidence-bearing model as any other change. The issue closes; the proof stays.

DEFECT-260726-MFPA Covered by requirement

KINDdefect fix

TITLE

Set with array-index path component under an object parent produces malformed JSON output.

ORIGIN

Known issue KI-3

VIOLATED INTENT

SYS-REQ-009

REPRODUCER

set_spec_test.go · pins the break on the affected revision

FIX

parser.go · Set

INSTANCE

fixed

DISPOSITION

covered_by_requirement · reviewed by human:buger

DEFECT CLASS

obligation attached to SYS-REQ-009 / not declared closed

REGRESSION

two tests retained, permanently

Real recordRead off proof/problem-reports/DEFECT-260726-MFPA.yaml on our public project, with the same record opened field by field.

A verified defect record records

  1. the originating issue
  2. the original reproducer
  3. the fixing change
  4. affected requirements and components
  5. root cause
  6. the evidence proving the individual instance is fixed
  7. any evidence supporting closure of the wider defect class
  8. sibling-defect analysis
  9. permanent regression evidence
  10. human or policy approval

Two of those lines are different claims: the instance and the class. The record keeps them apart, and so does the next section.

The record beside this list is one of ours, so it is shown in the state it is actually in. The instance is fixed and the reproducer is kept. The record does not say the class is closed, and neither do we.

05 / Closure

Instance fixed versus class closed

One passing reproducer can prove the known instance is gone. Closing the whole defect class takes broader evidence.

Rung 1

  • REPRODUCER PASSES

INDIVIDUAL INSTANCE FIXED

The reproducer that pinned the break passes after the fix. That settles the case in front of you, and only that case. The test is kept forever, so this instance cannot return unseen.

Rung 2

  • BROADER OBLIGATIONS PASS
  • SIBLING SWEEP
  • HAZARD EVIDENCE
  • BLAST-RADIUS VERIFICATION

DEFECT CLASS CLOSED

The class is every case that shares this root cause. Proof records it as closed only when the wider obligations pass, the sibling cases are swept, the hazard has evidence against it, and the blast radius is verified again. Until all four are in, the record says what is attached and what is still open.

A passing reproducer is not a closed class. The two rungs stay on the record as two separate statements, so nobody has to guess which one was earned.

06 / Reach

Blast radius

Every change record carries its reach. See the blast radius before you touch the code, and see it again, measured, after the change lands.

IF THIS CHANGES

  • 5 files
  • 13 tests
  • 1 parent requirement
  • related obligations
The reach is read from the dependency graph, not from a folder. Illustrative counts, drawn to shape; a real record lists every file and test by name.

Two readings, one record

Before the work, the reach is a warning: this is what the change can touch. After the work, the same list is a checklist: this is what was re-proven, and this is what was not.

The gap between the two readings is the honest part of the change. It is written into the record instead of being left for a reviewer to notice.

How the graph answers this

07 / Staleness

Evidence invalidation

Software knowledge becomes dangerous when it silently goes stale. A change record does not only say what it proved. It says what it put in doubt.

  1. VERIFIED

    the obligation ran and passed on a known revision

  2. EVIDENCE STALE

    the code, the requirement, or the document under it moved

  3. VERIFIED

    confidence is restored against the new revision

Proof does not automatically declare the requirement false. It withdraws yesterday’s confidence until the affected obligations are reviewed or rerun. The record carries the list, marked EVIDENCE REQUIRED, and it stays there until somebody clears it.

This is why a change record is worth more than a green pipeline. A pipeline reports the tests that ran. The record also names the ones that should have run and did not.

08 / Retained

Change history for humans and agents

None of this is written for an archive. The history is the working context for the next change, and it is read the same way by a person and by a coding agent.

  1. new behavior
  2. change record
  3. requirements and evidence retained
  4. issue discovered
  5. reproducer retained
  6. defect record
  7. hazard and class knowledge retained
  8. the next human or agent starts with more context

The history is the context

Ask the record what a component promises, what broke it last time, which test proves it, and which obligations are still stale. The answer is retrieved, not remembered by whoever happened to be there.

Your coding agent gets the same model of the software that your engineers use. It reads the same requirements, the same reproducers, and the same open questions.

What the agent receives

09 / Release

Release-level change receipts

A release is a set of change records. The receipt is what they add up to, in one document, with a route from every line back to the record that produced it.

RELEASE RECEIPT Template
CHANGE RECORDS
every change in the release, by kind
REQUIREMENTS
introduced, changed, affected
EVIDENCE
what ran, and on which revision
KNOWN ISSUES OPEN
listed, never folded into the defect count
DEFECT RECORDS
instance and class stated separately
STALE OBLIGATIONS
what must be proven again
APPROVALS
who accepted the result, and when
WHAT REMAINS UNCERTAIN
stated, not omitted

A receipt nobody has to write

No line here is a summary somebody typed at the end of the quarter. Each one is assembled from records that already exist, and each one can be opened.

That is also what makes it safe to show outside the team. A receipt that can be checked is worth reading; a status report is not.

Receipts we publish on our own work

How the evidence is produced