Skip to content

Backend runtime correctness + observability #2402

Description

@Aureliolo

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 kwarg
  • src/synthorg/engine/brownfield/scanner/node_scanner.py:71 -- log JSONDecodeError before swallowing; add logger.warning + error_type kwarg
  • src/synthorg/engine/brownfield/scanner/rust_scanner.py:65 -- log TOMLDecodeError before swallowing; add logger.warning + error_type kwarg

Slot 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 constant
  • src/synthorg/client/feedback/adversarial.py:53 -- replace f-string event name with observability.events constant
  • src/synthorg/client/generators/dataset.py:51 -- replace f-string event name with observability.events constant
  • src/synthorg/engine/middleware/models.py:207 -- replace f-string event name with observability.events constant
  • src/synthorg/engine/middleware/models.py:211 -- replace f-string event name with observability.events constant
  • src/synthorg/hr/evaluation/external_benchmark_registry.py:58 -- replace f-string event name with observability.events constant
  • src/synthorg/hr/evaluation/external_benchmark_registry.py:78 -- replace f-string event name with observability.events constant

Slot 04 -- Missing state-transition log

  • src/synthorg/engine/workflow/execution_service.py:199 -- emit *_STATUS_TRANSITIONED after RUNNING/COMPLETED initial transition
  • src/synthorg/api/controllers/requests/lifecycle.py:208 -- emit *_STATUS_TRANSITIONED after submit_request persistence write
  • src/synthorg/meta/charter/_charter_crud.py:228 -- emit *_STATUS_TRANSITIONED after _close_conversation persistence write
  • src/synthorg/meta/charter/_charter_crud.py:134 -- replace wrong event constant with correct *_STATUS_TRANSITIONED pattern
  • src/synthorg/hr/registry.py:745 -- emit *_STATUS_TRANSITIONED after apply_autonomy_level persistence write
  • src/synthorg/hr/promotion/service.py:418 -- replace wrong event pattern with *_STATUS_TRANSITIONED after persistence write
  • src/synthorg/meta/chief_of_staff/_intake_parking.py:284 -- replace wrong event with *_STATUS_TRANSITIONED for reject_conversational_proposal

Slot 05 -- Observability completeness

  • src/synthorg/providers/base.py:245 -- add cost recording call inside stream() after all chunks consumed
  • src/synthorg/engine/task_engine_apply.py:65 -- add task-transition counter increment on state change
  • src/synthorg/engine/coordination/_dispatch_helpers.py:291 -- add coordination.wave OTel span around wave dispatch
  • src/synthorg/api/controllers/users/org_roles.py:148 -- add principal= kwarg to audit events
  • src/synthorg/engine/coordination/wave_dispatcher.py:136 -- add coordination.dispatch OTel span
  • src/synthorg/observability/audit_chain/sink.py:197 -- add signing for config.* events in AuditChainSink

