Research-company operation
SecOpsAI's initial research programs are software supply chains and AI/agent security. The daily product is a verified intelligence brief. Original advisories and longer reports depend on evidence, independent reproduction and disclosure readiness. Discovery volume is not a release quota.
Release contract
- Collection creates leads. Scores, hashes shared with an article, word overlap, and agreement between models do not substantiate a claim.
- A qualified human reviewer, distinct from the author, records the exact statement, exact archived text span, origin/hash/acquisition time, versions, environment, sample set, observation period, alternatives and limitations.
- Observation, source reporting, inference, disputed and unknown are separate assessments. Analytic confidence is an explicit reviewer judgment with a rationale. Likelihood is optional and separate; severity and exposure remain case fields. Reference count never increases confidence.
- Execution claims require recorded execution output and a scoped laboratory experiment. Static source code can establish a file read in the code; it cannot establish execution, successful exfiltration or victim compromise.
- Prior-art searches record the index, query, time, earlier reports and precise contribution. Text similarity remains an attribution check, not proof of novelty. Model specialists remain supplementary challenges.
- A named qualified technical reviewer and editor review the same exact draft. All mandatory checks must pass. Changed facts, evidence, scopes, reviewers, sharing rights, or draft text invalidate the relevant approval.
- The final blog publication boundary rechecks the current case and exact text. Original Research cannot bypass the case gate by removing its ID. Publication and deployment remain separate human decisions.
Confirmed requires a credible verdict and a current reviewed malicious observation. ATT&CK mappings require a separately recorded, reviewed behavior with precise references. Keyword matches only guide investigation.
Setup with real people
Use secopsai --json research operation ACTION --input record.json --actor ID.
Inputs may also be supplied through standard input with --input -. The
dashboard's protected Research operation panel records claim assessments and
exact-draft approvals. Hosted writes are explicit operator commands processed
by the research worker; they are never model actions.
Register the operator first with person-register; the initial record must use
the same actor/person ID and include the operator role. Subsequent registration
requires a registered operator. Supply real names, roles and qualifications;
registration is the authorized operator's assertion, not government identity
verification. Existing administrator tokens remain the authentication boundary.
An author cannot self-review. Do not register a model or service as a human.
Useful actions:
| Work | Actions |
|---|---|
| Staff and duty coverage | person-register, people, roster |
| Claims and independent reviews | claim-assess, case-review, audit |
| Novelty and methods | prior-art, compare-releases, experiment, behavior |
| Primary intelligence | source-configure, source-collect, events, event-verify |
| Editorial operation | board, brief-create, brief-edit, brief-approve, brief-publish, brief-correct, editions |
| Partners and disclosure | submission, disclosure-milestone, requirement |
| Durability | queue, queue-claim, queue-heartbeat, queue-complete, queue-fail, artifact-backup, artifact-restore, recovery-drill, storage-assessment |
| Measured usefulness | outcome, metrics, coverage, status |
The seven-day roster uses weekday keys 0 through 6 (Monday through Sunday),
each containing author_id, editor_id, backup_id. All three must be distinct
registered people; the editor and backup must hold the editor role. A research
owner may have at most two active original investigations on the editorial board.
Daily operation, Europe/Istanbul
| Time | Work and accountable owner |
|---|---|
| Continuous | Bounded collection, artifact comparison, queue and freshness checks |
| 09:00 | Duty operator reviews collection gaps and checkpoint health |
| 09:30 | Research owner selects leads and planned hypotheses |
| 10:00–15:00 | Protected planned research, alongside urgent verified incidents |
| 15:00 | Independent technical reviewer checks evidence; owner follows disclosure |
| 16:00 | Worker assembles a draft from verified public primary-source items |
| 17:00 | Duty editor reviews and explicitly approves release |
| 18:00 | Duty operator verifies public output and records unresolved handoff |
SECOPSAI_PRIMARY_INTEL=1 enables bounded primary intake and draft assembly in
the existing single-writer Research Worker. It cannot approve or publish.
Assembly is idempotent for the edition date. When no valid roster exists, it
still creates a machine-attributed, unassigned review draft; it does not invent
an author or release approver. A quiet day is an honest coverage/update brief;
nothing is fabricated. The hosted console exposes pending public-source items
for a registered human technical reviewer. Aggregator reports require a
separately acquired primary event, and restricted submissions are never shown
in this queue.
Event verification records a checked summary, defensive action, limitations, primary event and primary URL. Aggregators cannot corroborate themselves. Source timestamps, acquisition time and first observation remain distinct. Missing source publication time stays unknown. KEV/EPSS signals are not claims of exploitation observed by SecOpsAI; EPSS is a predictive 30-day measure.
brief-approve requires every release checklist item, a rationale,
expected_fingerprint, and reviewed_draft equal to the complete current body.
The assigned editor or backup must be distinct from the author. Larger hosted
drafts that exceed the bounded projection remain in the ledger and cannot be
approved from a truncated view. brief-publish creates the reviewed public blog
files; use the existing controlled Blog Ops deployment process to release them.
Hosted commands exclude local sample paths, queue leases and publication from
an ephemeral worker. Corrections retain the original body and require a new
review of the corrected or retraction notice. Newly verified source material
arriving after a draft is edited or released is recorded as a pending edition
update; the console shows the source details and requires an author to reconcile
it into a new reviewable draft. Published editions use the correction workflow,
and new text must pass release approval again before the existing Blog Ops
release.
Evidence and lab inputs
claim-assess requires statement, assessment, confidence, references,
scope, rationale, quality, alternatives, contradictions, limitations.
scope contains versions, environment, sample_set, observation_period.
likelihood is optional in [0,1]; it is not confidence. Contrary evidence
requires a resolution before a supported assessment can be recorded.
A reference selects an existing active evidence record, for example:
{"evidence_id":"existing evidence ID","selector":"/metadata/file_contents/install.js","start":0,"end":42,"excerpt":"the exact 42-character archived passage"}
Selectors support JSON Pointer escaping (~1 for slash, ~0 for tilde).
Offsets count Unicode characters and must match the excerpt exactly. Titles,
analyst notes, and repeated identifiers are not admissible proof spans. Accepted
categories are archived source excerpts, file contents, matched strings, trace
events and experiment output. Evidence also needs a hash, provenance and
acquisition time. Source excerpts establish source-reported facts, not direct
SecOpsAI observations.
experiment records artifact hash, affected versions, environment, trigger,
observed behavior, competing explanations, demonstrated impact, mitigation,
reproduction steps, authorization scope, limitations and exact output references.
Execution modes require disposable systems, synthetic credentials, controlled
networking and authorized targets. This record never executes a submitted
command. Existing approval-gated sandbox tooling performs authorized execution.
Detection and patch-verification outcomes require actual recorded experiments.
compare-releases takes two attributable, timestamped, hash-bound snapshots
for one package. It compares install hooks, dependency declarations, publisher
labels and permission declarations. AI/agent comparisons additionally require
complete paginated MCP catalogs; new/removed/changed tool schemas and annotations
are recorded as untrusted differences requiring reproduction. See the
MCP tool specification
and MCP security guidance.
Durability and monitoring
Primary intake stores bounded archived bytes, provenance, normalized events, queue items and the cursor in one SQLite transaction. Invalid or oversized feeds and backpressure leave the cursor unchanged. The existing registry collectors retain their own transactional cursor/event behavior.
Queue leases are fenced. Expired jobs re-enter retry or dead letter; stale workers cannot complete them. A repeated identical completion with the same lease returns the original outcome; conflicting delivery fails. Remote operator mutations and their command receipt commit together, so lost acknowledgements cannot duplicate an approval or correction. No availability fallback converts invalid evidence into a favorable decision.
Coverage reports use a stated window. They distinguish metadata-only sources,
bounded artifact scans, unknown upstream denominators, skipped/error reasons,
queue age, missing evidence instrumentation and freshness. Historical rows are
not comprehensive surveillance. null is unknown, not zero. New scan stage
records identify the same release event through acquisition and analysis.
Primary-source collection visits at most ten due feeds per cycle, so initial coverage does not wait for several registry cycles. Catalog feed repairs retain the original source identity and archived events; explicit operator changes take precedence. Google's feed uses its HTTPS FeedBurner endpoint. MSRC uses the Security Update Guide advisory feed because its old blog feed now serves HTML. RSS excerpts over 20,000 characters carry a truncation flag, original length, hash and selected range; the full feed remains archived and coverage counts the truncation. A shortened excerpt cannot establish claims about omitted text. Publisher-provided HTTP citation links remain untrusted source identifiers; collection and every redirect still require HTTPS. Citation normalization never asserts that an HTTP link was fetched or silently substitutes a different URL.
The private artifact client and its production smoke use an explicit application User-Agent. Authentication, checksum validation and redirect rejection remain required; the edge receiving a request is not evidence of a successful backup.
Deploy the merged Core revision through Deploy Core Edge on main. This
protected production workflow validates the hosted contracts, applies additive
D1 migrations and checks authenticated assistant reads without creating jobs.
Use Deploy Ledger Store to update private immutable storage and verify it
with a bounded benign object. These workflows use configured repository secrets;
local access failures do not bypass production authentication. Keep the GitHub
research worker as the sole ledger writer during this rollout.
The deployed ledger-store protocol advertises safe completion retries. Do not start the disabled container runner or another writer. Test the worker, storage service and failure/lost-acknowledgement regressions before deployment. The independent research-operation watchdog checks checkpoint/source freshness and public availability; it cannot write the ledger or launch a replay. It also acquires and parses the ten supported public feeds independently of the worker, distinguishing HTTP transport denial from invalid feed contents. RSS requests advertise RSS/Atom/XML media types. Failed acquisition never advances the source cursor or records a successful collection. A source reachable from a developer machine may still reject hosted runners; that remains a coverage gap until the source permits access or an explicitly reviewed intake path is available. An unrelated replacement feed cannot establish the missing coverage.
recovery-drill copies a selected ledger consistently into a separate owner-only
file, reconciles table counts, checks foreign keys and source hashes, and records
restore duration. A small fixture drill cannot prove recovery of a 10 GB
production ledger. RPO ≤5 minutes and RTO ≤1 hour are targets requiring a
production-size drill and checkpoint-age measurement. storage-assessment
reports actual table/storage sizes and the gates for a future metadata-store
migration. Keep the current ledger authoritative until dual reads, reconciliation,
rollback and cutover tests pass. The ledger checkpoint alone does not back up
quarantine files. SECOPSAI_ARTIFACT_VAULT=1 backs up public registry artifacts
immediately when registered by the research pipeline, before that step can
succeed, and retries existing artifacts in bounded batches. It writes private,
immutable R2 objects before recording a completed manifest receipt in the
ledger. Each object and the complete restored artifact
must match their SHA-256 and size. No bytes are extracted or executed.
artifact-backup accepts artifact_id; restricted/local samples additionally
require a registered operator and the explicit Boolean
cloud_storage_authorized: true, supported by the applicable sharing agreement.
artifact-restore accepts artifact_id and requires a completed receipt. It
recovers verified bytes into owner-only local quarantine. These actions are
local operator commands, excluded from hosted/model interfaces. Failed or
missing bytes never create a completed backup receipt. Historical artifacts
whose ephemeral files were already lost require authorized reacquisition; a
catalog record alone cannot recover them. Restore before sandbox handoff.
Chunks are at most 32 MiB, artifacts at most 250 MiB; the worker attempts five public artifacts per cycle with a shared 60-second deadline. Missing historical files do not consume upload slots; their failures distinguish missing, unreadable and non-regular local bytes from upload failure. Its result records the pending backlog and explicit failures within the latest 1,000 catalog entries, rather than claiming complete historical backup coverage. The hosted coverage projection reports outstanding public backup receipts, and the watchdog blocks operational readiness while enabled backups remain incomplete. The R2 Workers API validates streamed checksums and conditional immutable writes.
Acceptance gates and real operational dependencies
The software verifies behavior using synthetic, isolated fixtures. That does
not establish model calibration, a legal authorization, a partnership, a real
human review, an original discovery, or fourteen days of daily operation.
status reports these requirements separately. Pending, revoked and expired
agreements cannot satisfy readiness.
Keep Clef paused, the replay stopped, and alert closure in observation mode. No live evaluation was authorized by this program. A future held-out evaluation must use independent labels, fixed corpus hashes, predeclared acceptance criteria and uncertainty; record both models' decisions separately. Never average scores as a substitute for calibrated policy.
Days 1–14 establish real reviewer ownership, deployment/recovery evidence, coverage baseline and a reviewed pilot. Days 15–30 require fourteen consecutive reviewed briefs and rejected unsupported claims. Days 31–60 require independently reproduced cases and tested defenses. Days 61–90 require reviewed original reports, disclosure follow-ups and an honest held-out quality/coverage report. Expanding telemetry and ecosystems depends on consent, measured discovery value and review capacity. These elapsed-time and staffing gates cannot be accelerated by software.
Operational recovery rollout
The worker cooperatively stops at safe transport/stage boundaries. A forced shutdown still writes a final checkpoint but now fails the run; preserving bytes must not label an incomplete cycle healthy. Semantic chunks are persisted before transport, retained until acknowledgement, retried with the same receipt, and subject to backpressure instead of deleting pending work. Each delivery pass has a shared deadline. The hosted readiness view reports the complete pending count.
All fifteen configured publisher/registry sources have reviewed intake paths. Grafana uses its official RSS index, GitHub its public advisory API, Open VSX its release API, and JFrog/Socket bounded same-origin publisher indexes. These indexes are source-reported leads, not complete historical coverage or full article acquisition. Missing dates stay unknown. Empty/challenged index pages fail closed.
If the original CISA feed returns 403, a token-authenticated fixed-source collector on the Ledger Worker may acquire the same original URL. Only CISA News and the separate advisory comparison are allowed. The private token is never forwarded to a publisher. Hashes, original source identity and collection transport are validated and retained. A failed relay remains a collection gap.
Since 2026-11-04 cisa.gov answers 403 to every automated client, including the Ledger Worker, for everything except the KEV file; a browser still loads the same pages. SecOpsAI does not imitate a browser to get past this. CISA News is disabled. CISA's IT and ICS advisories are collected from the ROLIE feeds in CISA's official CSAF repository (github.com/cisagov/CSAF). The feeds list the whole catalogue, so only advisories updated in the last 14 days are in scope and the rest count as historical. ICS advisories link readers to their cisa.gov page.
SECOPSAI_PUBLIC_ARTIFACT_RECOVERY=1 permits bounded reacquisition of registered
public registry artifacts from their archived URL and the ecosystem adapter's
host allowlist. Both the original hash and size must match before catalog repair;
private durable backup must complete before a recovery receipt exists. This never
extracts or executes a sample and cannot recover changed or unavailable bytes.
Restricted submissions remain outside automatic recovery.
Incremental checkpoints use consistent SQLite backups. Version 3 pins a full baseline in immutable, individually hashed gzip chunks. The opt-in version 4 format records only changed 4 KiB blocks relative to that baseline, plus the complete baseline manifest. A delta never references another delta. This avoids retransmitting a large gzip chunk when a small edit lands anywhere within it. The manifest is committed only after all referenced objects exist, and older completion retries cannot move the pointer backward. Restore verifies compressed chunks, bounded decompression, raw chunks, full database hash and SQLite integrity before atomic replacement. Sparse restoration also validates record ordering, offsets, block lengths, frame checksums and the final full database hash. A corrupt local baseline or a rewrite changing more than one quarter of its bytes triggers an explicitly bounded full rebase. The combined baseline and patch references remain capped at 900 objects, below the storage service's internal request budget. Legacy checkpoints remain preserved; old clients cannot silently restore a legacy ledger after the incremental pointer advances.
Deploy the additive Ledger protocol first. Then enable the repository variable
RESEARCH_INCREMENTAL_CHECKPOINTS=true only after checks and the active legacy
writer complete. The first full transfer has a separate bounded 600-second
bootstrap budget. Verified immutable chunk receipts survive an interrupted
manifest commit within a runner. After bootstrap or a verified incremental
restore, the workflow uses a 60-second interval and a 240-second total recurring
capture/upload budget. The interval is measured from capture start; saves never
overlap and a slow save does not add another idle interval. A compact hash index
verified against the immutable baseline avoids rereading that full file on every
sparse capture. These bounds are an implementation design;
production five-minute committed-loss guarantees require measured crash drills.
After deploying the additive version 4 server and passing its gates, enable
RESEARCH_PAGE_DELTA_CHECKPOINTS=true. The runner retains a private immutable
baseline copy; disk capacity must accommodate the live ledger, baseline and
consistent capture. Bootstrap and full rebases may exceed the recurring recovery
objective and must be reported separately rather than represented as a proven RPO.
Use the read-only Research Recovery Drill workflow to restore the exact
production checkpoint in disposable storage, check foreign keys, enumerate rows
and verify source archive hashes. It then writes synthetic committed markers to
the private copy, checkpoints them in the isolated /recovery-drill namespace,
interrupts the next checkpoint before manifest commit and kills only its own
synthetic writer. Restoring the previous isolated checkpoint measures committed
loss and confirms that a failed commit preserves the previous pointer. The
production pointer is never modified. The report checks the one-hour recovery
and five-minute loss targets for that scenario; continued production timing
monitoring is required before claiming a sustained guarantee.
No rollout changes Clef enablement, decision mode, replay status, publication approval or existing single-writer ownership. Real reviewers, partner agreements, consented telemetry and independently labeled evaluation evidence remain external activation requirements.
The disposable parser laboratory (python -m secopsai.research_parser_lab)
performs deterministic mutation tests on fixed SecOpsAI-owned parser targets.
It creates a separate process with no inherited provider credentials, blocks
network sockets, bounds CPU/runtime/input count, and records the exact corpus
hash, seed and failure identities. It executes no package code. This makes
parser robustness experiments repeatable; it does not replace authorized
package execution, victim telemetry or independent human reproduction. A
synthetic laboratory pass cannot satisfy held-out model calibration or create a
publication approval.
Ontology receipt identity
New ontology-v2: receipts hash normalized JSON with stable object-key order;
array order and factual values remain material. Legacy receipt hashes retain
their original backend contract. Only an explicit legacy idempotency_conflict
can create a durably recorded versioned retry. The original queued JSON and key
remain archived in ontology_sync_receipt_migrations; acknowledgement of the new
receipt is required before the old outbox row is removed. Lost acknowledgements
reuse the same recorded versioned request. Entity identity and scope conflicts
never trigger this migration.
Named validation failures remain queued for review and do not block later valid
chunks that can supply missing dependencies. Authorization or transport failures
stop the bounded batch. The dashboard and watchdog continue to report all pending
work; a rejected chunk is never counted as delivered. Hosted workers emit bounded
stage names through SECOPSAI_WORKER_STAGE_LOGS=1 so an interrupted cycle identifies
its last stage without exposing case content. Recovery reports preserve SQLite
error codes and failure phases without recording endpoint bodies or credentials.
Source-to-lead delivery
Per-source, version and archived-source-hash delivery receipts track successful advisory-to-lead materialization. The grouped package alert ID is captured rather than guessed from a historical dedupe format. Unchanged facts are not repeatedly upserted and cannot reopen an operator-resolved lead on every cycle. A changed source hash or a missing referenced candidate/alert remains eligible for repair. Receipts are written only after a durable alert exists; a crash before receipt storage safely repeats the idempotent grouped upsert.
Hosted cycles prioritize historical private backup/recovery and primary-source intake before external advisory materialization. The worker bounds that latter batch to 100 records, so progress can resume from receipts rather than repeating the same first thousand records and starving collection.
Existing ledgers migrate to schema version 14 before ontology receipt migration or external advisory delivery. Both required delivery tables participate in the initializer's fast-path check, including recovery from an incomplete upgrade. A fresh supervisor restore fences running daily jobs from the serialized snapshot; ordinary starts preserve live owners' leases. Cooperative shutdown releases only the current run's exact owner and generation, retaining completed step evidence. Daily automation invoked after the current worker's surveillance records that step as already performed instead of recursively collecting the same sources. Standalone daily automation still performs its own surveillance pass.
For delivery repair after collection/analysis already passed, the Research Worker
workflow's delivery_only input restores the canonical ledger, materializes a
bounded semantic snapshot, durably queues it, drains acknowledged delivery within
an 840-second budget and refreshes the hosted research-operation projection. It
uses the same single-writer lock and final checkpoint. It performs no registry
scans, package analysis or model jobs. Rejected or unacknowledged records remain
queued and fail verification. Optional retry_sources names select only enabled
primary sources still reporting failures; already recovered sources are skipped,
and disabled sources cannot be resumed by this path. A successful projection
write retries transient transport/server failures against one 45-second deadline;
authentication and contract failures are never retried as availability failures.
After the delivery-only final checkpoint, the workflow runs the independent checkpoint/hosted-state/public-availability watchdog and preserves its bounded diagnostic report. In this mode, delivery backlog, checkpoint, backup, ontology and endpoint failures are release blockers. Source-freshness gaps remain in the report as an explicit degraded operational status, but do not fail a delivery run that performs no collection. The watchdog's default full-operation scope continues to block on those gaps. This does not repeat the fifteen-source parsing probe.
Share this page