Configured dogfood and transcript replay suites
Capability availability discovery has a separate bounded workflow; see the capability discovery guide. Its candidates are review inputs and do not change the suite’s governance or application-verification meaning.
praetorctl dogfood suite runs a finite, repeatable set of pinned public adoption
cases and explicitly selected local transcript cases. The checked-in public suite
contains Cobra and Flask plus six representative public repositories covering Rust,
JavaScript, C++, C#, Java, and Haskell (ShellCheck). Every public entry is pinned to a
live immutable GitHub commit; use it to rerun the same inputs after a Praetor change.
Every invocation requires a new evidence directory; earlier results and original
sources remain intact.
Public configuration
The checked-in .config/dogfood/public-suite.json selects eight pinned public
repositories. Preview it without network or transcript access:
praetorctl dogfood suite --config .config/dogfood/public-suite.json \
--source-root . --artifacts /existing/private/evidence/public-plan --stage plan
plan is the default. It validates declarations and writes plan.json and
report.json; it does not check whether a source exists or whether its content
matches a pin. Its status is always planned, never verified.
Execute actual adoption, verification and repeat-apply checks with a new output:
praetorctl dogfood suite --config .config/dogfood/public-suite.json \
--source-root . --artifacts /existing/private/evidence/public-run --stage verify
The public loop retains fresh clones and checks actual lock digests, generated context, HISS debt and reconciliation stability. It never executes upstream application tests, build scripts, hooks or agent instructions.
The adoption command plan reports declared native commands and missing gates separately. A governance result of verified does not mean those commands ran; an unavailable native build contract remains unavailable and does not create a governance repair job.
Public cases use the resolved audit policy for both the
original and post-adoption scans. Each attempt must retain the planned policy
identity, and its saved baseline must match the independently scanned original
debt. A checkout that already carries .standards-baseline.json is therefore
re-recorded by the plan and the first attempt, with the loop's rationale stored
when the count rises (recordPublicBaseline in internal/dogfood/public.go,
TestRunPublicLoopReRecordsAnExistingBaseline); a plain adoption keeps an
existing baseline (the baseline on a re-adoption).
Reports include the effective digest, function-length limit and validated
baseline hash. A stricter profile can therefore reject a touched function below
the previous fixed scanner limit. Re-run older public results before treating
them as evidence for a stricter policy.
Repair planning rejects old verified public reports that lack policy/baseline evidence, and checks retained policy digests and ratchet results for internal consistency. Failed historical reports remain available for triage. These metadata checks do not replace a fresh pinned run. Saved public baselines are bounded to 8 MiB; incomplete scans and malformed or inconsistent baseline entries cannot produce a verified result.
New HISS scan reports retain coverage: files actually read by supported
scanners, files outside those extensions, and a bounded extension/count map.
The latter includes documentation/configuration files and unsupported languages
such as C# and TypeScript. It is not a list of violations. The map retains at
most 32 extensions of at most 32 bytes; excess files remain counted separately.
An empty extension key denotes an extensionless file. Ignored directories,
symlinks and oversized supported inputs remain in skips; truncated limits
the whole report, including observed coverage. A historical report without
coverage has unknown coverage. Zero infractions does not establish that a
repository's application language was analyzed. CLI/MCP audit summaries expose
this scope; application verification still requires the native test tools.
Private workstation configuration
Use workstation inventory to precheck local repositories, worktrees and local-only identities through the CLI or MCP before selecting cases.
Store private configuration and evidence outside the public repository. A config
must contain version, public_repositories and transcripts, with optional
input_limits as described below. All case
fields below are required; replace the example path and SHA with a reviewed source:
{
"version": 1,
"public_repositories": [],
"transcripts": [
{
"id": "workstation-session",
"source_path": "/absolute/path/to/session.jsonl",
"sha256": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"format": "claude-code-jsonl-v1"
}
]
}
source_path must be an explicit, clean absolute path. Supported formats are
claude-code-jsonl-v1 and antigravity-jsonl-v1. For Antigravity, a sibling
transcript_full.jsonl is preferred; pin that selected file's SHA256. No home
directory discovery, uploads or global rule rewrites happen during a suite.
See transcript ingestion for format and exclusion rules.
Verification ingests every page into a fresh private cache, then replays every page into that same cache. It requires consistent source identity, complete record accounting, at least one stored observation, no truncated records, and zero additional writes on replay. Metadata/thinking exclusions remain explicit; their whole-source counts in page reports must not be summed across pages. The result establishes observed-event persistence and replay, not verified facts or working semantic memory recall.
Configured input limits
Suite configs and discovery policies accept an optional input_limits object.
Omitting it keeps the defaults below. If present, both groups and every field are
required positive integers; unknown, duplicate, null, and case-variant keys fail
before execution. Limits affect input admission, not HISS compliance thresholds.
"input_limits": {
"snapshot": {
"max_entries": 20000,
"max_file_bytes": 33554432,
"max_tree_bytes": 268435456
},
"verification": {
"max_entries": 131072,
"max_files": 128,
"max_depth": 32,
"max_file_bytes": 262144,
"max_total_bytes": 2097152
}
}
This example admits larger model assets and monorepo metadata. It is part of the pinned config or policy hash; CLI and MCP consume the same file. A suite records resolved limits and uses them for the original snapshot, every repeat application, and native command planning. Discovery records the limits and reuses them for its final tree readback.
| Bound | Default | Maximum configurable value |
|---|---|---|
| Snapshot entries, including root | 20,000 | 20,000 |
| Snapshot bytes per file | 16 MiB | 256 MiB |
| Snapshot tree bytes | 256 MiB | 1 GiB |
| Native planning entries | 65,536 | 200,000 |
| Native metadata files | 128 | 512 |
| Native metadata depth | 32 | 64 |
| Native metadata bytes per file | 64 KiB | 1 MiB |
| Native metadata total bytes | 2 MiB | 16 MiB |
The native planning defaults and ceilings are adoption's own
(adopt.DefaultVerificationLimits and adopt.NormalizeVerificationLimits in
internal/adopt/verification_limits.go), so a suite that omits input_limits
plans with the same bounds as praetorctl adopt.
A per-file limit cannot exceed its corresponding total. Snapshot hashes stream file contents; symlinks record targets without reading linked content. Snapshots retain completion status, observed counters, and file/entry failure details. Over-budget or failed reads cannot produce a complete tree identity or a verified case. Input completeness does not qualify native application commands: these remain declared, unavailable, or preserved until independently exercised.
Evidence, bounds and failure behavior
The config is bounded to 64 KiB and 1–8 total cases. Each explicit
public_repositories entry enrolls a public GitHub repository at an immutable
commit; no separate repository allowlist or personal fork configuration is needed.
Use https://github.com/owner/repo#<commit> with a lowercase 40- or 64-hex commit
pin. The admitted spelling uses an ASCII alphanumeric/hyphen owner of 1–39 bytes
with alphanumeric endpoints, and an ASCII alphanumeric/dot/underscore/hyphen
repository name of 1–100 bytes. Credentials, alternate hosts, ports, queries,
percent escapes, whitespace, extra path segments, trailing slashes, ./..
repository names and .git suffix aliases are rejected. Repository identities
are compared without case, so spelling or pin changes cannot enroll duplicates.
The eight popular benchmark defaults remain available. Exploratory public-loop runs may omit pins only for those defaults; suites always require pins. Enrollment permits disposable clone and Praetor adoption checks only. It does not authorize upstream hooks, build scripts or application tests, and MCP public verification still requires the server's existing remote opt-in. Plan records declarations without cloning and remains unverified.
Duplicate IDs, duplicate transcript paths, unknown or duplicate JSON fields, invalid formats, null lists, and unpinned public URLs fail before evidence creation or execution. Config and evidence paths reject symlink ancestors; Unix config/source reads use nonblocking opens to reject FIFO replacement. Kernel filesystem I/O is not a hard real-time cancellation guarantee, especially on other platforms.
The suite has a 15-minute deadline. Each public case retains the lower public loop's five-minute deadline and two-application stability check. Each transcript pass uses pages of at most 10,000 records and at most ten pages, within the ingester's 64 MiB source and 100,000-record bounds.
New evidence directories use mode 0700 and metadata/cache files 0600, respecting
stricter existing process permissions. A valid suite writes its declaration plan,
one case-NN.json per completed/failed case, and a final report.json. Each case
links retained public results or both transcript passes. Failures preserve actual
page counters, including partial writes. Later cases still receive outcomes;
deadline exhaustion marks them skipped_due_to_context. Any failed case or
evidence-write error produces a nonzero exit and cannot claim aggregate success.
An interrupted process may leave a plan or case reports without a final report;
that is incomplete evidence. Run again into a new directory.
The report includes the exact config hash and the engine build in engine_build
(engineBuild in internal/dogfood/suite.go; discovery and scheduled suite reports
record the same map):
| Key | Value |
|---|---|
version |
What praetorctl version prints for the binary that ran the suite: the injected release, the 12-character commit (suffixed -dirty for a modified tree), the module version of a go install build, or unknown (<reason>) (version each binary reports) |
revision |
The full commit from Go's VCS stamp, or unavailable |
modified |
true or false, present only with a VCS stamp |
go_version |
The Go toolchain, present when the binary carries build information |
praetorctl and standards-mcp pass their own identity into the suite, so a report from
a release binary names that release. A test binary has neither an injected release nor a
VCS stamp; its report records unknown (<reason>) and stays loadable by praetorctl dogfood repairs.
internal/dogfood/engine_build_test.go covers a release, an unstamped and a module-version
build. The development MCP launcher additionally records the actual source and binary
hashes.
Development MCP
standards_dogfood_suite exposes the same consumer. Both top-level paths and
transcript paths inside the loaded config obey server confinement. Public
verification requires the server's remote opt-in; a client argument cannot grant it.
python3 scripts/dev_mcp.py call --allow-remote-benchmarks --timeout 300 \
standards_dogfood_suite \
'{"config_path":".config/dogfood/public-suite.json","artifact_dir":".workingdir/evidence/new-suite-run","stage":"verify"}'
The artifact parent must already exist. A shorter MCP/client timeout can stop a suite before its 15-minute library ceiling. For private sources, select an explicit server root containing the config, sources and evidence, or use the CLI.
This stage provides one-shot execution; scheduled runs are described in dogfood scheduling. A suite run does not install timers, dispatch models, apply agent-generated fixes, publish upstream changes, or advance repository rollout stages automatically.