Gate 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 kwarg
  • src/synthorg/engine/pipeline/service.py:334 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/engine/pipeline/service.py:338 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/engine/pipeline/service.py:433 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/engine/pipeline/service.py:502 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/engine/pipeline/service.py:516 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/engine/pipeline/service.py:551 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/engine/pipeline/service.py:554 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/engine/pipeline/service.py:561 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/engine/decomposition/service.py:63 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/engine/decomposition/service.py:73 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/engine/workflow/execution_service.py:497 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/engine/workflow/execution_service.py:506 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/engine/workflow/execution_service.py:509 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/engine/workflow/execution_service.py:515 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/engine/workflow/execution_service.py:521 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/providers/routing/selector.py:101 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/providers/routing/selector.py:155 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/providers/management/preset_override_service.py:107 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/providers/management/preset_override_service.py:215 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/providers/management/preset_override_service.py:221 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/providers/management/refresh_scheduler.py:217 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/api/auto_wire_meetings.py:232 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/api/lifecycle_helpers/toolsmith_wiring.py:158 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/api/lifecycle_helpers/toolsmith_wiring.py:190 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/workers/worker.py:191 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/workers/seen_claims_pruner.py:74 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/workers/dead_letter.py:189 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/workers/claim.py:232 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/workers/claim.py:381 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/workers/claim.py:427 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/workers/claim.py:446 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/workers/claim.py:513 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/workers/claim.py:677 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/workers/claim.py:700 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/organization/services.py:95 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/organization/services.py:631 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/organization/services.py:637 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/organization/services.py:662 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/organization/services.py:668 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/infrastructure/services/_status_facades.py:61 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/infrastructure/services/_status_facades.py:129 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/infrastructure/services/_status_facades.py:166 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/infrastructure/services/_status_facades.py:211 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/infrastructure/services/_status_facades.py:239 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/infrastructure/services/_read_facades.py:338 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/infrastructure/services/_read_facades.py:356 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/infrastructure/services/_read_facades.py:374 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/knowledge/loaders/repo.py:116 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/knowledge/factory.py:50 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/knowledge/factory.py:57 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/project_brain/indexer.py:153 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/project_brain/writer.py:199 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/project_brain/writer.py:215 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/project_brain/writer.py:243 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/project_brain/writer.py:263 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/project_brain/writer.py:273 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/project_brain/service.py:278 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/project_brain/service.py:322 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/project_brain/service.py:363 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/project_brain/service.py:400 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/project_brain/service.py:542 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/project_brain/service.py:589 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/research/service.py:300 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/research/synthesis/citation_binder.py:40 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/research/synthesis/citation_binder.py:49 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/research/synthesis/llm_synthesizer.py:97 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/research/factory.py:93 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/research/factory.py:157 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/integrations/connections/types/a2a_peer.py:54 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/integrations/mcp_facades/_ontology.py:35 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/integrations/mcp_facades/_ontology.py:57 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/integrations/mcp_facades/_ontology.py:78 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/integrations/mcp_facades/_ontology.py:99 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/integrations/mcp_facades/_catalog.py:53 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/integrations/mcp_facades/_catalog.py:74 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/integrations/mcp_facades/_catalog.py:96 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/integrations/mcp_facades/_catalog.py:124 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/integrations/mcp_facades/_catalog.py:155 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/integrations/webhooks/service.py:45 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/integrations/webhooks/service.py:48 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/a2a/gateway.py:992 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/a2a/gateway.py:1029 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/a2a/gateway.py:1045 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/a2a/well_known.py:389 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/ontology/service.py:208 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/ontology/decorator.py:218 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/charter/_charter_crud.py:70 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/charter/_charter_crud.py:124 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/charter/_charter_crud.py:189 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/charter/_charter_crud.py:198 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/charter/dispatch.py:194 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/charter/dispatch.py:202 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/charter/dispatch.py:263 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/charter/dispatch.py:284 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/charter/dispatch.py:404 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/charter/service.py:234 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/charter/service.py:236 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/charter/strategy.py:169 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/chief_of_staff/group_chat.py:198 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/chief_of_staff/group_chat.py:200 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/chief_of_staff/group_chat.py:202 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/chief_of_staff/group_chat.py:224 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/chief_of_staff/group_chat.py:226 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/chief_of_staff/group_chat.py:264 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/chief_of_staff/actor.py:153 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/chief_of_staff/propose.py:298 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/chief_of_staff/propose.py:306 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/chief_of_staff/propose.py:308 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/chief_of_staff/propose.py:391 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/reports/service.py:91 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/reports/service.py:94 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/reports/service.py:151 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/reports/service.py:209 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/rollout/before_after.py:54 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/rollout/regression/welch.py:88 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/rollout/regression/welch.py:107 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/toolsmith/strategy.py:121 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/toolsmith/strategy.py:192 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/toolsmith/strategy.py:236 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/toolsmith/strategy.py:239 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/toolsmith/validation_gate.py:235 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/meta/toolsmith/cycle_scheduler.py:225 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/tools/external_api/external_api_tool.py:164 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/tools/browser/browser_tool.py:367 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/tools/browser/browser_tool.py:466 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/tools/browser/browser_tool.py:509 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/tools/browser/browser_tool.py:704 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/tools/browser/browser_tool.py:1075 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/tools/browser/browser_tool.py:1088 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/tools/browser/browser_tool.py:1098 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/tools/browser/browser_tool.py:1110 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/tools/browser/browser_tool.py:1116 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/tools/sandbox/docker_sandbox.py:679 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/tools/sandbox/docker_sandbox.py:686 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/tools/invoker.py:995 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/hr/promotion/service.py:291 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/memory/fine_tune_admin_service.py:217 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/memory/fine_tune_admin_service.py:218 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/hr/performance/composite_quality_strategy.py:171 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/communication/bus/nats.py:178 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/communication/bus/_nats_kv.py:186 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/communication/event_stream/stream.py:281 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/communication/meetings/service.py:110 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/communication/meetings/service.py:119 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/communication/async_tasks/service.py:275 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/communication/delegation/service.py:200 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/communication/delegation/service.py:206 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/backup/service.py:451 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/backup/service_archive.py:498 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/backup/service_archive.py:506 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/security/visionverify/verifiers/_image.py:38 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/security/visionverify/verifiers/_image.py:43 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/security/visionverify/verifiers/_image.py:46 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/security/visionverify/verifiers/_image.py:67 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/security/autonomy/change_strategy_factory.py:78 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/security/autonomy/change_strategy_factory.py:104 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/config/loader.py:144 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/config/loader.py:301 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/config/loader.py:397 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/docs_engine/service.py:267 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/docs_engine/service.py:389 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/docs_engine/service.py:409 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/docs_engine/service.py:445 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/docs_engine/service.py:513 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/docs_engine/service.py:526 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/docs_engine/slug.py:55 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/telemetry/reporters/logfire.py:98 -- add logger.warning before raise; include error_type kwarg
  • src/synthorg/engine/pipeline/entry/boot.py:115 -- add logger.warning before raise; include error_type kwarg

