docs(wp5): public-facing truth refresh#1924
Conversation
Dependency Review✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.OpenSSF Scorecard
Scanned Files
|
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository UI Review profile: ASSERTIVE Plan: Pro Run ID: 📒 Files selected for processing (2)
📜 Recent review details⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (13)
🧰 Additional context used📓 Path-based instructions (3)**/*.md📄 CodeRabbit inference engine (CLAUDE.md)
Files:
src/synthorg/**/*.py📄 CodeRabbit inference engine (CLAUDE.md)
Files:
src/**/*.py⚙️ CodeRabbit configuration file
Files:
🧠 Learnings (1)📚 Learning: 2026-05-05T09:04:46.195ZApplied to files:
🔇 Additional comments (2)
WalkthroughThis PR refreshes public-facing documentation and data (runtime stats, README, competitors), corrects roadmap/site claims and autonomy-tier wording, clarifies multiple design and guide documents, adds a Cross-provider Fallback config example and persistence tuning, expands Litestar Parameter metadata across many API controllers (updating generated OpenAPI TypeScript JSDoc), relaxes two validation tests to accept 400/422, and configures documentation redirect mappings plus Caddy legacy redirects and docs-build dependency. 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/roadmap/index.md`:
- Line 5: Replace the hardcoded rounded test count in docs/roadmap/index.md with
the exact value sourced from data/runtime_stats.yaml by using the RS marker for
tests: change the current `<!--RS:tests-->30,000+<!--/RS-->` fragment to
`<!--RS:tests-->30,536<!--/RS-->` (i.e., bind the numeric token named "tests" to
the value emitted from data/runtime_stats.yaml) so the page uses the canonical
runtime_stats "tests" value; ensure the marker name "tests" matches the key in
data/runtime_stats.yaml and that the doc generation pipeline recognizes
<!--RS:tests-->...<!--/RS--> markers.
In `@src/synthorg/api/controllers/meta_analytics.py`:
- Around line 117-122: Replace the hardcoded literal default in the Parameter
declaration for min_deployments with the module constant: change default=3 to
default=_DEFAULT_MIN_DEPLOYMENTS_FLOOR in the min_deployments Parameter (the
declaration using Parameter(..., ge=1, le=100, description=...)) so the
parameter uses the existing module-level constant _DEFAULT_MIN_DEPLOYMENTS_FLOOR
per the numeric-literal policy.
In `@src/synthorg/api/controllers/providers.py`:
- Around line 593-599: The preset_hint parameter description currently names
real vendors; update the description string for the Annotated parameter
preset_hint (in providers.py) to remove vendor names and use repository-approved
neutral examples (e.g., "example-provider" or "test-provider", or
"example-large-001") so the description reads something like "Canonical preset
hint (e.g. example-provider)." Ensure the change is made on the Annotated
preset_hint declaration to keep max_length and other Parameter settings
unchanged.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: d6b99a06-bafd-4cb5-a693-6a3a2bf8a3e6
⛔ Files ignored due to path filters (1)
uv.lockis excluded by!**/*.lock
📒 Files selected for processing (49)
README.mddata/competitors.yamldata/runtime_stats.yamldocs/design/a2a-protocol.mddocs/design/hr-lifecycle.mddocs/design/tools.mddocs/design/verification-quality.mddocs/guides/agent-management.mddocs/guides/budget.mddocs/guides/company-config.mddocs/guides/memory.mddocs/guides/workflow-api.mddocs/reference/cli-commands.mddocs/research/multi-agent-failure-audit.mddocs/research/s1-multi-agent-decision.mddocs/roadmap/future-vision.mddocs/roadmap/index.mddocs/user_guide.mdmkdocs.ymlpyproject.tomlscripts/generate_runtime_stats.pysite/src/components/FeatureShowcase.astrosite/src/pages/compare.astrosite/src/pages/index.astrosrc/synthorg/api/controllers/agent_identity_versions.pysrc/synthorg/api/controllers/approvals.pysrc/synthorg/api/controllers/audit.pysrc/synthorg/api/controllers/budget.pysrc/synthorg/api/controllers/budget_config_versions.pysrc/synthorg/api/controllers/ceremony_policy.pysrc/synthorg/api/controllers/company_versions.pysrc/synthorg/api/controllers/coordination_metrics.pysrc/synthorg/api/controllers/escalations.pysrc/synthorg/api/controllers/evaluation_config_versions.pysrc/synthorg/api/controllers/events.pysrc/synthorg/api/controllers/meetings.pysrc/synthorg/api/controllers/messages.pysrc/synthorg/api/controllers/meta_analytics.pysrc/synthorg/api/controllers/ontology.pysrc/synthorg/api/controllers/providers.pysrc/synthorg/api/controllers/requests.pysrc/synthorg/api/controllers/role_versions.pysrc/synthorg/api/controllers/subworkflows.pysrc/synthorg/api/controllers/tasks.pysrc/synthorg/api/controllers/workflow_versions.pytests/unit/api/controllers/test_approvals.pytests/unit/api/controllers/test_meetings.pyweb/Caddyfileweb/src/api/types/openapi.gen.ts
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (13)
- GitHub Check: Build Backend
- GitHub Check: Build Fine-Tune (gpu, fine-tune-gpu)
- GitHub Check: Build Fine-Tune (cpu, fine-tune-cpu)
- GitHub Check: Build Web Assets (melange)
- GitHub Check: Dashboard Test
- GitHub Check: Test (Python 3.14)
- GitHub Check: CodSpeed Python benchmarks
- GitHub Check: CodSpeed Web benchmarks
- GitHub Check: Lighthouse Site
- GitHub Check: Lighthouse Dashboard
- GitHub Check: Analyze (go)
- GitHub Check: Analyze (javascript-typescript)
- GitHub Check: Analyze (python)
🧰 Additional context used
📓 Path-based instructions (13)
**/*.md
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.md: Numerics in README and public docs must be sourced fromdata/runtime_stats.yamlvia markers; enforce Doc Numeric Claims
Use D2 for architecture / nested containers diagrams; use mermaid for flowcharts / sequence / pipelines; use Markdown tables for tabular data; D2 theme 200 (Dark Mauve), D2 CLI pinned to v0.7.1 in CI
Files:
docs/design/a2a-protocol.mdREADME.mddocs/research/multi-agent-failure-audit.mddocs/research/s1-multi-agent-decision.mddocs/guides/workflow-api.mddocs/roadmap/future-vision.mddocs/roadmap/index.mddocs/user_guide.mddocs/guides/memory.mddocs/design/hr-lifecycle.mddocs/design/tools.mddocs/guides/budget.mddocs/guides/agent-management.mddocs/design/verification-quality.mddocs/reference/cli-commands.mddocs/guides/company-config.md
src/synthorg/**/*.py
📄 CodeRabbit inference engine (CLAUDE.md)
src/synthorg/**/*.py: Configuration precedence: DB > env > code default viaSettingsService/ConfigResolver(Cat-1) or env > code default (Cat-2,read_only_post_init); Cat-3 bootstrap secrets are pure env at boot site; YAML is ingestion format only; noos.environ.getoutside startup; pre-init Cat-2 reads usesettings.bootstrap_resolver.resolve_init_value
No hardcoded numeric values; numerics live insettings/definitions/; allowlist 0/1/-1, HTTP codes, hex masks, powers-of-2, and module-level annotated named constants (NAME: int|float|Final|Final[int]|Final[float] = literal); enforced by scripts/check_no_magic_numbers.py
Comments should explain WHY only; no reviewer citations, issue back-refs, or migration framing; enforced by check_no_review_origin_in_code.py and check_no_migration_framing.py
Nofrom __future__ import annotations(Python 3.14 has PEP 649); use PEP 758 except:except A, B:no parens unless binding
Type hints required on public functions; mypy strict mode; use Google-style docstrings; line length 88; functions <50 lines; files <800 lines
Errors: use<Domain><Condition>Errorform inheriting fromDomainError; never inherit directly fromException/RuntimeError/etc; enforced by check_domain_error_hierarchy.py
Pydantic v2: use frozen +extra="forbid"on API DTOs (Request/Response/Snapshot/Result/Envelope/Status/Info/Summary suffixes); use@computed_fieldfor derived; useNotBlankStrfor identifiers
Use args models at every system boundary; useparse_typed()for every external dict ingestion; enforced by check_boundary_typed.py
Immutability: usemodel_copy(update=...)orcopy.deepcopy(); deepcopy at system boundaries
Async: useasyncio.TaskGroupfor fan-out/fan-in; helpers catchExceptionand re-raiseMemoryError/RecursionError
Clock seam: useclock: Clock | None = None; tests injectFakeClock; lifecycle: services own_lifecycle_lock; timed-out stops mark unrestartable
Untrusted content (SEC-1): use `wrap_u...
Files:
src/synthorg/api/controllers/messages.pysrc/synthorg/api/controllers/budget_config_versions.pysrc/synthorg/api/controllers/meetings.pysrc/synthorg/api/controllers/company_versions.pysrc/synthorg/api/controllers/events.pysrc/synthorg/api/controllers/tasks.pysrc/synthorg/api/controllers/approvals.pysrc/synthorg/api/controllers/subworkflows.pysrc/synthorg/api/controllers/coordination_metrics.pysrc/synthorg/api/controllers/role_versions.pysrc/synthorg/api/controllers/escalations.pysrc/synthorg/api/controllers/ceremony_policy.pysrc/synthorg/api/controllers/budget.pysrc/synthorg/api/controllers/meta_analytics.pysrc/synthorg/api/controllers/agent_identity_versions.pysrc/synthorg/api/controllers/requests.pysrc/synthorg/api/controllers/workflow_versions.pysrc/synthorg/api/controllers/evaluation_config_versions.pysrc/synthorg/api/controllers/audit.pysrc/synthorg/api/controllers/providers.pysrc/synthorg/api/controllers/ontology.py
src/**/*.py
⚙️ CodeRabbit configuration file
This project uses Python 3.14+ with PEP 758 except syntax: "except A, B:" (comma-separated, no parentheses) is correct and mandatory -- do NOT flag it as a typo or suggest parenthesized form. The "except builtins.MemoryError, RecursionError: raise" pattern is intentional project convention for system-error propagation. When evaluating the 50-line function limit, count only the function body excluding the signature lines, decorators, and docstring. Functions 1-5 lines over due to docstrings or multi-line signatures should not be flagged. Do not suggest extracting single-use helper functions called exactly once -- this reduces readability without improving maintainability.
Files:
src/synthorg/api/controllers/messages.pysrc/synthorg/api/controllers/budget_config_versions.pysrc/synthorg/api/controllers/meetings.pysrc/synthorg/api/controllers/company_versions.pysrc/synthorg/api/controllers/events.pysrc/synthorg/api/controllers/tasks.pysrc/synthorg/api/controllers/approvals.pysrc/synthorg/api/controllers/subworkflows.pysrc/synthorg/api/controllers/coordination_metrics.pysrc/synthorg/api/controllers/role_versions.pysrc/synthorg/api/controllers/escalations.pysrc/synthorg/api/controllers/ceremony_policy.pysrc/synthorg/api/controllers/budget.pysrc/synthorg/api/controllers/meta_analytics.pysrc/synthorg/api/controllers/agent_identity_versions.pysrc/synthorg/api/controllers/requests.pysrc/synthorg/api/controllers/workflow_versions.pysrc/synthorg/api/controllers/evaluation_config_versions.pysrc/synthorg/api/controllers/audit.pysrc/synthorg/api/controllers/providers.pysrc/synthorg/api/controllers/ontology.py
tests/**/*.py
📄 CodeRabbit inference engine (CLAUDE.md)
tests/**/*.py: Testing: use markers@pytest.mark.{unit,integration,e2e,slow}; async tests use auto; timeout 30s global; coverage 80% min
Windows: unit tests useWindowsSelectorEventLoopPolicy(3.14 IOCP teardown race); subprocess tests override back
Test doubles: use ladder from conventions.md; useFakeClockfor Clock seam,mock_of[T](**overrides)for typed-boundary substitutions,SimpleNamespacefor attribute-bags; bareMagicMockat typed boundary is blocked by check_mock_spec.py (zero-tolerance, no baseline)
ImportFakeClockandmock_offromtests._shared; inject viaclock=and helper's spec subscript
Flaky tests: NEVER skip/xfail; fix fundamentally; useasyncio.Event().wait()notsleep(large)
Files:
tests/unit/api/controllers/test_meetings.pytests/unit/api/controllers/test_approvals.py
⚙️ CodeRabbit configuration file
Test files do not require Google-style docstrings on classes or functions -- ruff D rules are only enforced on src/. A bare
@settings() decorator with no arguments on Hypothesis property tests is a no-op and should not be suggested -- the HYPOTHESIS_PROFILE env var controls example counts via registered profiles, which@given() honors automatically.
Files:
tests/unit/api/controllers/test_meetings.pytests/unit/api/controllers/test_approvals.py
tests/**/*test*.py
📄 CodeRabbit inference engine (CLAUDE.md)
Hypothesis: use 10 deterministic CI examples; failures are real bugs (fix + add
@example(...)) for property-based testing
Files:
tests/unit/api/controllers/test_meetings.pytests/unit/api/controllers/test_approvals.py
pyproject.toml
📄 CodeRabbit inference engine (CLAUDE.md)
Testing: xdist
-n 8 --dist=loadfileauto-applied via pyprojectaddopts(loadfile prevents 3.14+ Windows ProactorEventLoop leak)
Files:
pyproject.toml
src/synthorg/**/{app,main,startup}*.py
📄 CodeRabbit inference engine (CLAUDE.md)
src/synthorg/**/{app,main,startup}*.py: API startup lifecycle: construction phase (create_appbody) wires synchronous services; on_startup phase (_build_lifecycle.on_startup) wires services needing connected persistence backend
Construction-phase ordering invariants:agent_registrymust be built BEFOREauto_wire_meetings;tunnel_provideris wired unconditionally (not gated byintegrations.enabled)
On-startup ordering invariants:SettingsServiceauto-wire must precedeWorkflowExecutionObserverregistration;OntologyServicewires afterpersistence.connect()via_wire_ontology_service
Files:
src/synthorg/api/controllers/approvals.py
src/synthorg/**/provider*.py
📄 CodeRabbit inference engine (CLAUDE.md)
Resilience: provider calls go through
BaseCompletionProviderfor retry + rate limit; never implement retry in driver subclasses; retryable:RateLimitError,Provider{Timeout,Connection,Internal}Error
Files:
src/synthorg/api/controllers/providers.py
web/src/**/*.{tsx,ts}
📄 CodeRabbit inference engine (CLAUDE.md)
Reuse
web/src/components/ui/design tokens only in React web dashboard; see web/CLAUDE.md for Web Dashboard Design System
Files:
web/src/api/types/openapi.gen.ts
web/src/**/*.{ts,tsx}
📄 CodeRabbit inference engine (web/CLAUDE.md)
web/src/**/*.{ts,tsx}: Always usecreateLoggerfrom@/lib/logger; never use bareconsole.warn/console.error/console.debugin application code
Always use variable namelogfor logger instances (e.g.,const log = createLogger('module-name'))
Pass dynamic/untrusted values as separate args to logger (not interpolated into the message string) so they go throughsanitizeArg
Wrap attacker-controlled fields inside structured objects insanitizeForLog()before embedding in logs
Callers MUST NOT wrap store mutation calls intry/catch; the store owns the error UX
Display counts must come fromdata.length; the wire envelope no longer carriestotal
ImportErrorCodeandErrorCategoryfrom@/api/types/errors(re-exported fromweb/src/api/types/error-codes.gen.ts); discriminate onErrorCode.<NAME>, never on raw integer literals
Generated DTO types re-exportcomponents['schemas']['X']with no hand-written tightening because the generator handles response optionality
Import DTOs via the barrel (import type { AgentConfig } from '@/api/types') or directly from the generated module (import type { AgentConfig } from '@/api/types/dtos.gen')
ALWAYS reuse existing components fromweb/src/components/ui/before creating new ones
A PostToolUse hook (scripts/check_web_design_system.py) flags hardcoded hex/rgba/fonts/Motion durations/locale literals/bare.toLocale*String()calls/missing Storybook stories/duplicate component patterns/complex.map()blocks; fix every violation before proceeding
Forbid passing async functions where the callsite ignores the returned promise via@typescript-eslint/no-misused-promises(withchecksVoidReturn: { attributes: false }); React 19asyncevent handlers stay allowed
Files:
web/src/api/types/openapi.gen.ts
web/src/{stores,api}/**/*.{ts,tsx}
📄 CodeRabbit inference engine (web/CLAUDE.md)
Use cursor-based paging via
PaginationMetafor list endpoints; keepnextCursor+hasMorein state (not offset arithmetic) and early-return when!hasMore || !nextCursor
Files:
web/src/api/types/openapi.gen.ts
web/src/api/**/*.{ts,tsx}
📄 CodeRabbit inference engine (web/CLAUDE.md)
getLiveness()is always 200 while the process is alive;getReadiness()is 200 healthy / 503 unavailable (binary'ok' | 'unavailable'outcome, no tri-state). Any new caller must handle the 503 path explicitly.
Files:
web/src/api/types/openapi.gen.ts
web/src/api/types/**/*.gen.ts
📄 CodeRabbit inference engine (web/CLAUDE.md)
NEVER hand-edit a
*.gen.tsfile; regenerate withuv run python scripts/generate_dto_types_ts.py
Files:
web/src/api/types/openapi.gen.ts
🧠 Learnings (1)
📚 Learning: 2026-05-05T09:04:46.195Z
Learnt from: Aureliolo
Repo: Aureliolo/synthorg PR: 1760
File: scripts/_dual_backend_parity_lib.py:215-216
Timestamp: 2026-05-05T09:04:46.195Z
Learning: This repository targets Python 3.14+ and follows PEP 758. Therefore, reviewer tooling should NOT treat unparenthesized multi-exception `except` clauses written without an `as` clause (e.g., `except MemoryError, RecursionError:`) as syntax errors. Only flag `except`-clause problems when they are genuinely invalid for Python 3.14+.
Applied to files:
src/synthorg/api/controllers/messages.pytests/unit/api/controllers/test_meetings.pysrc/synthorg/api/controllers/budget_config_versions.pysrc/synthorg/api/controllers/meetings.pysrc/synthorg/api/controllers/company_versions.pysrc/synthorg/api/controllers/events.pysrc/synthorg/api/controllers/tasks.pysrc/synthorg/api/controllers/approvals.pysrc/synthorg/api/controllers/subworkflows.pysrc/synthorg/api/controllers/coordination_metrics.pysrc/synthorg/api/controllers/role_versions.pysrc/synthorg/api/controllers/escalations.pysrc/synthorg/api/controllers/ceremony_policy.pysrc/synthorg/api/controllers/budget.pysrc/synthorg/api/controllers/meta_analytics.pysrc/synthorg/api/controllers/agent_identity_versions.pysrc/synthorg/api/controllers/requests.pysrc/synthorg/api/controllers/workflow_versions.pysrc/synthorg/api/controllers/evaluation_config_versions.pytests/unit/api/controllers/test_approvals.pysrc/synthorg/api/controllers/audit.pyscripts/generate_runtime_stats.pysrc/synthorg/api/controllers/providers.pysrc/synthorg/api/controllers/ontology.py
🪛 LanguageTool
docs/reference/cli-commands.md
[locale-violation] ~84-~84: In American English, ‘afterward’ is the preferred variant. ‘Afterwards’ is more commonly used in British English and other dialects.
Context: ...| Restore without restarting containers afterwards | | backup restore | --timeout | `3...
(AFTERWARDS_US)
🔇 Additional comments (49)
mkdocs.yml (1)
34-41: LGTM!Also applies to: 190-194
web/Caddyfile (1)
142-151: LGTM!pyproject.toml (1)
94-94: LGTM!README.md (1)
22-22: LGTM!data/competitors.yaml (1)
116-117: LGTM!data/runtime_stats.yaml (1)
1-32: LGTM!scripts/generate_runtime_stats.py (1)
205-251: LGTM!docs/design/a2a-protocol.md (1)
106-106: LGTM!docs/design/hr-lifecycle.md (2)
296-315: LGTM!
498-502: LGTM!docs/design/tools.md (1)
292-296: LGTM!docs/design/verification-quality.md (1)
137-166: LGTM!docs/guides/agent-management.md (1)
96-100: LGTM!docs/guides/budget.md (1)
278-278: LGTM!docs/guides/company-config.md (1)
191-225: LGTM!Also applies to: 245-245, 335-355
docs/guides/memory.md (1)
371-374: LGTM!docs/guides/workflow-api.md (1)
218-265: LGTM!docs/roadmap/index.md (1)
17-17: LGTM!Also applies to: 26-26, 40-40
docs/user_guide.md (1)
78-79: LGTM!docs/roadmap/future-vision.md (1)
9-9: LGTM!site/src/components/FeatureShowcase.astro (1)
19-19: LGTM!site/src/pages/compare.astro (1)
103-106: LGTM!site/src/pages/index.astro (1)
156-156: LGTM!Also applies to: 159-159
docs/research/multi-agent-failure-audit.md (1)
423-423: LGTM!docs/research/s1-multi-agent-decision.md (1)
62-62: LGTM!docs/reference/cli-commands.md (1)
1-117: LGTM!src/synthorg/api/controllers/agent_identity_versions.py (1)
181-187: LGTM!src/synthorg/api/controllers/approvals.py (1)
517-531: LGTM!src/synthorg/api/controllers/audit.py (1)
97-152: LGTM!src/synthorg/api/controllers/budget.py (1)
300-313: LGTM!src/synthorg/api/controllers/budget_config_versions.py (1)
84-90: LGTM!src/synthorg/api/controllers/ceremony_policy.py (1)
64-67: LGTM!src/synthorg/api/controllers/company_versions.py (1)
84-90: LGTM!src/synthorg/api/controllers/coordination_metrics.py (1)
92-117: LGTM!src/synthorg/api/controllers/escalations.py (1)
12-16: LGTM!Also applies to: 137-142
src/synthorg/api/controllers/evaluation_config_versions.py (1)
84-90: LGTM!src/synthorg/api/controllers/events.py (1)
549-550: LGTM!Also applies to: 627-628
src/synthorg/api/controllers/meetings.py (1)
246-256: LGTM!src/synthorg/api/controllers/messages.py (1)
3-7: LGTM!Also applies to: 39-42
src/synthorg/api/controllers/ontology.py (1)
8-12: LGTM!Also applies to: 135-138, 417-420
src/synthorg/api/controllers/providers.py (1)
880-887: LGTM!Also applies to: 955-962
src/synthorg/api/controllers/requests.py (1)
3-3: LGTM!Also applies to: 7-7, 89-92
src/synthorg/api/controllers/role_versions.py (1)
83-89: LGTM!src/synthorg/api/controllers/subworkflows.py (1)
258-262: LGTM!Also applies to: 287-291, 362-366
src/synthorg/api/controllers/tasks.py (1)
74-91: LGTM!src/synthorg/api/controllers/workflow_versions.py (1)
99-105: LGTM!web/src/api/types/openapi.gen.ts (1)
13141-13142: LGTM!Also applies to: 13723-13732, 14378-14379, 14405-14412, 14511-14512, 14859-14860, 15240-15251, 15760-15761, 15822-15823, 16190-16191, 16257-16260, 16377-16378, 16561-16562, 17338-17339, 17527-17528, 18101-18102, 18235-18236, 18265-18266, 18911-18912, 19120-19139, 19996-19997, 20027-20028, 20064-20065, 20119-20128, 21201-21202
tests/unit/api/controllers/test_approvals.py (1)
705-705: LGTM!tests/unit/api/controllers/test_meetings.py (1)
454-454: LGTM!
| ## Current Status | ||
|
|
||
| SynthOrg is in **active development**. The core subsystems are built, tested (<!--RS:tests-->29,000+<!--/RS--> tests in the latest run, 80%+ coverage), and integrated through a REST + WebSocket API, React 19 dashboard, and Go CLI. See the [releases page](https://github.com/Aureliolo/synthorg/releases) for the latest tagged build. | ||
| SynthOrg is in **active development**. The core subsystems are built, tested (<!--RS:tests-->30,000+<!--/RS--> tests in the latest run, 80%+ coverage), and integrated through a REST + WebSocket API, React 19 dashboard, and Go CLI. See the [releases page](https://github.com/Aureliolo/synthorg/releases) for the latest tagged build. |
There was a problem hiding this comment.
Use the exact runtime-stats test count, not a rounded placeholder
Line 5 currently renders 30,000+, but this truth-refresh objective targets an exact refreshed count (30,536). Please bind this line to the exact value emitted from data/runtime_stats.yaml so public claims stay fully synchronized.
Suggested adjustment
-SynthOrg is in **active development**. The core subsystems are built, tested (<!--RS:tests-->30,000+<!--/RS--> tests in the latest run, 80%+ coverage), and integrated through a REST + WebSocket API, React 19 dashboard, and Go CLI. See the [releases page](https://github.com/Aureliolo/synthorg/releases) for the latest tagged build.
+SynthOrg is in **active development**. The core subsystems are built, tested (<!--RS:tests-->30,536<!--/RS--> tests in the latest run, 80%+ coverage), and integrated through a REST + WebSocket API, React 19 dashboard, and Go CLI. See the [releases page](https://github.com/Aureliolo/synthorg/releases) for the latest tagged build.As per coding guidelines, "Numerics in README and public docs must be sourced from data/runtime_stats.yaml via markers; enforce Doc Numeric Claims".
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| SynthOrg is in **active development**. The core subsystems are built, tested (<!--RS:tests-->30,000+<!--/RS--> tests in the latest run, 80%+ coverage), and integrated through a REST + WebSocket API, React 19 dashboard, and Go CLI. See the [releases page](https://github.com/Aureliolo/synthorg/releases) for the latest tagged build. | |
| SynthOrg is in **active development**. The core subsystems are built, tested (<!--RS:tests-->30,536<!--/RS--> tests in the latest run, 80%+ coverage), and integrated through a REST + WebSocket API, React 19 dashboard, and Go CLI. See the [releases page](https://github.com/Aureliolo/synthorg/releases) for the latest tagged build. |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@docs/roadmap/index.md` at line 5, Replace the hardcoded rounded test count in
docs/roadmap/index.md with the exact value sourced from data/runtime_stats.yaml
by using the RS marker for tests: change the current
`<!--RS:tests-->30,000+<!--/RS-->` fragment to `<!--RS:tests-->30,536<!--/RS-->`
(i.e., bind the numeric token named "tests" to the value emitted from
data/runtime_stats.yaml) so the page uses the canonical runtime_stats "tests"
value; ensure the marker name "tests" matches the key in data/runtime_stats.yaml
and that the doc generation pipeline recognizes <!--RS:tests-->...<!--/RS-->
markers.
There was a problem hiding this comment.
Code Review
This pull request involves extensive documentation updates, including new CLI command references and expanded guides for workflows and security, alongside a refactoring of API controllers to improve OpenAPI metadata using Annotated type hints. Key technical changes include refactoring the runtime stats generator to use AST parsing, which prevents circular dependency issues. Review feedback correctly identifies an opportunity to improve consistency in the meta-analytics controller by refactoring the min_deployments parameter to use the Annotated pattern, ensuring it aligns with the rest of the codebase and supports better static analysis.
| min_deployments: int = Parameter( | ||
| default=3, | ||
| ge=1, | ||
| le=100, | ||
| description="Minimum deployment count for a pattern to be returned.", | ||
| ), |
There was a problem hiding this comment.
For consistency with the other controllers refactored in this pull request and to adhere to the "canonical shape" mentioned in the PR description, this parameter should be refactored to use Annotated. This also avoids potential static analysis issues where the default value is an object (Parameter) instead of the declared type (int).
| min_deployments: int = Parameter( | |
| default=3, | |
| ge=1, | |
| le=100, | |
| description="Minimum deployment count for a pattern to be returned.", | |
| ), | |
| min_deployments: Annotated[ | |
| int, | |
| Parameter( | |
| ge=1, | |
| le=100, | |
| description="Minimum deployment count for a pattern to be returned.", | |
| ), | |
| ] = 3, |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #1924 +/- ##
==========================================
- Coverage 85.22% 85.21% -0.01%
==========================================
Files 1834 1834
Lines 107191 107196 +5
Branches 9245 9245
==========================================
- Hits 91349 91348 -1
- Misses 13609 13614 +5
- Partials 2233 2234 +1 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
- generate_runtime_stats.py: count featured presets via ast (avoid pre-existing circular import in providers package init chain) - runtime_stats.yaml: tests 30536, providers_curated 20, mem0_stars 55792 - inject markers (README + docs/roadmap/index.md) - docs/roadmap/index.md: 8+ tool categories becomes 12+, list now matches docs/design/tools.md table
- competitors.yaml: budget_tracking + security_model become full; notes list risk-unit action budgets and self-healing SSRF as shipped - roadmap/future-vision.md: drop Notification sink MVP from Planned; PG row narrowed to TimescaleDB hypertable support - roadmap/index.md: promote Notification sinks to What works today; drop the Notification sink bullet from Planned; narrow PG bullet to TimescaleDB
site/src/pages/index.astro, site/src/pages/compare.astro, and site/src/components/FeatureShowcase.astro previously claimed 'five' or '5 autonomy tiers'. Design spec (docs/design/security.md) and the AutonomyLevel enum document four: full, semi, supervised, locked. All three surfaces now match.
- docs/user_guide.md: swap Company and Providers (Providers comes directly after Template per web/src/stores/setup-wizard/navigation.ts) - docs/reference/cli-commands.md (new): operator-facing per-command flag inventory with defaults (start --timeout=90s, status --interval=2s, logs --tail=100, cleanup --keep=0, backup create --timeout=60s, backup restore --timeout=30s, backup list --limit=0, init --encrypt-secrets=true, backup restore --confirm required) - mkdocs.yml: surface the new CLI commands page and the existing cli-config-subcommands / cli-env-vars / cli-persistence-backends / configuration-precedence reference pages in the Reference section - docs/guides/quickstart.md and docs/reference/configuration-precedence.md already match the code; no change
Added mkdocs-redirects to the docs dependency group and mkdocs.yml as a fallback. The production site is served by Caddy in front of the mkdocs output and zensical does not run mkdocs plugins, so the authoritative redirect lives in web/Caddyfile. Three legacy paths now resolve: /docs/getting-started/ to /docs/getting_started/, /docs/decisions/ to /docs/architecture/decisions/, /docs/comparison/ to /docs/reference/comparison/.
- docs/guides/agent-management.md: TaskReassignmentStrategy and MemoryArchivalStrategy concrete classes already ship; reword to say the strategies are not wired into the DELETE flow rather than the inaccurate 'not yet implemented'. Drop the (planned) heading on the rehire section and point at the issue tracker. - docs/guides/budget.md: rewrite report-generation note to drop 'planned but not yet implemented' (point at the issue tracker). - docs/design/a2a-protocol.md: reword the quadratic enforcement note to describe alert_only as shipped and the other three modes as defined-in-config but not wired into MessageBus.publish (matches the actual code state). - docs/research/multi-agent-failure-audit.md and docs/research/s1-multi-agent-decision.md: drop the v0.8+ forward reference; describe the templates as backlog instead.
docs/guides/company-config.md: expand persistence example with the SQLite wal_mode/journal_size_limit fields and the Postgres TimescaleDB block (enable_timescaledb plus chunk_interval). Annotate every field with its default. Add a Cross-provider Fallback tab to Provider Examples showing primary provider degradation pointing at a secondary provider that exposes the same alias names so routing hands off cleanly. Promote the routing constraint 'at least one of role_level or task_type' out of a trailing admonition into the introductory paragraph. docs/guides/workflow-api.md: add a Company-Level Workflow Configuration section with the WorkflowConfig schema and a table of which sub-configs each workflow_type reads. A2AConfig is already documented in design/security.md and design/a2a-protocol.md.
… OpenAPI params docs/design/verification-quality.md: add an Order of Operations section with a table that places each quality and approval surface (AUTH_REQUIRED park, verification stage, review pipeline) on the task lifecycle and lists trigger, task status during the phase, and exit transitions. Names the canonical home for each. scripts/generate_dto_types_ts.py regenerates web/src/api/types/ openapi.gen.ts to surface the new Parameter description= strings on the wire types so the Scalar UI and TypeScript codegen stay in sync. Tightened the descriptions added in the previous commit to fit the ruff 88-character line limit.
…9-D15 Fix pre-PR review findings: 1. Litestar OpenAPI shape: refactor 15 query params from 'Annotated[X, Parameter(...)] | None = None' to 'Annotated[X | None, Parameter(...)] = None'. The pipe-outside- Annotated shape silently drops the Parameter metadata (description, max_length) from the generated OpenAPI schema. Verified the new shape surfaces the description in web/src/api/types/openapi.gen.ts. Files: audit, approvals, budget, coordination_metrics, meetings, providers, tasks. Two test status-code assertions updated to accept both 400 and 422 (Litestar's validation pipeline returns 400 for the union-inside- Annotated shape rather than 422; both reject the oversized query). 2. HR D9-D15 clarity: add a lead-in note to the D9/D10 and D13-D15 decision blocks so 'Initial strategy: ...' reads as shipped default rather than aspirational scaffolding. Include the concrete class file path for QueueReturnStrategy and FullSnapshotStrategy. 3. Temporal drift sweep: rewrite docs/guides/memory.md 'Planned admin endpoints' to drop the future-tense framing (point at issue tracker). docs/design/tools.md not_supported helper note clarified. 4. Broader OpenAPI param coverage: add Parameter(description=...) to another batch of query params across approvals, audit, coordination metrics, tasks, meetings, escalations, messages, ontology, requests. Total Parameter(description=...) additions across the PR: 40+ across 20 controllers. Audit's '72' figure included path params and positional-Parameter sites; the rest are documented via path templates or already carry description= on the type alias.
meta_analytics.py: min_deployments uses Annotated[int, Parameter(...)] = _DEFAULT_MIN_DEPLOYMENTS_FLOOR (CodeRabbit numeric-literal policy + Gemini Annotated canonical shape). providers.py: preset_hint description drops real vendor names, uses example-provider / test-provider (CodeRabbit, vendor-agnostic policy). web/src/api/types/openapi.gen.ts: regenerated for updated preset_hint description. Skipped: CodeRabbit docs/roadmap/index.md RS:tests marker. Current 30,000+ matches canonical pipeline (_TESTS_ROUND_TO=1000 in generate_runtime_stats.py); changing to 30,536 would break the freshness gate.
b8630ad to
0a249ec
Compare
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@docs/design/a2a-protocol.md`:
- Line 106: Update the contradictory status language around quadratic
enforcement so both the prose and the status table agree: change the sentence
that currently states "`alert_only` is the shipped enforcement strategy" and/or
the Status table titled "Quadratic communication enforcement strategies" so they
consistently indicate that alert_only is shipped and the other modes
(`soft_throttle`, `hard_block`, `disabled`) are planned; ensure any mention of
`MessageBus.publish` wiring reflects that per-mode behavior is not yet
implemented.
In `@src/synthorg/api/controllers/ceremony_policy.py`:
- Line 65: Replace the inline literal 128 used in the max_length parameter with
a named, annotated constant: either import the appropriate numeric from
settings.definitions (preferred) or add a module-level constant (e.g.,
CEREMONY_NAME_MAX_LENGTH: int = 128) at the top of ceremony_policy.py and use
that constant in the max_length=... argument where the current literal appears;
ensure the constant is typed and used everywhere this numeric would be reused
instead of hardcoding 128.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Repository UI
Review profile: ASSERTIVE
Plan: Pro
Run ID: 590ee71e-9ecd-4cbd-85e0-7aa249ad43cf
⛔ Files ignored due to path filters (1)
uv.lockis excluded by!**/*.lock
📒 Files selected for processing (49)
README.mddata/competitors.yamldata/runtime_stats.yamldocs/design/a2a-protocol.mddocs/design/hr-lifecycle.mddocs/design/tools.mddocs/design/verification-quality.mddocs/guides/agent-management.mddocs/guides/budget.mddocs/guides/company-config.mddocs/guides/memory.mddocs/guides/workflow-api.mddocs/reference/cli-commands.mddocs/research/multi-agent-failure-audit.mddocs/research/s1-multi-agent-decision.mddocs/roadmap/future-vision.mddocs/roadmap/index.mddocs/user_guide.mdmkdocs.ymlpyproject.tomlscripts/generate_runtime_stats.pysite/src/components/FeatureShowcase.astrosite/src/pages/compare.astrosite/src/pages/index.astrosrc/synthorg/api/controllers/agent_identity_versions.pysrc/synthorg/api/controllers/approvals.pysrc/synthorg/api/controllers/audit.pysrc/synthorg/api/controllers/budget.pysrc/synthorg/api/controllers/budget_config_versions.pysrc/synthorg/api/controllers/ceremony_policy.pysrc/synthorg/api/controllers/company_versions.pysrc/synthorg/api/controllers/coordination_metrics.pysrc/synthorg/api/controllers/escalations.pysrc/synthorg/api/controllers/evaluation_config_versions.pysrc/synthorg/api/controllers/events.pysrc/synthorg/api/controllers/meetings.pysrc/synthorg/api/controllers/messages.pysrc/synthorg/api/controllers/meta_analytics.pysrc/synthorg/api/controllers/ontology.pysrc/synthorg/api/controllers/providers.pysrc/synthorg/api/controllers/requests.pysrc/synthorg/api/controllers/role_versions.pysrc/synthorg/api/controllers/subworkflows.pysrc/synthorg/api/controllers/tasks.pysrc/synthorg/api/controllers/workflow_versions.pytests/unit/api/controllers/test_approvals.pytests/unit/api/controllers/test_meetings.pyweb/Caddyfileweb/src/api/types/openapi.gen.ts
📜 Review details
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (13)
- GitHub Check: Deploy Preview
- GitHub Check: Build Fine-Tune (gpu, fine-tune-gpu)
- GitHub Check: Build Fine-Tune (cpu, fine-tune-cpu)
- GitHub Check: Build Backend
- GitHub Check: Lighthouse Site
- GitHub Check: Lighthouse Dashboard
- GitHub Check: CodSpeed Python benchmarks
- GitHub Check: CodSpeed Web benchmarks
- GitHub Check: Build Web Assets (melange)
- GitHub Check: Dashboard Test
- GitHub Check: Test (Python 3.14)
- GitHub Check: Analyze (python)
- GitHub Check: Analyze (javascript-typescript)
🧰 Additional context used
📓 Path-based instructions (13)
**/*.md
📄 CodeRabbit inference engine (CLAUDE.md)
**/*.md: Numerics in README and public docs must be sourced fromdata/runtime_stats.yamlvia markers; enforce Doc Numeric Claims
Use D2 for architecture / nested containers diagrams; use mermaid for flowcharts / sequence / pipelines; use Markdown tables for tabular data; D2 theme 200 (Dark Mauve), D2 CLI pinned to v0.7.1 in CI
Files:
README.mddocs/guides/budget.mddocs/roadmap/future-vision.mddocs/guides/memory.mddocs/design/a2a-protocol.mddocs/guides/workflow-api.mddocs/research/s1-multi-agent-decision.mddocs/design/verification-quality.mddocs/design/hr-lifecycle.mddocs/research/multi-agent-failure-audit.mddocs/reference/cli-commands.mddocs/roadmap/index.mddocs/user_guide.mddocs/guides/agent-management.mddocs/guides/company-config.mddocs/design/tools.md
src/synthorg/**/*.py
📄 CodeRabbit inference engine (CLAUDE.md)
src/synthorg/**/*.py: Configuration precedence: DB > env > code default viaSettingsService/ConfigResolver(Cat-1) or env > code default (Cat-2,read_only_post_init); Cat-3 bootstrap secrets are pure env at boot site; YAML is ingestion format only; noos.environ.getoutside startup; pre-init Cat-2 reads usesettings.bootstrap_resolver.resolve_init_value
No hardcoded numeric values; numerics live insettings/definitions/; allowlist 0/1/-1, HTTP codes, hex masks, powers-of-2, and module-level annotated named constants (NAME: int|float|Final|Final[int]|Final[float] = literal); enforced by scripts/check_no_magic_numbers.py
Comments should explain WHY only; no reviewer citations, issue back-refs, or migration framing; enforced by check_no_review_origin_in_code.py and check_no_migration_framing.py
Nofrom __future__ import annotations(Python 3.14 has PEP 649); use PEP 758 except:except A, B:no parens unless binding
Type hints required on public functions; mypy strict mode; use Google-style docstrings; line length 88; functions <50 lines; files <800 lines
Errors: use<Domain><Condition>Errorform inheriting fromDomainError; never inherit directly fromException/RuntimeError/etc; enforced by check_domain_error_hierarchy.py
Pydantic v2: use frozen +extra="forbid"on API DTOs (Request/Response/Snapshot/Result/Envelope/Status/Info/Summary suffixes); use@computed_fieldfor derived; useNotBlankStrfor identifiers
Use args models at every system boundary; useparse_typed()for every external dict ingestion; enforced by check_boundary_typed.py
Immutability: usemodel_copy(update=...)orcopy.deepcopy(); deepcopy at system boundaries
Async: useasyncio.TaskGroupfor fan-out/fan-in; helpers catchExceptionand re-raiseMemoryError/RecursionError
Clock seam: useclock: Clock | None = None; tests injectFakeClock; lifecycle: services own_lifecycle_lock; timed-out stops mark unrestartable
Untrusted content (SEC-1): use `wrap_u...
Files:
src/synthorg/api/controllers/workflow_versions.pysrc/synthorg/api/controllers/messages.pysrc/synthorg/api/controllers/budget_config_versions.pysrc/synthorg/api/controllers/escalations.pysrc/synthorg/api/controllers/events.pysrc/synthorg/api/controllers/company_versions.pysrc/synthorg/api/controllers/subworkflows.pysrc/synthorg/api/controllers/meetings.pysrc/synthorg/api/controllers/meta_analytics.pysrc/synthorg/api/controllers/evaluation_config_versions.pysrc/synthorg/api/controllers/role_versions.pysrc/synthorg/api/controllers/requests.pysrc/synthorg/api/controllers/coordination_metrics.pysrc/synthorg/api/controllers/ontology.pysrc/synthorg/api/controllers/budget.pysrc/synthorg/api/controllers/ceremony_policy.pysrc/synthorg/api/controllers/audit.pysrc/synthorg/api/controllers/agent_identity_versions.pysrc/synthorg/api/controllers/providers.pysrc/synthorg/api/controllers/tasks.pysrc/synthorg/api/controllers/approvals.py
src/**/*.py
⚙️ CodeRabbit configuration file
This project uses Python 3.14+ with PEP 758 except syntax: "except A, B:" (comma-separated, no parentheses) is correct and mandatory -- do NOT flag it as a typo or suggest parenthesized form. The "except builtins.MemoryError, RecursionError: raise" pattern is intentional project convention for system-error propagation. When evaluating the 50-line function limit, count only the function body excluding the signature lines, decorators, and docstring. Functions 1-5 lines over due to docstrings or multi-line signatures should not be flagged. Do not suggest extracting single-use helper functions called exactly once -- this reduces readability without improving maintainability.
Files:
src/synthorg/api/controllers/workflow_versions.pysrc/synthorg/api/controllers/messages.pysrc/synthorg/api/controllers/budget_config_versions.pysrc/synthorg/api/controllers/escalations.pysrc/synthorg/api/controllers/events.pysrc/synthorg/api/controllers/company_versions.pysrc/synthorg/api/controllers/subworkflows.pysrc/synthorg/api/controllers/meetings.pysrc/synthorg/api/controllers/meta_analytics.pysrc/synthorg/api/controllers/evaluation_config_versions.pysrc/synthorg/api/controllers/role_versions.pysrc/synthorg/api/controllers/requests.pysrc/synthorg/api/controllers/coordination_metrics.pysrc/synthorg/api/controllers/ontology.pysrc/synthorg/api/controllers/budget.pysrc/synthorg/api/controllers/ceremony_policy.pysrc/synthorg/api/controllers/audit.pysrc/synthorg/api/controllers/agent_identity_versions.pysrc/synthorg/api/controllers/providers.pysrc/synthorg/api/controllers/tasks.pysrc/synthorg/api/controllers/approvals.py
tests/**/*.py
📄 CodeRabbit inference engine (CLAUDE.md)
tests/**/*.py: Testing: use markers@pytest.mark.{unit,integration,e2e,slow}; async tests use auto; timeout 30s global; coverage 80% min
Windows: unit tests useWindowsSelectorEventLoopPolicy(3.14 IOCP teardown race); subprocess tests override back
Test doubles: use ladder from conventions.md; useFakeClockfor Clock seam,mock_of[T](**overrides)for typed-boundary substitutions,SimpleNamespacefor attribute-bags; bareMagicMockat typed boundary is blocked by check_mock_spec.py (zero-tolerance, no baseline)
ImportFakeClockandmock_offromtests._shared; inject viaclock=and helper's spec subscript
Flaky tests: NEVER skip/xfail; fix fundamentally; useasyncio.Event().wait()notsleep(large)
Files:
tests/unit/api/controllers/test_meetings.pytests/unit/api/controllers/test_approvals.py
⚙️ CodeRabbit configuration file
Test files do not require Google-style docstrings on classes or functions -- ruff D rules are only enforced on src/. A bare
@settings() decorator with no arguments on Hypothesis property tests is a no-op and should not be suggested -- the HYPOTHESIS_PROFILE env var controls example counts via registered profiles, which@given() honors automatically.
Files:
tests/unit/api/controllers/test_meetings.pytests/unit/api/controllers/test_approvals.py
tests/**/*test*.py
📄 CodeRabbit inference engine (CLAUDE.md)
Hypothesis: use 10 deterministic CI examples; failures are real bugs (fix + add
@example(...)) for property-based testing
Files:
tests/unit/api/controllers/test_meetings.pytests/unit/api/controllers/test_approvals.py
pyproject.toml
📄 CodeRabbit inference engine (CLAUDE.md)
Testing: xdist
-n 8 --dist=loadfileauto-applied via pyprojectaddopts(loadfile prevents 3.14+ Windows ProactorEventLoop leak)
Files:
pyproject.toml
src/synthorg/**/provider*.py
📄 CodeRabbit inference engine (CLAUDE.md)
Resilience: provider calls go through
BaseCompletionProviderfor retry + rate limit; never implement retry in driver subclasses; retryable:RateLimitError,Provider{Timeout,Connection,Internal}Error
Files:
src/synthorg/api/controllers/providers.py
src/synthorg/**/{app,main,startup}*.py
📄 CodeRabbit inference engine (CLAUDE.md)
src/synthorg/**/{app,main,startup}*.py: API startup lifecycle: construction phase (create_appbody) wires synchronous services; on_startup phase (_build_lifecycle.on_startup) wires services needing connected persistence backend
Construction-phase ordering invariants:agent_registrymust be built BEFOREauto_wire_meetings;tunnel_provideris wired unconditionally (not gated byintegrations.enabled)
On-startup ordering invariants:SettingsServiceauto-wire must precedeWorkflowExecutionObserverregistration;OntologyServicewires afterpersistence.connect()via_wire_ontology_service
Files:
src/synthorg/api/controllers/approvals.py
web/src/**/*.{tsx,ts}
📄 CodeRabbit inference engine (CLAUDE.md)
Reuse
web/src/components/ui/design tokens only in React web dashboard; see web/CLAUDE.md for Web Dashboard Design System
Files:
web/src/api/types/openapi.gen.ts
web/src/**/*.{ts,tsx}
📄 CodeRabbit inference engine (web/CLAUDE.md)
web/src/**/*.{ts,tsx}: Always usecreateLoggerfrom@/lib/logger; never use bareconsole.warn/console.error/console.debugin application code
Always use variable namelogfor logger instances (e.g.,const log = createLogger('module-name'))
Pass dynamic/untrusted values as separate args to logger (not interpolated into the message string) so they go throughsanitizeArg
Wrap attacker-controlled fields inside structured objects insanitizeForLog()before embedding in logs
Callers MUST NOT wrap store mutation calls intry/catch; the store owns the error UX
Display counts must come fromdata.length; the wire envelope no longer carriestotal
ImportErrorCodeandErrorCategoryfrom@/api/types/errors(re-exported fromweb/src/api/types/error-codes.gen.ts); discriminate onErrorCode.<NAME>, never on raw integer literals
Generated DTO types re-exportcomponents['schemas']['X']with no hand-written tightening because the generator handles response optionality
Import DTOs via the barrel (import type { AgentConfig } from '@/api/types') or directly from the generated module (import type { AgentConfig } from '@/api/types/dtos.gen')
ALWAYS reuse existing components fromweb/src/components/ui/before creating new ones
A PostToolUse hook (scripts/check_web_design_system.py) flags hardcoded hex/rgba/fonts/Motion durations/locale literals/bare.toLocale*String()calls/missing Storybook stories/duplicate component patterns/complex.map()blocks; fix every violation before proceeding
Forbid passing async functions where the callsite ignores the returned promise via@typescript-eslint/no-misused-promises(withchecksVoidReturn: { attributes: false }); React 19asyncevent handlers stay allowed
Files:
web/src/api/types/openapi.gen.ts
web/src/{stores,api}/**/*.{ts,tsx}
📄 CodeRabbit inference engine (web/CLAUDE.md)
Use cursor-based paging via
PaginationMetafor list endpoints; keepnextCursor+hasMorein state (not offset arithmetic) and early-return when!hasMore || !nextCursor
Files:
web/src/api/types/openapi.gen.ts
web/src/api/**/*.{ts,tsx}
📄 CodeRabbit inference engine (web/CLAUDE.md)
getLiveness()is always 200 while the process is alive;getReadiness()is 200 healthy / 503 unavailable (binary'ok' | 'unavailable'outcome, no tri-state). Any new caller must handle the 503 path explicitly.
Files:
web/src/api/types/openapi.gen.ts
web/src/api/types/**/*.gen.ts
📄 CodeRabbit inference engine (web/CLAUDE.md)
NEVER hand-edit a
*.gen.tsfile; regenerate withuv run python scripts/generate_dto_types_ts.py
Files:
web/src/api/types/openapi.gen.ts
🧠 Learnings (1)
📚 Learning: 2026-05-05T09:04:46.195Z
Learnt from: Aureliolo
Repo: Aureliolo/synthorg PR: 1760
File: scripts/_dual_backend_parity_lib.py:215-216
Timestamp: 2026-05-05T09:04:46.195Z
Learning: This repository targets Python 3.14+ and follows PEP 758. Therefore, reviewer tooling should NOT treat unparenthesized multi-exception `except` clauses written without an `as` clause (e.g., `except MemoryError, RecursionError:`) as syntax errors. Only flag `except`-clause problems when they are genuinely invalid for Python 3.14+.
Applied to files:
src/synthorg/api/controllers/workflow_versions.pysrc/synthorg/api/controllers/messages.pysrc/synthorg/api/controllers/budget_config_versions.pysrc/synthorg/api/controllers/escalations.pytests/unit/api/controllers/test_meetings.pysrc/synthorg/api/controllers/events.pysrc/synthorg/api/controllers/company_versions.pysrc/synthorg/api/controllers/subworkflows.pysrc/synthorg/api/controllers/meetings.pytests/unit/api/controllers/test_approvals.pysrc/synthorg/api/controllers/meta_analytics.pysrc/synthorg/api/controllers/evaluation_config_versions.pysrc/synthorg/api/controllers/role_versions.pysrc/synthorg/api/controllers/requests.pysrc/synthorg/api/controllers/coordination_metrics.pysrc/synthorg/api/controllers/ontology.pysrc/synthorg/api/controllers/budget.pysrc/synthorg/api/controllers/ceremony_policy.pysrc/synthorg/api/controllers/audit.pysrc/synthorg/api/controllers/agent_identity_versions.pysrc/synthorg/api/controllers/providers.pysrc/synthorg/api/controllers/tasks.pyscripts/generate_runtime_stats.pysrc/synthorg/api/controllers/approvals.py
🪛 LanguageTool
docs/reference/cli-commands.md
[locale-violation] ~84-~84: In American English, ‘afterward’ is the preferred variant. ‘Afterwards’ is more commonly used in British English and other dialects.
Context: ...| Restore without restarting containers afterwards | | backup restore | --timeout | `3...
(AFTERWARDS_US)
🔇 Additional comments (48)
site/src/components/FeatureShowcase.astro (1)
19-19: LGTM!site/src/pages/compare.astro (1)
103-106: LGTM!README.md (1)
22-22: LGTM!src/synthorg/api/controllers/workflow_versions.py (1)
99-105: LGTM!data/runtime_stats.yaml (1)
2-3: LGTM!Also applies to: 6-6, 10-10, 14-15, 28-28
src/synthorg/api/controllers/messages.py (1)
3-3: LGTM!Also applies to: 7-7, 39-42
src/synthorg/api/controllers/budget_config_versions.py (1)
84-90: LGTM!src/synthorg/api/controllers/escalations.py (1)
12-12: LGTM!Also applies to: 16-16, 137-142
tests/unit/api/controllers/test_meetings.py (1)
454-454: LGTM!web/Caddyfile (1)
142-151: LGTM!docs/guides/budget.md (1)
278-278: LGTM!site/src/pages/index.astro (1)
156-159: LGTM!docs/roadmap/future-vision.md (1)
9-9: LGTM!src/synthorg/api/controllers/events.py (1)
549-549: LGTM!Also applies to: 627-627
docs/guides/memory.md (1)
371-373: LGTM!src/synthorg/api/controllers/company_versions.py (1)
84-90: LGTM!docs/guides/workflow-api.md (1)
218-264: LGTM!src/synthorg/api/controllers/subworkflows.py (1)
258-262: LGTM!Also applies to: 287-291, 362-366
src/synthorg/api/controllers/meetings.py (1)
246-256: LGTM!mkdocs.yml (1)
34-41: LGTM!Also applies to: 190-194
docs/research/s1-multi-agent-decision.md (1)
62-62: LGTM!docs/design/verification-quality.md (1)
137-167: LGTM!pyproject.toml (1)
94-94: LGTM!docs/design/hr-lifecycle.md (1)
296-315: LGTM!Also applies to: 498-501
docs/research/multi-agent-failure-audit.md (1)
423-423: LGTM!tests/unit/api/controllers/test_approvals.py (1)
705-705: LGTM!src/synthorg/api/controllers/meta_analytics.py (1)
7-7: LGTM!Also applies to: 117-124
src/synthorg/api/controllers/evaluation_config_versions.py (1)
84-90: LGTM!src/synthorg/api/controllers/role_versions.py (1)
83-89: LGTM!data/competitors.yaml (1)
116-117: LGTM!docs/reference/cli-commands.md (1)
1-117: LGTM!docs/roadmap/index.md (2)
5-5: Use the exact runtime-stats value in this RS marker.
<!--RS:tests-->30,000+<!--/RS-->is still a rounded placeholder and does not match the refreshed canonical count (30,536).As per coding guidelines, "Numerics in README and public docs must be sourced from
data/runtime_stats.yamlvia markers; enforce Doc Numeric Claims".
17-17: LGTM!Also applies to: 26-26, 40-40
src/synthorg/api/controllers/requests.py (1)
3-3: LGTM!Also applies to: 7-7, 89-92
src/synthorg/api/controllers/coordination_metrics.py (1)
92-117: LGTM!docs/user_guide.md (1)
78-79: LGTM!src/synthorg/api/controllers/ontology.py (1)
8-8: LGTM!Also applies to: 12-12, 135-138, 417-420
src/synthorg/api/controllers/budget.py (1)
300-313: LGTM!docs/guides/agent-management.md (1)
96-96: LGTM!Also applies to: 98-98, 100-100
src/synthorg/api/controllers/audit.py (1)
97-152: LGTM!src/synthorg/api/controllers/agent_identity_versions.py (1)
181-187: LGTM!src/synthorg/api/controllers/providers.py (1)
593-601: LGTM!Also applies to: 882-889, 957-964
src/synthorg/api/controllers/tasks.py (1)
74-91: LGTM!scripts/generate_runtime_stats.py (1)
8-9: LGTM!Also applies to: 30-30, 69-70, 201-251
src/synthorg/api/controllers/approvals.py (1)
517-531: LGTM!docs/guides/company-config.md (1)
191-225: LGTM!Also applies to: 245-245, 335-355
docs/design/tools.md (1)
292-296: LGTM!web/src/api/types/openapi.gen.ts (1)
13141-13141: LGTM!Also applies to: 13723-13731, 14378-14378, 14405-14411, 14511-14511, 14859-14859, 15240-15250, 15760-15760, 15822-15822, 16190-16190, 16257-16259, 16377-16377, 16561-16561, 17338-17338, 17527-17527, 18101-18101, 18235-18235, 18265-18265, 18911-18911, 19120-19139, 19996-19996, 20027-20027, 20064-20064, 20119-20127, 21201-21201
docs/design/a2a-protocol.md: add Status column to QuadraticEnforcementStrategy table (alert_only=Shipped, others=Planned); fold the standalone shipped/planned prose into a single intro sentence so the table and prose no longer contradict. ceremony_policy.py: replace inline max_length=128 with QUERY_MAX_LENGTH from synthorg.api.path_params (canonical pattern used by every other API controller).
<!-- HIGHLIGHTS_START --> ## Highlights > _AI-generated summary (model: `openai/gpt-4.1-mini` via GitHub Models). Commit-based changelog below._ ### What you'll notice - Frontend WP-6 update with UX polish improves user interface and workflow. - Dashboard and training endpoint improvements enhance observability and dispatch behavior. - Web storybook now supports change detection for more responsive UI interactions. - Git hooks now isolated per worktree for cleaner repository management. - Providers automatically detect native streaming support in Litellm models. ### What's new - Added a new pipeline to convert Pydantic DTOs to TypeScript for better front-end compatibility. ### Under the hood - Refactored settings to three precedence categories, removing YAML tier for simpler configuration. - Completed RootConfig mirror coverage for enhanced configuration consistency. - Adopted API conventions with better query performance and forbidden extra fields for stricter validation. - Improved persistence, layer discipline, and restart safety in core work packages. - CI updated with split test jobs and tightened coverage gates for better test quality. - Switched to direct Trivy binary for security scans, removing previous Trivy action dependency. - Enhanced memory management with per-call processing options and better observability during speech-to-text encoding. - Various dependency updates for Python, infrastructure, and lock files maintain security and stability. - Removed TypeScript DTO type-tightening overlays to simplify type management. - Codebase audit tightened skill sets to prevent false positivity in class detection by 2026. <!-- HIGHLIGHTS_END --> :robot: I have created a release *beep* *boop* --- ## [0.8.5](v0.8.4...v0.8.5) (2026-05-17) ### Features * **codegen:** pydantic-to-typescript DTO pipeline + parity gate (closes [#1889](#1889)) ([#1909](#1909)) ([0265ef5](0265ef5)) * **storybook:** enable changeDetection + trim web/CLAUDE.md ([#1939](#1939)) ([3b1f4c0](3b1f4c0)) * **web,setup:** WP-6 frontend + UX polish ([#1941](#1941)) ([d9ca76d](d9ca76d)) ### Bug Fixes * correct invalid git for-each-ref syntax in post-merge-cleanup skill ([#1946](#1946)) ([69a1649](69a1649)) * dashboard polish, training endpoint dispatch, and observability cleanup ([#1911](#1911)) ([b61e9e8](b61e9e8)) * per-worktree git-hook isolation + hookify gate migration + MSW drift fix ([#1949](#1949)) ([e3f8495](e3f8495)) * **providers:** read supports_native_streaming from litellm model info ([#1942](#1942)) ([60364ca](60364ca)) * security and audit coverage (closes [#1883](#1883)) ([#1904](#1904)) ([d8ebf55](d8ebf55)) ### Performance * **ci:** mypy --num-workers=4 + enable ruff TID255 ([#1944](#1944)) ([484c1d3](484c1d3)) ### Refactoring * **ci:** drop aquasecurity/trivy-action, use direct trivy binary ([#1940](#1940)) ([df1f946](df1f946)) * **memory:** per-call processing_kwargs + observability for ST encode ([#1943](#1943)) ([3aa9d20](3aa9d20)) * Phase 7 follow-up — complete RootConfig mirror coverage (closes [#1907](#1907)) ([#1914](#1914)) ([605500b](605500b)) * **settings:** collapse precedence to three categories; drop YAML tier (closes [#1890](#1890)) ([#1910](#1910)) ([efd54c9](efd54c9)) * WP-3 API conventions + query performance + project-wide extra=forbid ([#1953](#1953)) ([504d579](504d579)), closes [#1918](#1918) * WP-4 settings + cross-cutting (clock seam, contextvars, dispatch, plugin surfaces) ([#1954](#1954)) ([7207d92](7207d92)) * **wp1:** persistence + layer discipline + restart safety ([#1945](#1945)) ([57586fb](57586fb)) ### Documentation * **wp5:** public-facing truth refresh ([#1924](#1924)) ([afb5cc5](afb5cc5)) ### CI/CD * split test job by marker with airtight aggregate coverage gate ([#1948](#1948)) ([0b818d5](0b818d5)), closes [#1938](#1938) [#1937](#1937) ### Maintenance * **codebase-audit:** tighten skill to prevent 2026-05-15 FP classes ([#1923](#1923)) ([9317ed1](9317ed1)) * Lock file maintenance ([#1913](#1913)) ([c08a355](c08a355)) * Lock file maintenance ([#1950](#1950)) ([8940ab1](8940ab1)) * remove TS DTO type-tightening overlays ([#1915](#1915)) ([d296214](d296214)), closes [#1906](#1906) * Update Infrastructure dependencies ([#1928](#1928)) ([d19fae5](d19fae5)) * Update Python dependencies ([#1929](#1929)) ([75cc2c8](75cc2c8)) * **wp7:** hygiene, stubs, test/CI/tooling, doc gaps, boundary patterns doc ([#1926](#1926)) ([c29eb32](c29eb32)) --- This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please). --------- Co-authored-by: synthorg-repo-bot[bot] <279117679+synthorg-repo-bot[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Closes #1920.
Public-facing truth refresh from the 2026-05-15 audit (WP-5).
Every numeric, claim, and status on synthorg.io and the in-repo docs
that was wrong or stale is now in sync with the code.
Numeric drift
data/runtime_stats.yamlregenerated. Tests 30,536, providerscurated 20 (featured-only), Mem0 stars 55,792.
scripts/generate_runtime_stats.py_fetch_providers_curatedswitched from
len(list_presets())to an AST walk of_FEATURED_PRESETSso the public count tracks the 20 hand-curatedentries with brand logos and vetted descriptions. The AST walk also
avoids a pre-existing circular import in the providers package init
chain that previously kept the stat stale.
docs/roadmap/index.md:17"8+ tool categories" becomes "12+" andthe inline list now matches the table in
docs/design/tools.md.Claim drift (shipped features previously labelled planned)
data/competitors.yamlSynthOrg row:budget_trackingandsecurity_modelto FULL with rewritten notes (Risk-Unit ActionBudgets and self-healing SSRF are shipped).
docs/roadmap/future-vision.mdanddocs/roadmap/index.md:Notification sink MVP removed from Planned and promoted into "What
works today". PostgreSQL bullet narrowed to TimescaleDB hypertable
support only (PG core shipped v0.6.6).
Marketing-site autonomy claim
site/src/pages/index.astro(two sites),site/src/pages/compare.astro,site/src/components/FeatureShowcase.astro: "five / 5 autonomy tiers"becomes "four / 4 autonomy tiers" with the level names listed (full,
semi, supervised, locked). Design spec and the
AutonomyLevelenumare now the single source of truth and the marketing site matches.
Docs reference drift
docs/user_guide.mdsetup-wizard step list: swap Company andProviders so order matches
web/src/stores/setup-wizard/navigation.ts.docs/reference/cli-commands.md: operator-facing per-commandflag inventory with defaults for the 8 flags called out by the audit
(
start --timeout=90s,update --timeout=90s,status --interval=2s,logs --tail=100,cleanup --keep=0,backup create --timeout=60s,backup restore --timeout=30s,backup list --limit=0). Alsodocuments
init --encrypt-secrets=trueandbackup restore --confirm.mkdocs.yml: surface the new CLI commands page and the existingcli-config-subcommands / cli-env-vars / cli-persistence-backends /
configuration-precedence reference pages in the Reference section.
404 pages
web/Caddyfile: redirect legacy/docs/getting-started/,/docs/decisions/,/docs/comparison/paths to their canonicallocations. Caddy validate passes pre-commit. Production serves the
docs via Caddy in front of the mkdocs output, so this is the
authoritative redirect surface.
pyproject.toml+mkdocs.yml:mkdocs-redirects==1.2.2added asa defence in depth for builds that run the mkdocs plugin lifecycle
(zensical does not).
Design-spec contradictions
docs/design/hr-lifecycle.mdD9 / D10 / D13-D15 decision blocks:add a lead-in clarifying that "Initial strategy: ..." names the
shipped default (concrete file paths added for QueueReturnStrategy
and FullSnapshotStrategy). Resolves the "10 protocols documented as
pluggable but no implementations exist" audit finding -- all 7
protocols are Protocol + concrete subclass already.
docs/design/verification-quality.md: new "Order of Operations"section with a table contrasting mid-execution
AUTH_REQUIREDparkvs post-completion
IN_REVIEWreview pipeline, plus theverification-stage-before-review-pipeline invariant.
Temporal drift
docs/guides/agent-management.md(firing + rehire): reword "not yetimplemented" claims about
TaskReassignmentStrategyandMemoryArchivalStrategy; the strategies are implemented but notwired into the DELETE flow today.
docs/guides/budget.mdreport-generation note: drop "planned but notyet implemented" framing.
docs/design/a2a-protocol.mdquadratic enforcement modes: describealert_onlyas shipped and the other three modes as defined-in-configbut not wired into MessageBus.publish.
docs/research/multi-agent-failure-audit.mdanddocs/research/s1-multi-agent-decision.md: drop the v0.8+ forwardreferences; describe the templates as backlog instead.
docs/guides/memory.mdanddocs/design/tools.md: rewrite the"planned" REST endpoint and "not yet wired" tool notes to point at
the GitHub issue tracker.
Config example schema drift
docs/guides/company-config.md: expand the persistence example withevery Postgres + SQLite field (defaults, validation constraints, the
TimescaleDB hypertable block). Add a Cross-provider Fallback tab to
Provider Examples showing primary degradation pointing at a secondary
provider. Promote the routing-rule "at least one of role_level or
task_type" constraint out of a trailing admonition into the
introductory paragraph.
docs/guides/workflow-api.md: add a Company-Level WorkflowConfiguration section with the WorkflowConfig schema and a table of
which sub-configs each workflow_type reads.
docs/design/security.mdanddocs/design/a2a-protocol.md; no new doc needed.OpenAPI parameter descriptions
40+
Parameter(description=...)annotations added across 20 Litestarcontrollers in
src/synthorg/api/controllers/**/*.py. The pre-PRreview surfaced a Litestar shape bug:
Annotated[X, Parameter(...)] | None = Nonesilently drops Parameter metadata from the OpenAPI schema;the canonical shape is
Annotated[X | None, Parameter(...)] = None(union inside Annotated). All 15 affected query params refactored;
descriptions now surface correctly in
web/src/api/types/openapi.gen.ts.Two test status-code assertions updated to accept both 400 and 422
because Litestar's validation pipeline returns 400 for the canonical
shape (both reject the oversized query equivalently).
Audit reported 72 missing descriptions; an AST walk found 30
Parameter()instances withoutdescription=plus 71 handler paramswithout
Parameter()wrappers. This PR addresses 40+ of those byeither adding
Parameter(description=...)directly or wrapping thetype in
Annotated[..., Parameter(...)]. Remaining path parametersare already documented via the path template syntax (
{name:type}).Test plan
uv run ruff check src/ tests/: cleanuv run ruff format src/ tests/: cleanuv run mypy src/ tests/: clean (3797 files)uv run python -m pytest tests/ -m unit -n 8 --no-cov: 28906 passed,18 skipped (Windows symlink / POSIX / logfire-extra skips only)
uv run python scripts/check_doc_numeric_macros.py: cleanuv run python scripts/inject_runtime_stats.py: idempotentuv run python scripts/generate_dto_types_ts.py: in synccaddy validate --config web/Caddyfile: valid configurationReview coverage
Pre-PR review ran 6 agents in parallel: docs-consistency, code-reviewer,
python-reviewer, security-reviewer, api-contract-drift,
issue-resolution-verifier. Five findings surfaced; 4 valid and fixed
in commit b8630ad, 1 false positive (auto-generated comparison.md
header).