317 lines
13 KiB
Markdown
317 lines
13 KiB
Markdown
# Scanner End-to-End Validation Evidence: 2026-09-22
|
|
|
|
## Verdict
|
|
|
|
The bounded production validation passed on the approved `sec` deployment.
|
|
It exercised the real PostgreSQL queue, protocol-2 remote assignment, existing
|
|
Windows/WSL worker, TruffleHog execution, bundle upload, durable receipt,
|
|
transactional ingestion, normalized findings/errors, and JSONL compatibility
|
|
projection paths.
|
|
|
|
The evidence consists of:
|
|
|
|
- 36 ordinary public-target scans under realistic production backlog;
|
|
- one separately managed non-live synthetic GitLab fixture scan proving the
|
|
positive finding path;
|
|
- exact append-region validation for `scan_results.jsonl` and
|
|
`found_secrets.jsonl` against PostgreSQL reconstruction;
|
|
- byte-identical restoration of the original production config;
|
|
- cleanup of private validation target files; and
|
|
- audited reopening of discovery and dispatch.
|
|
|
|
This is strong bounded production evidence, not a claim that every source,
|
|
failure mode, platform, detector, scale, or deployment environment is proven.
|
|
|
|
## Safety Envelope
|
|
|
|
- Only `sec` was used. `prod` was never touched.
|
|
- Raw targets, raw findings, credentials, device tokens, runtime YAML, worker
|
|
argv, the protected admin prefix, and edge markers were not printed.
|
|
- Configuration changes used managed Preview -> Save candidate -> Apply.
|
|
- Discovery and dispatch were paused and the runtime was drained before every
|
|
apply.
|
|
- Long operations and monitors ran detached and were observed with bounded
|
|
status polls.
|
|
- Host Caddy and X-UI remained outside the managed lifecycle.
|
|
- PostgreSQL remained the sole authority; JSONL was treated as a rebuildable
|
|
compatibility projection.
|
|
|
|
## Original Baseline
|
|
|
|
- Original active config SHA-256:
|
|
`f055a9f2506ab4fffa6953a95c2f6c07b1202e6558f4ce52bbf1b463ed6b1781`.
|
|
- Drained baseline high-water IDs:
|
|
- target queue: 1,534,069;
|
|
- result reservations: 880;
|
|
- target scans: 879;
|
|
- findings: 7;
|
|
- errors: 1,913.
|
|
- Runtime controls were revision 26, paused/paused, `drained`, blockers zero.
|
|
- One active worker device had contacted the server recently.
|
|
- All baseline orphan and referential invariants were zero.
|
|
|
|
Root-only baseline evidence:
|
|
|
|
- `/opt/truf-remote-server/staging/scanner-validation-pre.json`;
|
|
- `/opt/truf-remote-server/staging/scanner-validation-drained.json`;
|
|
- `/opt/truf-remote-server/staging/scanner-validation-pre-discovery-v4.json`;
|
|
- `/opt/truf-remote-server/staging/scanner-validation-pre-dispatch-newest-v5.json`.
|
|
|
|
## Defects Found and Corrected
|
|
|
|
The validation exposed defects that synthetic tests had not modeled precisely.
|
|
Each failure was contained by pause/drain, rollback, or failed-hold behavior
|
|
before dispatch was opened.
|
|
|
|
### Protected Config Parent
|
|
|
|
Discovery required the parent of a private file to be runtime-owned mode 0700,
|
|
while the deployed contract intentionally uses root-owned mode 0755
|
|
`/data/config` with runtime-owned mode 0600 documents. Writable runtime
|
|
directories still require private runtime ownership. Sensitive file parents now
|
|
also accept a non-link root-owned directory with no group/other write bits and
|
|
effective-user search access. The private file itself remains strictly checked.
|
|
|
|
### Supervisor Startup Locking
|
|
|
|
PostgreSQL readiness previously launched core children and discovery producers
|
|
while the supervisor held `control_lock`, then could perform another PostgreSQL
|
|
query under that lock. Child bootstrap/entrypoint authentication needed the same
|
|
lock and had bounded deadlines. Pipeline status refresh now happens before the
|
|
lock, structured snapshots use cached-only status, core children start before
|
|
source admission, and discovery producers use the source dependency gate.
|
|
|
|
### Strict Discovery Health
|
|
|
|
Ordinary Docker health intentionally tolerates periodic producer waits. Managed
|
|
lifecycle health now additionally uses explicit
|
|
`--require-discovery-producers` and rejects enabled producers that are absent,
|
|
blocked, never run, runtime-blocked, or waiting after a nonzero exit. Waiting
|
|
after a successful exit remains valid.
|
|
|
|
### Transient Strict-Health Probe
|
|
|
|
The first fixture apply encountered one bounded HuggingFace PostgreSQL
|
|
connection timeout after every core worker had started successfully. The host
|
|
lifecycle formerly performed only one strict probe after Docker health became
|
|
healthy. It now retries only health-category strict failures inside the existing
|
|
240-second runtime-health deadline. Identity and metadata errors remain
|
|
immediate failures, and persistent health failure still rolls back.
|
|
|
|
### Managed Claim Order
|
|
|
|
The remote assignment path already supported `oldest`, `newest`, and `balanced`
|
|
PostgreSQL admission, but the exact managed template omitted this field for the
|
|
three core sources. The optional field is now represented and semantically
|
|
validated. Temporary `newest` ordering allowed recent bounded discoveries to be
|
|
tested against the real 1.5-million-row queue without direct SQL mutation or
|
|
mass-hiding historical backlog. The restored original config omits the optional
|
|
field and therefore uses the normal `oldest` default.
|
|
|
|
### Candidate Base Authority
|
|
|
|
Candidate preparation originally used editor text that could represent an old
|
|
candidate rather than active config. This inherited an earlier intentionally
|
|
disabled Worker API setting. Candidate tools now read and hash-bind active
|
|
config bytes explicitly before deriving changes.
|
|
|
|
## Runtime Deployment Evidence
|
|
|
|
The corrected runtime was built as small derived immutable images rather than
|
|
modifying a running container. The final validation image ID was:
|
|
|
|
`sha256:5b9c86f68719d8c1f2358e0c4565dd2795ed608482968747feb961cf14908b5a`
|
|
|
|
Prior images remain under rollback tags. Image Entrypoint, Cmd, User, source
|
|
hashes, and in-image compilation were checked. An official lifecycle restart on
|
|
the final image completed `succeeded/succeeded`, reconciled, without a safe
|
|
category or failed hold.
|
|
|
|
Relevant local regression evidence accumulated during the run:
|
|
|
|
- runtime-document and worker-assignment tests: 45 passed;
|
|
- host lifecycle after transient-health retry: 34 passed, 4 platform skips;
|
|
- combined ACL/supervisor/health-focused suite: 246 passed, 9 platform skips;
|
|
- authenticated supervisor control class: 20 passed;
|
|
- focused compiles and `git diff --check`: passed.
|
|
|
|
## Bounded Discovery
|
|
|
|
The temporary candidate enabled one-page/one-result search settings for GitLab
|
|
and DockerHub and a four-item private custom file for HuggingFace. Dispatch
|
|
remained paused. Five successful cycles for each source completed before the
|
|
monitor's conservative time limit; no source cycle failed.
|
|
|
|
Because source cycles do not map directly to queue rows and uniqueness conflicts
|
|
consume sequence values, queue high-water deltas were not treated as exact
|
|
cohort membership. Eight new queue rows were observed: five GitLab pending and
|
|
three DockerHub deferred. No direct queue updates were made.
|
|
|
|
## Realistic 36-Scan Cohort
|
|
|
|
The worker processed exactly 36 new remote reservations, IDs 881 through 916,
|
|
while discovery remained paused. A fail-closed monitor paused dispatch at the
|
|
target and started drain. Final source mix:
|
|
|
|
| Source | Scans |
|
|
|---|---:|
|
|
| DockerHub | 11 |
|
|
| GitLab | 14 |
|
|
| HuggingFace | 11 |
|
|
| Total | 36 |
|
|
|
|
All 36 reservations were remote, resolved, acknowledged, and
|
|
`bundle_accepted`. They had 36 distinct queue IDs, bundle IDs, and scan event
|
|
IDs, and every reservation had a receipt, payload hash, and execution-snapshot
|
|
hash.
|
|
|
|
### Results
|
|
|
|
| Source | Result summary |
|
|
|---|---|
|
|
| DockerHub | 8 clean, 3 degraded |
|
|
| GitLab | 12 clean, 1 retryable API error, 1 permanent not-found |
|
|
| HuggingFace | 11 clean |
|
|
|
|
- Queue completion: 34 done, one deferred, one failed; no row remained fenced.
|
|
- Findings: zero, a valid outcome for random public targets.
|
|
- Errors: exactly two GitLab errors with queue dispositions matching their
|
|
retryable/permanent categories.
|
|
- Quarantine: zero new rows.
|
|
- Bundle/projection capacity after completion: zero items and zero bytes.
|
|
- Existing unrelated keycheck capacity was unchanged.
|
|
|
|
### Bundle and Projection Invariants
|
|
|
|
- 36 acknowledged bundles contained 110 frames.
|
|
- All bundle identities and counts matched their reservations and scans.
|
|
- Acknowledged physical `.trb` files were absent only after both pipeline
|
|
artifact records reached durable `deleted` state, as designed.
|
|
- 36 scans used `raw_result_storage=normalized_v2`.
|
|
- 36 compatibility rows used expected bounded reconstruction.
|
|
- Exactly 36 projection jobs completed, one per scan, without duplicates or
|
|
errors; all projection capacity was released.
|
|
- Physical append evidence covered 36 `scan_results` records and two
|
|
`scan_errors` records.
|
|
- Every registered append generation/offset/length existed and matched its
|
|
payload SHA-256, record count, and required JSON structure.
|
|
- `scan_results.jsonl` grew by exactly 83,752 bytes.
|
|
- `found_secrets.jsonl` did not change, matching zero random-target findings.
|
|
- All global queue/reservation and orphan invariants remained zero.
|
|
|
|
Root-only evidence:
|
|
|
|
- post snapshot:
|
|
`/opt/truf-remote-server/staging/scanner-validation-post-dispatch-newest-v5.json`,
|
|
SHA-256
|
|
`45f9db81e88dbcbe4d6a04094dd1d892df06dd3f7cdd05eb9280c19da54aed94`;
|
|
- aggregate report:
|
|
`/opt/truf-remote-server/staging/scanner-validation-cohort-report-v5.json`,
|
|
SHA-256
|
|
`e0826587e4ba667de10a994d5842aae5fae8fa11dc071210c202b38b0e643bf4`.
|
|
|
|
## Controlled Positive Fixture
|
|
|
|
Random public targets produced no finding, so a separate one-target run used a
|
|
public GitLab project whose README declares that its secret examples are
|
|
generated and non-live. No detector or verification behavior was weakened.
|
|
|
|
- Fixture queue ID: 1,534,100.
|
|
- Reservation ID: 917.
|
|
- The immutable Git plan bound the approved exact head commit
|
|
`2a09bd6767d39b95cf39ce4b5fd210721275d503`.
|
|
- The reservation became acknowledged with `bundle_accepted` and a durable
|
|
receipt.
|
|
- Queue completion was `done` with no remaining reservation fence.
|
|
- Target scan status was `found` with 116 findings and zero errors.
|
|
- All 116 findings used the existing OpenAI detector.
|
|
- Verified count was zero, consistent with the unchanged no-verification policy.
|
|
- All findings had distinct finding UIDs, nonempty identities, private raw
|
|
material, redaction different from raw material, correct secret hashes, and
|
|
complete non-omitted compatibility payloads.
|
|
- No raw finding value was emitted by validation tooling.
|
|
- Bundle retirement and both pipeline artifact tombstones were correct.
|
|
- The single projection job completed and released capacity.
|
|
- The registered `scan_results` region contained one record with exactly 116
|
|
findings and zero errors.
|
|
- The registered `found_secrets` region contained exactly 116 records.
|
|
- Both physical append regions matched the database payload SHA-256 and were
|
|
byte-identical to fresh PostgreSQL compatibility reconstruction.
|
|
- No new quarantine row was created.
|
|
|
|
Root-only fixture report:
|
|
|
|
`/opt/truf-remote-server/staging/scanner-validation-fixture-report-v2.json`
|
|
|
|
SHA-256:
|
|
|
|
`243a16b24bf9ae898bfdeb8f857c56ef1cf78e12e637730ff5b0674a250a4984`
|
|
|
|
## Restoration and Final State
|
|
|
|
The original 36,354 config bytes were passed through managed Preview, saved as
|
|
a candidate, and applied through the host agent. Preview preserved the exact
|
|
original SHA-256 and reported 169 semantic reversions.
|
|
|
|
- Restore Save operation:
|
|
`af2a3cc4-90ae-5831-b932-bbe78ceb2cab`.
|
|
- Restore Apply operation:
|
|
`b12a2fc4-202a-578e-8dcf-b0a88cb028ef`.
|
|
- Apply terminal state: `succeeded/succeeded`, reconciled, category `None`.
|
|
- Active and candidate config SHA-256 both equal the original
|
|
`f055a9f2506ab4fffa6953a95c2f6c07b1202e6558f4ce52bbf1b463ed6b1781`.
|
|
- Lifecycle preflight and strict Worker API/discovery health passed.
|
|
- Runtime and edge were healthy; no failed hold existed.
|
|
- All private validation target/evidence files were removed.
|
|
- The root-only original backup was retained for audit.
|
|
|
|
The drained post-restore snapshot is root-only at
|
|
`/opt/truf-remote-server/staging/scanner-validation-post-restore-drained-v1.json`,
|
|
SHA-256
|
|
`de4bd98d728dc551b10712a4afb6be2db0ac9111428d46fa5dbb16f8d2d611ca`.
|
|
|
|
Final audited control transitions advanced revision 46 to 49 in this order:
|
|
|
|
1. cancel drain;
|
|
2. resume discovery;
|
|
3. resume dispatch.
|
|
|
|
Final state was discovery open, dispatch open, drain `normal`. The existing
|
|
worker contacted the server within five minutes and immediately received normal
|
|
production work. A live assignment after reopening is expected and is not a
|
|
drain blocker because drain is no longer requested.
|
|
|
|
The final post-resume snapshot had zero orphan/referential invariants and
|
|
preserved the original config SHA-256:
|
|
|
|
`/opt/truf-remote-server/staging/scanner-validation-post-resume-final-v1.json`
|
|
|
|
SHA-256:
|
|
|
|
`42e19edae09550693d563b74631430cb1d2c1b807d636ccff20e545cebec3c2d`
|
|
|
|
External route checks through existing host Caddy returned:
|
|
|
|
- invalid Worker API authentication: 401;
|
|
- unauthenticated protected admin route: 401;
|
|
- unrelated path: 404.
|
|
|
|
Host-agent, Caddy, and X-UI services remained active. Caddy and X-UI were not
|
|
lifecycle targets.
|
|
|
|
## Residual Limits
|
|
|
|
This validation does not prove:
|
|
|
|
- long-duration soak or high-concurrency behavior;
|
|
- every detector and verification provider;
|
|
- every source mode, browser, OS, architecture, or network failure;
|
|
- every secrets/config mutation and rotation case;
|
|
- HA or multi-server operation;
|
|
- resistance to an independent penetration test; or
|
|
- correctness of arbitrary unsupported Compose, ingress, or proxy layouts.
|
|
|
|
Within its declared scope, the real queue, worker, scanner, ingestion,
|
|
findings, error, compatibility, restoration, and resumed-production paths all
|
|
produced internally consistent durable evidence.
|