Gate 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 module
  • src/synthorg/engine/intervention/plan_steering.py:89 -- remove runtime deferred import; use protocol/forward-ref instead
  • src/synthorg/persistence/charter_protocol.py:20 -- break cycle via meta.charter.init; import concrete only under TYPE_CHECKING
  • src/synthorg/persistence/charter_protocol.py:21 -- break cycle via meta.charter.init; import concrete only under TYPE_CHECKING
  • src/synthorg/communication/meeting/_prompts.py:6 -- document cold-import cycle or restructure to avoid it
  • src/synthorg/engine/compaction/__init__.py:13 -- add protocol to cold-import exclusion or restructure
  • src/synthorg/engine/compaction/__init__.py:14 -- add protocol to cold-import exclusion or restructure
  • src/synthorg/workers/claim.py:61 -- remove redundant guard; align comment with actual cycle structure
  • src/synthorg/engine/coordination/factory.py:39 -- narrow TYPE_CHECKING block to genuinely cycle-breaking imports only
  • src/synthorg/engine/coordination/factory.py:57 -- narrow TYPE_CHECKING block to genuinely cycle-breaking imports only

Slot 63 -- Persistence boundary deep violations

  • src/synthorg/tools/database/sql_query.py:254 -- move transaction management into persistence layer; remove direct aiosqlite usage
  • src/synthorg/tools/database/schema_inspect.py:194 -- use SQLite double-quoting for identifier; replace f-string PRAGMA interpolation
  • src/synthorg/tools/database/sql_query.py:265 -- wrap write path in explicit transaction to prevent silent rollback on fetchmany raise

Slot 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 abstraction

Slot 66 -- Queue boundary leaks

  • src/synthorg/communication/event_stream/stream.py:410 -- replace leaked asyncio.Queue with queue backend protocol; remove cross-boundary exposure

Slot 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 directly
  • src/synthorg/api/controllers/_conversational_resume.py:476 -- move invite_repo.transition_if call into service layer
  • src/synthorg/api/controllers/_conversational_resume.py:581 -- move participant_repo.save call into service layer
  • src/synthorg/api/controllers/workflow_executions.py:99 -- move per-request service construction into DI wiring; not in controller
  • src/synthorg/api/controllers/_webhooks_wiring.py:188 -- move lazy persistence wiring out of controller; wire at startup
  • src/synthorg/api/controllers/analytics/overview.py:147 -- route through service layer; remove direct persistence.tasks.query call
  • src/synthorg/api/controllers/analytics/trends.py:138 -- route through service layer; remove direct persistence.tasks.query call
  • src/synthorg/api/controllers/training.py:299 -- route through service layer; remove multiple direct persistence reads

Slot 69 -- Hardcoded backend selection

  • src/synthorg/observability/prometheus_collector.py:286 -- replace string comparison with backend protocol discriminator or enum
  • src/synthorg/integrations/connections/types/database.py:66 -- replace dialect != "sqlite" string comparison with protocol/enum check

