Bo Chen / quickbase

Quickbase · data integration

inspection-reconcile

Is an inspection documentation package actually ready for review? This tool compares the work a project requires with the inspections, documents and approvals actually captured, explains every gap with the exact source rows, and never says “ready” on evidence it could not see.

The S02 report: BLOCKED. Obligation O-017 has no current inspection, found from the accepted scope rather than from the records; its four downstream checks are not evaluated.
Scenario S02, unedited: one missing inspection reads as one root failure, and the four checks behind it are marked “not evaluated” instead of piling up as more failures.

Live verification · 9 October 2026

Verified end to end against a live Quickbase app

The tool built its test app in a real Quickbase realm through the REST API, captured it back read-only, and assessed what came back. Synthetic data only.

42API calls to build 4 tables, 3 relationships, 200 records and 80 files
29 / 29field IDs came out exactly as planned
80 / 80files captured; completeness earned, not assumed
207 / 207checks pass: READY_FOR_REVIEW
0findings added, removed or changed in outcome versus the reference scenario

Completeness was earned three ways: Quickbase's record totals matched, two read passes agreed, and the operator attested full read access.

The design

Three facts drive it

A checker that only looks at the records it was handed will happily approve an incomplete package.

01

Valid rows are not complete work

Expected work comes from an independently accepted scope, never from the records being checked. Thirty-nine valid inspections cannot satisfy forty obligations.

02

Absence from a partial view is not absence

Every finding is PASS, FAIL or UNKNOWN, plus NOT_EVALUATED behind a failed prerequisite. If the capture can't decide, the answer is UNKNOWN, and it says what would resolve it.

03

Approvals go stale

An approval binds a specific inspection revision and a SHA‑256 over the exact evidence bytes. Replace one photo under the same label and the approval no longer counts.

The Quickbase side

Built from the published API contract

The adapter follows Quickbase's official OpenAPI document and field-type pages, and it is careful in the places integrations usually aren't.

Read-only by construction

The client allows exactly four read operations: getFields, getTable, runQuery and downloadFile. The check runs before any request, so nothing can write or delete. The token comes only from the environment and is redacted from every message, log and file.

Field IDs, not labels

The mapping names fields by ID and is verified against the live field list, type and mode included. A renamed label changes nothing; a changed type stops the capture with a clear error instead of silently misreading data.

Completeness is earned

Keyset pagination by Record ID#, per-page total accounting, and a second pass that catches records changed mid-capture. Only a read that passes all of it is declared complete.

A separate, create-only builder

One command builds the test app's tables, fields, relationships and data through the API. It can only create, only inside the app it creates, never deletes, and the reader never imports it. A refused request stops cleanly and creates nothing.

What the report shows

Every finding carries its evidence

Each report is one self-contained HTML file: no scripts, no external requests, identical bytes on every operating system. Every finding has its expected and observed values, a resolution, and the source rows it cites.

The S08 report: R6 FAIL EVIDENCE_CHANGED_SINCE_APPROVAL, with the approved evidence digest next to the current one.
S08: a photo's bytes changed after approval while its revision label stayed the same. Digest binding catches it.
The S05 report: UNKNOWN. Every dataset is partial because the capture was interrupted, with four root unknowns and no failures.
S05: the capture was interrupted, so four missing inspections are UNKNOWN, not FAIL, and the status is UNKNOWN rather than BLOCKED.
The demo index: 24 scenarios, each matching its hand-written expected status, and the comparison of S02 with S06.
All 24 scenarios, each checked against a hand-written oracle. Open the live demo reports →

How it is tested

Built so a wrong answer has nowhere to hide

  • Expected results for 24 scenarios were written by hand from the specification before the engine existed, then re-derived independently. The tests never compute an expected verdict with the code under test.
  • About 900 automated tests, including five deliberately injected defects that must each be caught.
  • CI on Windows, macOS and Linux with Python 3.12 and 3.13, comparing every scenario's evaluation identity and report digest across all six.
  • An SQL cross-check: export-sqlite writes the snapshot to SQLite, and independent queries re-derive the engine's answers.
  • Independent review passes against the specification, each confirmed defect fixed with a regression test.

Run it yourself

About five seconds, no account needed

Python 3.12+ and uv. The demo runs offline: it assesses every scenario and checks each result against the oracle.

# clone, install, run every scenario
git clone https://github.com/bochen2029-pixel/inspection-reconcile
cd inspection-reconcile
uv sync --all-extras
uv run inspection-reconcile demo --all --out out/demo

The manual

Two guides, tested like the code

Every command the guides annotate with an exit code runs in CI and must exit as printed.

User Guide · 35 pages

Running an assessment, reading the report, the four outcomes, the eight checks in plain language, comparing two runs, and a guided tour of six scenarios.

Administrator Guide · 32 pages

Installing, requirement packs, the snapshot format, the Quickbase mapping and capture, the security model, provenance, and every exit and run-error code.