Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
263 commits
Select commit Hold shift + click to select a range
cb9222d
feat(eval): add C7 eval metric functions (#32)
echel0nn Jul 19, 2026
9ca738a
feat(security): redact inline secrets at the log boundary (C6, #42)
echel0nn Jul 19, 2026
a403483
fix(reporting): verify TLS certificate when emailing reports (#48)
echel0nn Jul 19, 2026
20fa2bd
test(backbone): restore SQLite fixture compatibility for shared metad…
echel0nn Jul 20, 2026
c5705f3
fix(forensics): read real ArtifactRecord fields in writeup builder (#59)
echel0nn Jul 20, 2026
a1c8da2
fix(reporting): autoescape and URL-scheme guard for vulnerability PDF…
echel0nn Jul 20, 2026
1a9fe04
feat(security): C1 team-scope request resolver and owned_or_404 (#36/…
echel0nn Jul 20, 2026
5bc4e39
fix(modules): construct each module once during discovery (#41)
echel0nn Jul 20, 2026
858822d
fix(malware): module-prefix workspace unique constraint to match migr…
echel0nn Jul 20, 2026
abded69
fix(fuzz): reject symlinks and oversized files in crash discovery (#58)
echel0nn Jul 20, 2026
421b00a
fix(malware): sanitize investigation narrative on persist (#43)
echel0nn Jul 20, 2026
a05cc18
fix(config): redact secret config values for non-admin readers (#50, C6)
echel0nn Jul 20, 2026
5b57db4
fix(malware): align tag-index constraint name with migration 068 (#56)
echel0nn Jul 20, 2026
699feeb
fix(malware): enforce team ownership on target single-resource routes…
echel0nn Jul 20, 2026
8115112
fix(malware): close IDOR across investigation/observation/subresource…
echel0nn Jul 20, 2026
9d8ad01
fix(systems): enforce team ownership on systems + tags routers (#57)
echel0nn Jul 20, 2026
8e4a08c
fix(http): re-validate SSRF policy on every redirect hop (#42)
echel0nn Jul 20, 2026
bd6c7c5
fix(ssh): redact command dispatch log and audit forward_trusted (#42)
echel0nn Jul 20, 2026
2a6dad9
fix(ssh): reject SFTP path traversal on upload and download (#42)
echel0nn Jul 20, 2026
cf13f16
fix(llm): redact secrets from provider error messages (#44)
echel0nn Jul 20, 2026
a256c42
fix(llm): fail fast on non-retryable provider errors (#44)
echel0nn Jul 20, 2026
92b79e5
fix(events): isolate emitter destinations and bound the SSE stream li…
echel0nn Jul 20, 2026
65ab244
fix(malware): deterministic token-boundary family match (#61)
echel0nn Jul 20, 2026
8cf68b2
fix(forensics): bound writeup output size and per-call LLM ceiling (#48)
echel0nn Jul 20, 2026
5d681ee
fix(vr): schema-validate finding evidence refs at write time (#48)
echel0nn Jul 20, 2026
7dd63b6
fix(config): redact secret values on the config write/audit path (#50…
echel0nn Jul 20, 2026
e5c80c0
fix(forensics): purge all child tables on project delete (#59)
echel0nn Jul 20, 2026
ae6332b
feat(journal): add C2 append-only hash-chained platform journal (C2)
echel0nn Jul 20, 2026
c66690f
feat(evidence): seal evidence packs with a tamper-evident merkle dige…
echel0nn Jul 20, 2026
277dc01
feat(audit): migrate CLI audit trail to the tamper-evident journal (#52)
echel0nn Jul 20, 2026
70abc31
feat(llm): bound each tool execution with a per-call timeout (#44)
echel0nn Jul 20, 2026
7c20950
fix(llm): pool AsyncOpenAI clients to stop the per-call fd leak (#44)
echel0nn Jul 20, 2026
97bc271
test(llm): restore the async config fakes in the client suite (#62)
echel0nn Jul 20, 2026
7fd299a
test(llm): restore the async config provider suite (#62)
echel0nn Jul 20, 2026
7b11b15
test(llm): stub the client pool in the retry-loop harness (#44)
echel0nn Jul 20, 2026
6df118c
test(llm): restore the stale-async LLM pipeline unit tests (#62)
echel0nn Jul 20, 2026
603b853
test(llm): restore the pipeline smoke test (#62)
echel0nn Jul 20, 2026
c2edcc6
test(llm): restore the custom-injection-pattern test (#62)
echel0nn Jul 20, 2026
c01686c
feat(reports): admin CA bundle and implicit TLS for report email (#48)
echel0nn Jul 20, 2026
7a23823
fix(cost): keep budget-check failures from breaking cost recording (#39)
echel0nn Jul 20, 2026
77c8d66
fix(cost): return None on LLM failure in human cost estimation (#39)
echel0nn Jul 20, 2026
9d43db4
fix(cost): make budget alerting truly never-raise (#39)
echel0nn Jul 20, 2026
93d0347
fix(llm): stop cost-telemetry failures from failing the LLM call (#39)
echel0nn Jul 20, 2026
8807b5a
fix(journal): use portable length() in the hash-length check constrai…
echel0nn Jul 20, 2026
749d63d
test(storage): migrate config-audit and operations tests to async Pos…
echel0nn Jul 20, 2026
526d32d
test(seal): migrate the audit-seal suite to async Postgres (#62)
echel0nn Jul 20, 2026
bb56e12
test(reasoning): align the reasoning-engine suite with evolved contra…
echel0nn Jul 20, 2026
dd90f8c
test(vuln): align tool base tests with async forward and no init_db (…
echel0nn Jul 20, 2026
f6272d6
test(vuln): migrate module conftest test_db to PostgreSQL (#62)
echel0nn Jul 20, 2026
caa5d1c
test(vuln): drop dispatch tests for relocated analyze_fleet path (#62)
echel0nn Jul 20, 2026
918a77d
test: add shared PostgreSQL test_db fixture; migrate mttr tool test (…
echel0nn Jul 20, 2026
1b7b353
test(vuln): migrate root-level tool tests to PostgreSQL async (#62)
echel0nn Jul 20, 2026
1ad356a
fix(vuln): make weekly_digest async and wire CLI async tool callsites…
echel0nn Jul 20, 2026
0895e67
test(vuln): migrate ops tool tests to PostgreSQL async (#62)
echel0nn Jul 20, 2026
394c322
fix(platform): correct scalar-id subscript in knowledge dedup update …
echel0nn Jul 20, 2026
5966546
test: migrate memory/agent/intel/config/task-progress tests to async …
echel0nn Jul 20, 2026
b656191
test: migrate report-repository/schedule/scaling tests to async Postg…
echel0nn Jul 20, 2026
9811ac5
test(vuln): align intel/task-queue tests with async + TTL/dedup contr…
echel0nn Jul 20, 2026
7092027
test(vr): align MASVS verdict/seed/pdf tests with current contracts (…
echel0nn Jul 20, 2026
ac67c9c
test: align ssh/database-lock/cli tests with async + evolved contract…
echel0nn Jul 20, 2026
b8736a5
test: align workflow/knowledge-wiring/http/scoring tests with async c…
echel0nn Jul 20, 2026
9334b44
test(vr): align VR core tests with evolved enums/contracts + async (#62)
echel0nn Jul 20, 2026
44dce53
test(vr): exempt MASVS-ARCH controls from the relevant_apis invariant…
echel0nn Jul 20, 2026
b9376d5
test(api): align health/auth/config/schema tests with evolved contrac…
echel0nn Jul 20, 2026
2b7f61f
test(api): unwrap DataEnvelope and await async Protocol methods (#62)
echel0nn Jul 20, 2026
2a420db
feat(tasks): make get_task_tuning read namespace='platform' config li…
echel0nn Jul 20, 2026
9ef846a
test(api): align cost/reports/systems/vr tests with evolved contracts…
echel0nn Jul 20, 2026
3646b60
fix(api): close scan SSE stream cleanly on mid-stream backend error (…
echel0nn Jul 20, 2026
47affe4
fix(auth): make API key revocation atomic to close a duplicate-revoke…
echel0nn Jul 20, 2026
e8cfda6
fix(api): declare binary response content for file-download routes (#62)
echel0nn Jul 20, 2026
c1cfd36
test(api): align SSE streaming and race-isolation tests with current …
echel0nn Jul 20, 2026
5d1b1e2
test(api): gate live scan smoke test on GITHUB_TOKEN (#62)
echel0nn Jul 20, 2026
dc5bfec
fix(vuln): return full tag rows from list_system_tags (#62)
echel0nn Jul 20, 2026
029c2a8
test(api): align Phase-138 auth/endpoint tests; xfail two documented …
echel0nn Jul 20, 2026
c5d12bd
fix(oidc): validate callback state against the signed cookie (#62)
echel0nn Jul 20, 2026
69b57e1
fix(platform): isolate module seeding and stamp malware seed version …
echel0nn Jul 20, 2026
50f80d5
perf(contracts): batch upsert_many and bound observation reads (#61)
echel0nn Jul 20, 2026
202530f
fix(platform): resolve two remaining discarded-coroutine config reads…
echel0nn Jul 20, 2026
c6f0f0c
fix(platform): make periodic-sweep re-registration idempotent (#46)
echel0nn Jul 20, 2026
88e93b3
fix(audit): commit audit rows in the business transaction; fail loud …
echel0nn Jul 20, 2026
36ea773
feat(llm): budget hard-stop, pre-call budget check, async embedding o…
echel0nn Jul 20, 2026
d072183
perf(vuln): SQL pagination and workflow-transition validation on find…
echel0nn Jul 20, 2026
13c4d0e
feat(forensics): list pagination and freeflow cost ceiling (#59)
echel0nn Jul 20, 2026
11d9603
fix(forensics): surface non-zero script exit instead of reporting suc…
echel0nn Jul 20, 2026
7f53b28
fix(llm): fence untrusted tool output and report facts against prompt…
echel0nn Jul 20, 2026
5097c76
fix(audit): commit remaining audit rows in the business transaction (…
echel0nn Jul 20, 2026
65aefd2
fix(sse): lifetime cap, disconnect detection, and active-connection g…
echel0nn Jul 20, 2026
8c0f8f2
fix(automation): overlap guard, claim-before-submit ordering, per-sch…
echel0nn Jul 20, 2026
e7c9b9d
fix(malware): gate playbook step dispatch behind a tool allowlist (#58)
echel0nn Jul 20, 2026
e418efe
fix(forensics): re-hash pulled evidence locally instead of trusting t…
echel0nn Jul 20, 2026
a4360ab
fix(vuln): harden the synchronous PDF render env against injection (#43)
echel0nn Jul 20, 2026
3ff37d1
fix(forensics): run deep-analysis SSH off the DB connection (#63)
echel0nn Jul 20, 2026
d9a0a7c
fix(forensics): enqueue readiness analysis outside the DB session (#63)
echel0nn Jul 20, 2026
9d4325f
perf(events): reuse a pooled sync Redis client in the emitter (#60)
echel0nn Jul 20, 2026
1a5f65a
fix(forensics): guard markdown link scheme in WriteUpViewer (#43)
echel0nn Jul 20, 2026
203008c
refactor(platform): drop dead notification_types and cost is_admin br…
echel0nn Jul 21, 2026
b057a9f
fix(api): OIDC cookie secure flag and CORS credential hardening (#36)
echel0nn Jul 21, 2026
88cf254
fix(http): redact secrets from surfaced httpx errors (#42)
echel0nn Jul 21, 2026
146a377
fix(vr): treat a null outcome timestamp as never-fresh in section cac…
echel0nn Jul 21, 2026
68e1673
feat(malware): dedup observation writes via partial unique index (#61)
echel0nn Jul 21, 2026
b8a8738
fix(api): await async platform handle in session chat endpoint
echel0nn Jul 21, 2026
680c3b8
chore(release): 0.3.0 -- security, correctness, and reliability harde…
echel0nn Jul 21, 2026
15efcdb
fix(automation): supervise the tick loop with exponential backoff (#46)
echel0nn Jul 21, 2026
598326b
fix(config): declare SMTP scheduled-report keys in the platform schem…
echel0nn Jul 21, 2026
f1f69dd
feat(storage): make DB connection pool sizing env-tunable (#45)
echel0nn Jul 21, 2026
fef33db
fix(tasks): correct workflow retry backoff off-by-one (#40)
echel0nn Jul 21, 2026
828e55c
fix(reasoning): thread investigation run_id into LLM calls (#39, #59)
echel0nn Jul 21, 2026
b4f3da1
fix(llm): abort LLM retry backoff on cancellation token (#44)
echel0nn Jul 21, 2026
7279bf8
fix(vr): offload blocking PDF render off the event loop (#48)
echel0nn Jul 21, 2026
d97fa78
fix(vr): offload MASVS report render, correct false offload docstring…
echel0nn Jul 21, 2026
867d2dc
fix(vulnerability): offload WeasyPrint PDF render off the event loop …
echel0nn Jul 21, 2026
85261f7
fix(forensics): skip readiness auto-enqueue when analysis already act…
echel0nn Jul 21, 2026
00be064
fix(reasoning): reject non-JSON observables at construction (#61)
echel0nn Jul 21, 2026
1d75228
fix(reporting): team-scope scheduled report records (#48)
echel0nn Jul 21, 2026
03f9abd
fix(api): team-scope audit event queries (#36)
echel0nn Jul 21, 2026
d1f5cf0
fix(malware): team-gate investigation sub-resource reads (#36)
echel0nn Jul 21, 2026
ef217bc
fix(malware): team-scope target/workspace/outcome sub-resource reads …
echel0nn Jul 21, 2026
e861df8
fix(vulnerability): team-scope findings queries (#36)
echel0nn Jul 21, 2026
cbd3317
test(forensics): anchor readiness dedup fn_path to submit derivation …
echel0nn Jul 21, 2026
6752f2c
fix(api): team-scope topology reads (#36)
echel0nn Jul 21, 2026
3f6b0ec
fix(malware): cap dict-value observation payload size (#61)
echel0nn Jul 21, 2026
4c1d12e
fix(workflows): preserve cursor version chain on recreation (#40)
echel0nn Jul 21, 2026
75e5f2c
fix(api): team-scope user management reads and writes (#36)
echel0nn Jul 21, 2026
fce5c1e
fix(llm): add confidence-drift retention sweep (#45)
echel0nn Jul 21, 2026
87a98b3
fix(api): team-scope dashboard, executive, and search reads (#36)
echel0nn Jul 21, 2026
117c52f
fix(tasks): pair requeue/resume/cancel with ARQ side-effects, guard r…
echel0nn Jul 21, 2026
622be60
fix(automation): implement platform health-check dependency probes (#46)
echel0nn Jul 21, 2026
2ed9c08
fix(automation): timezone-aware cron, auto-disable on parse error, co…
echel0nn Jul 21, 2026
87cba5a
fix(platform): validate SSRF egress policy on every redirect hop (#42)
echel0nn Jul 21, 2026
3d37dd1
fix(api): restrict team and dead-letter administration to god-tier (#36)
echel0nn Jul 21, 2026
2f05242
perf(storage): index hot query columns on workflow/audit/artifact tab…
echel0nn Jul 21, 2026
7b56b58
feat(tasks): inherit team_id through task engine, scope task reads by…
echel0nn Jul 21, 2026
476081b
feat(api): stamp team_id on module-router root submits (#53, #36)
echel0nn Jul 21, 2026
b7b07f5
fix(knowledge): embed store/retrieve tools via the canonical provider…
echel0nn Jul 21, 2026
9c3d960
fix(knowledge): add relevance floor to hybrid retrieve via extracted …
echel0nn Jul 21, 2026
76477cc
fix(knowledge): resolve knowledge_store dedup INSERT race idempotentl…
echel0nn Jul 21, 2026
4dff56e
docs(changelog): reconcile 0.3.0 entry with the latest hardening batch
echel0nn Jul 21, 2026
77fce4c
fix(platform): stamp workflow runs with the submitting team (#36)
echel0nn Jul 21, 2026
120bd48
fix(vulnerability): stamp findings with the scan team, scope schedule…
echel0nn Jul 21, 2026
3cd1010
fix(platform): stamp team on agent-tool system registration (#36)
echel0nn Jul 21, 2026
e58d530
fix(platform): stamp audit events with the acting team (#36)
echel0nn Jul 21, 2026
fbd034f
fix(auth): team-scope API keys on create, list, and revoke (#36)
echel0nn Jul 21, 2026
7c0b1e9
fix(auth): scope OIDC users to a team, carry team in the JWT (#36)
echel0nn Jul 21, 2026
da709ea
fix(knowledge): store embeddings at full 1024-dim BGE-M3 (#49)
echel0nn Jul 21, 2026
0645372
perf(storage): index notification reads on (user_id, created_at) (#45)
echel0nn Jul 21, 2026
029cce2
fix(auth): add refresh_token_records ip_address/user_agent columns (#36)
echel0nn Jul 21, 2026
2727fba
docs(llm,malware): correct stale docstrings to match behavior
echel0nn Jul 21, 2026
6e269a7
feat(config): typed dynamic-key families for per-task-type config (#45)
echel0nn Jul 22, 2026
b6202fb
feat(knowledge): select embedding provider from platform config (#49)
echel0nn Jul 22, 2026
60e475e
fix(config): honor declared config keys via ConfigRegistry (#45)
echel0nn Jul 22, 2026
2e3e9cb
fix(storage): reconcile model-vs-migration schema drift (#45)
echel0nn Jul 22, 2026
f56160b
docs(config,storage): define landed config and schema changes in desi…
echel0nn Jul 22, 2026
57088a8
refactor(imports): canonicalize platform _common imports to public pa…
echel0nn Jul 22, 2026
17be94b
fix(resilience): flip fail-open recovery paths to fail-closed (#31)
echel0nn Jul 22, 2026
79b6aba
fix(contracts): make ModulePayload a real discriminated union (#61)
echel0nn Jul 22, 2026
1d3e05b
feat(observability): correlate cost + MCP-call records to investigati…
echel0nn Jul 22, 2026
a173435
feat(contracts): hoist shared enums, contracts, and constraint-naming…
echel0nn Jul 22, 2026
f4aa07e
feat(contracts): FK-derivation mechanism + workspace/branch record ba…
echel0nn Jul 22, 2026
ab78ff3
feat(contracts): add the remaining 9 RFC-01 record + contract bases (…
echel0nn Jul 22, 2026
075968e
refactor(contracts): vr + malware re-export hoisted enums and contrac…
echel0nn Jul 22, 2026
a82b139
fix(contracts): record bases use sa_type not shared Column instances …
echel0nn Jul 22, 2026
971bdc9
refactor(db): zero-domain records subclass platform bases (#26)
echel0nn Jul 22, 2026
cd83583
refactor(db): domain records subclass platform bases (#26)
echel0nn Jul 22, 2026
c52bb29
feat(template): db_models scaffold subclassing platform bases (#26)
echel0nn Jul 22, 2026
7547ccf
feat(honesty): add RFC-01 re-duplication guardrail rules (#26)
echel0nn Jul 22, 2026
d5896a3
test(contracts): assert concrete MRO preserves TeamScopedMixin order …
echel0nn Jul 22, 2026
7c71ee2
fix(config): route scheduled-report trigger through the shared regist…
echel0nn Jul 22, 2026
fb0c983
refactor(tasks): lift arq_purge to the platform (#29)
echel0nn Jul 22, 2026
ae0ef06
refactor(services): lift branch_cleanup to the platform (#29)
echel0nn Jul 22, 2026
708ca0a
refactor(services): lift machine_readiness to the platform (#29)
echel0nn Jul 22, 2026
1d62178
refactor(services): lift branch_reaper to the platform (#29)
echel0nn Jul 22, 2026
42bcd20
refactor(services): lift multi_target to the platform (#29)
echel0nn Jul 22, 2026
7ed2ca7
refactor(services): lift pattern_store to the platform (#29)
echel0nn Jul 22, 2026
54b4408
refactor(services): lift stage_tracker to the platform (#29)
echel0nn Jul 22, 2026
4d487f0
refactor(mcp): lift mcp_registry to the platform (#29)
echel0nn Jul 23, 2026
317daf2
refactor(services): lift stall_recovery to the platform (#29)
echel0nn Jul 23, 2026
e7c4489
refactor(services): lift outcome_review to the platform (#29)
echel0nn Jul 23, 2026
93bffb8
fix(mcp): unify MCP call logger; malware gains correlation join-keys …
echel0nn Jul 23, 2026
712ce3e
refactor(services): lift investigation cap reaper to platform; VR gai…
echel0nn Jul 23, 2026
0607986
refactor(services): lift investigation finalizers to platform; malwar…
echel0nn Jul 23, 2026
02b38d8
test(rfc01): mcp_call_log residue is empty after join-key hoist (#29 …
echel0nn Jul 23, 2026
88ef63a
refactor(config): add ModuleConfigBase + unify typed config readers (…
echel0nn Jul 23, 2026
7e817dd
feat(honesty): add rule 37 module_config_schema_base (#29)
echel0nn Jul 23, 2026
f21e191
fix(vr): finalize cap-check reads caps via ConfigRegistry (#29)
echel0nn Jul 23, 2026
b9daa44
feat(honesty): add rule 38 service_copy_of_platform (#29)
echel0nn Jul 23, 2026
39fbc73
refactor(services): lift investigation pause/resume to platform (#27)
echel0nn Jul 23, 2026
7c02f07
refactor(services): lift investigation reenqueue to platform (#27)
echel0nn Jul 23, 2026
b071225
fix(malware): route pause/resume through the platform lifecycle servi…
echel0nn Jul 23, 2026
ff053ca
fix(malware): log pause/resume lifecycle summary for VR parity (#27)
echel0nn Jul 23, 2026
1f6743a
fix(malware): own re-enqueue state machine at the platform boundary (…
echel0nn Jul 23, 2026
a7599ef
fix(malware): report live investigation cost via platform aggregator …
echel0nn Jul 23, 2026
734a63f
refactor(platform): share the investigation summary projection (#27)
echel0nn Jul 23, 2026
59de32a
refactor(platform): share the persona sibling spawn (#27)
echel0nn Jul 23, 2026
7e860c4
fix(malware): live spend on the /cost endpoint via platform aggregato…
echel0nn Jul 23, 2026
7fcda08
feat(honesty): guardrails against lifecycle + cost re-drift (#27)
echel0nn Jul 23, 2026
08c242a
refactor(platform): extract the investigation setup state factory (#27)
echel0nn Jul 23, 2026
902c6f5
refactor(platform): extract the investigation loop state factory (#27)
echel0nn Jul 23, 2026
6e3cee3
feat(honesty): guardrail against workflow-state re-copy (#27)
echel0nn Jul 23, 2026
5377bd7
refactor(platform): investigation emit state to platform factory (RFC…
echel0nn Jul 23, 2026
28e55d1
refactor(platform): shared terminal-transition helper (RFC-02)
echel0nn Jul 23, 2026
d5748e8
refactor(platform): lift auto-steering + intent classifier to platfor…
echel0nn Jul 23, 2026
368d6b0
refactor(platform): sibling-consensus injector to platform/agents (RF…
echel0nn Jul 23, 2026
be2dd5b
fix(platform): idempotent LLM wrapper closes claim-verifier double-pa…
echel0nn Jul 23, 2026
c8918d6
fix(platform): route pattern/synthesis/narrative LLM calls through id…
echel0nn Jul 23, 2026
1a4b78e
fix(platform): adopt idempotent wrapper at nday_researcher + close ru…
echel0nn Jul 23, 2026
85758b5
refactor(platform): branch pool to platform/agents + FOR UPDATE fork …
echel0nn Jul 23, 2026
d7e56cb
refactor(platform): shared tool-execution primitives to platform/agen…
echel0nn Jul 23, 2026
b9b3844
fix(malware): conform OutcomeDispatcher to the platform dispatcher co…
echel0nn Jul 23, 2026
e1a8b8a
refactor(platform): RFC-04 Phase 3 -- shared SSE transport hook
echel0nn Jul 23, 2026
fdc861c
feat(honesty): RFC-05 rule 44 private_platform_import guardrail
echel0nn Jul 23, 2026
6e3c78f
refactor(platform): RFC-05 (e) IntelServiceProtocol via platform runtime
echel0nn Jul 23, 2026
d059360
refactor(platform): RFC-05 (b) parameterize MCP bridges by module_id
echel0nn Jul 23, 2026
d5a8157
refactor(platform): RFC-05 (c) drop dead domain-event vocabulary
echel0nn Jul 23, 2026
7503ad2
refactor(platform): RFC-05 Phase 6 -- platform owns task/cursor reaping
echel0nn Jul 23, 2026
58f7db1
refactor(platform): RFC-05 (d) module-declared reasoning registries
echel0nn Jul 23, 2026
fc7844e
test(vr): fix stale imports after RFC-03 platform extractions
echel0nn Jul 23, 2026
068d101
refactor(platform): RFC-05 (a)/(g) de-weld shared API routers from mo…
echel0nn Jul 23, 2026
5247edc
fix(platform): RFC-03 Phase 6b -- close outcome dispatch TOCTOU with …
echel0nn Jul 24, 2026
6655acd
test(vr): characterization net for ToolExecutor pre-dispatch gating (…
echel0nn Jul 24, 2026
87e0ef4
test(malware): characterization net for ToolExecutor pre-dispatch gat…
echel0nn Jul 24, 2026
e6fcc26
feat(platform): RFC-09 step 0 -- file-backed prompt registry
echel0nn Jul 24, 2026
7f20586
feat(platform): RFC-09 step 1 -- tag LLM cost records with prompt con…
echel0nn Jul 24, 2026
38f74fe
feat(platform): RFC-09 step 4 -- immutable prompt version + alias store
echel0nn Jul 24, 2026
9db2a66
fix(frontend): render the 'claimed' outcome dispatch status
echel0nn Jul 24, 2026
ebf6c6b
fix(platform): zombie reaper must not cancel never-beating tasks
echel0nn Jul 24, 2026
cbc14db
fix(platform): self-heal a stranded outcome dispatch claim
echel0nn Jul 24, 2026
7950083
fix(platform): prompt version suffix must not reuse an archived number
echel0nn Jul 24, 2026
b6878af
feat(platform): tag audit seals with the prompt content hash (RFC-09 …
echel0nn Jul 24, 2026
f450b13
refactor(platform): give ProgressStream._KEY_FMT a single reader
echel0nn Jul 24, 2026
671c7be
fix(platform): arq_purge redis-url fallback imported a nonexistent mo…
echel0nn Jul 24, 2026
e7cd9e8
fix(forensics): route the resolver LLM call through the idempotency c…
echel0nn Jul 24, 2026
e0dc856
refactor(platform): extract shared ToolExecutor helpers to a platform…
echel0nn Jul 24, 2026
0dba916
test(agents): direct coverage of extracted ToolExecutor helpers
echel0nn Jul 24, 2026
4f86fa7
feat(agents): resolve prompts through the version store (RFC-09)
echel0nn Jul 24, 2026
52e034c
feat(api): admin prompt-version deploy surface (RFC-09)
echel0nn Jul 24, 2026
099094d
refactor(agents): merge ToolExecutor.execute into platform base via h…
echel0nn Jul 24, 2026
b81f9de
refactor(agents): lift shared turn-runner helpers to platform
echel0nn Jul 24, 2026
1c8ddd5
feat(eval): eval-gated prompt-version promotion runner (RFC-08)
echel0nn Jul 24, 2026
a3dc18f
feat(resilience): infra-death classifier + SSE-write-failure counter …
echel0nn Jul 24, 2026
705a42e
feat(knowledge): content-aware chunker + pattern relevance floor (RFC…
echel0nn Jul 24, 2026
2e0cfcb
feat(lifecycle): agent lifecycle control plane -- evaluate/promote/ro…
echel0nn Jul 24, 2026
1c36d1c
feat(mcp): DB-backed MCP server instance catalog (RFC-11)
echel0nn Jul 24, 2026
783d6c6
refactor(agents): consolidate run_turn into platform AgentTurnRunnerB…
echel0nn Jul 24, 2026
500ab9b
refactor(agents): route agent submit-gate caps through ConfigRegistry…
echel0nn Jul 24, 2026
25662ea
fix(api): derive search result module_id from the resolved module (RF…
echel0nn Jul 24, 2026
ec4008d
feat(knowledge): stamp per-vector provenance + wire relevance floor t…
echel0nn Jul 24, 2026
7f1f018
refactor(platform): extract branch/message/outcome summary builders (…
echel0nn Jul 24, 2026
aee04d2
feat(api): admin HTTP surface for the agent lifecycle controller (RFC…
echel0nn Jul 24, 2026
64dc636
feat(lifecycle): enforce review-quorum on agent promotion (RFC-08/RFC…
echel0nn Jul 24, 2026
facf623
refactor(agents): extract PersonaRouter, PatternExtractor, OutcomeDis…
echel0nn Jul 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
315 changes: 315 additions & 0 deletions CHANGELOG.md

Large diffs are not rendered by default.

86 changes: 86 additions & 0 deletions docs/CONFIG_REGISTRY.md
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,12 @@ The `platform` namespace is registered with `PlatformConfigSchema`. All fields:
| `arq_max_tries` | int | `3` | Maximum retry attempts for failed jobs |
| `arq_keep_result_s` | int | `3600` | Job result retention in Redis |
| `progress_stream_maxlen` | int | `1000` | Max events per Redis progress stream |
| `llm_default_model` | str | `antigravity/claude-opus-4-6-thinking` | Default LLM model id (provider/model) when no per-task override is set |
| `llm_base_url` | str | `https://openrouter.ai/api/v1` | LLM provider API base URL |
| `llm_default_max_tokens` | int | `4096` | Default max completion tokens |
| `llm_default_temperature` | float | `0.0` | Default sampling temperature (deterministic) |
| `llm_tool_timeout_s` | float | `300.0` | Wall-clock ceiling for a single tool-calling step |
| `llm_kill_switch` | bool | `False` | Operator circuit breaker; short-circuits every LLM call when true |
| `llm_pipeline_classify_default` | bool | `True` | LLM pipeline classify stage default-on |
| `llm_pipeline_validate_default` | bool | `True` | LLM pipeline validate stage default-on |
| `llm_pipeline_gate_default` | bool | `True` | LLM pipeline gate stage default-on |
Expand All @@ -240,6 +246,7 @@ The `platform` namespace is registered with `PlatformConfigSchema`. All fields:
| `llm_human_consultant_hourly_rate` | float | `150.0` | USD/hr used for human-equivalent cost projections |
| `data_posture_mode` | str | `"standard"` | `transparent` / `standard` / `paranoid` |
| `data_direction_default` | str | `"bidirectional"` | `inbound` / `local_only` / `bidirectional` |
| `knowledge_embedding_model` | str | `"bge-m3"` | Selects the KnowledgeService embedding provider: `bge-m3` (1024-dim, default) or `all-MiniLM-L6-v2` (384-dim, zero-padded to the 1024 column) |

Per-task-type overrides land under namespaced keys (e.g.
`llm_pipeline_classify_<task_type>`, `llm_pipeline_classify_fail_mode_<task_type>`,
Expand All @@ -248,6 +255,44 @@ Per-task-type overrides land under namespaced keys (e.g.

---

## Dynamic key families

Some configuration is per-task-type or per-team, so the key space is open (for
example `llm_model_{task_type}` or `llm_monthly_budget_usd_{team_id}`) and
cannot be enumerated as a fixed set of schema fields. A namespace schema
declares typed dynamic-key families in a `__dynamic_families__` class
attribute; each family carries a prefix, a `value_type`, and a default. When a
key does not match an exact static field, ConfigRegistry resolves it to the
longest-matching family, so the key is settable through `PUT /config` and cast
on read exactly as a static field is. A key that matches no static field and
no family is rejected by `set`.

The `platform` namespace declares the following families:

| Prefix | Type | Purpose |
|--------|------|---------|
| `llm_model_` | str | Per-task-type model id |
| `llm_max_tokens_` | int | Per-task-type max output tokens |
| `llm_temperature_` | float | Per-task-type sampling temperature |
| `llm_max_tool_steps_` | int | Per-task-type tool-call loop cap |
| `llm_tool_timeout_s_` | float | Per-task-type per-tool timeout (seconds) |
| `llm_data_direction_` | str | Per-task-type data-direction constraint |
| `llm_budget_max_total_tokens_` | int | Per-task-type token budget ceiling |
| `llm_monthly_budget_usd_` | float | Per-team monthly budget ceiling (USD) |
| `llm_pipeline_gate_high_threshold_` | float | Per-task-type HIGH-confidence gate threshold |
| `llm_pipeline_gate_medium_threshold_` | float | Per-task-type MEDIUM-confidence gate threshold |
| `llm_pipeline_gate_reject_threshold_` | float | Per-task-type REJECT-confidence gate threshold |
| `llm_pipeline_gate_consensus_strategy_` | str | Per-task-type consensus strategy (`same_model_high_temp` or `cross_model`) |
| `llm_pipeline_gate_consensus_model_` | str | Per-task-type consensus model id for `cross_model` |
| `llm_pipeline_gate_consensus_retries_` | int | Per-task-type consensus retry count |
| `llm_pipeline_verify_threshold_` | float | Per-task-type cross-model verification threshold |
| `llm_pipeline_verify_model_` | str | Per-task-type verifier model id |
| `llm_pipeline_pre_call_steps_` | str | Per-task-type pre-call pipeline step order (comma-separated) |
| `llm_pipeline_post_call_steps_` | str | Per-task-type post-call pipeline step order (comma-separated) |
| `llm_pipeline_` | str | Generic pipeline step enable / fail-mode override (bool or `open` / `closed`; callers coerce) |

---

## Module Config Schemas

Modules register their own config schemas under their own namespace. For example,
Expand Down Expand Up @@ -278,6 +323,47 @@ Or via env var:
export AILA_VULNERABILITY_SOME_FIELD=new_value
```

### VR namespace (`vr`)

Registered by the VR module via `VRConfigSchema`. All keys are settable via
`PUT /config/vr/{key}` and read through ConfigRegistry.

| Key | Type | Purpose |
|-----|------|---------|
| `llm_model` | str | LLM model id used by every VR agent (empty falls back to the platform default) |
| `nday_max_turns` | int | Turn cap for the n-day researcher agent |
| `nday_tool_time_seconds` | float | Per-tool timeout for the n-day researcher |
| `poc_max_attempts` | int | Max PoC generation attempts per finding |
| `poc_reliability_target` | str | Required PoC reliability class |
| `poc_timeout_seconds` | float | Wall-clock ceiling for a single PoC run |
| `poc_memory_limit_mb` | int | Memory ceiling for a single PoC run (MB) |
| `ssh_command_timeout_seconds` | float | Timeout for individual SSH commands on the analysis host |
| `audit_mcp_url` | str | Base URL for the audit-mcp indexer bridge |
| `ida_headless_url` | str | Base URL for the ida-headless-mcp bridge |
| `android_mcp_url` | str | Base URL for the android-mcp bridge |
| `max_branches_per_investigation` | int | Hard cap on active branches per investigation |
| `claim_verifier_auto_promote_floor` | float | Minimum verifier confidence to auto-promote a claim |
| `investigation_total_turn_cap` | int | Aggregate turn ceiling across all branches of one investigation |
| `zombie_task_heartbeat_min` | int | Minutes without a heartbeat before a running task is treated as zombie |
| `cursor_cleanup_batch` | int | Rows per batch when the cursor reaper deletes crashed cursors |
| `stale_branch_frozen_min` | int | Minutes without progress before a branch is marked `frozen` |
| `stale_branch_halted_min` | int | Minutes without progress before a branch is marked `halted` |
| `ingestion_poll_timeout_s` | float | Wall-clock ceiling for target-ingestion poll loops |

### Forensics namespace (`forensics`)

Registered by the forensics module via `ForensicsConfigSchema`. All keys are
read through ConfigRegistry.

| Key | Type | Purpose |
|-----|------|---------|
| `llm_model` | str | LLM model id for every forensics agent (empty falls back to the platform default) |
| `ssh_command_timeout_seconds` | float | Timeout for individual SSH commands on the analyzer machine |
| `script_execution_timeout_seconds` | float | Timeout for agent-generated script execution |
| `collection_timeout_seconds` | float | Timeout for the full artifact collection pipeline |
| `freeflow_max_attempts` | int | Max script-execution attempts per free-flow investigation |
| `freeflow_max_cost_usd` | float | Hard per-investigation LLM spend ceiling in USD; `0.0` disables the ceiling |

---

## ConfigRegistry vs Settings
Expand Down
44 changes: 36 additions & 8 deletions docs/DATABASE_MIGRATIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,21 @@ src/aila/
064_vr_branch_persona_voice_not_null.py
065_task_records_input_hash_unique.py
066_task_records_status_check.py
067_workflow_state_cursor_archived_state.py # current head
067_workflow_state_cursor_archived_state.py
068_malware_module_tables.py
069_malware_audit_fixes.py
070_malware_project_slim_and_ack.py
071_platform_journal.py
072_malware_observation_dedup.py
073_scheduled_report_team_scope.py
074_automation_tz_disable.py
075_hot_column_indexes.py
076_oidc_default_team.py
077_knowledge_embedding_1024.py
078_notification_created_index.py
079_refresh_token_client_meta.py
080_platform_schema_reconcile.py
081_vr_schema_reconcile.py # current head
```

`alembic.ini` and the `alembic/` directory live under `src/aila/`, not at the repo root. All Alembic commands must run from `src/aila/`:
Expand Down Expand Up @@ -86,29 +100,29 @@ Where `{NNN}` is the next sequential number (zero-padded to 3 digits). Check the

```bash
ls src/aila/alembic/versions/*.py | tail -1
# 067_workflow_state_cursor_archived_state.py -> next is 068
# 081_vr_schema_reconcile.py -> next is 082
```

### Step 3: Write the migration

Use this template:

```python
"""063 -- add priority column to task records.
"""082 -- add priority column to task records.

Adds a nullable priority field so operators can influence queue ordering.

Revision ID: 063_taskrecord_priority
Revises: 067_workflow_state_cursor_archived_state
Create Date: 2026-06-10
Revision ID: 082_taskrecord_priority
Revises: 081_vr_schema_reconcile
Create Date: 2026-07-22
"""
from __future__ import annotations

import sqlalchemy as sa
from alembic import op

revision = "063_taskrecord_priority"
down_revision = "067_workflow_state_cursor_archived_state"
revision = "082_taskrecord_priority"
down_revision = "081_vr_schema_reconcile"
branch_labels = None
depends_on = None

Expand Down Expand Up @@ -168,6 +182,20 @@ Examples from the codebase:
| `065_task_records_input_hash_unique.py` | Platform column + partial UNIQUE |
| `066_task_records_status_check.py` | Platform CHECK constraint |
| `067_workflow_state_cursor_archived_state.py` | Platform column addition |
| `068_malware_module_tables.py` | Malware module initial tables (17 tables) |
| `069_malware_audit_fixes.py` | Module column additions + findings table rebuild |
| `070_malware_project_slim_and_ack.py` | Module column drops + acked_at column |
| `071_platform_journal.py` | Platform append-only hash-chained journal + dead-letter |
| `072_malware_observation_dedup.py` | Module column + partial UNIQUE index |
| `073_scheduled_report_team_scope.py` | Platform team_id column + backfill |
| `074_automation_tz_disable.py` | Platform cron timezone + disable reason columns |
| `075_hot_column_indexes.py` | Platform indexes on hot query columns |
| `076_oidc_default_team.py` | Platform column addition (OIDC default team) |
| `077_knowledge_embedding_1024.py` | Platform column type widening to vector(1024) |
| `078_notification_created_index.py` | Platform composite index on notifications |
| `079_refresh_token_client_meta.py` | Platform column additions (auth client metadata) |
| `080_platform_schema_reconcile.py` | Platform schema drift reconciliation (types + constraint promotion) |
| `081_vr_schema_reconcile.py` | Module UNIQUE constraint renames on VR tables |

The `revision` string inside the file must match the filename (without `.py`).

Expand Down
13 changes: 8 additions & 5 deletions docs/DB_SCHEMA.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,16 @@ All SQLModel tables used by AILA, organized by ownership (platform vs module).

PostgreSQL 16 with the `pgvector` extension is the only supported backend. Tables
use SQLModel (SQLAlchemy Core) DDL; `sa_column=Column(Text)` carries large-text
columns; `pgvector` carries 384-dim embedding columns. asyncpg is the runtime
columns; `pgvector` carries the 1024-dim knowledge embedding column produced by
BGE-M3 (`BAAI/bge-m3`). The `all-MiniLM-L6-v2` fallback (384-dim) is zero-padded
to 1024 by `KnowledgeService.embed` when it is selected via the
`knowledge_embedding_model` config key. asyncpg is the runtime
driver; Alembic swaps to psycopg automatically via `src/aila/alembic/env.py`.

Two creation paths coexist:
- Platform + module tables that predate the Alembic baseline (`001_baseline_stamp`)
are created on first boot by `make db-init`, which runs `SQLModel.metadata.create_all()`
then stamps `alembic_version` at the current head (`067_workflow_state_cursor_archived_state`).
then stamps `alembic_version` at the current head (`081_vr_schema_reconcile`).
- Every schema change since then ships as an Alembic revision under
`src/aila/alembic/versions/`. See [`DATABASE_MIGRATIONS.md`](DATABASE_MIGRATIONS.md).

Expand Down Expand Up @@ -197,7 +200,7 @@ Vector-indexed knowledge entry for agent retrieval.
| id | int | PK, auto | Row identity |
| namespace | str | indexed | Agent class name |
| content | Text | | Knowledge text |
| embedding | LargeBinary | | 384-dim float32 BLOB |
| embedding | Vector(1024) | pgvector, HNSW cosine index | BGE-M3 1024-dim vector; MiniLM 384-dim output zero-padded to fit when the fallback provider is selected |
| entry_metadata | Text | default="{}" | JSON metadata |
| dedup_key | Text/null | indexed, UQ(namespace,dedup_key) | Deduplication key |
| created_at | datetime | default=utc_now | Creation timestamp |
Expand Down Expand Up @@ -570,7 +573,7 @@ Owned by `aila.modules.vr.db_models`. Created and evolved by migrations 040 + 04

## Table Summary

Counts reflect the Alembic head `067_workflow_state_cursor_archived_state` (2026-06-21).
Counts reflect the Alembic head `081_vr_schema_reconcile` (2026-07-22).

| Group | Owner | Tables |
|---|---|---|
Expand All @@ -590,4 +593,4 @@ The `hello_world` module ships as a reference and does not own any DB tables.
---

*Generated from source models in `src/aila/storage/db_models.py`, `src/aila/platform/tasks/models.py`, `src/aila/platform/llm/cost_record.py`, `src/aila/platform/llm/idempotency_cache.py`, `src/aila/platform/automation/models.py`, and the per-module `db_models/` packages under `src/aila/modules/<module>/`.*
*Last updated: 2026-06-21 (Alembic head `067_workflow_state_cursor_archived_state`).*
*Last updated: 2026-07-22 (Alembic head `081_vr_schema_reconcile`).*
5 changes: 3 additions & 2 deletions docs/ENV_VARS.md
Original file line number Diff line number Diff line change
Expand Up @@ -152,9 +152,10 @@ through PowerShell.

### AILA_PLATFORM_LLM_DEFAULT_MODEL / _BASE_URL / _DEFAULT_MAX_TOKENS

- **Defaults:** `antigravity/claude-opus-4-6-thinking`, `https://openrouter.ai/api/v1`, `4096` (from `PlatformConfigSchema`).
- **Used in:** `src/aila/platform/llm/config.py` (`LLMConfigResolver`)
- **Resolution:** ConfigRegistry env-var override path. These keys live under the `platform` namespace but are NOT in `PlatformConfigSchema` -- the env var sets the value, the DB row carries persistent overrides, and the resolver bakes in its own fallbacks (`openai/gpt-4o-mini`, `https://openrouter.ai/api/v1`, `4096`) when nothing matches.
- **Production guidance:** Set per deployment to pin the default model/provider for every task type. Per-task-type overrides land under `AILA_PLATFORM_LLM_MODEL_<TASK_TYPE>` and `AILA_PLATFORM_LLM_MAX_TOKENS_<TASK_TYPE>`.
- **Resolution:** Declared as static fields on `PlatformConfigSchema` under the `platform` namespace. Reads go through the standard ConfigRegistry chain (env var, then in-memory cache, then the persisted DB row, then the schema default). The env var wins over the DB, so setting `AILA_PLATFORM_LLM_DEFAULT_MODEL` overrides any value stored through `PUT /config/platform/llm_default_model`.
- **Production guidance:** Set per deployment to pin the default model, provider base URL, and completion ceiling for every task type. Runtime edits without a restart go through `PUT /config/platform/llm_default_model` (and its `_base_url` / `_default_max_tokens` siblings). Per-task-type overrides land under `AILA_PLATFORM_LLM_MODEL_<TASK_TYPE>` and `AILA_PLATFORM_LLM_MAX_TOKENS_<TASK_TYPE>`, or via the same `PUT /config` endpoint against the matching dynamic-key family.

### AILA_LLM_TIMEOUT_SECONDS

Expand Down
11 changes: 11 additions & 0 deletions docs/LLM_INTEGRATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -714,20 +714,30 @@ All LLM configuration lives in the `platform` namespace of ConfigRegistry. Chang
| `llm_default_temperature` | `0.0` | Default sampling temperature (deterministic). |
| `llm_temperature_{task_type}` | *(unset)* | Per-task-type temperature override. |
| `llm_max_tool_steps_{task_type}` | `0` | Max tool-calling loop iterations per task type. `0` = tool calling disabled. |
| `llm_tool_timeout_s` | `300.0` | Default wall-clock ceiling (seconds) for a single tool-calling step. |
| `llm_tool_timeout_s_{task_type}` | *(unset)* | Per-task-type per-tool timeout override (seconds). |

### Pipeline Step Toggling

| Key | Default | Description |
|-----|---------|-------------|
| `llm_pipeline_{step}_{task_type}` | `true` | Enable/disable a pipeline step for a task type. Steps: `classify`, `validate`, `gate`, `seal`. |
| `llm_pipeline_{step}_fail_mode_{task_type}` | `open` | Fail mode for a pipeline step. `"open"` = log and continue. `"closed"` = raise `LLMError`. |
| `llm_pipeline_pre_call_steps_{task_type}` | *(unset)* | Comma-separated pre-call step-order override for a task type (e.g. `classify,validate`). |
| `llm_pipeline_post_call_steps_{task_type}` | *(unset)* | Comma-separated post-call step-order override for a task type (e.g. `gate,seal`). |

### Classification

| Key | Default | Description |
|-----|---------|-------------|
| `llm_pipeline_classify_restricted_behavior_{task_type}` | `fail` | RESTRICTED data behavior. `"fail"` = raise `ClassificationBlockedError`. `"redact"` = replace sensitive tokens with `[REDACTED-*]` tags and continue. |

### Data Direction

| Key | Default | Description |
|-----|---------|-------------|
| `llm_data_direction_{task_type}` | *(falls back to `data_direction_default`)* | Per-task-type data-direction constraint. Values: `inbound`, `local_only`, `bidirectional`. Used by the classify stage to reject calls that would send data in a forbidden direction. |

### Confidence Gating

| Key | Default | Description |
Expand All @@ -752,6 +762,7 @@ All LLM configuration lives in the `platform` namespace of ConfigRegistry. Chang
| Key | Default | Description |
|-----|---------|-------------|
| `llm_budget_max_total_tokens_{task_type}` | `0` | Max total tokens per run for a task type. `0` = unlimited (no enforcement). |
| `llm_monthly_budget_usd_{team_id}` | *(unset)* | Per-team monthly spend ceiling in USD. Evaluated against the running sum of `LLMCostRecord.cost_usd` rows for the team over the current calendar month; a call that would cross the ceiling is refused before the API request. |

### Common operations

Expand Down
Loading