Slot 72 -- Dependency inversion violations (concrete types instead of Protocols)

  • src/synthorg/engine/pipeline/service.py:128 -- replace AgentRegistryService with AgentRegistryProtocol in type annotation
  • src/synthorg/engine/identity/store/append_only.py:38 -- replace concrete type with protocol in constructor annotation
  • src/synthorg/engine/identity/store/copy_on_write.py:39 -- replace concrete type with protocol in constructor annotation
  • src/synthorg/engine/classification/semantic_detectors.py:229 -- replace BaseCompletionProvider with CompletionProvider protocol
  • src/synthorg/engine/classification/pipeline.py:152 -- replace concrete type with protocol in annotation
  • src/synthorg/engine/classification/pipeline.py:192 -- replace concrete type with protocol in annotation
  • src/synthorg/engine/classification/pipeline.py:225 -- replace concrete type with protocol in annotation
  • src/synthorg/engine/classification/pipeline.py:287 -- replace concrete type with protocol in annotation
  • src/synthorg/engine/classification/pipeline.py:359 -- replace concrete type with protocol in annotation
  • src/synthorg/engine/classification/pipeline.py:443 -- replace concrete type with protocol in annotation
  • src/synthorg/communication/meeting/orchestrator.py:125 -- replace ConfigResolver with ConfigResolverProtocol
  • src/synthorg/communication/conflict_resolution/escalation/sweeper.py:45 -- replace concrete type with protocol in annotation
  • src/synthorg/communication/meeting/agent_caller.py:78 -- replace concrete type with protocol in annotation
  • src/synthorg/api/bootstrap.py:96 -- replace concrete type with protocol in annotation
  • src/synthorg/api/services/org_mutations.py:76 -- replace SettingsService with SettingsServiceProtocol
  • src/synthorg/api/services/_org_department_mutations.py:51 -- replace concrete type with protocol in annotation
  • src/synthorg/api/controllers/meta.py:70 -- replace concrete type with protocol in annotation
  • src/synthorg/api/controllers/settings/_sinks.py:210 -- replace concrete type with protocol in annotation
  • src/synthorg/api/controllers/settings/security.py:63 -- replace concrete type with protocol in annotation
  • src/synthorg/api/controllers/setup/_status_checks.py:77 -- replace concrete type with protocol in annotation
  • src/synthorg/api/controllers/setup/_status_checks.py:107 -- replace concrete type with protocol in annotation
  • src/synthorg/api/controllers/setup/completion.py:73 -- replace concrete type with protocol in annotation
  • src/synthorg/api/controllers/setup/completion.py:130 -- replace concrete type with protocol in annotation
  • src/synthorg/api/controllers/setup/completion.py:168 -- replace concrete type with protocol in annotation

Slot 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 protocol
  • src/synthorg/api/auth/user_service.py:30 -- replace DEFAULT_LIST_LIMIT import from persistence._shared with domain constant
  • src/synthorg/api/webhook_cleanup.py:32 -- replace paginate import from persistence._shared with service-layer helper
  • src/synthorg/api/lifecycle_helpers/bootstrap.py:22 -- replace paginate import from persistence._shared with service-layer helper
  • src/synthorg/hr/persistence_protocol.py:17 -- replace DEFAULT_LIST_LIMIT import from persistence._shared with domain constant
  • src/synthorg/hr/offboarding_service.py:43 -- replace paginate import from persistence._shared with service-layer helper
  • src/synthorg/communication/loop_prevention/circuit_breaker.py:19 -- replace collect_all import from persistence._shared with service-layer helper
  • src/synthorg/communication/conflict_resolution/escalation/in_memory_store.py:31 -- replace parse_iso_utc import from persistence._shared; use core datetime util
  • src/synthorg/ontology/service.py:23 -- replace collect_all_mapping import from persistence._shared with service helper
  • src/synthorg/ontology/drift/__init__.py:14 -- remove re-export of concrete SQLiteOntologyDriftReportRepository from non-persistence module
  • src/synthorg/engine/workflow/service.py:38 -- replace DEFAULT_LIST_LIMIT import from persistence._shared with domain constant
  • src/synthorg/engine/workflow/execution_service.py:79 -- replace DEFAULT_LIST_LIMIT import from persistence._shared with domain constant
  • src/synthorg/engine/workflow/execution_lifecycle.py:47 -- replace DEFAULT_LIST_LIMIT import from persistence._shared with domain constant
  • src/synthorg/engine/workflow/subworkflow_service.py:49 -- replace collect_all import from persistence._shared with service-layer helper
  • src/synthorg/engine/workflow/subworkflow_registry.py:51 -- replace DEFAULT_LIST_LIMIT, MAX_LIST_LIMIT, collect_all from persistence._shared
  • src/synthorg/engine/classification/loaders.py:23 -- replace paginate import from persistence._shared with service-layer helper
  • src/synthorg/integrations/connections/_cache.py:19 -- replace paginate import from persistence._shared with service-layer helper
  • src/synthorg/integrations/mcp_catalog/in_memory_installations.py:24 -- replace validate_pagination_args import from persistence._shared
  • src/synthorg/providers/management/_capability_helpers.py:14 -- replace format_iso_utc import from persistence._shared; use core datetime util
  • src/synthorg/backup/retention.py:26 -- replace parse_iso_utc import from persistence._shared; use core datetime util
  • src/synthorg/tools/database/sql_query.py:21 -- remove direct aiosqlite import outside persistence boundary
  • src/synthorg/tools/database/schema_inspect.py:11 -- remove direct aiosqlite import outside persistence boundary

