PR 1 -- Backend runtime correctness + observability
Scope: Gates 1, 2, 6, 10, 14, 15, 16 (observability discipline, log-before-raise,
layering + persistence boundary + dependency inversion, domain-error contract,
SEC-1 prompt fences + MCP/audit-event emission, concurrency + races + idempotency +
clock-seam, graceful shutdown + lifecycle-lock + probes).
Source date: 2026-06-18
Confirmed items: 382
Excluded -- FALSE_POSITIVE: 14 (slot 03: 6, slot 97: 4, slot 127: 4)
Excluded -- INTENTIONAL: 3 (slot 97: 3)
Done when: all checkboxes ticked + Gates 1, 2, 6, 10, 14, 15, 16 green.
Gate 1 -- Observability discipline
Slot 01 -- Missing logger (brownfield scanners swallow exceptions silently)
Slot 02 -- Missing event constants (f-strings instead of event constants)
Slot 04 -- Missing state-transition log
Slot 05 -- Observability completeness
Gate 2 -- Log-before-raise rollout
Slot 03 -- Missing error logging (raises without preceding log)
Gate 6 -- Layering + persistence boundary + dependency inversion
Slot 41 -- Circular dependencies
Slot 63 -- Persistence boundary deep violations
Slot 64 -- Provider boundary leaks
(no confirmed findings -- clean)
Slot 65 -- Memory boundary leaks
Slot 66 -- Queue boundary leaks
Slot 68 -- State mutation leaks (controllers reaching into persistence)
Slot 69 -- Hardcoded backend selection
Slot 72 -- Dependency inversion violations (concrete types instead of Protocols)
Slot 144 -- Layer violations (persistence._shared imports from wrong layers)
Gate 10 -- Domain-error contract
Slot 21 -- Silent exception swallow (missing error_type/error kwargs)
Slot 34 -- Error handling consistency (non-DomainError raised in controllers)
Slot 112 -- Duplicate error codes
Slot 147 -- Error mapping inconsistency
Gate 14 -- SEC-1 prompt fences + MCP/audit-event emission
Slot 92 -- Prompt injection defences
Slot 124 -- MCP handler contract (guardrail not captured, MCP_ADMIN_OP_EXECUTED missing)
Slot 125 -- SEC-1 prompt safety call sites
Slot 129 -- Audit chain coverage
Gate 15 -- Concurrency, races, idempotency, clock-seam
Slot 39 -- Race conditions
Slot 40 -- Resource leaks
Slot 67 -- Process spawn leaks
Slot 97 -- Memory leak patterns (confirmed only)
Slot 126 -- Currency aggregation invariant
Slot 133 -- Idempotency / retry safety
Slot 134 -- Clock-seam injection
Gate 16 -- Graceful shutdown + lifecycle-lock + probes
Slot 102 -- Graceful shutdown
Slot 106 -- Health/readiness probes
Slot 127 -- Lifecycle-lock pattern (confirmed only)
PR 1 -- Backend runtime correctness + observability
Scope: Gates 1, 2, 6, 10, 14, 15, 16 (observability discipline, log-before-raise,
layering + persistence boundary + dependency inversion, domain-error contract,
SEC-1 prompt fences + MCP/audit-event emission, concurrency + races + idempotency +
clock-seam, graceful shutdown + lifecycle-lock + probes).
Source date: 2026-06-18
Confirmed items: 382
Excluded -- FALSE_POSITIVE: 14 (slot 03: 6, slot 97: 4, slot 127: 4)
Excluded -- INTENTIONAL: 3 (slot 97: 3)
Done when: all checkboxes ticked + Gates 1, 2, 6, 10, 14, 15, 16 green.
Gate 1 -- Observability discipline
Slot 01 -- Missing logger (brownfield scanners swallow exceptions silently)
src/synthorg/engine/brownfield/scanner/python_scanner.py:80-- log TOMLDecodeError before swallowing; add logger.warning + error_type kwargsrc/synthorg/engine/brownfield/scanner/node_scanner.py:71-- log JSONDecodeError before swallowing; add logger.warning + error_type kwargsrc/synthorg/engine/brownfield/scanner/rust_scanner.py:65-- log TOMLDecodeError before swallowing; add logger.warning + error_type kwargSlot 02 -- Missing event constants (f-strings instead of event constants)
src/synthorg/client/feedback/adversarial.py:49-- replace f-string event name with observability.events constantsrc/synthorg/client/feedback/adversarial.py:53-- replace f-string event name with observability.events constantsrc/synthorg/client/generators/dataset.py:51-- replace f-string event name with observability.events constantsrc/synthorg/engine/middleware/models.py:207-- replace f-string event name with observability.events constantsrc/synthorg/engine/middleware/models.py:211-- replace f-string event name with observability.events constantsrc/synthorg/hr/evaluation/external_benchmark_registry.py:58-- replace f-string event name with observability.events constantsrc/synthorg/hr/evaluation/external_benchmark_registry.py:78-- replace f-string event name with observability.events constantSlot 04 -- Missing state-transition log
src/synthorg/engine/workflow/execution_service.py:199-- emit *_STATUS_TRANSITIONED after RUNNING/COMPLETED initial transitionsrc/synthorg/api/controllers/requests/lifecycle.py:208-- emit *_STATUS_TRANSITIONED after submit_request persistence writesrc/synthorg/meta/charter/_charter_crud.py:228-- emit *_STATUS_TRANSITIONED after _close_conversation persistence writesrc/synthorg/meta/charter/_charter_crud.py:134-- replace wrong event constant with correct *_STATUS_TRANSITIONED patternsrc/synthorg/hr/registry.py:745-- emit *_STATUS_TRANSITIONED after apply_autonomy_level persistence writesrc/synthorg/hr/promotion/service.py:418-- replace wrong event pattern with *_STATUS_TRANSITIONED after persistence writesrc/synthorg/meta/chief_of_staff/_intake_parking.py:284-- replace wrong event with *_STATUS_TRANSITIONED for reject_conversational_proposalSlot 05 -- Observability completeness
src/synthorg/providers/base.py:245-- add cost recording call inside stream() after all chunks consumedsrc/synthorg/engine/task_engine_apply.py:65-- add task-transition counter increment on state changesrc/synthorg/engine/coordination/_dispatch_helpers.py:291-- add coordination.wave OTel span around wave dispatchsrc/synthorg/api/controllers/users/org_roles.py:148-- add principal= kwarg to audit eventssrc/synthorg/engine/coordination/wave_dispatcher.py:136-- add coordination.dispatch OTel spansrc/synthorg/observability/audit_chain/sink.py:197-- add signing for config.* events in AuditChainSinkGate 2 -- Log-before-raise rollout
Slot 03 -- Missing error logging (raises without preceding log)
src/synthorg/engine/pipeline/service.py:331-- add logger.warning before raise; include error_type kwargsrc/synthorg/engine/pipeline/service.py:334-- add logger.warning before raise; include error_type kwargsrc/synthorg/engine/pipeline/service.py:338-- add logger.warning before raise; include error_type kwargsrc/synthorg/engine/pipeline/service.py:433-- add logger.warning before raise; include error_type kwargsrc/synthorg/engine/pipeline/service.py:502-- add logger.warning before raise; include error_type kwargsrc/synthorg/engine/pipeline/service.py:516-- add logger.warning before raise; include error_type kwargsrc/synthorg/engine/pipeline/service.py:551-- add logger.warning before raise; include error_type kwargsrc/synthorg/engine/pipeline/service.py:554-- add logger.warning before raise; include error_type kwargsrc/synthorg/engine/pipeline/service.py:561-- add logger.warning before raise; include error_type kwargsrc/synthorg/engine/decomposition/service.py:63-- add logger.warning before raise; include error_type kwargsrc/synthorg/engine/decomposition/service.py:73-- add logger.warning before raise; include error_type kwargsrc/synthorg/engine/workflow/execution_service.py:497-- add logger.warning before raise; include error_type kwargsrc/synthorg/engine/workflow/execution_service.py:506-- add logger.warning before raise; include error_type kwargsrc/synthorg/engine/workflow/execution_service.py:509-- add logger.warning before raise; include error_type kwargsrc/synthorg/engine/workflow/execution_service.py:515-- add logger.warning before raise; include error_type kwargsrc/synthorg/engine/workflow/execution_service.py:521-- add logger.warning before raise; include error_type kwargsrc/synthorg/providers/routing/selector.py:101-- add logger.warning before raise; include error_type kwargsrc/synthorg/providers/routing/selector.py:155-- add logger.warning before raise; include error_type kwargsrc/synthorg/providers/management/preset_override_service.py:107-- add logger.warning before raise; include error_type kwargsrc/synthorg/providers/management/preset_override_service.py:215-- add logger.warning before raise; include error_type kwargsrc/synthorg/providers/management/preset_override_service.py:221-- add logger.warning before raise; include error_type kwargsrc/synthorg/providers/management/refresh_scheduler.py:217-- add logger.warning before raise; include error_type kwargsrc/synthorg/api/auto_wire_meetings.py:232-- add logger.warning before raise; include error_type kwargsrc/synthorg/api/lifecycle_helpers/toolsmith_wiring.py:158-- add logger.warning before raise; include error_type kwargsrc/synthorg/api/lifecycle_helpers/toolsmith_wiring.py:190-- add logger.warning before raise; include error_type kwargsrc/synthorg/workers/worker.py:191-- add logger.warning before raise; include error_type kwargsrc/synthorg/workers/seen_claims_pruner.py:74-- add logger.warning before raise; include error_type kwargsrc/synthorg/workers/dead_letter.py:189-- add logger.warning before raise; include error_type kwargsrc/synthorg/workers/claim.py:232-- add logger.warning before raise; include error_type kwargsrc/synthorg/workers/claim.py:381-- add logger.warning before raise; include error_type kwargsrc/synthorg/workers/claim.py:427-- add logger.warning before raise; include error_type kwargsrc/synthorg/workers/claim.py:446-- add logger.warning before raise; include error_type kwargsrc/synthorg/workers/claim.py:513-- add logger.warning before raise; include error_type kwargsrc/synthorg/workers/claim.py:677-- add logger.warning before raise; include error_type kwargsrc/synthorg/workers/claim.py:700-- add logger.warning before raise; include error_type kwargsrc/synthorg/organization/services.py:95-- add logger.warning before raise; include error_type kwargsrc/synthorg/organization/services.py:631-- add logger.warning before raise; include error_type kwargsrc/synthorg/organization/services.py:637-- add logger.warning before raise; include error_type kwargsrc/synthorg/organization/services.py:662-- add logger.warning before raise; include error_type kwargsrc/synthorg/organization/services.py:668-- add logger.warning before raise; include error_type kwargsrc/synthorg/infrastructure/services/_status_facades.py:61-- add logger.warning before raise; include error_type kwargsrc/synthorg/infrastructure/services/_status_facades.py:129-- add logger.warning before raise; include error_type kwargsrc/synthorg/infrastructure/services/_status_facades.py:166-- add logger.warning before raise; include error_type kwargsrc/synthorg/infrastructure/services/_status_facades.py:211-- add logger.warning before raise; include error_type kwargsrc/synthorg/infrastructure/services/_status_facades.py:239-- add logger.warning before raise; include error_type kwargsrc/synthorg/infrastructure/services/_read_facades.py:338-- add logger.warning before raise; include error_type kwargsrc/synthorg/infrastructure/services/_read_facades.py:356-- add logger.warning before raise; include error_type kwargsrc/synthorg/infrastructure/services/_read_facades.py:374-- add logger.warning before raise; include error_type kwargsrc/synthorg/knowledge/loaders/repo.py:116-- add logger.warning before raise; include error_type kwargsrc/synthorg/knowledge/factory.py:50-- add logger.warning before raise; include error_type kwargsrc/synthorg/knowledge/factory.py:57-- add logger.warning before raise; include error_type kwargsrc/synthorg/project_brain/indexer.py:153-- add logger.warning before raise; include error_type kwargsrc/synthorg/project_brain/writer.py:199-- add logger.warning before raise; include error_type kwargsrc/synthorg/project_brain/writer.py:215-- add logger.warning before raise; include error_type kwargsrc/synthorg/project_brain/writer.py:243-- add logger.warning before raise; include error_type kwargsrc/synthorg/project_brain/writer.py:263-- add logger.warning before raise; include error_type kwargsrc/synthorg/project_brain/writer.py:273-- add logger.warning before raise; include error_type kwargsrc/synthorg/project_brain/service.py:278-- add logger.warning before raise; include error_type kwargsrc/synthorg/project_brain/service.py:322-- add logger.warning before raise; include error_type kwargsrc/synthorg/project_brain/service.py:363-- add logger.warning before raise; include error_type kwargsrc/synthorg/project_brain/service.py:400-- add logger.warning before raise; include error_type kwargsrc/synthorg/project_brain/service.py:542-- add logger.warning before raise; include error_type kwargsrc/synthorg/project_brain/service.py:589-- add logger.warning before raise; include error_type kwargsrc/synthorg/research/service.py:300-- add logger.warning before raise; include error_type kwargsrc/synthorg/research/synthesis/citation_binder.py:40-- add logger.warning before raise; include error_type kwargsrc/synthorg/research/synthesis/citation_binder.py:49-- add logger.warning before raise; include error_type kwargsrc/synthorg/research/synthesis/llm_synthesizer.py:97-- add logger.warning before raise; include error_type kwargsrc/synthorg/research/factory.py:93-- add logger.warning before raise; include error_type kwargsrc/synthorg/research/factory.py:157-- add logger.warning before raise; include error_type kwargsrc/synthorg/integrations/connections/types/a2a_peer.py:54-- add logger.warning before raise; include error_type kwargsrc/synthorg/integrations/mcp_facades/_ontology.py:35-- add logger.warning before raise; include error_type kwargsrc/synthorg/integrations/mcp_facades/_ontology.py:57-- add logger.warning before raise; include error_type kwargsrc/synthorg/integrations/mcp_facades/_ontology.py:78-- add logger.warning before raise; include error_type kwargsrc/synthorg/integrations/mcp_facades/_ontology.py:99-- add logger.warning before raise; include error_type kwargsrc/synthorg/integrations/mcp_facades/_catalog.py:53-- add logger.warning before raise; include error_type kwargsrc/synthorg/integrations/mcp_facades/_catalog.py:74-- add logger.warning before raise; include error_type kwargsrc/synthorg/integrations/mcp_facades/_catalog.py:96-- add logger.warning before raise; include error_type kwargsrc/synthorg/integrations/mcp_facades/_catalog.py:124-- add logger.warning before raise; include error_type kwargsrc/synthorg/integrations/mcp_facades/_catalog.py:155-- add logger.warning before raise; include error_type kwargsrc/synthorg/integrations/webhooks/service.py:45-- add logger.warning before raise; include error_type kwargsrc/synthorg/integrations/webhooks/service.py:48-- add logger.warning before raise; include error_type kwargsrc/synthorg/a2a/gateway.py:992-- add logger.warning before raise; include error_type kwargsrc/synthorg/a2a/gateway.py:1029-- add logger.warning before raise; include error_type kwargsrc/synthorg/a2a/gateway.py:1045-- add logger.warning before raise; include error_type kwargsrc/synthorg/a2a/well_known.py:389-- add logger.warning before raise; include error_type kwargsrc/synthorg/ontology/service.py:208-- add logger.warning before raise; include error_type kwargsrc/synthorg/ontology/decorator.py:218-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/charter/_charter_crud.py:70-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/charter/_charter_crud.py:124-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/charter/_charter_crud.py:189-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/charter/_charter_crud.py:198-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/charter/dispatch.py:194-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/charter/dispatch.py:202-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/charter/dispatch.py:263-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/charter/dispatch.py:284-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/charter/dispatch.py:404-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/charter/service.py:234-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/charter/service.py:236-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/charter/strategy.py:169-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/chief_of_staff/group_chat.py:198-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/chief_of_staff/group_chat.py:200-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/chief_of_staff/group_chat.py:202-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/chief_of_staff/group_chat.py:224-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/chief_of_staff/group_chat.py:226-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/chief_of_staff/group_chat.py:264-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/chief_of_staff/actor.py:153-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/chief_of_staff/propose.py:298-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/chief_of_staff/propose.py:306-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/chief_of_staff/propose.py:308-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/chief_of_staff/propose.py:391-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/reports/service.py:91-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/reports/service.py:94-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/reports/service.py:151-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/reports/service.py:209-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/rollout/before_after.py:54-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/rollout/regression/welch.py:88-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/rollout/regression/welch.py:107-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/toolsmith/strategy.py:121-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/toolsmith/strategy.py:192-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/toolsmith/strategy.py:236-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/toolsmith/strategy.py:239-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/toolsmith/validation_gate.py:235-- add logger.warning before raise; include error_type kwargsrc/synthorg/meta/toolsmith/cycle_scheduler.py:225-- add logger.warning before raise; include error_type kwargsrc/synthorg/tools/external_api/external_api_tool.py:164-- add logger.warning before raise; include error_type kwargsrc/synthorg/tools/browser/browser_tool.py:367-- add logger.warning before raise; include error_type kwargsrc/synthorg/tools/browser/browser_tool.py:466-- add logger.warning before raise; include error_type kwargsrc/synthorg/tools/browser/browser_tool.py:509-- add logger.warning before raise; include error_type kwargsrc/synthorg/tools/browser/browser_tool.py:704-- add logger.warning before raise; include error_type kwargsrc/synthorg/tools/browser/browser_tool.py:1075-- add logger.warning before raise; include error_type kwargsrc/synthorg/tools/browser/browser_tool.py:1088-- add logger.warning before raise; include error_type kwargsrc/synthorg/tools/browser/browser_tool.py:1098-- add logger.warning before raise; include error_type kwargsrc/synthorg/tools/browser/browser_tool.py:1110-- add logger.warning before raise; include error_type kwargsrc/synthorg/tools/browser/browser_tool.py:1116-- add logger.warning before raise; include error_type kwargsrc/synthorg/tools/sandbox/docker_sandbox.py:679-- add logger.warning before raise; include error_type kwargsrc/synthorg/tools/sandbox/docker_sandbox.py:686-- add logger.warning before raise; include error_type kwargsrc/synthorg/tools/invoker.py:995-- add logger.warning before raise; include error_type kwargsrc/synthorg/hr/promotion/service.py:291-- add logger.warning before raise; include error_type kwargsrc/synthorg/memory/fine_tune_admin_service.py:217-- add logger.warning before raise; include error_type kwargsrc/synthorg/memory/fine_tune_admin_service.py:218-- add logger.warning before raise; include error_type kwargsrc/synthorg/hr/performance/composite_quality_strategy.py:171-- add logger.warning before raise; include error_type kwargsrc/synthorg/communication/bus/nats.py:178-- add logger.warning before raise; include error_type kwargsrc/synthorg/communication/bus/_nats_kv.py:186-- add logger.warning before raise; include error_type kwargsrc/synthorg/communication/event_stream/stream.py:281-- add logger.warning before raise; include error_type kwargsrc/synthorg/communication/meetings/service.py:110-- add logger.warning before raise; include error_type kwargsrc/synthorg/communication/meetings/service.py:119-- add logger.warning before raise; include error_type kwargsrc/synthorg/communication/async_tasks/service.py:275-- add logger.warning before raise; include error_type kwargsrc/synthorg/communication/delegation/service.py:200-- add logger.warning before raise; include error_type kwargsrc/synthorg/communication/delegation/service.py:206-- add logger.warning before raise; include error_type kwargsrc/synthorg/backup/service.py:451-- add logger.warning before raise; include error_type kwargsrc/synthorg/backup/service_archive.py:498-- add logger.warning before raise; include error_type kwargsrc/synthorg/backup/service_archive.py:506-- add logger.warning before raise; include error_type kwargsrc/synthorg/security/visionverify/verifiers/_image.py:38-- add logger.warning before raise; include error_type kwargsrc/synthorg/security/visionverify/verifiers/_image.py:43-- add logger.warning before raise; include error_type kwargsrc/synthorg/security/visionverify/verifiers/_image.py:46-- add logger.warning before raise; include error_type kwargsrc/synthorg/security/visionverify/verifiers/_image.py:67-- add logger.warning before raise; include error_type kwargsrc/synthorg/security/autonomy/change_strategy_factory.py:78-- add logger.warning before raise; include error_type kwargsrc/synthorg/security/autonomy/change_strategy_factory.py:104-- add logger.warning before raise; include error_type kwargsrc/synthorg/config/loader.py:144-- add logger.warning before raise; include error_type kwargsrc/synthorg/config/loader.py:301-- add logger.warning before raise; include error_type kwargsrc/synthorg/config/loader.py:397-- add logger.warning before raise; include error_type kwargsrc/synthorg/docs_engine/service.py:267-- add logger.warning before raise; include error_type kwargsrc/synthorg/docs_engine/service.py:389-- add logger.warning before raise; include error_type kwargsrc/synthorg/docs_engine/service.py:409-- add logger.warning before raise; include error_type kwargsrc/synthorg/docs_engine/service.py:445-- add logger.warning before raise; include error_type kwargsrc/synthorg/docs_engine/service.py:513-- add logger.warning before raise; include error_type kwargsrc/synthorg/docs_engine/service.py:526-- add logger.warning before raise; include error_type kwargsrc/synthorg/docs_engine/slug.py:55-- add logger.warning before raise; include error_type kwargsrc/synthorg/telemetry/reporters/logfire.py:98-- add logger.warning before raise; include error_type kwargsrc/synthorg/engine/pipeline/entry/boot.py:115-- add logger.warning before raise; include error_type kwargGate 6 -- Layering + persistence boundary + dependency inversion
Slot 41 -- Circular dependencies
src/synthorg/engine/intervention/plan_steering.py:33-- replace deferred import with TYPE_CHECKING guard or move to leaf modulesrc/synthorg/engine/intervention/plan_steering.py:89-- remove runtime deferred import; use protocol/forward-ref insteadsrc/synthorg/persistence/charter_protocol.py:20-- break cycle via meta.charter.init; import concrete only under TYPE_CHECKINGsrc/synthorg/persistence/charter_protocol.py:21-- break cycle via meta.charter.init; import concrete only under TYPE_CHECKINGsrc/synthorg/communication/meeting/_prompts.py:6-- document cold-import cycle or restructure to avoid itsrc/synthorg/engine/compaction/__init__.py:13-- add protocol to cold-import exclusion or restructuresrc/synthorg/engine/compaction/__init__.py:14-- add protocol to cold-import exclusion or restructuresrc/synthorg/workers/claim.py:61-- remove redundant guard; align comment with actual cycle structuresrc/synthorg/engine/coordination/factory.py:39-- narrow TYPE_CHECKING block to genuinely cycle-breaking imports onlysrc/synthorg/engine/coordination/factory.py:57-- narrow TYPE_CHECKING block to genuinely cycle-breaking imports onlySlot 63 -- Persistence boundary deep violations
src/synthorg/tools/database/sql_query.py:254-- move transaction management into persistence layer; remove direct aiosqlite usagesrc/synthorg/tools/database/schema_inspect.py:194-- use SQLite double-quoting for identifier; replace f-string PRAGMA interpolationsrc/synthorg/tools/database/sql_query.py:265-- wrap write path in explicit transaction to prevent silent rollback on fetchmany raiseSlot 64 -- Provider boundary leaks
(no confirmed findings -- clean)
Slot 65 -- Memory boundary leaks
src/synthorg/communication/meeting/embedder.py:117-- replace direct sentence_transformers import with memory backend protocol abstractionSlot 66 -- Queue boundary leaks
src/synthorg/communication/event_stream/stream.py:410-- replace leaked asyncio.Queue with queue backend protocol; remove cross-boundary exposureSlot 68 -- State mutation leaks (controllers reaching into persistence)
src/synthorg/api/controllers/_conversational_resume.py:173-- move repo.transition_if call into service layer; controller must not call repo directlysrc/synthorg/api/controllers/_conversational_resume.py:476-- move invite_repo.transition_if call into service layersrc/synthorg/api/controllers/_conversational_resume.py:581-- move participant_repo.save call into service layersrc/synthorg/api/controllers/workflow_executions.py:99-- move per-request service construction into DI wiring; not in controllersrc/synthorg/api/controllers/_webhooks_wiring.py:188-- move lazy persistence wiring out of controller; wire at startupsrc/synthorg/api/controllers/analytics/overview.py:147-- route through service layer; remove direct persistence.tasks.query callsrc/synthorg/api/controllers/analytics/trends.py:138-- route through service layer; remove direct persistence.tasks.query callsrc/synthorg/api/controllers/training.py:299-- route through service layer; remove multiple direct persistence readsSlot 69 -- Hardcoded backend selection
src/synthorg/observability/prometheus_collector.py:286-- replace string comparison with backend protocol discriminator or enumsrc/synthorg/integrations/connections/types/database.py:66-- replace dialect != "sqlite" string comparison with protocol/enum checkSlot 72 -- Dependency inversion violations (concrete types instead of Protocols)
src/synthorg/engine/pipeline/service.py:128-- replace AgentRegistryService with AgentRegistryProtocol in type annotationsrc/synthorg/engine/identity/store/append_only.py:38-- replace concrete type with protocol in constructor annotationsrc/synthorg/engine/identity/store/copy_on_write.py:39-- replace concrete type with protocol in constructor annotationsrc/synthorg/engine/classification/semantic_detectors.py:229-- replace BaseCompletionProvider with CompletionProvider protocolsrc/synthorg/engine/classification/pipeline.py:152-- replace concrete type with protocol in annotationsrc/synthorg/engine/classification/pipeline.py:192-- replace concrete type with protocol in annotationsrc/synthorg/engine/classification/pipeline.py:225-- replace concrete type with protocol in annotationsrc/synthorg/engine/classification/pipeline.py:287-- replace concrete type with protocol in annotationsrc/synthorg/engine/classification/pipeline.py:359-- replace concrete type with protocol in annotationsrc/synthorg/engine/classification/pipeline.py:443-- replace concrete type with protocol in annotationsrc/synthorg/communication/meeting/orchestrator.py:125-- replace ConfigResolver with ConfigResolverProtocolsrc/synthorg/communication/conflict_resolution/escalation/sweeper.py:45-- replace concrete type with protocol in annotationsrc/synthorg/communication/meeting/agent_caller.py:78-- replace concrete type with protocol in annotationsrc/synthorg/api/bootstrap.py:96-- replace concrete type with protocol in annotationsrc/synthorg/api/services/org_mutations.py:76-- replace SettingsService with SettingsServiceProtocolsrc/synthorg/api/services/_org_department_mutations.py:51-- replace concrete type with protocol in annotationsrc/synthorg/api/controllers/meta.py:70-- replace concrete type with protocol in annotationsrc/synthorg/api/controllers/settings/_sinks.py:210-- replace concrete type with protocol in annotationsrc/synthorg/api/controllers/settings/security.py:63-- replace concrete type with protocol in annotationsrc/synthorg/api/controllers/setup/_status_checks.py:77-- replace concrete type with protocol in annotationsrc/synthorg/api/controllers/setup/_status_checks.py:107-- replace concrete type with protocol in annotationsrc/synthorg/api/controllers/setup/completion.py:73-- replace concrete type with protocol in annotationsrc/synthorg/api/controllers/setup/completion.py:130-- replace concrete type with protocol in annotationsrc/synthorg/api/controllers/setup/completion.py:168-- replace concrete type with protocol in annotationSlot 144 -- Layer violations (persistence._shared imports from wrong layers)
src/synthorg/api/auth/user_constraints.py:16-- move constraint_tokens import inside persistence boundary or expose via protocolsrc/synthorg/api/auth/user_service.py:30-- replace DEFAULT_LIST_LIMIT import from persistence._shared with domain constantsrc/synthorg/api/webhook_cleanup.py:32-- replace paginate import from persistence._shared with service-layer helpersrc/synthorg/api/lifecycle_helpers/bootstrap.py:22-- replace paginate import from persistence._shared with service-layer helpersrc/synthorg/hr/persistence_protocol.py:17-- replace DEFAULT_LIST_LIMIT import from persistence._shared with domain constantsrc/synthorg/hr/offboarding_service.py:43-- replace paginate import from persistence._shared with service-layer helpersrc/synthorg/communication/loop_prevention/circuit_breaker.py:19-- replace collect_all import from persistence._shared with service-layer helpersrc/synthorg/communication/conflict_resolution/escalation/in_memory_store.py:31-- replace parse_iso_utc import from persistence._shared; use core datetime utilsrc/synthorg/ontology/service.py:23-- replace collect_all_mapping import from persistence._shared with service helpersrc/synthorg/ontology/drift/__init__.py:14-- remove re-export of concrete SQLiteOntologyDriftReportRepository from non-persistence modulesrc/synthorg/engine/workflow/service.py:38-- replace DEFAULT_LIST_LIMIT import from persistence._shared with domain constantsrc/synthorg/engine/workflow/execution_service.py:79-- replace DEFAULT_LIST_LIMIT import from persistence._shared with domain constantsrc/synthorg/engine/workflow/execution_lifecycle.py:47-- replace DEFAULT_LIST_LIMIT import from persistence._shared with domain constantsrc/synthorg/engine/workflow/subworkflow_service.py:49-- replace collect_all import from persistence._shared with service-layer helpersrc/synthorg/engine/workflow/subworkflow_registry.py:51-- replace DEFAULT_LIST_LIMIT, MAX_LIST_LIMIT, collect_all from persistence._sharedsrc/synthorg/engine/classification/loaders.py:23-- replace paginate import from persistence._shared with service-layer helpersrc/synthorg/integrations/connections/_cache.py:19-- replace paginate import from persistence._shared with service-layer helpersrc/synthorg/integrations/mcp_catalog/in_memory_installations.py:24-- replace validate_pagination_args import from persistence._sharedsrc/synthorg/providers/management/_capability_helpers.py:14-- replace format_iso_utc import from persistence._shared; use core datetime utilsrc/synthorg/backup/retention.py:26-- replace parse_iso_utc import from persistence._shared; use core datetime utilsrc/synthorg/tools/database/sql_query.py:21-- remove direct aiosqlite import outside persistence boundarysrc/synthorg/tools/database/schema_inspect.py:11-- remove direct aiosqlite import outside persistence boundaryGate 10 -- Domain-error contract
Slot 21 -- Silent exception swallow (missing error_type/error kwargs)
src/synthorg/engine/approval_gate.py:225-- add error_type=type(exc).name and error=safe_error_description(exc) kwargssrc/synthorg/engine/approval_gate.py:250-- add error_type=type(exc).name and error=safe_error_description(exc) kwargssrc/synthorg/engine/approval_gate.py:290-- add error_type=type(exc).name and error=safe_error_description(exc) kwargssrc/synthorg/engine/approval_gate.py:434-- add error_type=type(exc).name and error=safe_error_description(exc) kwargssrc/synthorg/engine/approval_gate.py:462-- add error_type=type(exc).name and error=safe_error_description(exc) kwargssrc/synthorg/memory/procedural/evolver.py:143-- add error_type=type(exc).name and error=safe_error_description(exc) kwargssrc/synthorg/hr/scaling/guards/composite.py:61-- add error_type=type(exc).name and error=safe_error_description(exc) kwargssrc/synthorg/settings/dispatcher.py:610-- add error_type=type(exc).name and error=safe_error_description(exc) kwargssrc/synthorg/settings/dispatcher.py:647-- add error_type=type(exc).name and error=safe_error_description(exc) kwargsSlot 34 -- Error handling consistency (non-DomainError raised in controllers)
src/synthorg/api/controllers/webhooks/_shared.py:395-- replace TypeError with appropriate DomainError subclasssrc/synthorg/api/controllers/webhooks/retry.py:136-- replace TypeError with appropriate DomainError subclasssrc/synthorg/api/controllers/approvals/_notify.py:74-- replace RuntimeError with appropriate DomainError subclasssrc/synthorg/api/controllers/_custom_rules_helpers.py:289-- replace ValueError with appropriate DomainError subclassSlot 112 -- Duplicate error codes
src/synthorg/engine/errors.py:369-- assign unique ErrorCode to TaskEngineNotRunning; remove SERVICE_UNAVAILABLE collision with QueueFullsrc/synthorg/engine/errors.py:379-- assign unique ErrorCode to QueueFull; remove SERVICE_UNAVAILABLE collision with TaskEngineNotRunningsrc/synthorg/meta/errors.py:162-- assign RESOURCE_NOT_FOUND (or a new code) to GroupParticipantUnknownError; not VALIDATION_ERRORsrc/synthorg/meta/errors.py:116-- assign unique ErrorCode to feature-unavailable error; remove SERVICE_UNAVAILABLE collisionsrc/synthorg/meta/errors.py:148-- assign unique ErrorCode to feature-unavailable error; remove SERVICE_UNAVAILABLE collisionsrc/synthorg/meta/errors.py:289-- assign unique ErrorCode to feature-unavailable error; remove SERVICE_UNAVAILABLE collisionsrc/synthorg/memory/service.py:107-- assign unique ErrorCode to CheckpointNotFound; remove RECORD_NOT_FOUND collision with FineTuneRunNotFoundsrc/synthorg/memory/service.py:153-- assign unique ErrorCode to FineTuneRunNotFound; remove RECORD_NOT_FOUND collision with CheckpointNotFoundsrc/synthorg/hr/errors.py:99-- assign unique ErrorCode to AgentNotFound; remove RESOURCE_NOT_FOUND collisionsrc/synthorg/hr/errors.py:184-- assign unique ErrorCode to PersonalityNotFound; remove RESOURCE_NOT_FOUND collisionsrc/synthorg/hr/errors.py:200-- assign unique ErrorCode to TrainingSessionNotFound; remove RESOURCE_NOT_FOUND collisionSlot 147 -- Error mapping inconsistency
src/synthorg/api/controllers/escalations.py:171-- replace NotFoundError with SERVICE_UNAVAILABLE DomainError for unwired storesrc/synthorg/api/controllers/escalations.py:219-- replace NotFoundError with SERVICE_UNAVAILABLE DomainError for unwired storesrc/synthorg/api/controllers/escalations.py:274-- replace NotFoundError with SERVICE_UNAVAILABLE DomainError for unwired storesrc/synthorg/api/controllers/escalations.py:315-- register EscalationDecisionError in error handler mapsrc/synthorg/api/controllers/escalations.py:398-- replace NotFoundError with SERVICE_UNAVAILABLE DomainError for unwired storesrc/synthorg/api/controllers/ontology/admin.py:73-- return 503 (not 200 OK) when ontology service is unwiredsrc/synthorg/api/controllers/ontology/drift.py:80-- return 503 (not 200 empty) when drift store is unwiredsrc/synthorg/api/controllers/ontology/drift.py:124-- return 503 (not 200 empty) when drift store is unwiredsrc/synthorg/api/controllers/ontology/drift.py:149-- return 503 (not 200 OK) when drift service is unwiredsrc/synthorg/api/controllers/memory/fine_tune.py:190-- return 503 (not IDLE 200) when fine-tune orchestrator is Nonesrc/synthorg/api/controllers/webhooks/retry.py:136-- replace TypeError with DomainError; return RFC 9457 error bodysrc/synthorg/api/controllers/metrics.py:46-- add comment explaining plain-text 503/500 intentional RFC 9457 bypassGate 14 -- SEC-1 prompt fences + MCP/audit-event emission
Slot 92 -- Prompt injection defences
src/synthorg/engine/prompt_template.py:279-- wrap task.title, task.description, acceptance_criteria with wrap_untrusted + untrusted_content_directivesrc/synthorg/engine/prompt_template.py:213-- replace prose disclaimer with untrusted_content_directive for org_policies blocksrc/synthorg/engine/hybrid/step_helpers.py:102-- replace hand-rolled directive with canonical untrusted_content_directive callsrc/synthorg/engine/prompt_validation.py:244-- wrap agent_name and task_id with wrap_untrusted in inject_async_task_sectionsrc/synthorg/engine/loop_tool_execution.py:68-- add import-time assertion linking FENCE_TAGS to TAG* constants registrySlot 124 -- MCP handler contract (guardrail not captured, MCP_ADMIN_OP_EXECUTED missing)
src/synthorg/meta/mcp/handlers/brain.py:141-- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on successsrc/synthorg/meta/mcp/handlers/brain.py:173-- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on successsrc/synthorg/meta/mcp/handlers/brain.py:207-- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on successsrc/synthorg/meta/mcp/handlers/brain.py:241-- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on successsrc/synthorg/meta/mcp/handlers/charter.py:196-- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on successsrc/synthorg/meta/mcp/handlers/charter.py:226-- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on successsrc/synthorg/meta/mcp/handlers/cockpit.py:161-- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on successsrc/synthorg/meta/mcp/handlers/cockpit.py:194-- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on successsrc/synthorg/meta/mcp/handlers/cockpit.py:239-- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on successsrc/synthorg/meta/mcp/handlers/cockpit.py:286-- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on successsrc/synthorg/meta/mcp/handlers/docs.py:82-- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on successsrc/synthorg/meta/mcp/handlers/knowledge.py:120-- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on successsrc/synthorg/meta/mcp/handlers/knowledge.py:151-- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on successsrc/synthorg/meta/mcp/handlers/knowledge.py:233-- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on successsrc/synthorg/meta/mcp/handlers/meta.py:102-- remove persistence bypass fallback; route through service layersrc/synthorg/meta/mcp/handlers/budget.py:75-- remove persistence bypass fallback; route through service layerSlot 125 -- SEC-1 prompt safety call sites
src/synthorg/engine/prompt_template.py:279-- add wrap_untrusted + untrusted_content_directive to DEFAULT_TEMPLATE system prompt (CRITICAL)src/synthorg/engine/intervention/loop_hook.py:57-- append untrusted_content_directive((TAG_BRAIN_STATE,)) after wrap_untrusted fenceSlot 129 -- Audit chain coverage
src/synthorg/api/auth/system_user.py:113-- emit SECURITY_USER_CREATED after persistence.users.save(user)src/synthorg/api/auth/controllers/bootstrap.py:120-- emit SECURITY_USER_CREATED after CEO user persistence.users.savesrc/synthorg/api/auth/controllers/bootstrap.py:140-- emit SECURITY_AUTH_TOKEN_ISSUED after create_token on setup pathsrc/synthorg/api/auth/controllers/credentials.py:136-- emit SECURITY_AUTH_TOKEN_ISSUED after create_token on password-change pathsrc/synthorg/integrations/connections/mcp_service.py:88-- replace COMMUNICATION_CONNECTION_CREATED with SECURITY_CONNECTION_CREATEDsrc/synthorg/integrations/connections/mcp_service.py:112-- replace COMMUNICATION_CONNECTION_DELETED with SECURITY_CONNECTION_DELETEDsrc/synthorg/security/autonomy/change_strategy.py:73-- move SECURITY_AUTONOMY_PROMOTION_DENIED emission to after persistence write in _handle_pendingGate 15 -- Concurrency, races, idempotency, clock-seam
Slot 39 -- Race conditions
src/synthorg/communication/delegation/service.py:125-- add CAS/lock to dedup check; eliminate TOCTOU window (HIGH)src/synthorg/budget/forecast_service.py:206-- add optimistic locking / CAS on raise_ceiling read-modify-write (HIGH)src/synthorg/meta/charter/_charter_crud.py:122-- add CAS / version guard on edit_charter read-modify-write (HIGH)src/synthorg/providers/management/preset_override_service.py:109-- add version guard before preset override write (HIGH)src/synthorg/hr/performance/llm_calibration_sampler.py:150-- add asyncio.Lock around shared dict mutation (HIGH)src/synthorg/communication/meeting/orchestrator.py:334-- add lock on _append_record to prevent concurrent append race (HIGH)src/synthorg/hr/promotion/service.py:283-- add CAS / atomic check on cooldown TOCTOU (MEDIUM)src/synthorg/communication/conflict_resolution/service.py:200-- make audit_trail.extend atomic; use lock or CAS (MEDIUM)src/synthorg/communication/loop_prevention/rate_limit.py:66-- eliminate TOCTOU on shared rate-limit state (MEDIUM)src/synthorg/communication/loop_prevention/rate_limit.py:109-- eliminate TOCTOU on shared rate-limit state (MEDIUM)src/synthorg/communication/loop_prevention/dedup.py:72-- eliminate TOCTOU on dedup state (MEDIUM)src/synthorg/communication/loop_prevention/dedup.py:108-- eliminate TOCTOU on dedup state (MEDIUM)Slot 40 -- Resource leaks
src/synthorg/a2a/_construction.py:66-- wrap httpx.AsyncClient construction in try/except; call aclose() on exception pathSlot 67 -- Process spawn leaks
src/synthorg/telemetry/host_info.py:300-- move aiodocker.Docker() inside sandbox boundary; never open outside sandboxsrc/synthorg/engine/workspace/environment/image_builder.py:121-- add path-containment check before subprocess launchsrc/synthorg/persistence/postgres/backup_utils.py:418-- replace os.environ.copy() in pg_restore_list with explicit minimal env dictSlot 97 -- Memory leak patterns (confirmed only)
src/synthorg/providers/base.py:585-- cancel and await the background task on provider shutdown to prevent leaksrc/synthorg/api/controllers/brownfield.py:105-- cancel background tasks on request cancellation / shutdownsrc/synthorg/api/controllers/objectives.py:120-- cancel background tasks on request cancellation / shutdownsrc/synthorg/api/controllers/requests/pipeline.py:67-- cancel background tasks on request cancellation / shutdownsrc/synthorg/api/controllers/tasks.py:158-- cancel background tasks on request cancellation / shutdownweb/src/stores/websocket/transport.ts:44-- clear reconnect timer in cleanup / dispose path to prevent leakweb/src/lib/global-error-handlers.ts:53-- return an uninstall fn; call on HMR dispose / test teardown; resetinstalledflag (prevents SPA/test listener leak)src/synthorg/communication/event_stream/stream.py:285-- add__del__cancellation safety net for_janitor_taskso test/tool contexts that skipstop()don't leakSlot 126 -- Currency aggregation invariant
src/synthorg/budget/forecast_history.py:108-- add assert_currencies_match before currency aggregation in _build_indexSlot 133 -- Idempotency / retry safety
src/synthorg/api/controllers/approvals/decisions.py:96-- add X-Idempotency-Key header; wrap store.add in IdempotencyService.run_idempotentsrc/synthorg/workers/__main__.py:251-- pass seen_claims=SeenClaimsRepository to run_worker_pool in standalone workersrc/synthorg/meta/mcp/handlers/infrastructure/backup.py:120-- require idempotency_key arg; wrap create_backup in IdempotencyService.run_idempotentsrc/synthorg/api/controllers/backup.py:319-- add Idempotency-Key header; wrap restore_from_backup in IdempotencyService.run_idempotentSlot 134 -- Clock-seam injection
src/synthorg/observability/background_tasks.py:181-- replace bare time.monotonic() with injected Clock.monotonic()src/synthorg/integrations/rate_limiting/shared_state.py:48-- replace bare datetime.now() with injected Clock.now()Gate 16 -- Graceful shutdown + lifecycle-lock + probes
Slot 102 -- Graceful shutdown
src/synthorg/api/lifecycle_runner_shutdown.py:373-- add explicit timeout= to _try_stop for notification_dispatcher.aclose()src/synthorg/api/lifecycle_runner_shutdown.py:378-- wrap a2a_client_obj.aclose() in asyncio.wait_for with budget constantsrc/synthorg/api/state.py:95-- drain/cancel _objective_background_tasks and _brownfield_background_tasks on shutdownsrc/synthorg/api/lifecycle_runner_shutdown.py:215-- add explicit timeout= to _try_stop for event_stream_hub.stop()src/synthorg/api/lifecycle_runner_shutdown.py:221-- add explicit timeout= to _try_stop for health_prober.stop()src/synthorg/api/lifecycle_runner_shutdown.py:229-- add explicit timeout= to _try_stop for escalation_notify_subscriber.stop()src/synthorg/api/lifecycle_runner_shutdown.py:234-- add explicit timeout= to _try_stop for escalation_sweeper.stop()src/synthorg/api/lifecycle_runner_shutdown.py:249-- add explicit timeout= to _try_stop for oauth_token_manager.stop()src/synthorg/api/lifecycle_runner_shutdown.py:255-- add explicit timeout= to _try_stop for health_prober_service.stop()src/synthorg/api/lifecycle_runner_shutdown.py:261-- add explicit timeout= to _try_stop for webhook_event_bridge.stop()src/synthorg/api/lifecycle_runner_shutdown.py:271-- add explicit timeout= to _try_stop for mcp_bridge_factory.shutdown()src/synthorg/api/lifecycle_runner_shutdown.py:185-- add explicit timeout= to _try_stop for training memory backend disconnect()src/synthorg/api/signals.py:55-- install SIGTERM/SIGINT handlers on win32 via loop.add_signal_handler or threading.signalsrc/synthorg/api/lifecycle_shared.py:123-- add event_stream_hub, integration services, health_prober to _cleanup_on_failure paramsSlot 106 -- Health/readiness probes
docker/backend/Dockerfile:147-- change HEALTHCHECK endpoint from /readyz to /healthzSlot 127 -- Lifecycle-lock pattern (confirmed only)
src/synthorg/integrations/rate_limiting/shared_state.py:156-- add _lifecycle_lock + asyncio.wait_for drain timeout + _stop_failed flagsrc/synthorg/integrations/oauth/token_manager.py:187-- add _lifecycle_lock + asyncio.wait_for drain timeout + _stop_failed flagsrc/synthorg/engine/workflow/webhook_bridge.py:226-- add _lifecycle_lock + asyncio.wait_for drain timeout + _stop_failed flagsrc/synthorg/budget/quota_poller.py:88-- add _lifecycle_lock + asyncio.wait_for drain timeout + _stop_failed flagsrc/synthorg/notifications/dispatcher.py:224-- add _lifecycle_lock + asyncio.wait_for drain timeout + _stop_failed flagsrc/synthorg/communication/bus/nats.py:161-- add _lifecycle_lock + asyncio.wait_for drain timeout + _stop_failed flagsrc/synthorg/backup/service.py:112-- add _lifecycle_lock + asyncio.wait_for drain timeout + _stop_failed flag