Four queues, one incident
A cloud-security finding, an odd identity session, a suspicious process tree, and an outbound network alert may be one intrusion. They arrive as four unrelated queues of work, in four products, with four notions of “host.”
SignalArray is the reasoning layer between your detection products and your incident response. It takes the findings you already have, correlates them with deterministic, replayable rules, and investigates each candidate case with a bounded, read-only agent that must cite its evidence. The output isn’t another alert. It’s a reviewable case: what belongs together, why, what happened, and what to do about it.
SPECIFICATION DRAFT · CONTRACTS UNDER REVIEW · NO IMPLEMENTATION YET
They lack a reliable way to know when signals from different systems describe the same event, gather the evidence, and explain what probably happened. Today the correlation engine is an analyst with six tabs open.
A cloud-security finding, an odd identity session, a suspicious process tree, and an outbound network alert may be one intrusion. They arrive as four unrelated queues of work, in four products, with four notions of “host.”
A shared IP, a reused hostname, a display name that resembles another. Consoles that correlate on names merge things that aren’t the same, and one false merge contaminates every conclusion downstream.
Pointing an LLM at raw telemetry is expensive, unsafe, and impossible to evaluate. Every log line, process argument, and issue description becomes a candidate instruction aimed at the model.
A fluent report with a score at the top starts to look like permission. But a score without evidence is not a finding, and a finding without a policy decision is not authorization to touch production.
SignalArray’s answer isn’t a smarter detector. It’s a case: deterministic software decides what belongs together, a bounded investigator explains it with citations, and nothing on the page authorizes a mutation.
Detection, correlation, and investigation need different data volumes, permissions, and failure semantics. SignalArray keeps them apart on purpose, and only the last one involves a model.
Every finding becomes one versioned contract with provenance intact, and nothing downstream ever sees the native shape:
Redelivery of the same version returns the same signal_id. A meaningful update is a new immutable version linked to the last, never an overwrite of evidence a case already used.
Rules are data, not scripts. Each immutable version declares what it needs and records why it matched:
Only then does a model see anything. Layer C is the investigator: it receives a bounded case snapshot, not the event store; it may ask for evidence through registered read-only tools or complete a report, and nothing else. It returns incident, benign, or inconclusive, and uncertainty is a supported result, not a failure.
Any High or Critical signal starts a fast, narrowly budgeted Validation Investigation, even alone. Exactly one result suppresses the page. Everything else, including timeouts and failures, alerts a human and unlocks the full investigation.
A signal lands, once. The adapter authenticates the source, validates the payload, derives the idempotency key, and normalizes. Redelivery returns the original signal_id; malformed input is quarantined, never patched with invented fields.
Identity is resolved conservatively. Scoped keys, source-asserted aliases, and versioned probable mappings can join. Resemblance cannot. Ambiguity is represented, not collapsed.
Rules append membership events. Crossing a creation threshold starts one workflow with a deterministic ID: signalarray:case:{workspace_id}:{case_id}. Starting it twice signals the existing run.
Validation, fast and separately budgeted. The minimum evidence needed to decide whether the claimed severity is credible. It emits a cited validation record, never a stand-in for the full report.
Escalate by default. Anything but affirmative benign at high confidence writes an immutable validation_escalated event and durably enqueues the on-call alert. Full Investigation and playbook selection start without waiting for delivery or acknowledgement.
A bounded hypothesis loop. Each turn returns exactly one schema-valid action: request_evidence with a registered tool and the hypothesis it would distinguish, or complete_report. Budgets end the loop as a normal stop, named in the report.
Validate citations, publish, wait for a human. Every cited evidence_id must exist and have been visible to that turn; failed tool calls cannot masquerade as evidence. Reports are immutable versions. Disposition is recorded with actor, reason, and time.
A candidate case comes with a proof of why the signals were grouped, and every decision replays identically against the same input and rule version. Open a row to read the evaluation.
Scores prioritize and gate explicit evidence. They are not calibrated incident probability, and the specification says so out loud, because a number that looks like a probability gets treated like one.
Nothing here is enforced by a prompt. Each gate is a deterministic check in the activity that runs the call, evaluated independently of anything the model said.
A case can only ask about itself.
Free-form tool execution is not an action.
Exhaustion is a normal stop, not an error.
Absence of evidence is never evidence.
The model never holds a credential.
Validation failure comes back as a structured denial and is audited. The investigator cannot negotiate around it through prose, and quoted source content is labeled as untrusted data in every excerpt it sees.
Automated response is optional, separate, and default deny. A scenario-specific Response Playbook runs as a durable Response Run under its own agent, credentials, and budgets. Operators author it through a guided UI with safe presets and plain-language review. The UI compiles to an immutable revision you can diff, replay, and audit.
Record the match and the proposed action. Request nothing, execute nothing. Also the result of every unmatched, conflicting, expired, or invalid policy.
A bounded action proceeds only after an authorized human records a separate approval with actor, scope, revision, and expiry. A page acknowledgement does not count.
An explicitly scoped, reversible action within strict target and blast-radius limits. Policy and live target facts are revalidated immediately before the mutation.
The recommendation stays in the case and the alert. Nothing infers permission, widens a target, or falls back to a different action.
The Response Agent reasons only at declared decision steps and selects exactly one eligible playbook using cited evidence. Deterministic orchestration owns transitions, waits, approvals, policy calls, mutations, verification, and terminal state. A successful adapter request is not proof of containment; a verify step has to show it.
Not switched off. Not hidden behind a prompt. Absent. Each boundary below is a requirement with an adversarial test in the security model, not a configuration default.
Never lets a model decide case membership. Deduplication, identity, windows, and grouping are deterministic and replayable. The investigator reasons over a case; it doesn’t assemble one.
Never merges on a name. Hostnames, emails, IPs, and tags are aliases or observables. Only scoped identifiers, authoritative assertions, and versioned probable rules can join.
Never scans the firehose. SignalArray begins at signals. Upstream products keep doing high-volume collection and detection; a bounded investigation may query telemetry, but no model reads the stream.
Never gives the investigator a write path. Destructive or production-mutating tools are impossible to register in the v1 investigator role. The response plane does not exist in that runtime.
Never treats confidence as authorization. No threshold, including 100%, authorizes a mutation. Only an active, immutable policy revision matching the exact action, targets, environment, and bounds can.
Never treats an acknowledgement as approval. A page being seen or owned is a coordination fact. Human authorization is a distinct audited human_approval step with its own expiry.
Never lets source content steer the system. Log lines, issue descriptions, URLs, and documents remain quoted evidence. They never become workflow policy, tool permission, or playbook instruction.
Never fabricates evidence. A failed or denied tool call is an explicit gap. A report cannot describe it as retrieved, and cannot describe a recommended action as taken.
Never lets a vendor payload cross the adapter. Credentials, native shapes, and vendor errors stay inside the adapter. Core rules may not depend on an extensions field.
Never requires StarColony. The same SignalArray-owned workflow runs on a bundled Temporal or on StarColony. Evaluation, dogfood, and core operation stay standalone by default.
What a prompt-injected investigator can actually reach: a redacted case projection, registered read-only tools inside case scope, and a report schema that rejects uncited claims. That is the entire surface.
SignalArray is being specified in the open, contract first. Present tense above means the specification; here is exactly what is settled and what is deliberately still a question.
No implementation exists yet. Every integration named on this page is a reference adapter or planned work. The specification is the product today.
Wiz and Datadog are reference adapters, not dependencies. They demonstrate two complementary signal sources. Core contracts may not contain logic that requires either.
SignalArray is not a SIEM, a detection console, or a managed SOC. It reduces cross-tool investigation toil for a small team that already runs several detectors and is willing to self-host.
We’re looking for a small set of security teams who already run Wiz, Datadog, or their equivalents, lose time reconstructing incidents across them, and would rather shape the contracts than inherit them.
No invented logos, no fake metrics, no testimonials. A conversation about your detectors, your investigation toil, and our open questions.
Deterministic before agentic. Evidence before confidence.