Gate 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) kwargs
  • src/synthorg/engine/approval_gate.py:250 -- add error_type=type(exc).name and error=safe_error_description(exc) kwargs
  • src/synthorg/engine/approval_gate.py:290 -- add error_type=type(exc).name and error=safe_error_description(exc) kwargs
  • src/synthorg/engine/approval_gate.py:434 -- add error_type=type(exc).name and error=safe_error_description(exc) kwargs
  • src/synthorg/engine/approval_gate.py:462 -- add error_type=type(exc).name and error=safe_error_description(exc) kwargs
  • src/synthorg/memory/procedural/evolver.py:143 -- add error_type=type(exc).name and error=safe_error_description(exc) kwargs
  • src/synthorg/hr/scaling/guards/composite.py:61 -- add error_type=type(exc).name and error=safe_error_description(exc) kwargs
  • src/synthorg/settings/dispatcher.py:610 -- add error_type=type(exc).name and error=safe_error_description(exc) kwargs
  • src/synthorg/settings/dispatcher.py:647 -- add error_type=type(exc).name and error=safe_error_description(exc) kwargs

Slot 34 -- Error handling consistency (non-DomainError raised in controllers)

  • src/synthorg/api/controllers/webhooks/_shared.py:395 -- replace TypeError with appropriate DomainError subclass
  • src/synthorg/api/controllers/webhooks/retry.py:136 -- replace TypeError with appropriate DomainError subclass
  • src/synthorg/api/controllers/approvals/_notify.py:74 -- replace RuntimeError with appropriate DomainError subclass
  • src/synthorg/api/controllers/_custom_rules_helpers.py:289 -- replace ValueError with appropriate DomainError subclass

Slot 112 -- Duplicate error codes

  • src/synthorg/engine/errors.py:369 -- assign unique ErrorCode to TaskEngineNotRunning; remove SERVICE_UNAVAILABLE collision with QueueFull
  • src/synthorg/engine/errors.py:379 -- assign unique ErrorCode to QueueFull; remove SERVICE_UNAVAILABLE collision with TaskEngineNotRunning
  • src/synthorg/meta/errors.py:162 -- assign RESOURCE_NOT_FOUND (or a new code) to GroupParticipantUnknownError; not VALIDATION_ERROR
  • src/synthorg/meta/errors.py:116 -- assign unique ErrorCode to feature-unavailable error; remove SERVICE_UNAVAILABLE collision
  • src/synthorg/meta/errors.py:148 -- assign unique ErrorCode to feature-unavailable error; remove SERVICE_UNAVAILABLE collision
  • src/synthorg/meta/errors.py:289 -- assign unique ErrorCode to feature-unavailable error; remove SERVICE_UNAVAILABLE collision
  • src/synthorg/memory/service.py:107 -- assign unique ErrorCode to CheckpointNotFound; remove RECORD_NOT_FOUND collision with FineTuneRunNotFound
  • src/synthorg/memory/service.py:153 -- assign unique ErrorCode to FineTuneRunNotFound; remove RECORD_NOT_FOUND collision with CheckpointNotFound
  • src/synthorg/hr/errors.py:99 -- assign unique ErrorCode to AgentNotFound; remove RESOURCE_NOT_FOUND collision
  • src/synthorg/hr/errors.py:184 -- assign unique ErrorCode to PersonalityNotFound; remove RESOURCE_NOT_FOUND collision
  • src/synthorg/hr/errors.py:200 -- assign unique ErrorCode to TrainingSessionNotFound; remove RESOURCE_NOT_FOUND collision

