Changelog
All notable changes to Dativo Talon are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
Unreleased
Changed
-
feat(compliance): RoPA now distinguishes redacted from raw PII at each recipient, and cross-checks declared residency against observed transfers. Two accuracy gaps surfaced during field testing. (1) Section 5 (Recipients) listed identifier types per destination (e.g.
email→ openai) without saying whether the raw values actually reached the recipient — misleading whenredact_piiwas on and the provider only ever received placeholders. Types that were redacted in every flow to a destination are now annotated(redacted before egress); a type forwarded raw even once stays unannotated (no overstatement in either direction). The JSON export gains aredacted_entity_typesfield per destination. (2) Declaringcompliance.data_residency: euwhile runningllm.routing.data_sovereignty_mode: eu_preferred/globallet non-EU transfers happen silently relative to the declaration; the RoPA now adds aconsistency:warning when EU residency is declared but non-EU/LOCAL destinations appear in the data-flow evidence, pointing at the two honest resolutions — enforceeu_strict, or document the transfer mechanism (SCCs/adequacy) with your DPO. Verify quickly: declaredata_residency: eu, run traffic through a US provider, regeneratetalon compliance ropaand see the warning; docs: RoPA declarations guide, configuration reference. -
feat(cmd):
talon audit shownow renders the Data Flow section. Thedata_flowevidence section was signed and exported but invisible in the human-readable view — operators had to fall back toaudit export --format signed-json+jqto see where a request's data went.audit show <id>now prints one line per flow item: source → destination (kind, name, model, region), disposition (forwarded/redacted/blocked/surfaced), data tier, and detected entity types. ThePII Redactedline now labels both directions (input=… output=…): it previously showed only the output flag, which read as a contradiction next to aredactedinput flow ("PII Redacted: false" while the prompt was in fact redacted before egress). -
feat(evidence): data-flow evidence now covers all governed traffic, not only classified data. Previously the
data_flowevidence section was recorded only when PII or tier > 0 data was detected, and only on the gateway path — so a cleantalon runagainst OpenAI produced a RoPA with empty Recipients (Art. 30(1)(d)) and Transfers (Art. 30(1)(e)) sections despite real egress to a US provider. Now every request that egresses records at least its prompt → destination flow (provider, model, region): gateway requests, CLI/scheduled/webhook agent runs (new), and MCP proxy tool calls. Provider regions for agent runs resolve from registered provider metadata (e.g. openai → US, mistral → EU, ollama → LOCAL). Blocked flows are recorded as evidence but no longer counted as RoPA recipients/transfers — blocked data never reached the destination. Verify quickly:talon run "hello"thentalon compliance ropa --format html --output ropa.html— Section 5 lists your provider and Section 6 flags non-EU transfers with the SCC/adequacy note. No migration impact:data_flowremains optional in the integrity spec (requests denied before egress still omit it); records signed under earlier spec versions verify unchanged.
Added
- feat(evidence): governance parity across all entry paths — MCP server and graph adapter now record data flow; a runtime guardrail prevents future drift. Two paths lagged behind the consolidated data-flow posture and are now reconciled. (1) The embedded MCP server (
talon serve→POST /mcp) classifies tool arguments and results for PII and records adata_flowsection on everytools/call— including policy-denied calls (disposition: blocked) — with destination regionLOCAL(embedded tools execute in-process). (2) The graph adapter (POST /v1/graph/events) records an orchestrator-reportedprompt → external:<framework>flow onrun_endwhenever the external runtime reported a model or non-zero cost; content never transits Talon on this path, so the item carries no entity types and regionunknown— Talon never guesses, and the unresolved region deliberately surfaces in RoPA Section 6 as a prompt to gateway the traffic. The shared contract is now enforced in three layers:evidence.ValidateGovernedRecordruns on every store and logsgovernance_parity_violationwarnings (fail-open — evidence is never dropped),TestGovernanceParity_EntryPathContractenumerates all five entry paths in CI, and smoke section 29 verifies black-box that every model-call record in the live evidence DB carriesdata_flow. New reference doc: Governance control matrix — which controls run on which path, by-design limitations, and the checklist for adding new entry paths. Verify quickly: call any embedded tool viaPOST /mcpand checktalon audit show <id>for thedata_flowsection. No migration impact:data_flowremains optional in the integrity spec; existing signatures verify unchanged. - feat(compliance):
talon compliance annex-iv— EU AI Act Annex IV technical-documentation pack (#126). CTOs and DPOs preparing for the AI Act (high-risk obligations apply from 2 August 2026) can now generate an Annex IV-shaped pack (HTML or JSON) combining declared system facts (compliance.declarations.systeminagent.talon.yaml: description, intended purpose, oversight arrangements) with runtime records from signed evidence: models/providers observed, policy denials and reasons (Art. 9 risk controls), plan-review human-oversight events (Art. 14), routing/egress decisions, audited memory writes, and post-market monitoring coverage (Art. 72). The pack explicitly lists items Talon cannot produce (model development process, performance metrics, declaration of conformity) with their owners — honest scoping for deployers. Verify quickly:talon compliance annex-iv --format html --output annex-iv.html, or seeexamples/auditor-pack/annex-iv.html. Docs: export runbook. Supporting documentation for Annex IV review, not a conformity assessment. - feat(compliance):
talon compliance ropa— GDPR Art. 30 Record of Processing Activities export (#125). DPOs and platform teams can now generate an Art. 30(1)-shaped RoPA (HTML print-to-PDF-ready, or JSON) that merges declared facts (controller identity fromtalon.config.yamlcompliance.controller; purposes/retention/legal basis fromagent.talon.yamlcompliance.declarations) with runtime facts from the signed evidence store (processing activities observed, personal-data identifiers detected, recipients and regions, third-country transfers). Missing declarations never fail the export — they are listed as warnings and rendered as flagged "DECLARATION MISSING" sections so the document tells you what to complete before auditor handoff. Every document carries an evidence-linkage block (record count, sample IDs,talon audit verifycommand) and a claims-discipline footer: supporting records for review, not a legal filing. Verify quickly:talon compliance ropa --format html --output ropa.htmlafter any governed traffic, or see the committed sample inexamples/auditor-pack/ropa.html. Docs: export runbook, configuration reference. No migration impact: both declaration blocks are optional.
Release Note Quality Bar
For user-facing entries, include:
- why this change matters (problem solved),
- who should care (operator/developer persona),
- how to verify quickly (command or path),
- any upgrade/migration impact,
- at least one share artifact reference (screenshot, GIF, or snippet) when applicable.
1.6.0 - 2026-06-10
Added
- feat(gateway): egress allow/deny by destination and data classification (#130). Operators can now declare which destinations (providers and/or regions) each data tier may egress to via
gateway.default_policy.egress(per-caller override undercallers[].policy_overrides.egress). Denials happen in the policy step — before secrets retrieval and before any bytes reach the upstream — return HTTP 403 with machine codesegress_tier_destination_disallowed/egress_destination_disallowed, and map to the newPOLICY_DENIED_EGRESSexplanation code. This supports data-transfer controls (e.g. GDPR Chapter V transfer policies) for CTO/DPO personas; Talon enforces and evidences the rule, it does not make the compliance determination. Verify quickly: add a tier_2 rule withallowed_regions: ["EU", "LOCAL"], send a payload containing an IBAN to a US-region provider, and expect a 403 plus anegress_decisionevidence section. Unconfigured deployments are unchanged (egress is not evaluated); inshadowmode violations are recorded but forwarded. - feat(evidence):
egress_decisionevidence section (integrity spec v1.2). Signed evidence records now carry an optionalegress_decisionobject (tier,provider,region,decision,matched_rule,reason) whenever an egress policy is configured. The field is additive and appended afterdata_flow: records signed under spec 1.0/1.1 verify unchanged. - feat(gateway): named data-tier aliases in config. Tier fields in the gateway config (
egress.rules[].tier,callers[].policy_overrides.max_data_tier) now acceptpublic/internal/confidential(case-insensitive) interchangeably with0/1/2, following the ascending-sensitivity convention used by ISO 27001 practice and Microsoft Purview/AGT. This makes policies self-documenting for operators without changing tier semantics: evidence records, Rego inputs, and the JSON schema keep numeric tiers (schema accepts both forms). No migration needed — numeric configs remain valid. - feat(observability): egress decision telemetry. New counter
talon.gateway.egress.decisions(tenant_id,tier,gen_ai.system,region,decision) andtalon.egress.*span attributes on gateway request spans; egress denials emit a structuredgateway_egress_deniedlog line withcorrelation_id,tenant_id, tier, destination, and reason.
Changed
- fix(config): removed phantom config keys that the runtime never read.
talon initno longer generatestenants:,evidence:,llm_provider:, orsecrets_key_env:blocks intalon.config.yaml— none of these were parsed by any loader, which misled operators into believing budgets/rate limits or evidence paths were configured there (they live inagent.talon.yamland{data_dir}/evidence.dbrespectively). Existing configs with these keys keep working (keys are ignored, as before); regenerate withtalon initor delete the blocks to clean up. - feat(config):
log_level/log_formatintalon.config.yamlnow take effect. Previously only the--log-level/--log-formatflags worked and the YAML values were silently ignored. Precedence: flag > config file > default. - feat(cache):
cache.ttl_by_tieris now enforced. The documented per-tier TTL overrides (public/internal/confidential, seconds) were parsed but never applied; cache entries now use the tier-specific TTL and record their real data tier (previously alwayspublic).talon doctorvalidates the keys. Verify: setttl_by_tier.internal: 900, store a tier-1 entry, and check itsexpires_at. - feat(policy): one canonical agent schema.
talon validatepreviously used an embedded schema that had drifted from the documentedschemas/agent.talon.schema.json. The embedded schema (nowinternal/policy/agent.talon.schema.json) is canonical and backfilled with all parsed sections (tool_policies,copaw,semantic_enrichment,session_limits,compliance.plan_review, extended rate/resource limits,destructive_patterns);schemas/agent.talon.schema.jsonis an exact synced copy enforced by a test. - feat(policy): unknown-key warnings on policy load. Misspelled or misplaced keys in
agent.talon.yamlwere silently ignored (e.g.policies.plan_reviewinstead ofcompliance.plan_review). The loader now logs a structured warning naming the unknown field; loading still succeeds for backward compatibility. A test guards that all shipped examples and pack overlays are warning-free. - feat(schema):
talon.config.schema.jsonnow covers the full Go config surface — top-level fields (data_dir,secrets_key,signing_key,default_policy,max_attachment_mb,ollama_base_url,log_level,log_format), thecacheblock, and previously missing gateway fields (upstream_auth_mode,dashboard_listen,response_scanning,network_interception, tool/attachment governance, full caller overrides). - fix(policy): proxy compliance accepts
data_residency: "eu". The proxy Rego only matched the literal"eu-only", so the"eu"token thattalon initwrites was silently unenforced. Both tokens now require EU upstream regions. - feat(otel): routing spans emit
talon.routing.*attributes.llm.route/llm.graceful_routespans now carrytalon.data.tier,talon.routing.sovereignty_mode,talon.provider.jurisdiction,talon.provider.region,talon.routing.rejected_count, andtalon.routing.selection_reason(constants existed but were never emitted; the old non-namespaceddata.tierkey is replaced). - docs:
model_routing.*.locationdocumented as declarative. The field is informational; region enforcement comes from provider registry metadata +llm.routing.data_sovereignty_mode(and gateway egress rules). Documented defaults corrected:audit.retention_days(2555 when section omitted, not 90),attachment_handling.mode(permissivewhen omitted), memory defaults (max_entries100,max_entry_size_kb10,mode: activewhen enabled),action_on_detectionvaluelog_only(notlog), and a new cache configuration reference section.
Fixed
- fix(policy):
compliance.plan_review.volume_thresholdandmodewere silently dropped on load. The YAML-facingpolicy.PlanReviewConfiglackedvolume_threshold, so the documented volume-detection recipe never reached the runtime; the runner mapping also droppedmode. Both now flow through to plan review andtalon intent classify. - fix(pack): EU AI Act overlay
require_for_tier: "2"was a no-op. The parser acceptstier_0/tier_1/tier_2; the overlay now usestier_2so tier-based plan review actually triggers. - fix(schema):
talon.config.schema.jsoncaller field renamedsource_cidrs→source_ip_rangesto match what the gateway actually parses, and the gatewaymodeschema default corrected fromshadowtoenforce(the runtime default whenmodeis omitted). - docs: consistency fixes across config docs. Quickstart demo claimed data tier 3 (tiers are 0–2; confidential = 2); policy cookbook caller example used nonexistent
api_key(nowtenant_key);human_oversightexamples used invalidon_demand(canonical:on-demand); the tool-class governance recipe documented a nonexistentpolicies.plan_reviewpath with unimplemented fields (now showscompliance.plan_review+ built-in class defaults);add-talon-to-existing-appcopy-paste config was missing the requiredbase_urlfor the enabled openai provider.
1.5.5 - 2026-06-01
Added
- feat(evidence): signed export and offline file verification. Added
talon audit export --format signed-json|signed-ndjsonandtalon audit verify --file <path>so operators and compliance teams can verify evidence integrity outside the running instance. This matters for GDPR/NIS2 handoffs where auditors request portable, tamper-evident artifacts. Verify quickly withtalon audit export --format signed-json --output signed.json && talon audit verify --file signed.json. - feat(dashboard): persistent evidence integrity UX. Evidence rows now expose explicit integrity states (
Verified,Invalid,Not checked,Unable to verify), with a persistent detail/signature block that shows signed fields and trust/spend context in one view. This makes integrity obvious to CTO/DPO users without requiring CLI-first workflows.
Docs
- docs(evidence): add 5-minute tamper-proof demo and signed export runbook updates. Added
docs/./evidence-integrity-demo.md, updated the 60-second demo and compliance export runbook to distinguish reduced reporting exports from signed integrity exports, and documented/v1/evidence/{id}/verifyresponse shape in the evidence store reference.
1.5.0 - 2026-06-01
Added
- feat(serve): OpenAI-compatible quickstart proxy mode. Added
talon serve --proxy-quickstartfor dev/local host-root compatibility (POST /v1/chat/completions,POST /v1/responses) without gateway YAML, while keeping policy, PII redaction, and evidence active. - feat(gateway): upstream auth mode support for quickstart. Added provider
upstream_auth_mode(secretdefault,client_bearerquickstart path) with client bearer forwarding,OPENAI_API_KEYfallback, and explicit 401 when no upstream key is available. - feat(evidence): quickstart upstream auth metadata. Evidence records now include additive fields
upstream_auth_mode,upstream_key_source,upstream_key_fingerprint, andgateway_annotations(backward compatible with existing records). - feat(metrics): periodic reconciliation loop and status telemetry. Added bounded/idempotent collector reconciliation (
ReconcileFromStore+ loop), OTel reconcile metrics, and/v1/statusfields for reconcile runs/recovered events/errors. - feat(server): consolidated SSOT gate suite. Added
internal/server/ssot_gate_test.goplusmake test-ssot-gateand wired it intomake checkas an explicit release gate. - feat(events): sanitized
reasons[]on operational events./api/v1/events/recentand/api/v1/events/streamnow include deterministic, deduped, length-boundedreasons[]derived from policy decision reasons, explanation reasons, and execution errors. This improves operator context without exposing raw payloads. Verify quickly withcurl -s -H "X-Talon-Admin-Key: $TALON_ADMIN_KEY" "http://localhost:8080/api/v1/events/recent?limit=1" | jq '.events[0].reasons'.
Changed
- change(server): dev-mode route relocation under quickstart. When
--proxy-quickstartis enabled, host-root OpenAI-compatible paths are handled by the quickstart facade. Tenant agent chat is available atPOST /v1/agents/chat/completionsonly when the operator has configured real tenant keys; in default quickstart (no tenant keys), that route is not mounted and returns404 Not Foundto preserve a strict facade-only boundary. - change(serve): quickstart no longer registers a synthetic tenant key. Quickstart mode is strictly a host-root OpenAI-compatibility facade; it will not silently unlock tenant APIs. When tenant keys are configured, the relocated tenant endpoint sits behind standard tenant-auth middleware and returns
401 Unauthorizedwithout a valid key. - change(serve):
--gateway-configexclusivity check uses explicit flag set.--proxy-quickstartis rejected alongside--gatewayor any explicitly passed--gateway-config, detected viacobra.Flags().Changedrather than the default string value. - change(gateway): quickstart
unsafe-listensignal threaded via config. Thequickstart_unsafe_listenevidence annotation is driven byGatewayConfig.QuickstartUnsafeListen, populated from--unsafe-listenthroughQuickstartOptions, instead of a process environment variable. - change(events/metrics): evidence-first projection parity hardening. Operational event reason fields now prefer deterministic explanation payloads, evidence/event ordering is stabilized on
timestamp DESC, id DESC, and metrics conversion is unified through evidence-driven projection paths for stronger CLI/API/dashboard parity. - change(dashboard/cli): reliability signals surfaced in routine flows. Dashboard and gateway pages now expose degraded/reliability warning chips, and
talon metrics/talon events tailprint preflight warnings when/v1/statusreports degradation. - change(observability/events): SSOT scope contract locked.
/api/v1/metricsis documented as all-activity (gateway and agent-run evidence-backed runtime), and/api/v1/events/*is documented as one event per persisted evidence row, including terminal outcomes plus evidence-backed lifecycle subset records (plan_review, graph runtime). Endpoint shapes remain backward-compatible. - change(metrics/evidence): pragmatic SSOT live-feed unification. Dashboard live metrics are now fed from
evidence.Store.Store()post-commit observer notifications (all invocation types), while periodic reconciliation remains bounded/idempotent repair. Degraded evidence-write signaling is centralized in the evidence store path, and production serve wiring no longer double-emits via direct gateway metrics recorder attachment.
Fixed
- fix(session): auto-migrate legacy
sessionsschema on startup. Session store initialization now adds missingmax_costandreasoningcolumns when older SQLite tables are detected, preventing run/session creation failures on upgraded installs. Verify withgo test ./internal/session -run MigratesLegacySessionsTable. - fix(agent): preserve audit trail on evidence write failures. Runner paths that previously ignored evidence/step write errors now log structured failures (
correlation_id,tenant_id,agent_id) so silent audit-loss conditions are observable during denied, dry-run, cached, and tool-step flows. - fix(memory): redact low-risk PII before memory governance checks. Memory observations now sanitize
person/locationentities before validation, allowing safe useful memories while sensitive PII still fails closed under governance policy. - fix(events): expand stream reliability telemetry. Event stream handling now increments disconnect and backlog-drop counters (in addition to gap/replay signals) and exposes them in status output for faster operator diagnosis.
- fix(gateway/metrics): no metrics emission without persisted evidence. Gateway collector events are now emitted only after successful evidence persistence, preventing runtime telemetry drift when evidence writes fail.
- fix(metrics): surface collector backpressure drops. Collector channel overflow drops now increment
dropped_events, emit OTel countertalon.metrics.events_dropped.total, and appear in/v1/statusasmetrics_events_dropped.
1.4.6 - 2026-04-14
Added
- feat(explanation): deterministic explanation normalization. Added canonical normalization for deterministic policy explanation tokens so equivalent outcomes converge to stable, reusable phrasing across runs and audit surfaces. This helps operators compare evidence reliably and reduces explanation drift in dashboards and tests. Verify quickly with
go test ./internal/./....
Fixed
-
fix(explanation): stage taxonomy and token collapse consistency. Aligned explanation stage taxonomy (including MCP PII semantics) and fixed edge cases where fully-collapsed tokens were not returned as a single deduplicated canonical token. This improves consistency between policy decisions and rendered explanations.
-
fix(gateway): canonical explanation stage propagation. Gateway explanation output now uses the canonical explanation stage instead of pipeline-stage values, preventing mismatched stage labels in downstream evidence and UI surfaces.
-
fix(graphadapter): preserve graph evidence identity fields. Graph adapter run evidence now retains session and model fields on graph execution paths, improving traceability for stateful graph runs and downstream audit analysis.
Docs
- docs(quickstart): add verification snippet. Quickstart now includes an explicit verification snippet so operators can validate a governed setup immediately after onboarding with less ambiguity.
1.4.5 - 2026-04-12
Added
-
feat(graphadapter): graph runtime governance control plane. Added graph-aware governance execution with event-aware policy checks, lineage-aware evidence hooks, and integration points for LangChain/LangGraph stateful flows. Operators and framework integrators get first-class graph execution visibility while preserving existing run governance semantics. Verify quickly with
tests/smoke_sections/30_graph_events.shandgo test ./tests/integration -run Graph. -
feat(policy): graph governance Rego policies and tests. Added dedicated graph governance policy modules and policy tests to enforce graph-specific constraints and deny handling at runtime, including deterministic explanation rendering for governance outcomes.
-
docs(integration): LangChain/LangGraph integration guide and examples. Added end-to-end integration docs and runnable examples under
examples/langchain-integration/to demonstrate stateless and stateful adapter usage patterns with Talon governance.
Fixed
-
fix(graphadapter): tenant binding and denial propagation hardening. Tightened tenant binding checks, stabilized run-end denial handling, and improved ./evidence consistency under denied branches and error paths.
-
fix(graphadapter): concurrency and lint hardening. Addressed run-state race conditions, aligned request construction with context-aware patterns, and added regression tests for concurrent denial tracking and retry guardrails.
Test
- test(graphadapter): full graph governance test pyramid. Added broad unit, handler, policy, integration, and smoke coverage for graph event execution and governance decisions, reducing regression risk for graph-enabled agent pipelines.
1.4.0 - 2026-03-31
Added
-
feat(agent): operational control plane. Run lifecycle state machine (QUEUED → RUNNING → COMPLETED|FAILED|TERMINATED|BLOCKED|DENIED) with structured failure taxonomy (
cost_exceeded,llm_error,tool_timeout,policy_deny,operator_kill, etc.) in evidence records. New admin API surfaces:GET /v1/runs(list active),POST /v1/runs/{id}/kill(terminate),POST /v1/runs/kill-all?tenant_id=X(tenant-wide kill),POST /v1/runs/{id}/pause/resume(mid-execution pause). Operator overrides:POST /v1/overrides/{tenant_id}/lockdown(reject all new runs + kill active), dynamic tool disable (/v1/overrides/{tenant_id}/tools/disable), runtime policy tightening (/v1/overrides/{tenant_id}/policy). Pre-tool approval gates: tools listed inresource_limits.require_approvalpause for human decision viaPOST /v1/tool-approvals/{id}/decide(5 min default timeout). Single-shot cost check catches expensive LLM calls that exceed per-request budget. Per-run tool failure escalation auto-disables tools after 3 consecutive failures. All new endpoints are admin-only (X-Talon-Admin-Key). See Operational control plane reference. -
feat(agent): input prompt PII redaction. New
redact_input/redact_outputfields indata_classificationconfig give granular control over when PII is redacted from prompt (before LLM) and response (before returning). The legacyredact_piifield is preserved as a shorthand that defaults both. Evidence now includesinput_pii_redactedfor audit. Schema, template, init merge, smoke test (section 26), and PII enrichment quality test updated. -
feat(classifier): PII semantic enrichment. Optional semantic attributes on PII placeholders: PERSON → gender (from title/honorific), LOCATION → scope (city/region/country). Canonical entity model and adapter from current detector; built-in enricher; Rego policy
semantic_enrichment.rego(mode off/shadow/enforce, allowed_attributes). Placeholder renderer: legacy[TYPE]or XML-style<PII type="..." id="..." .../>. Config:policies.semantic_enrichment(enabled, mode, confidence_threshold, allowed_attributes). Metrics:talon.pii.enrichment.attempts.total,talon.pii.enrichment.attributes.emitted.total,talon.pii.enrichment.fallback_unknown.total. Smoke section 26 (5+5 runs with enrichment off/enforce). Docs: PII semantic enrichment reference, policy cookbook snippet, Presidio migration note. -
feat(evidence): deterministic policy explanations. Policy explanation rendering is now deterministic across evidence generation and surfaces, reducing ordering drift and making repeated runs easier to compare in audits and tests.
-
chore(legal): add LICENSE file. Repository now includes a root
LICENSEfile for explicit distribution terms.
Fixed
- fix(security): governance hardening. Governance pipeline checks were tightened based on adversarial audit findings to reduce bypass risk under hostile or malformed inputs.
Changed
- fix(readme): improve trust signals. Status and metadata links now render as badge images; the previous "Trust Signals" text block was removed for a more scannable project header.
Test
- test(classifier): enrichment quality comparison script. Added a dedicated semantic enrichment quality comparison script to support repeatable validation of enrichment behavior.
1.3.0 - 2026-03-18
Added
- feat(dashboard): Mission Control UX. Governance and Gateway dashboards unified under a shared Mission Control layout with consistent 3-band information architecture, new widgets (posture, interventions, fleet risk, drift/PII signals), session timeline and compliance report preview panels (#35).
- feat(agent): intent governance tooling. New
talon intentCLI (classify/classes) backed byinternal/agent/intent.goinfers operation class, risk, and bulk signals from tool names and JSON params to determine plan review requirements (#36). - feat(agent): tool safety gaps T7, T8, T9. T7: per-tool
max_row_countandrequire_dry_runwith Rego deny and pre-execution row count guard; T8: IdempotencyStore (SQLite) deduplicates tool calls by (agent_id, correlation_id, tool_name, argument_hash) with pending/completed lifecycle; T9:forbidden_argument_valuesin ToolPIIPolicy with Rego deny for specific argument values (e.g.mode=overwrite). Session governance Rego (cost, max_candidates, max_judge_calls), session store, evidence session/stage fields, tool registry schema validation (#37). - feat(agent): tool_governance idempotency config. New
tool_governancepolicy section for per-tool idempotency: scope (request_id/session_id), cache_ttl, duplicate handling (return_cached/fail), strict_mode. Runner applies idempotency only to listed tools; keys use correlation_id or session_id; cached results stored after PII redaction. IdempotencyStore supports TTL-based expiration (#38).
Fixed
- fix(agent): Idempotency cache now stores PII-scanned results and handles pending status explicitly so cached results are redacted and non-idempotent tools are not double-executed on retry (#37).
Changed
- chore(build): Go bumped to 1.25.8 for stdlib vulnerability fixes (govulncheck: GO-2026-4603, GO-2026-4602, GO-2026-4601).
- feat(init): Pack validation derived from
pack.ValidPackIDs(), additional industry packs in wizard, dedicated langchain/generic agent templates (#36). - docs: Policy cookbook update_records hardening example; talon intent output fields (#36, #37).
1.2.0 - 2026-03-13
Added
- feat(evidence): session_id in export and API. Evidence records and audit export (CSV, JSON, NDJSON) now include
session_idfor lifecycle session correlation. Plan-gated runs and their auto-dispatch share the same session; export andGET /v1/evidence/{id}include it when present.
Fixed
- fix(smoke): Section 24 plan-dispatch: accept HTTP 202 for plan_pending (human_oversight); use section-local response file and admin key for evidence read when serve runs without gateway; relax rate limit (requests_per_minute=300) to avoid OPA deny from shared evidence DB; capture plan execute stderr and dispatch evidence session_id diagnostics on failure.
Changed
- docs: Evidence store: document session_id, fix HMAC key (TALON_SIGNING_KEY), retention in agent.talon.yaml, CSV/export columns. Auth: note that serve without --gateway has no tenant keys (admin key only). Agent planning: plan stores session_id, dispatcher reuses it. Compliance export runbook and config reference (TALON_ADMIN_KEY) updated.
1.1.0 - 2026-03-09
Added
-
feat(cache): governed semantic cache. Optional semantic cache for LLM requests: SQLite store, BM25 embedder, PII scrubber, OPA policy (
internal/cache,cache.rego). Config sectioncache(disabled by default), wizard and doctor support, init templates. Integration in agent runner and gateway (lookup/store, policy, evidence). Evidence:CacheHit,CacheEntryID,CacheSimilarity,CostSaved;CacheEventfor erasure. CLI:talon cache config|stats|list|erase;talon audit,talon costs,talon reportshow cache savings. Docs: cache vs memory, policy cookbook, config reference; smoke test section for cache. -
ci: CodeQL workflow.
.github/workflows/codeql.ymlfor Go analysis with advanced config;.github/codeql-config.ymlto exclude go/weak-sensitive-data-hashing (SHA-2 used for cache key derivation, not secrets).
Fixed
- fix(cache): Record actual similarity score in evidence instead of threshold; centralize cache key derivation in
cache.DeriveEntryKey; gateway uses config-derived tenant ID for cache key (CodeQL taint); remove dead code and clarify cache key hashing docs. - fix(server): HEAD support for dashboard so
curl -Ireturns 200 (health checks / smoke tests). - fix(cmd): Cache prompt (y/N) to match default
nandreadLine [n]. - fix(lint): Resolve golangci-lint gosec and noctx (agent postBudgetAlert ctx, enforce path validation, mounts/retention nolint, gateway tests with
NewRequestWithContext); gofmt gateway.go, noctx in otel chi_test and MCP tests.
Changed
- ci: Coverage threshold lowered to 65%; enforce.go nolint G703 for validated path; response_pii_test noctx.
- docs(gateway): Clarify
cacheKeyHashis cache lookup, not password hashing (CodeQL).
1.0.0 - 2026-03-06
Added
- feat(docs): self-adoption overhaul (Gates 1–5). README hero shows
talon audit listwith blocked tool + blocked PII; one-line mechanism and inline 60-second demo. "What it stops" replaces "Why Talon?" with four failure-first bullets (LiteLLM, CloakLLM, DIY proxy). QUICKSTART simplified to 3-path job-to-be-done (existing app / new agent / understand first). New guide Add Talon to your existing app (Gate 4, first real request). Quickstart-demo: "What you just proved", "Now wire this to your app" (Python/Node/curl), "You're done". "You're done" + next-steps table added to all guides. New comment-playbook (internal Reddit/HN templates) and Why not just a PII proxy?. Docs index updated; P8 buzzwords removed from reader-facing copy.
Changed
- chore(build):
make testandmake test-e2enow run with-count=1so the test cache is disabled and results are always fresh.
[0.9.5] - 2026-03-04
Added
- feat(copaw): CoPaw integration. Govern CoPaw (AgentScope/Alibaba DAMO personal AI assistant) via Talon's LLM API gateway. One URL change in CoPaw (Base URL → Talon, API Key → caller key) routes all LLM traffic through Talon for PII scanning, cost limits, and audit. New init pack
talon init --pack copaw, callercopaw-main/talon-gw-copaw-001, DashScope support in wizard, CoPaw dashboard tab and/v1/copaw/stats,/v1/copaw/alertsAPI, OTel span attributescopaw.callerandcopaw.channel, MCP-to-CoPaw skill bridge (internal/copaw/bridge.go), memory governor (internal/copaw/memory_governor.go), Rego policycopaw_skills.regoand.talon.yamlcopaw.skillsschema. Docs: CoPaw integration guide, Docker primer, examples/copaw. Design doc: internal_docs/copaw_integration_design_doc.md.
Fixed
- fix(copaw):
/v1/copaw/alertsnow returns"alerts": []instead of"alerts": nullwhen no matching evidence records are found, consistent with the no-store path and clients expecting an array.
0.9.2 - 2026-03-03
Added
- feat(init): zero-config init wizard. In a terminal,
talon initruns an interactive wizard: choose workload type (agent/proxy), framework pack (OpenClaw, generic, etc.), primary LLM provider, region (if applicable), data residency (EU strict / preferred / global), and compliance features (PII, audit, cost, injection, EU AI Act, DORA). Non-interactive options:talon init --scaffoldfor quick defaults,talon init --pack <id>for starter packs, or scriptedtalon init --provider openai --name my-agentwith optional--data-sovereignty,--features. New list commands:--list-providers,--list-packs,--list-features. When stdin is not a TTY, init prints guidance instead of running the wizard. Pack and feature registries (internal/pack,internal/feature) drive wizard choices; post-init verification reusestalon doctor; next steps are vault-first (TALON_SECRETS_KEY thentalon secrets set).
Fixed
- fix(init): gosec nolint for init wizard (G705/G703/G115 false positives). Unit tests added for coverage ≥70% (packName, providerName, dataResidencyLabel, readLine, readChoice, BuildConfigs branches, marshalWithHeader, WriteConfigs, PostInitVerify, runList*).
Changed
- docs: All user-facing docs updated for init wizard (README, QUICKSTART, configuration reference, first-governed-agent tutorial, persona guides, OpenClaw guides, provider-registry, ADOPTION_SCENARIOS, ROADMAP).
0.9.1 - 2026-03-02
Changed
- Version bump to 0.9.1.
0.9.0 - 2026-02-27
Added
- feat(community): implement PROMPT_10 launch track and quality track. Full community adoption plan build-out with a launch-first approach — 36 new files across docs, examples, schemas, deploy templates, and community governance.
Launch Track (demo-first for HN virality)
- Mock OpenAI provider (
examples/docker-compose/mock-provider/main.go): Standalone server with streaming + non-streaming support, realistic token counts, canned PII-triggering responses. No API key needed. - Docker Compose demo stack (
examples/docker-compose/):docker compose upstarts Talon + mock provider. 60-second demo from clone to evidence record. - README hero rewrite: Terminal output of
talon audit listis now the first visible content. Proxy-as-hook framing, Flow 0 commands, CI/license badges. Compliance language moved below the fold. - Show HN post updated (
internal_docs/show-hn.md): Reframed around "intercept all AI API calls with one URL change" narrative. - Request lifecycle doc (
docs/./what-talon-does-to-your-request.md): 10-step gateway pipeline breakdown, latency budget table (<15ms overhead), "What Talon Does NOT Do" section, streaming behavior, source code pointers. - Verification scripts:
scripts/verify-flow0.sh(automated end-to-end Flow 0 test) andscripts/demo-recorder.sh(generates 10 varied evidence records for screenshots/GIFs).
Quality Track (examples, docs, governance)
- examples/gateway-minimal/: Smallest working LLM gateway config with
run.shand README. - examples/mcp-proxy-minimal/: Smallest working MCP proxy config with tool filtering.
- examples/plan-review/: Human-in-the-loop demo for EU AI Act Article 14 compliance.
- examples/policies/: Starter OPA/Rego library — cost-budget, pii-block, model-allowlist, data-residency.
- docs/./evidence-store.md: HMAC signing, progressive disclosure, storage, export, compliance mapping.
- docs/./quickstart-demo.md: Flow 0 tutorial (no API key, Docker Compose).
- schemas/: JSON Schema for
talon.config.yamlandagent.talon.yaml— enables editor autocomplete and CI validation. - deploy/: systemd unit file (hardened, non-root) and production docker-compose (Talon + PostgreSQL + OTel Collector).
- Community files:
CODE_OF_CONDUCT.md(Contributor Covenant v2.1),MAINTAINERS.md,ROADMAP.md,.github/CODEOWNERS. - Makefile targets:
demo-gateway,demo-full,demo-clean,verify-flow0. - docs/README.md: Updated index with all new tutorials, explanations, examples, and policy reference.
0.8.14 - 2026-02-26
Added
- feat(audit): show tool governance in
talon audit show. Gateway evidence records now display a "Tool Governance (gateway)" section with Requested, Filtered, and Forwarded tool names when the request included a tools array, so operators can verify which tools were stripped byforbidden_toolsbefore the LLM saw them. - docs(gateway): Added
gateway-default-policy-tool-governance-snippet.yamlin the OpenClaw primer for pastingforbidden_toolsandtool_policy_actionintotalon.config.yaml.
Fixed
- fix(gateway): persist tool governance when any of requested/filtered/forwarded is non-empty. Previously
RecordGatewayEvidenceonly settool_governancewhenToolsRequestedhad length; it now persists whenever any of the three slices is non-empty.
Test
- test(gateway):
TestRecordGatewayEvidence_ToolGovernanceRoundTripensures tool governance is stored and returned byGet()(same path astalon audit show).
0.8.13 - 2026-02-26
(No notable changes in this release.)
0.8.12 - 2026-02-26
Added
- feat(gateway): attachment scanning for base64-encoded file blocks (#23). The gateway now detects base64-encoded file blocks in OpenAI (Chat Completions
file/image_url+ Responses APIinput_file) and Anthropic (document/imagewithsource.type: "base64") requests. Text is extracted from supported formats (PDF, TXT, CSV, HTML), scanned for PII and prompt injection, and governed by a newattachment_policywith four actions:allow,warn(default — log findings, forward unchanged),strip(remove file blocks before forwarding),block(reject request with HTTP 400). Per-caller overrides viapolicy_overrides.attachment_policy. Images are logged for evidence but skip text-based scanning. - feat(gateway): enforce PII actions on streaming responses.
handleStreamingPIIScannow buffers the SSE stream, scans the completed content, and either forwards as-is (warn), rewrites the SSE payload with redacted content (redact), or returns HTTP 451 (block). Defaultresponse_pii_actioniswarn.
Changed
- refactor(gateway): decompose
openclaw_incident_test.goby testing pyramid. The 1134-line monolith is now split into layered test files:gateway_test_helpers_test.go,response_pii_test.go,extract_test.go,forward_test.go,gateway_integration_test.go,responses_api_test.go,evidence_test.go.
Test
- test(gateway): Extensive attachment scanning coverage: multi-file requests, size/type enforcement, Responses API
input_file, Anthropic base64 document/image blocks, multi-turn string content tolerance, corrupt/empty/unsupported formats, warn/strip/block/allow modes, per-caller override propagation, and full gateway integration tests. - test(attachment): PDF extraction tests with
buildTestPDFhelper generating valid PDFs;ExtractBytesWithLimitoverride tests. - test(gateway): Streaming response PII tests covering warn/redact/block behaviours with real SSE format.
0.8.11 - 2026-02-26
Fixed
- fix(gateway): streaming response PII scanning no longer breaks SSE clients. The v0.8.10 approach of forcing
stream:falseon upstream requests caused OpenClaw (and any SSE-expecting client) to hang — it received a plain JSON response but was waiting for SSE events. The gateway now buffers the full SSE stream from the upstream, extracts the completed response from theresponse.completedevent (Responses API) or delta accumulation (Chat Completions), scans for PII, and either forwards the original buffered events (no PII) or returns a redacted response wrapped in valid SSE format. Streaming is preserved when PII action isallow.
Test
- test(gateway): Replaced
disableStreaming-based tests with SSE-native tests:TestGateway_ResponsesAPI_StreamingResponsePIIRedacted(redact mode with SSE),TestGateway_ResponsesAPI_StreamingNoPII(clean passthrough),TestGateway_StreamingAllowed_WhenPIIActionAllow, andTestGateway_ResponsesAPI_StreamingPIIBlock. All tests use real SSE response format.
0.8.10 - 2026-02-26
Fixed
- fix(gateway): response PII scanning now works when clients send
stream:true(superseded by v0.8.11 — see above). This version forcedstream:falsewhich broke SSE clients.
Test
- test(gateway): Added streaming PII scanning tests (updated in v0.8.11).
0.8.9 - 2026-02-26
Fixed
- fix(gateway): Refactored
extractResponseContentTextandredactResponseContentFieldsinresponse_pii.goto reduce cyclomatic complexity below the linter threshold (gocyclo > 15). Extracted Anthropic and Responses API parsing into dedicated helpers. - fix(gateway):
redactOpenAIBodyno longer injectscontent: nullinto Responses APIinputarray items that have nocontentfield (e.g.item_referenceentries). Previously this caused400 Unknown parameter: 'input[N].content'from OpenAI. - fix(gateway):
openAIContentToTextandredactOpenAIContentnow recognizeinput_textandoutput_textblock types in addition totext, covering all Responses API content block formats.
Test
- test(gateway): Added 8 full-pipeline integration tests for the Responses API path: request PII redaction (string input, array content, input_text blocks), item_reference preservation (no content:null injection), response PII redaction and blocking, clean passthrough, and block-mode request rejection. These tests exercise the complete gateway handler including routing, store:true injection, PII scanning, evidence recording, and upstream forwarding.
0.8.8 - 2026-02-26
Fixed
- fix(gateway): PII scanning and redaction now handles the OpenAI Responses API format (
output[].content[].textwithtype: "output_text") in addition to Chat Completions (choices[].message.content) and Anthropic (content[].text). Previously, emails and other PII in Responses API output passed through unredacted. - fix(gateway): Request-path PII extraction and redaction now handles the Responses API
inputfield (string or array of message objects), in addition to Chat Completionsmessages[]. All other request fields (store,previous_response_id, etc.) are preserved during redaction.
Test
- test(gateway): Added Responses API test cases for response PII scanning (email, IBAN in
output[].content), content extraction (single/multiple outputs, non-text outputs ignored), request extraction (inputas string/array/content blocks), and request redaction (string input, array input, field preservation).
0.8.7 - 2026-02-26
Fixed
- fix(gateway): Force
store: trueon OpenAI Responses API requests instead of only adding it when missing. OpenClaw (and other clients) may sendstore: falseexplicitly; the gateway now overwrites it so multi-turn conversations work through the proxy.
0.8.6 - 2026-02-26
Fixed
- fix(gateway): Automatically inject
store: trueinto OpenAI Responses API requests (/v1/responses) when not explicitly set. Without this, OpenAI does not persist response items, causing 404 errors on multi-turn conversations when the client (e.g. OpenClaw) references previous response IDs. Explicitstore: falsefrom the client is preserved.
Test
- test(gateway): Added
TestIsResponsesAPIPathandTestEnsureResponsesStore— path detection for Responses API, store injection with field preservation, explicit store override, and invalid JSON safety.
0.8.5 - 2026-02-26
Fixed
- fix(gateway): Strip
Accept-Encodingfrom headers forwarded to upstream providers. Go'shttp.Transportonly auto-decompresses gzip responses when it manages the header itself; forwarding the client'sAccept-Encodingcaused raw gzip bytes to be written back to the client, producing "404 + binary garbage" in OpenClaw and other clients. Also strip staleContent-Length(invalid after PII redaction). Defensive strip added in both the gateway handler and theForward()function. - fix(version):
talon versionand OTelservice.versionresource now useruntime/debug.ReadBuildInfo()as fallback when ldflags are not injected (e.g.go install ...@v0.8.5), so the correct module version is displayed instead of "dev" in both CLI output and trace spans.
Docs
- docs(openclaw): Added troubleshooting entry for "Talon dev" version string after
go install.
Test
- test(gateway): Added
TestForward_GzipErrorDecompressedandTestForward_GzipSuccessDecompressed— verify that gzip-compressed upstream responses (both 404 and 200) are transparently decompressed for the client, PII scanner, and token usage parser.
0.8.4 - 2026-02-25
Fixed
- fix(gateway): Response PII scanner now scans only LLM-generated content fields (
choices[].message.contentfor OpenAI,content[].textfor Anthropic) instead of the entire JSON body. Prevents false positives on API envelope fields (createdtimestamp, token counts,id,system_fingerprint). The[NATIONAL_ID]false positive oncreatedtimestamps is eliminated. - fix(init):
talon init --pack openclawnow showsTALON_SECRETS_KEYas step 1 beforetalon secrets set, preventing vault key mismatch errors.
Docs
- docs: macOS
go installlinker error (unsupported tapi file type) workaround added to README, OpenClaw integration guide, and first-governed-agent tutorial.
Test
- test(gateway): Comprehensive response PII false-positive prevention suite — 12 envelope-only subtests (timestamps, large tokens, fingerprints, Anthropic format, multi-choice, multimodal, empty/null content), 4 content-PII-with-envelope-preserved subtests, 9
extractResponseContentTextunit tests, 5scanResponseForPIImode tests.
0.8.2 - 2026-02-25
Added
- feat(init):
talon init --pack openclawgenerates OpenClaw gateway starter (agent.talon.yaml+talon.config.yaml) with post-init instructions. - docs(openclaw): Integration guide — baseUrl with trailing
/v1for correct upstream paths; two-keys clarification (TALON_SECRETS_KEY vs caller api_key); troubleshooting (404, binary garbage, vault key); diagnostics script; recommended sequence (secrets then serve). Standardized caller api_key totalon-gw-openclaw-001across examples and guides; install instructions (go install, install.gettalon.dev).
Fixed
- fix(gateway): Error responses (4xx/5xx) from upstream are no longer streamed; body is read and forwarded so clients receive readable JSON instead of raw binary/gzip (fixes OpenClaw "404 + garbage" when upstream returned error with SSE content-type).
Test
- test(gateway): Forward-level tests for error responses (404/500/429/400/401 with SSE or JSON) not streamed; success stream unchanged. Gateway pipeline tests: upstream 404/500 readable, 404 with SSE content-type, evidence recorded on upstream error, PII redact then upstream 404, 429 rate-limit forwarded with headers.
0.8.1 - 2026-02-25
Added
- feat(governance): Tool-aware PII redaction with per-tool, per-argument policies — allow/redact/audit/block categories (Gap T1).
- feat(gateway): Response-path PII scanning with redact/block/warn modes for both MCP proxy and LLM gateway (Gap F).
- feat(agent): Kill switch via
ActiveRunTracker.Kill()Go API (Gap D). CLI and HTTP wrappers planned for next release. - feat(agent): Circuit breaker with half-open recovery for repeated policy denials, configurable via
circuit_breaker_thresholdandcircuit_breaker_windowin.talon.yaml(Gap C). - feat(policy): Destructive operation detection in
tool_access.rego— blocksdelete,drop,removepatterns (Gap A). - feat(policy): Per-agent rate limit isolation in
rate_limits.regowithrequests_last_minute_agentpolicy input (Gap B). - feat(agent): Contextual volume detection in plan review — flags high-volume operations (Gap E).
- feat(evidence):
SanitizeForEvidencedefense-in-depth — scrubs PII from evidence payloads before storage (Gap G). - feat(memory): Optional HMAC signing for memory entries (Gap H).
- feat(evidence): Pre-execution pending evidence for tool calls — writes "pending" step record before
tool.Execute(), updates to "completed"/"failed" after. A kill or crash never creates an unaudited action (Gap T2). - feat(mcp):
tools/listfiltering in MCP proxy — agents only see tools in theirallowed_toolslist (Gap T3). - feat(agent): Separate tool failure tracking — tool execution errors feed
ToolFailureTrackerwith operator alerting, not the circuit breaker. Configurable viatool_failure_thresholdandtool_failure_window(Gap T4). - feat(agent): Per-tool execution timeouts — reads
ToolPIIPolicy.Timeoutand wrapstool.Execute()withcontext.WithTimeout(Gap T5). - feat(agent): Tool argument validation interface — tools implementing
ArgumentValidatorget pre-execution validation. Full JSON Schema validation planned for Phase 2 (Gap T6). - feat(gateway): Per-caller and global rate limiting enforced via token bucket (
golang.org/x/time/rate). Configured viaglobal_requests_per_minandper_caller_requests_per_min. - fix(agent): Wire circuit breaker into Runner execution — checks before policy evaluation, records denials/successes.
- fix(agent): Pass
requests_last_minute_agentto OPA policy input — per-agent rate limiting now functional. - test: Comprehensive E2E governance test suite covering OpenClaw incident failure modes.
0.8.0 - 2026-02-24
Added
- Memory Phase 1: Input-hash deduplication;
memory.governance.dedup_window_minutes; per-run--no-memory;talon audit showwithout ID shows latest; retention/max_entries enforcement. See docs/./memory-governance.md. - Memory Phase 2: Consolidation pipeline (ADD/UPDATE/INVALIDATE/NOOP); temporal invalidation (preserved for audit); point-in-time
AsOf(CLItalon memory as-of <RFC3339>and APIGET /v1/memory/as-of). See docs/./memory-governance.md. - Memory Phase 3: Three-type memory (semantic, episodic, procedural) and relevance-scored retrieval (relevance × recency × type weight × trust); enhanced input fingerprint (prompt + attachment hashes). See docs/./memory-governance.md.
0.7.6 - 2026-02-23
Changed
- CLI: When
talon runis invoked without--agent, the runtime agent ID (evidence, memory, secrets) is now taken from the loaded policy file (agent.namein the YAML) instead of the CLI default"default". Explicit--agent <name>continues to override. This aligns config file and runtime identity when using the default policy.
Added
- CLI:
resolveRunAgentNameand unit tests for default vs explicit agent name resolution;--agentflag description updated; QUICKSTART and PERSONA_GUIDES note the behavior when--agentis omitted.
0.7.5 - 2026-02-23
Added
- Policy:
policies.data_classification.block_on_pii— when true, runs are denied (no LLM call) when the user prompt or any attachment content contains PII; prompt and attachment text are scanned and evidence is recorded on deny. Documented in policy cookbook.
Fixed
- Agent: Deterministic ordering of
PIIDetected/pii_detectedin evidence and logs (merged PII entity names are now sorted to avoid flaky tests and unstable serialized evidence).
0.7.2 - 2026-02-23
Fixed
- CI: Dockerfile Go 1.24 to match go.mod; goreleaser skip linux/arm64 (CGO assembler incompatibility in goreleaser-cross); gitleaks allowlist for test/doc placeholders.
0.7.1 - 2026-02-23
Fixed
- Release: Use goreleaser-cross for CGO cross-compilation (fix darwin/arm64 build from Linux). GoReleaser archive deprecations (format → formats).
- Security: Run gitleaks CLI instead of gitleaks-action@v2 to avoid org license requirement. Dependency upgrades for govulncheck: OpenTelemetry v1.28 → v1.40 (GO-2026-4394), OPA v0.62 → v0.68 (GO-2024-3141), golang.org/x/net → v0.38 (GO-2025-3595). Go 1.22 → 1.23 for stdlib fixes.
0.7.0 - 2026-02-23
Added
- Bootstrap & CLI: Cobra CLI with OpenTelemetry integration; zerolog structured logging with OTel bridge; Makefile, Dockerfile, docker-compose, CI workflows.
- Policy engine: Embedded OPA with v2.0 schema; Rego policies for cost limits, rate limits, time restrictions, resource limits, tool access, secret access, memory governance, data classification;
talon initandtalon validate(strict mode); template-based init. - MCP proxy: Architecture and onboarding docs; proxy Rego policies (tool allowlists, rate limits, PII redaction, high-risk blocking).
- PII, attachments, LLM: Regex-based PII classifier (EU patterns); attachment scanner with extraction, instruction detection, sandboxing; multi-provider LLM router (OpenAI, Anthropic, Bedrock EU, Ollama); cost estimation and tier-based routing.
- Agent pipeline: Full runner (policy → classify → scan attachments → OPA → secrets → route LLM → evidence); execution plan generation and plan review gate (EU AI Act Art. 11/13); pipeline hooks (webhook delivery); MCP tool registry;
talon runwith--dry-run,--agent,--tenant,--attach,--policy. - Secrets & evidence: AES-256-GCM secrets vault with per-secret ACL; secret rotation and audit log; SQLite evidence store with HMAC-SHA256; progressive disclosure (list → timeline → detail);
talon audit list/verify,talon secrets set/list/audit/rotate. - Cost & PII: Graceful cost degradation (fallback model when budget threshold reached); expanded EU PII patterns.
- Testing: Test pyramid (unit, integration, e2e); shared
internal/testutil(mock provider, policy helpers, constants); e2e CLI flows (init, run, validate, audit, costs, secrets, memory); fuzz and benchmarks; CI coverage threshold 70%. - Memory, context, triggers: Governed agent memory (Constitutional AI, allowed/forbidden categories, PII scan); shared enterprise context mounts with privacy tags; cron scheduler and webhook handler; memory CLI and search.
- SMB governance: Onboarding and governance improvements for SMB use cases.
- Agent planning: Bounded agentic loop; step-level evidence; loop containment policy; tests and docs.
- Observability & CLI: Config show, doctor, costs/report commands; examples and docs.
- HTTP API & MCP: REST API with 15+ endpoints; MCP JSON-RPC 2.0 server; MCP proxy for vendor integration; embedded dashboard (evidence, plan review, memory); per-tenant rate limits.
- CI/CD & release: Golden tests for policy engine; integration full-flow and gateway stub tests; gofmt, vet, OPA policy tests, Codecov in CI; security workflow (govulncheck, gitleaks, SBOM); docs workflow (markdown link check); install script with checksum verification; GoReleaser with SBOM and Docker (GHCR); SECURITY.md; issue and PR templates.
Fixed
- Policy engine post-review fixes (PR #4).
- Memory: prevent data race on shared Governance OPA evaluator.
Security
- AES-256-GCM encryption for secrets at rest.
- HMAC-SHA256 signatures for evidence integrity.
- Timing-safe API key comparison; per-agent/tenant ACL; fail-closed policy evaluation.
Compliance
- ISO 27001: policy, classification, audit, secrets controls.
- GDPR: controller obligations, privacy by design, processing records, security.
- NIS2: risk management, incident reporting via evidence timeline.
- EU AI Act: risk management, transparency, human oversight (Art. 9, 13, 14).
- Data residency: tier-based EU model routing.