CI / unit tests
- Agent TestAgentStdioIsolated green
- Server TestServerStdioIsolated green
- Credit INT-REQ-005 marked covered via children
Topic · Integration testing
Gist
Integration testing checks that wired modules honor their boundary. Proof fails proof audit --check integration_evidence_witnessed unless each active INT-REQ has its own integration test, not a unit test on a child.
proof audit --check integration_evidence_witnessed
Keep Testcontainers if you already wire the stack. Keep Pact if you already mock the contract. Keep Jama if you author shalls. Proof will not count green parts as the assembled interface. Jama still authors.
01 · The parts are not the boundary
The agent honors stdio in isolation. The server honors stdio in isolation. The wired session still drops a handshake. The suite still reads green.
IBM, Wikipedia, CircleCI, and the testing glossaries define the same act: join the modules and check they work together. That sits between unit testing and system testing on the V-model. Proof does not replace that act. It asks a narrower question: if you wrote an interface requirement, is there a real integration test on that requirement, or only unit tests on the children?
Decomposition is not that witness. A nominal-covered derived SW-REQ verifies its own shall. It does not verify the assembled interface. That gap is how an INT-REQ that says two components honor stdio ships with green children and no test that actually wires them.
The command is deterministic. It does not call a model. It does not start Testcontainers. It refuses a silent pass when an active INT-REQ has no integration test and no honest deferral.
proof audit --check integration_evidence_witnessed
proof audit --check interface_staleness_clean
The first command is the V-model floor for INT-REQ. The second is the fingerprint check on the interface record itself. Green children after a copy-paste INT-REQ is how the wired boundary stayed untested.
02 · The exhibit
The children still pass. INT-REQ-005 never gained an integration test. Click the tabs.
CI / unit tests
This interface
No test wires agent to mcp_server over stdio. The handshake path was never exercised as a whole.
No witnessCI / unit tests
Still the children. Still a green log. Keep the unit suite.
Keep the partsProof
Same stdio. A green unit suite, or this witness. Click the tabs.
| What the record lists | What Proof actually does | What a green cell is not |
|---|---|---|
| Unit tests | Keep them. A SW-REQ still wants :nominal on its own function |
Not interface validation. The parts are not the wire. |
| Witness | A test annotated <INT-REQ>:integration:integration across the integrated component boundary |
Not a unit test on a derived SW-REQ. |
| Deferral | obligation_deferrals for class integration is counted WARNING, never a silent pass |
Not evidence. Only a real integration test clears it. |
| Runners | Keep Testcontainers, Pact, Playwright, go test | Not a test runner. Proof does not start the stack. |
| CI | Default-on warning. Strict-exempt: stays amber under audit.evidence_strict |
Not a signed V&V certificate. Jama still authors. |
The witness looks like this on a test file:
// INT-REQ-005:integration:integration
func TestMCPServerHonorsStdioProtocol(t *testing.T) {
// wire agent to mcp_server over stdio
// assert the interface contract holds across the boundary
}
If no integration test exists yet, stage the INT-REQ with an
obligation_deferrals entry: class integration,
a reason of at least 32 characters, and a
tracking ref. The check reports
N deferred (tracked) and a counted WARNING. It never reads as a clean pass. Only a real integration test clears it.
We have not run Testcontainers, Pact, and Proof on the same frozen corpus, and we have not scored this witness as a proof of the Go. The loss is named, not scored.
03 · The honest loss
The command refuses a silent pass. Proof will not pretend that YAML is a wired session, or that a warning is an error.
go test still owns the execution. Testcontainers still owns the stack. Pact still owns consumer-driven contracts. IBM and Wikipedia still own the glossary. Jama still authors the shall. Proof stores the INT-REQ in the repo and fails a silent pass when that shall has no integration test. It does not independently prove the interface is the right interface. It does not execute the integration test unless you wrote one. Default-on is a warning. Debt staged with
obligation_deferrals stays a warning even under
evidence_strict.
Proof is not Testcontainers. It is not Pact. It is not Selenium. Jama still authors. VectorCAST or LDRA still win at a qualified C toolchain.
The interface document still lives on interface control document. The stakeholder criterion still lives on acceptance criteria. Two implementations on the same input still live on differential testing.
04 · Nearby questions
What is software integration testing? Same URL. The typed head is integration testing. The software qualifier is this page, not a twin.
What is the difference between unit testing and integration testing? Unit tests pin one function. Integration tests pin the wired boundary. CircleCI and IBM still win that glossary.
proof audit --check integration_evidence_witnessed is the INT-REQ floor after the tests exist.
Is Proof an alternative to Testcontainers or Pact? No. Keep the runner. Proof checks that the claimed INT-REQ sits on a real integration test. Jama still authors.
Do unit tests on derived requirements count? No. A child's unit test witnesses the child. The INT-REQ needs its own integration test across the assembled interface.
What is an interface control document? That H1 lives on interface control document. The fingerprint of the record is not this witness.
What are acceptance criteria? That H1 lives on acceptance criteria. Stakeholder criteria want an acceptance test. INT-REQs want an integration test. Same V-model, different level.