Slot 147 -- Error mapping inconsistency

  • src/synthorg/api/controllers/escalations.py:171 -- replace NotFoundError with SERVICE_UNAVAILABLE DomainError for unwired store
  • src/synthorg/api/controllers/escalations.py:219 -- replace NotFoundError with SERVICE_UNAVAILABLE DomainError for unwired store
  • src/synthorg/api/controllers/escalations.py:274 -- replace NotFoundError with SERVICE_UNAVAILABLE DomainError for unwired store
  • src/synthorg/api/controllers/escalations.py:315 -- register EscalationDecisionError in error handler map
  • src/synthorg/api/controllers/escalations.py:398 -- replace NotFoundError with SERVICE_UNAVAILABLE DomainError for unwired store
  • src/synthorg/api/controllers/ontology/admin.py:73 -- return 503 (not 200 OK) when ontology service is unwired
  • src/synthorg/api/controllers/ontology/drift.py:80 -- return 503 (not 200 empty) when drift store is unwired
  • src/synthorg/api/controllers/ontology/drift.py:124 -- return 503 (not 200 empty) when drift store is unwired
  • src/synthorg/api/controllers/ontology/drift.py:149 -- return 503 (not 200 OK) when drift service is unwired
  • src/synthorg/api/controllers/memory/fine_tune.py:190 -- return 503 (not IDLE 200) when fine-tune orchestrator is None
  • src/synthorg/api/controllers/webhooks/retry.py:136 -- replace TypeError with DomainError; return RFC 9457 error body
  • src/synthorg/api/controllers/metrics.py:46 -- add comment explaining plain-text 503/500 intentional RFC 9457 bypass

Gate 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_directive
  • src/synthorg/engine/prompt_template.py:213 -- replace prose disclaimer with untrusted_content_directive for org_policies block
  • src/synthorg/engine/hybrid/step_helpers.py:102 -- replace hand-rolled directive with canonical untrusted_content_directive call
  • src/synthorg/engine/prompt_validation.py:244 -- wrap agent_name and task_id with wrap_untrusted in inject_async_task_section
  • src/synthorg/engine/loop_tool_execution.py:68 -- add import-time assertion linking FENCE_TAGS to TAG* constants registry

Slot 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 success
  • src/synthorg/meta/mcp/handlers/brain.py:173 -- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on success
  • src/synthorg/meta/mcp/handlers/brain.py:207 -- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on success
  • src/synthorg/meta/mcp/handlers/brain.py:241 -- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on success
  • src/synthorg/meta/mcp/handlers/charter.py:196 -- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on success
  • src/synthorg/meta/mcp/handlers/charter.py:226 -- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on success
  • src/synthorg/meta/mcp/handlers/cockpit.py:161 -- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on success
  • src/synthorg/meta/mcp/handlers/cockpit.py:194 -- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on success
  • src/synthorg/meta/mcp/handlers/cockpit.py:239 -- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on success
  • src/synthorg/meta/mcp/handlers/cockpit.py:286 -- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on success
  • src/synthorg/meta/mcp/handlers/docs.py:82 -- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on success
  • src/synthorg/meta/mcp/handlers/knowledge.py:120 -- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on success
  • src/synthorg/meta/mcp/handlers/knowledge.py:151 -- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on success
  • src/synthorg/meta/mcp/handlers/knowledge.py:233 -- capture require_admin_guardrails() return value; emit MCP_ADMIN_OP_EXECUTED on success
  • src/synthorg/meta/mcp/handlers/meta.py:102 -- remove persistence bypass fallback; route through service layer
  • src/synthorg/meta/mcp/handlers/budget.py:75 -- remove persistence bypass fallback; route through service layer

Slot 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 fence

