portfolios:manage scope. The period is a UTC
calendar month. Omit period to get the previous (most recently closed)
month.
What it proves, and what it does not
An attestation certifies that evaluation occurred against the stated data horizons: which query was in force, how many times it ran, the sync runs it consumed, and the office-data coverage timestamps it reached. It does not certify that every relevant mark was surfaced. Recall is bounded by connector coverage and the match strategy you configured. This is a deliberate bright line: the attestation is evidence of diligence and process, not a guarantee of exhaustive detection. Thestatement field states this in
plain language, and the wording is subject to founder and counsel review.
The “no alert” versus “not looking” model
The whole point of an attestation is to make silence provable. If you received no alert for a period, the attestation shows whether that silence means “we looked and found nothing” or “we were not looking”.- We looked and found nothing.
evaluations_countis greater than zero,changes_evaluatedshows the volume assessed,match_countis 0, and there are no gaps. That is a real negative result you can rely on. - We were not looking. The period carries a
gaps[]entry (see below), the office is markedno_evaluations(a supported office with zero evaluations in the period, disclosed with a full-period gap and no coverage claims), or the office is markedunsupported. A single office sync run that was skipped because it was too large to evaluate is disclosed the same way, as abudget_declinedgap naming that run. Silence never implies coverage that did not happen.
watch_status_at_generation so the current state is on the
record. Pause history within the period itself is not reconstructable in this
version (there is no status audit trail yet); that is a documented limitation.
Per-office fields
Each entry inoffices[] reports one office in the watch scope.
changes_evaluated is candidacy volume
changes_evaluated is the count of candidate changes assessed against your
query, summed across the evaluations in the period. It is not a claim about how
many records exist at the office. It tells you the volume of change the watch
weighed before deciding there was nothing to alert on.
Coverage gaps
gaps[] is where honest degradation is disclosed. A gap is an interval in the
period where the office-data coverage the watch had evaluated through fell
behind the internal freshness target for that office. Gap disclosure is
permanent: it stays in the artifact for that period even after coverage
recovers, because it is a fact about what happened.
reason: "office_lagging"means coverage was stale beyond the office target for that interval.reason: "evaluation_missing"means no evaluation ran for that interval at all, although one should have: an eligible office sync run has no evaluation receipt for this watch (a pause, a credit lock, or lease starvation), or there is no evaluation evidence for longer than the continuity backstop. Silence is never read as coverage.reason: "budget_declined"means a specific office sync run was not evaluated at all. A run carrying an abnormally large number of changes (a bulk reload, for example) exceeds the evaluator’s per-run ceiling and is declined rather than partially processed. The gap names the run insync_run_idand opens at the start of that run’s own office-data window, which is where the un-evaluated changes are. Later coverage does not close it: a subsequent run’s data horizon says nothing about the changes in the declined run. A decline that is still outstanding when a month ends is disclosed again in the following month’s attestation, clipped to that month, until it is closed.resolved: truemeans coverage caught back up within the period (foroffice_lagging), or an operator closed the decline within the period (forbudget_declined).resolved: falsemeans it was still outstanding at the period boundary.resolutionappears on a resolvedbudget_declinedgap and says how it was closed:redriven(the run was re-evaluated with a raised budget, so the changes were eventually assessed) orsuppressed(an operator recorded the deliberate decision that this run will never be evaluated). Those are not the same claim, so we never collapse them into a bareresolved: true.- A declined run is disclosed once: it carries the richer
budget_declinedgap and is never also reported asevaluation_missing, even though it is by construction an eligible run without a receipt.
totals.declined_runs and totals.declined_runs_unresolved count these across
every office in scope, and the statement says so in prose, so a declined run
can never be lost in a per-office detail block. A period’s coverage_through
timestamps are still exactly what the evaluations recorded; they simply do not
attest to a declined window, which is what the gap makes explicit.
What a closed month says about evaluation never changes retroactively: if a
declined run is re-evaluated in August, the June and July artifacts still show
the gap that was open at the time. August’s artifact is where the resolution
appears. (Re-fetching an old period reproduces the same content_hash as long
as the watch configuration and the office metadata have not changed since; see
the integrity section below.)
Evaluations that failed outright do not write a receipt and have no ledger of
their own, so they are not reconstructed as gaps. The evaluation_failed reason
is reserved for a future version.
Two special gap shapes to know:
- A supported office with zero evaluations in the period is marked
no_evaluationsand carries a single gap spanning the whole period. In the month the watch was created, the gap starts when the watch was created: nothing before a watch existed is a gap. That gap staysresolved: falsepermanently, because nothing that happens later can evaluate a month that has already passed. The same holds for a gap that runs to the end of a closed period on an office that was evaluated: the silence after its last evaluation is part of that month’s record, and a later evaluation does not retroactively fill it. Whether evaluation resumed afterwards is reported separately, on every supported office, asevaluation_resumed_after_period, a fact about now rather than about the period, and therefore excluded fromcontent_hash. - Evaluations recorded before coverage snapshots existed cannot state what
office-data horizon they covered. They are disclosed as incomplete coverage
evidence (a gap with a null
coverage_through), never presented as covered.
Unsupported offices
If a watch is scoped to an office Signa does not currently ingest, that office appears withstatus: "unsupported" and no evaluation claims at all. Signa
will never render a clean, zero-alert attestation for an office it does not
cover, because that would read as “we looked and found nothing” when the truth
is “we do not cover this office yet”.
If every office in the scope is unsupported, the endpoint returns
422 attestation_unsupported_scope rather than an empty artifact.
Configuration changes and the fingerprint
Thequery_fingerprint is a stable hash of the watch query and trigger
events. Its fingerprint_basis is current_configuration: it describes the
configuration as it exists when you fetch the artifact, because a full
evaluated-time configuration history is not stored yet. Two flags keep this
honest:
configuration_changed_in_period: truemeans the configuration changed during the period (the receipts carry more than one evaluation epoch); theepochs_in_periodarray lists them.configuration_changed_since_period: truemeans the configuration changed after the period closed. The fingerprint in the artifact then describes the current configuration, not the one that was in force during the period.
false pins the fingerprint to the period unambiguously.
Reconciliation
The artifact cross-checks the alert counts recorded on the evaluation receipts against the alert rows stored for the period, scoped to the same supported offices the artifact reports on. When they agree,reconciliation is
consistent. When they disagree, it is mismatch, surfaced honestly rather
than silently reconciled to one number.
One caveat: alerts that cannot be attributed to an office (their ingestion-run
reference is null, for example because the run record aged out) are included
in the cross-check total. In rare cases this can produce a mismatch that
reflects attribution loss rather than a missing or extra alert.
Verifying integrity with content_hash
The content_hash is a SHA-256 over the canonical, sorted-key form of the
artifact, excluding the fields that describe the moment of generation rather
than the period: generated_at, request_id, the hash itself,
watch_status_at_generation, watch.name (display-only),
watch.configuration_changed_since_period, and
offices[].evaluation_resumed_after_period. The artifact is computed
deterministically from stored evaluation records, and everything a closed period
claims about evaluation is clipped to that period, so that part of the hash is
fixed the moment the period ends.
To verify a filed copy: re-fetch the JSON for the same period and compare the
content_hash to the value on the copy you filed. A match proves the artifact
was not altered after issue.
One caveat to know when you compare: a few inputs are still read at generation
time rather than snapshotted for the period. Those are the watch’s current
configuration (the fingerprint and trigger events), the offices currently in
scope, and office names and support status. If any of them changes after you
file, a later re-fetch produces a different hash even though the period’s
evaluation history is untouched. That is the disclosure working as intended, not
tampering: the artifact also reports configuration_changed_since_period: true.
Keep the filed copy as the record of what was issued.
This proves the integrity of the artifact. It is not a third-party
authenticity signature. Cryptographically signed and timestamped documents
(for example RFC 3161 timestamps) are on the roadmap.
Filing the PDF
For a business record you can file, request the PDF:Accept: application/pdf. The PDF is rendered
from the same data as the JSON, so the numbers match. It includes the
configuration, a per-office coverage table, the gaps, the totals, the
statement, and the content_hash with instructions for verifying it against
the JSON endpoint.
A typical firm workflow: fetch the PDF once a month for the closed period, file
it in the matter record, and store the JSON alongside it so an auditor can
re-fetch and hash-verify later.
Periods and errors
- Periods are closed UTC calendar months. The default is the previous month.
- The current, in-progress month returns
422 attestation_period_open. Passpartial=trueto get an interim artifact marked"partial": true. - A period beyond the 25-month retention window returns
410 attestation_expired. The window is rolling (day-granular, matching the evidence retention clock): once any part of a month is past the horizon, the whole month is treated as expired. File monthly, within the window. - A period that ended before the watch existed returns
422 period_before_watch: there was no monitoring to attest. Evaluations recorded in the period count as proof the watch existed then. - An unknown watch, or a watch belonging to another organization, returns
404.