SalienceGate provides local commands for environment checks, an offline demo, Shadow Mode analysis,
frozen replay, algorithm replay, synthetic diagnostics, artifact inspection, and validation. These
commands do not call a live model or require an API credential. The separately named pilot
command is the only CLI surface that can contact a configured local OpenAI-compatible endpoint.
The installed entry point and module entry point are equivalent:
Artifact-compatible after installation:
saliencegate --help
python -m saliencegate --helpLong-option abbreviations are disabled. --help and --version exit successfully.
Successful command summaries write only to standard output; explicit artifact destinations and
the documented capture lifecycle may also mutate their bounded local files. With --json, stdout
is one compact, canonical UTF-8 JSON object followed by a newline. Errors remain value-free text on
standard error, even when --json was requested; paths, payloads, endpoints, and exception details
are not echoed.
doctor is the one command that writes its structured report before returning a non-zero health
status. A reader closing a pipe early is treated as success. A keyboard interruption returns
130.
| Exit | Meaning |
|---|---|
0 |
Success, help, version, or closed output pipe |
2 |
Invalid syntax, input, run identifier, suite, path, or destination |
3 |
Invalid local configuration |
4 |
Required Python or SQLite capability unavailable |
5 |
Corrupt artifact, digest mismatch, or unmet evidence requirement |
70 |
Unexpected internal error, reported without input values |
130 |
Keyboard interruption |
Capture commands use the same table with these fixed categories: invalid command input exits 2; an unsafe or unusable local configuration exits 3; a missing installed integration exits 4; and an authenticated-store, spool, receipt, journal, or managed-file integrity failure exits 5. Capture errors never echo project paths, provider-native identifiers, input values, or exception details.
Universal Shadow Capture supports project-local and user-global connections. The provider aliases
are exactly codex, claude-code, opencode, and pi. setup configures one or all providers;
connect, disconnect, and status select either --project or --global. Without either flag,
project commands use the current directory. sessions, report, and feedback always use the
current directory as the project boundary. A project-local integration takes precedence over the
matching global integration, and SalienceGate never changes provider trust settings. None of these
commands calls a model, reads a transcript, or gains decision authority.
The intended operator sequence is:
- run
setup, or inspect a scriptedsetup ... --dry-run, and review the managed files; - retain the provider's ordinary trust policy, then confirm the plan;
- run one provider session and distinguish installation from observation with
status; - select a short SalienceGate session identifier with
sessionsand inspect it withreport; - run
disconnect PROVIDERto stop admission while retaining existing evidence; - use
deleteonly when the retained local records are no longer required.
The complete provider paths, selected callbacks, version policy, exclusions, and recovery rules are in the integration contract.
Artifact-compatible after installation:
saliencegate setup
saliencegate setup --install-only
[--dry-run | --yes | --confirm PHRASE]
[--json]
saliencegate setup --provider codex|claude-code|opencode|pi|all
[--provider codex|claude-code|opencode|pi]
--scope project [--project PATH]
[--dry-run | --yes | --confirm PHRASE]
[--json]
saliencegate setup --provider codex|claude-code|opencode|pi|all
[--provider codex|claude-code|opencode|pi]
--scope global [--exclude PATH]...
[--dry-run | --yes | --confirm PHRASE]
[--json]
With no arguments, setup opens a wizard for install-only, current-project, selected-project, or
user-global setup. all must be used alone; in global scope it selects the detected providers that
already have a user configuration and usable host command. Explicit provider selections remain
fail-closed when unavailable. Otherwise --provider may be repeated. Project scope defaults to the
current directory when --project is omitted. Global exclusions must name existing project
directories and may be repeated.
Every form builds the complete plan before mutation. --dry-run stops after that plan. --yes
accepts it non-interactively, while --confirm must match the displayed scope-and-provider phrase.
JSON mutation requires one of those two explicit approvals. Setup reports that provider trust
changes are false.
Artifact-compatible after installation:
saliencegate connect codex|claude-code|opencode|pi
[--project PATH | --global]
[--exclude PATH]...
[--dry-run]
[--json]
connect plans or installs one authenticated integration. Project scope is the default;
--exclude is valid only with --global and may be repeated. A dry-run validates the selected
scope, provider contract, collision rules, and managed-file plan without creating the installation
key, capture store, receipt, launcher, or provider configuration.
A normal project connect registers a pending local connection, publishes the managed integration, and enables admission last. A global connect publishes into the provider's user configuration, registers one authenticated parent, and automatically derives an authenticated child when that provider first reports a non-excluded project. A matching project-local installation suppresses the global route for that provider. Codex and Claude Code probe their supported live versions; OpenCode and Pi use exact pinned versions without launching the host during connect.
The operation preserves unrelated configuration and fails closed on malformed selected config, ownership ambiguity, an unsafe path, unexpected managed-file drift, an unsupported host version, or provider policy that disables the selected hook surface. Repeating the same valid connection is idempotent. A supported patch-version change creates an authenticated connection generation rather than silently treating it as the audited baseline.
Human output reports the provider, install disposition, whether capture is enabled, and the
read-only Git review result for every managed project file. It distinguishes an absent Git work
tree, an unavailable probe, files ignored by repository rules, files Git would surface, and files
already tracked. JSON is one canonical capture-connect/v1 record with the same bounded result and
counts. Neither mode changes .gitignore or includes a project path, command, identifier, or
digest. Global output instead reports managed-file and exclusion counts; its JSON schema is
global-capture-connect/v1.
Artifact-compatible after installation:
saliencegate disconnect codex|claude-code|opencode|pi
[--project PATH | --global]
[--json]
Project-local disconnect disables admission, drains the authenticated spool, reverses only the
owned provider configuration or bridge files, and marks matching local connections disabled.
Global disconnect removes only that provider's authenticated user-global files and disables its
parent; derived project children remain as retained local evidence. Receipt and journal bindings
prevent an unrelated look-alike file from being removed. Drift or ambiguous ownership fails closed
for manual inspection.
Disconnect is the connector uninstall operation; it deliberately retains the installation key,
SQLite observations, spool boundary, disabled connection receipts, session records, feedback, and
deletion tombstones. It does not imply data deletion. JSON uses capture-disconnect/v1.
Global JSON uses global-capture-disconnect/v1.
Artifact-compatible after installation:
saliencegate status [codex|claude-code|opencode|pi]
[--project PATH | --global]
[--json]
Without a provider argument, either scope returns all four profiles. Project status drains an
available spool, authenticates the project connection and managed installation, and reports one of
not_installed, installed_not_observed, active_observed, degraded, or drifted. The
installed enum value is reserved for a future host-attested state and is not emitted by v1.
Installation alone is not observation: installed_not_observed remains explicit until a lifecycle
callback is actually admitted.
For each provider, the result includes connector availability, connection state, session and
quarantine counts, queued and dropped spool-event counts, the oldest short SalienceGate session
identifier, total local capture bytes, and closed drift codes. It reports neither storage paths nor
provider-native identifiers. JSON uses capture-status/v1 with four bounded
capture-provider-status/v1 records when no provider is selected.
Global status reports not_installed, enabled, disabled, or drifted, plus bounded project
child and exclusion counts. Its JSON schema is global-capture-status/v1.
Artifact-compatible after installation:
saliencegate sessions
[--provider codex|claude-code|opencode|pi]
[--state open|closed|quarantined]
[--limit 1..100]
[--json]
sessions drains capture state and lists only sessions bound to the current project. The default
limit is 20. Each item exposes a short SalienceGate session identifier, provider, state, bounded
event count, coverage-degraded flag, and local observation times. It never exposes the
provider-native session identifier. No configured store is a successful empty list; corrupted or
unusable existing state fails. JSON uses capture-sessions/v1 and
capture-session-list-item/v1.
Artifact-compatible after installation:
saliencegate report (--latest | SESSION_ID)
[--output PATH]
[--replace]
[--json]
report selects one current-project session, verifies the authenticated snapshot, drains the
matching spool boundary, normalizes only admitted structured records, and evaluates the installed
capability matrix. --latest selects the latest session for the current project; an explicit short
identifier must belong to that project. The complete report is canonical
capture-session-report/v1 JSON. Human output is content-free and includes the same headline,
support, denominators, exclusions, limits, and fixed authority declarations.
The headline vocabulary is closed:
| Headline | Exact boundary |
|---|---|
memory_review_suggested |
At least one supported deterministic signal was observed and no quarantine or integrity failure blocks the positive conclusion. |
no_current_evidence |
The session is closed, the spool is authenticated and cleanly drained, an applicable detector met its absence minimum, no signal was observed, and no report limit remains. |
insufficient_evidence |
No supported signal was detected and an explicit limit blocks the negative conclusion, or quarantine/integrity failure blocks a positive signal; limits include open or quarantined state, gaps, drops, unavailable or pending spool, no applicable detector, insufficient applicable evidence, and unverified compatibility. |
All three remain descriptive_observational, confirmatory=false, decision_authority=false, and
model_calls=0. A positive headline is not an instruction; a negative headline is not proof that
memory was unnecessary.
--output atomically publishes an owner-private canonical file in an already controlled parent.
Existing output is preserved unless --replace is present, and replacement requires a valid report
for the same session. --replace without --output is invalid. The canonical report is bounded to
4 MiB at the command publication boundary.
Artifact-compatible after installation:
saliencegate delete SESSION_ID [--json]
saliencegate delete --all --project PATH --confirm [--json]
The first form deletes one current-project session, including its captured events and feedback, and
retains a content-free authenticated tombstone so the same request is retry-safe. The second form
deletes every capture connection, session, feedback row, health row, transport receipt, and
tombstone for exactly one explicitly named project. Every provider connection for that project must
first be disabled with disconnect; otherwise the command exits 3 with the bounded recovery
instruction.
Both forms enable SQLite secure-delete, drain under spool maintenance, checkpoint and truncate the
WAL, and return one capture-delete/v1 receipt. This is application-level deletion, not a guarantee
that backups, filesystem snapshots, storage-device remanence, or previously exported reports were
erased. Deletion never removes another project's records or the installation key.
Artifact-compatible after installation:
saliencegate feedback SESSION_ID \
--label memory-needed|not-memory-needed|uncertain \
[--json]
feedback records one bounded human label for a closed captured session in the current project.
The session must be addressed by its short SalienceGate identifier; open, quarantined,
provider-native, and cross-project sessions are rejected. Repeating the current label is an
idempotent success. Changing the label records an authenticated revision without copying captured
events or provider content.
The human result contains only the short session identifier, label, write disposition, and bounded
revision count. --json emits one compact canonical capture-feedback-receipt/v1 object and also
includes the local label timestamp. Missing, open, quarantined, or wrong-project sessions exit 2;
local configuration or store contention exits 3; unavailable local capture state exits 4; and
authenticated-store corruption exits 5. Error text never echoes the session identifier, label,
project, path, or exception detail.
The command never exports a dataset or runs classification evaluation. Those are separate explicit Python APIs described in the feedback and evaluation reference. Recording a label does not enable a reminder, injection, or any other active behavior.
Artifact-compatible after installation:
saliencegate doctor \
[--repository PATH_OR_:memory:] \
[--key ABSOLUTE_PATH] \
[--endpoint HTTP_BASE_URL] \
[--capture] \
[--json]The command checks, in order:
- Python
>=3.11,<3.14; - SQLite
>=3.24; - FTS5 availability in an in-memory SQLite database;
- repository path type and permissions;
- installation-key path, type, size, ownership, and permissions;
- optional endpoint syntax.
The default repository path is saliencegate.sqlite3; :memory: is also accepted. If --key
is omitted, the normal per-user configuration path is inspected. An explicit key path must be
absolute. An existing key must be a regular 32-byte file and, on POSIX, owner-only and owned by
the current user. Repository and key symlinks are rejected.
--endpoint performs syntax validation only. It accepts a credential-free http or https
base URL with a hostname and no query or fragment; it never attempts a connection. Omitting it
produces an optional skip result. doctor does not create a repository or key.
JSON uses doctor/v1, containing status, ok, and six doctor-check/v1 records. A required
Python, SQLite, or FTS5 failure exits 4; another required failure exits 3.
--capture adds one strictly read-only project capture check. It does not open mutable SQLite or
spool handles, create a key, launch a provider, install a connector, or drain events. The added
check reports not_configured as an optional skip, ready after the store, spool, installation,
and managed files pass their read-only integrity checks, or degraded as a required failure. JSON
uses the enclosing capture-doctor/v1 report.
Artifact-compatible after installation:
saliencegate demo [--json]demo regenerates the 32-case StateDecayBench smoke diagnostic in memory. It validates the
eight-family and 16/16 intervene/silence geometry, evaluates every paired continuation through the
deterministic oracle, and reports one domain-separated result digest.
The command reads no fixture, repository, environment variable, credential, or Git state. It opens
no socket, imports no optional model runtime, calls no model, and writes no artifact. Its report is
always synthetic_diagnostic, confirmatory: false, and external_claims_supported: false. A
successful run verifies deterministic mechanics; it does not measure agent task efficacy.
JSON uses cli-demo-report/v1 and contains exactly:
schema_version, status, suite_id, evidence_level, diagnostic, synthetic,
confirmatory, external_claims_supported, external_claims_assessment,
scenario_count, family_count, intervene_count, silence_count,
oracle_passed, oracle_failed, result_digest
The frozen geometry is 32 scenarios, eight families, 16 intervene labels, 16 silence labels, 32 oracle passes, and zero failures. The result digest frames canonical scenario bytes before canonical oracle-result bytes under a demo-specific domain; it is not the smoke artifact manifest digest.
An installed distribution also exposes the separate saliencegate-review entry point for the
StateDecayBench v2 human workflow. Its four commands, local-storage requirements, publication
warning, correction behavior, and closed generation gate are documented in the
StateDecayBench v2 review reference.
Artifact-compatible after installation:
saliencegate shadow analyze TRACE --run-id UUID4 --output PATH
[--repository :memory:|PATH]
[--capture-scope unknown|selected_events|bounded_window|complete_run_declared]
[--task-scope-digest SHA256]
[--lineage-scope-digest SHA256]
[--capture-manifest-digest SHA256]
[--source-adapter ID]
[--replace]
[--json]
shadow analyze reads a bounded, private shadow-input/v1 NDJSON trace and atomically publishes
one owner-only canonical shadow-run-report/v1 file. It defaults to the in-memory repository,
capture_scope=unknown, and source_adapter=saliencegate-shadow/v1. A SQLite path enables durable
authenticated-prefix recovery. The command opens no socket, calls no model, reserves no budget,
creates no memory cycle or revision, and has no delivery or decision authority.
Input kinds are run_start, action, tool_result, test_result, observation,
controller_error, and run_end. The first row must be run_start; a run_end, when present, is
final. complete_run_declared requires that terminal row. Results refer to an earlier action by
source ID. Exact repeated rows are retries and are excluded from unique-event denominators.
With SQLite, a rerun reuses an exact existing prefix and submits only missing unique events. A complete prefix makes the ledger append a no-op. A conflicting prefix fails without an extension.
The limits are 10,000 rows, 2 MiB per encoded line, 64 MiB of complete input, and 128 MiB of
canonical report. Input must be a stable, user-owned regular file that is not group- or
world-writable. The output parent must already be private, and successful output has mode 0600.
Symlinks, hard links, changing files, unsafe ancestors, and aliases among input, SQLite, SQLite
sidecars, and output are rejected.
Existing output is never overwritten by default. --replace accepts only a valid report bound to
the same run, exact input bytes, normalized input, capture provenance, redaction-policy tag, and
detector profile. Corrupt or unrelated output remains unchanged.
The report contains authenticated initial-head commitments, input and configuration digests,
capture provenance, row and unique-event denominators, ordered payload-free observations, all four
supported detector outcomes, exact abstention counts, four-state heuristic counts, co-occurrences,
event and phase counts, first flagged sequence, a self digest, and the fixed
descriptive_observational evidence boundary. --json emits the smaller canonical
shadow-command-report/v1 with no filesystem paths or source-event IDs.
| Exit | Shadow meaning |
|---|---|
0 |
Success, help, version, or closed output pipe |
2 |
Invalid syntax, input, lifecycle, parent, collision, bound, path, alias, or replacement request |
3 |
Installation-key, SQLite, secure-publication, retry-exhaustion, or incompatible-repository failure |
5 |
Corrupt replacement, canonical mismatch, or report-digest failure |
70 |
Detector-contract or unexpected internal failure |
130 |
Keyboard interruption |
See the Shadow Mode reference for complete Python and NDJSON examples, detector scope, report fields, replacement bindings, and evidence limitations.
Artifact-compatible after installation:
saliencegate shadow analyze-atif TRACE
--profile {harbor-terminus-2-v1,harbor-codex-v1}
--run-id UUID4
--working-directory PATH
--environment-digest SHA256
--output PATH
[--repository :memory:|PATH]
[--task-scope-digest SHA256]
[--lineage-scope-digest SHA256]
[--capture-manifest-digest SHA256]
[--replace]
[--json]
shadow analyze-atif adapts one bounded ATIF JSON trajectory through an explicitly selected sealed
field-shape profile, runs the same deterministic Shadow detectors, and publishes one owner-private
canonical shadow-trace-report/v1. It never guesses a profile or working directory. The command has
no model, endpoint, provider, API-key, memory-schedule, output-content parser, or complete-capture
option; it opens no socket and does not execute trajectory content.
The CLI aliases have these exact meanings:
| Alias | Report profile | Accepted source | Selected action | Outcome evidence |
|---|---|---|---|---|
harbor-codex-v1 |
harbor-codex/v1 |
ATIF-v1.7, agent codex |
exec_command |
exact signed 32-bit integer exit metadata from a sealed path; producer-claimed |
harbor-terminus-2-v1 |
harbor-terminus-2/v1 |
ATIF-v1.6/v1.7, agent terminus-2 |
LF-submitted bash_command |
none |
The Codex claim covers the pinned Harbor converter field shape only; it does not guarantee a Codex
CLI runtime version. Terminus terminal text never becomes success or failure evidence. Both profiles
declare producer_authentication=none, select only root-segment events, report continued and
embedded-subagent presence without traversal, and set complete execution-session coverage to false.
capture_scope is fixed to selected_events.
The input must be a stable owner-private single-link regular file. Parsing and adaptation complete
before the command loads or creates the normal owner-private SalienceGate installation key. This is
local ledger-authentication state, not a provider credential; its first use may initialize the
platform-default key file. The repository defaults to :memory:. A private SQLite path enables
durable authenticated-prefix resume. The output parent must already be private, and output is
atomically published with mode 0600. Source, SQLite, sidecar, and output aliases; unsafe
permissions; hard links; symlinks; and state changes fail closed.
Existing output is preserved unless --replace is supplied. Replacement requires exact agreement
on source, profile, adapter and detector configuration, provenance, redaction-policy tag, nested
Shadow binding, initial repository state, and complete outer report identity. With SQLite, the exact
comparison preview may open the repository, apply schema migrations, and recover authenticated
derived state. It appends no trace suffix, and a mismatch publishes no report. Analysis appends only
the missing exact trace suffix in one atomic batch. The append is a no-op when the complete trace is
already present. Corrupt or unrelated output is never overwritten.
Human output contains source totals, root-coverage declarations, mapped and ignored call/result
counts, structured-outcome coverage, all four heuristic dispositions, the profile evidence matrix,
per-detector outcome and abstention counts, the evidence-sufficient denominator, timestamp mode,
producer authentication, outcome authority, compatibility-manifest digest, report digest, and the
fixed observational boundary. --json emits one canonical shadow-atif-command-report/v1, not the
full report. Neither form contains commands, tool output, source IDs, working directories, or source,
repository, and output paths.
The principal bounds are 64 MiB of source bytes, 10,000 root steps, 10,000 tool calls, 10,000 observation results, 1,000 mapped Shadow records, and 130 MiB of canonical outer report.
| Exit | ATIF Shadow meaning |
|---|---|
0 |
Success, help, version, or closed output pipe |
2 |
Invalid syntax, ATIF/profile input, bound, path, alias, or replacement request |
3 |
Installation-key, SQLite, secure-publication, retry-exhaustion, or incompatible-repository failure |
5 |
Corrupt replacement, canonical mismatch, or report-integrity failure |
70 |
Internal adapter/detector contract failure |
130 |
Keyboard interruption |
The ATIF example guide contains copy-paste Codex and Terminus 2 commands for an installed wheel. The Shadow Mode reference documents the one-call API, lower-level trace sessions, omission matrix, and provenance report.
Artifact-compatible after installation:
saliencegate replay TRACE.jsonl \
--output ARTIFACT_DIR \
[--responses RESPONSES.jsonl] \
[--replace] \
[--json]replay executes the frozen replay profile. It is not a configurable live-model runner. It uses
versioned JSONL trace and response fixtures, a deterministic scripted policy, an in-memory
repository, and a delivery sink that fails intentionally without an external side effect.
If --responses is omitted, exactly one response fixture must be discoverable:
<trace-directory>/<trace-stem>_responses.jsonl; or- when the trace directory is named
runs,<parent-of-runs>/models/<trace-stem>_responses.jsonl.
Zero or two matching candidates are rejected. An explicit --responses disables discovery. The
response count cannot exceed the event count. For N responses, the first event_count - N
events use scripted silence and the last N use scripted invocation.
The trace manifest and every record digest are verified. The trace must contain one UUID4 run, contiguous ordinals, unique source and event identities, parents that refer only to earlier events, and non-decreasing timestamps. Trace and response sources must be stable regular files, not symlinks or multiply linked files. The principal limits are 100,000 events or responses, 8 MiB per trace, and 64 MiB per response fixture.
Classification is automatic:
- all events marked
synthetic_fixtureproducesynthetic_digest_only; - any other valid trace produces
user_redacted.
The CLI always exports evidence_level: exploratory. A clean source revision or installed
distribution can make its provenance confirmatory_eligible, but that does not change the
evidence level and does not satisfy validate --require-confirmatory.
The cli-replay-report/v1 JSON result contains:
schema_version, status, run_id, trace_digest, result_digest,
classification, confirmatory, manifest_digest, overall_content_digest, counters
counters records events, decisions, invocations, cycles, model calls, deliveries, successful
deliveries, and outcomes. Fixture model-call receipts are not live or billed calls.
An existing output is never overwritten by default. --replace is accepted only when the
existing tree is a completely valid replay artifact for the same run. Unrelated or corrupt data
is preserved and the command fails closed.
Artifact-compatible after installation:
saliencegate algorithm replay TRACE.jsonl \
--condition CONDITION \
[--responses RESPONSES.jsonl] \
--output ARTIFACT_DIR \
[--replace] \
[--json]algorithm replay executes the closed comparison path with a frozen, local response
fixture. It never contacts an endpoint, imports the optional live-model runtime, reads an API
credential, or performs a billed model call. It accepts only the versioned paper-two-phase prompt
bundle, the fixed gpt-oss:20b replay profile, and one of these condition identifiers:
no_memorydisables the memory algorithm and forbids--responses;fixed_stepperforms the paper two-phase cycle at fixed boundaries;retrieval_alwaysperforms deterministic retrieval followed by the Phase 1 path;always_injectperforms the paper two-phase cycle and requires safe intervention selection.
The three active conditions require an explicit --responses path. There is no response-fixture
discovery and no condition fallback. A fixture prepared for a different condition fails because
its ordered requests and responses do not bind the selected run. no_memory has no model calls
and therefore has no empty response fixture.
The trajectory and response inputs must be stable, bounded, single-link regular files. Symlinks,
hardlinks, malformed records, duplicate identities, unsupported versions, incomplete response
sets, and changed files are rejected. The trajectory must contain only records classified
synthetic_fixture; algorithm-artifact/v1 does not permit user data to be relabelled as
synthetic.
The command executes the fixture twice through the same closed path and publishes only when both
results are canonically identical. The resulting artifact is synthetic_digest_only,
exploratory, and never confirmatory. It contains ordered receipts and commitments, not raw
prompts, responses, reasoning, or credentials. The CLI report does not expose provider-token
totals; in the committed fixtures they are unavailable. Reported canonical token counts are
replay-attested fixture measurements and do not represent a bill.
Because frozen replay performs no inference, its hardware attestation uses deterministic
not-applicable-replay labels and the schema-minimum value 1 for count fields. These are
sentinels, not measurements of the host that ran the CLI.
For output-path-independent reruns, a Git checkout is conservatively recorded with
dirty_worktree: true even when discovery initially finds it clean. The full commit remains
recorded, but this offline CLI never claims clean-revision provenance; the Python export API can
accept an explicit exact revision attestation when that distinction is required.
The cli-algorithm-replay-report/v1 JSON object contains:
schema_version, status, condition, run_id, run_digest, result_digest,
classification, confirmatory, manifest_digest,
overall_content_digest, calls, canonical_input_tokens,
canonical_output_tokens, canonical_token_equivalents,
interventions, grounding_rejections
Human output reports the same condition, counts, classification, and four execution/artifact
digests without printing fixture content. An existing destination is not overwritten. --replace
is authorized only for a completely valid algorithm artifact with the same run and condition;
unrelated, cross-condition, or corrupt data is preserved.
Missing or unknown command-line choices exit 2 with error: invalid command line. Unsafe or
inconsistent trajectory, response, condition, or destination inputs also exit 2 through one
value-free algorithm diagnostic. A corrupt artifact encountered during validation exits 5 with
error: artifact validation failed. Input paths and parser details are never echoed.
Artifact-compatible after installation:
saliencegate benchmark state-decay-smoke \
--output ARTIFACT_DIR \
[--replace] \
[--json]state-decay-smoke is the only registered smoke suite. The command generates its dataset from
the versioned generator rather than copying the committed fixture. It then reconstructs and runs
the deterministic paired-continuation oracle before publishing the artifact.
Fixed suite properties are:
- seed
20260711, generatorv1, suitev1; - 32 scenarios across eight families;
- four linked instances per family;
- two
interveneand twosilencelabels per family; - 32 expected oracle passes and zero expected failures;
- synthetic, balanced, diagnostic, and non-confirmatory.
The families are forgotten_requirement, stable_environment_fact,
failed_prior_attempt, retained_diagnosis, neglected_subgoal, stale_memory,
conflicting_evidence, and irreversible_action.
The suite does not execute an action model or measure task success, tokens, model cost, or
latency. Its output fixes external_claims_supported: false and
external_claims_assessment: insufficient.
The cli-benchmark-report/v1 JSON object includes suite, generator, seed, balance, counts,
fixture digest, reconstructed-oracle digest, overall content digest, and manifest digest.
--replace is restricted to a valid artifact of the same suite, version, and fixture digest.
Maintainers regenerate the committed source fixture with:
Run from a checkout:
uv run --locked python -m saliencegate.benchmarks.state_decay.generator \
--output benchmarks/state_decay --replaceThat committed fixture uses smoke_manifest.json. The runtime artifact uses manifest.json, so
the committed fixture directory is not directly accepted by saliencegate validate.
Artifact-compatible after installation:
saliencegate inspect RUN_UUID4 \
--artifact ARTIFACT_DIR_OR_MANIFEST \
[--json]inspect accepts a replay artifact directory or a regular file named exactly manifest.json.
It does not accept a StateDecayBench artifact. The requested UUID4 must equal the manifest run
identifier.
The complete replay artifact is validated before output is produced. Inspection uses the
already-validated in-memory view and does not reopen component files. The
cli-inspect-report/v1 output contains:
schema_version, status, run_id, manifest, execution, decisions,
budgets, cycles, deliveries, outcomes, attestations
It exposes typed lifecycle records and digests while omitting trace payloads, memory text, model
prompts and responses, rendered reminder text, raw delivery receipts, request identifiers, and
local paths. Even for synthetic_raw, synthetic.json is never returned by inspection.
This is data minimization, not anonymity. UUIDs, timestamps, reason codes, revision identifiers, model identifiers, and digests remain metadata and may be correlatable.
Artifact-compatible after installation:
saliencegate validate ARTIFACT_DIR_OR_MANIFEST \
[--expected-digest MANIFEST_DIGEST] \
[--require-confirmatory] \
[--json]A directory is resolved to its manifest.json. A file input must be a regular file named exactly
manifest.json; missing, renamed, or symlink inputs are rejected as invalid paths.
--expected-digest compares the artifact's domain-separated manifest_digest. It does not
accept the raw file SHA-256, overall_content_digest, or replay result_digest. Omitting it
returns expected_digest_matched: null; a correct value returns true. A malformed or different
value exits 5 rather than returning a successful report with false.
--require-confirmatory checks evidence_level: confirmatory, not revision eligibility. CLI replay
artifacts and algorithm-run artifacts are exploratory, while StateDecayBench artifacts are always
non-confirmatory, so all three CLI-produced families fail this option by design.
Before selecting a validator, the command reads a bounded, canonical manifest without following a
symbolic link. artifact_kind selects replay_run or algorithm_run; the legacy
state-decay-smoke-manifest/v1 schema selects the benchmark validator. Unknown kinds and schemas
fail closed. This preflight does not replace the complete family-specific filesystem and digest
validation.
Replay success uses artifact-validation-report/v1:
valid, integrity_valid, structurally_valid, expected_digest_matched,
grounding_assurance, confirmatory, manifest_digest,
overall_content_digest, component_count
grounding_assurance is producer_attested_digest_only: validation proves the recorded
producer attestations and cross-component bindings, not semantic entailment.
Benchmark success uses benchmark-validation-report/v1 and reports
assurance: deterministic_synthetic_oracle, confirmatory: false, and
external_claims_supported: false, together with the fixture, oracle, content, and manifest
digests.
Algorithm success uses algorithm-validation-report/v1:
valid, structurally_valid, self_consistent, expected_digest_matched,
source_result_assurance, confirmatory, manifest_digest,
overall_content_digest, component_count
source_result_assurance: producer_attested means a digest-only artifact is structurally and
cryptographically self-consistent but its source result was not reconstructed from raw content.
recomputed_from_raw is reserved for an explicitly classified synthetic-raw artifact whose
complete algorithm result was reprojected during validation. Both assurances are exploratory and
non-confirmatory.
For artifact layouts, digest construction, classification, validation invariants, and atomic replacement behavior, see Artifact reference.