Slot 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.save
  • src/synthorg/api/auth/controllers/bootstrap.py:140 -- emit SECURITY_AUTH_TOKEN_ISSUED after create_token on setup path
  • src/synthorg/api/auth/controllers/credentials.py:136 -- emit SECURITY_AUTH_TOKEN_ISSUED after create_token on password-change path
  • src/synthorg/integrations/connections/mcp_service.py:88 -- replace COMMUNICATION_CONNECTION_CREATED with SECURITY_CONNECTION_CREATED
  • src/synthorg/integrations/connections/mcp_service.py:112 -- replace COMMUNICATION_CONNECTION_DELETED with SECURITY_CONNECTION_DELETED
  • src/synthorg/security/autonomy/change_strategy.py:73 -- move SECURITY_AUTONOMY_PROMOTION_DENIED emission to after persistence write in _handle_pending

Gate 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 path

Slot 67 -- Process spawn leaks

  • src/synthorg/telemetry/host_info.py:300 -- move aiodocker.Docker() inside sandbox boundary; never open outside sandbox
  • src/synthorg/engine/workspace/environment/image_builder.py:121 -- add path-containment check before subprocess launch
  • src/synthorg/persistence/postgres/backup_utils.py:418 -- replace os.environ.copy() in pg_restore_list with explicit minimal env dict

Slot 97 -- Memory leak patterns (confirmed only)

  • src/synthorg/providers/base.py:585 -- cancel and await the background task on provider shutdown to prevent leak
  • src/synthorg/api/controllers/brownfield.py:105 -- cancel background tasks on request cancellation / shutdown
  • src/synthorg/api/controllers/objectives.py:120 -- cancel background tasks on request cancellation / shutdown
  • src/synthorg/api/controllers/requests/pipeline.py:67 -- cancel background tasks on request cancellation / shutdown
  • src/synthorg/api/controllers/tasks.py:158 -- cancel background tasks on request cancellation / shutdown
  • web/src/stores/websocket/transport.ts:44 -- clear reconnect timer in cleanup / dispose path to prevent leak
  • web/src/lib/global-error-handlers.ts:53 -- return an uninstall fn; call on HMR dispose / test teardown; reset installed flag (prevents SPA/test listener leak)
  • src/synthorg/communication/event_stream/stream.py:285 -- add __del__ cancellation safety net for _janitor_task so test/tool contexts that skip stop() don't leak

Slot 126 -- Currency aggregation invariant

  • src/synthorg/budget/forecast_history.py:108 -- add assert_currencies_match before currency aggregation in _build_index

Slot 133 -- Idempotency / retry safety

  • src/synthorg/api/controllers/approvals/decisions.py:96 -- add X-Idempotency-Key header; wrap store.add in IdempotencyService.run_idempotent
  • src/synthorg/workers/__main__.py:251 -- pass seen_claims=SeenClaimsRepository to run_worker_pool in standalone worker
  • src/synthorg/meta/mcp/handlers/infrastructure/backup.py:120 -- require idempotency_key arg; wrap create_backup in IdempotencyService.run_idempotent
  • src/synthorg/api/controllers/backup.py:319 -- add Idempotency-Key header; wrap restore_from_backup in IdempotencyService.run_idempotent

Slot 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 constant
  • src/synthorg/api/state.py:95 -- drain/cancel _objective_background_tasks and _brownfield_background_tasks on shutdown
  • src/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.signal
  • src/synthorg/api/lifecycle_shared.py:123 -- add event_stream_hub, integration services, health_prober to _cleanup_on_failure params

Slot 106 -- Health/readiness probes

  • docker/backend/Dockerfile:147 -- change HEALTHCHECK endpoint from /readyz to /healthz

Slot 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 flag
  • src/synthorg/integrations/oauth/token_manager.py:187 -- add _lifecycle_lock + asyncio.wait_for drain timeout + _stop_failed flag
  • src/synthorg/engine/workflow/webhook_bridge.py:226 -- add _lifecycle_lock + asyncio.wait_for drain timeout + _stop_failed flag
  • src/synthorg/budget/quota_poller.py:88 -- add _lifecycle_lock + asyncio.wait_for drain timeout + _stop_failed flag
  • src/synthorg/notifications/dispatcher.py:224 -- add _lifecycle_lock + asyncio.wait_for drain timeout + _stop_failed flag
  • src/synthorg/communication/bus/nats.py:161 -- add _lifecycle_lock + asyncio.wait_for drain timeout + _stop_failed flag
  • src/synthorg/backup/service.py:112 -- add _lifecycle_lock + asyncio.wait_for drain timeout + _stop_failed flag

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions