diff --git a/.agents/skills/green-refactor/SKILL.md b/.agents/skills/green-refactor/SKILL.md index e8610d8..a61591c 100644 --- a/.agents/skills/green-refactor/SKILL.md +++ b/.agents/skills/green-refactor/SKILL.md @@ -42,7 +42,7 @@ Não use esta skill para: - Primeiro faça os testes passarem com o menor código possível. - Só depois refatore. - Preserve contratos, nomes e limites arquiteturais do projeto. -- Use sempre o nome **AIgnt-Synapse-Flow** e deixe claro, ao menos uma vez, que ele é a engine própria de pipeline do AIgnt OS. +- Use sempre o nome **Synapse-Flow** e deixe claro, ao menos uma vez, que ele é a engine própria de pipeline do SynapseOS. - Mantenha compatibilidade com o MVP: - pipeline linear - runtime dual simples @@ -67,7 +67,7 @@ Depois de verde: 4. preserve contratos e testes 5. não aumente escopo da feature -# Pontos de atenção no AIgnt OS +# Pontos de atenção no SynapseOS Tenha cuidado especial com: diff --git a/.agents/skills/spec-editor/SKILL.md b/.agents/skills/spec-editor/SKILL.md index 1e80e97..ddb4e78 100644 --- a/.agents/skills/spec-editor/SKILL.md +++ b/.agents/skills/spec-editor/SKILL.md @@ -5,7 +5,7 @@ description: Use esta skill quando a tarefa for transformar um pedido do usuári # Objetivo -Transformar um pedido do usuário em uma SPEC de feature pequena, coerente com o AIgnt OS e pronta para alimentar TDD. +Transformar um pedido do usuário em uma SPEC de feature pequena, coerente com o SynapseOS e pronta para alimentar TDD. # Leia antes de agir @@ -44,7 +44,7 @@ Não use esta skill para: - A SPEC deve ser pequena o suficiente para caber em 1 a 3 dias de trabalho. - A SPEC deve ser coerente com o MVP: - pipeline linear state-driven - - AIgnt-Synapse-Flow como engine própria de pipeline + - Synapse-Flow como engine própria de pipeline - runtime dual simples - memória semântica apenas advisory - observabilidade local diff --git a/.agents/skills/spec-validator/SKILL.md b/.agents/skills/spec-validator/SKILL.md index 056d373..6b612ef 100644 --- a/.agents/skills/spec-validator/SKILL.md +++ b/.agents/skills/spec-validator/SKILL.md @@ -47,7 +47,7 @@ Não use esta skill para: ```bash uv run --no-sync python -c " from pathlib import Path -from aignt_os.specs.validator import validate_spec_file +from synapse_os.specs.validator import validate_spec_file result = validate_spec_file(Path('features//SPEC.md')) print(result) " diff --git a/.agents/skills/test-red/SKILL.md b/.agents/skills/test-red/SKILL.md index e06cb24..48db35f 100644 --- a/.agents/skills/test-red/SKILL.md +++ b/.agents/skills/test-red/SKILL.md @@ -58,7 +58,7 @@ Não use esta skill para: 4. Garanta que os testes falham pelos motivos certos. 5. Não implemente o código da feature nesta etapa. -# Convenções para o AIgnt OS +# Convenções para o SynapseOS Priorize testes para: diff --git a/.claude/agents/explorer.md b/.claude/agents/explorer.md index 747c15a..8518d0d 100644 --- a/.claude/agents/explorer.md +++ b/.claude/agents/explorer.md @@ -1,6 +1,6 @@ --- name: explorer -description: Explorador read-only da arquitetura do AIgnt OS. Mapeia arquivos afetados, ADRs, SPECs e dependências operacionais antes de qualquer edição de código. +description: Explorador read-only da arquitetura do SynapseOS. Mapeia arquivos afetados, ADRs, SPECs e dependências operacionais antes de qualquer edição de código. model: claude-sonnet-4-6 disallowedTools: - Write diff --git a/.codex/config.toml b/.codex/config.toml index 2abebc4..42d32fa 100644 --- a/.codex/config.toml +++ b/.codex/config.toml @@ -1,4 +1,4 @@ -# Project-local Codex configuration for AIgnt OS. +# Project-local Codex configuration for SynapseOS. # Repo defaults should be safe for daily work and explicit about multi-agent roles. model = "gpt-5.4" @@ -30,7 +30,7 @@ max_threads = 6 max_depth = 1 [agents.explorer] -description = "Read-only codebase explorer for mapping AIgnt OS architecture, affected code paths, specs, ADRs, and operational evidence before changes." +description = "Read-only codebase explorer for mapping SynapseOS architecture, affected code paths, specs, ADRs, and operational evidence before changes." config_file = "agents/explorer.toml" [agents.reviewer] diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index f37a35c..3229f48 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,5 +1,5 @@ { - "name": "aignt-os-codex-dev", + "name": "synapse-os-codex-dev", "dockerComposeFile": [ "../compose.yaml", "../compose.dev.yaml" diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 83eb0bb..ebe8845 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,4 +1,4 @@ -# Copilot Instructions for `aignt-os` +# Copilot Instructions for `synapse-os` ## Read first @@ -153,7 +153,7 @@ That is only a lightweight repo check. It does **not** replace the operational ` ## High-level architecture -AIgnt OS is a CLI-first meta-orchestrator for external AI tools. The intended system is centered on **AIgnt-Synapse-Flow**, the repository's own pipeline engine, which is state-driven and spec-first. +SynapseOS is a CLI-first meta-orchestrator for external AI tools. The intended system is centered on **Synapse-Flow**, the repository's own pipeline engine, which is state-driven and spec-first. There are two related flows to keep straight: @@ -173,13 +173,13 @@ REQUEST → SPEC_DISCOVERY → SPEC_NORMALIZATION → SPEC_VALIDATION → PLAN The docs describe a larger target system, but the current codebase now includes more than the earliest MVP slices. The implemented modules are concentrated in: -- `src/aignt_os/cli/app.py` for the public Typer CLI -- `src/aignt_os/runtime/` for the minimal persistent runtime lifecycle, worker loop, and dispatch service -- `src/aignt_os/specs/validator.py` for SPEC validation -- `src/aignt_os/state_machine.py` for the linear state machine -- `src/aignt_os/pipeline.py`, `src/aignt_os/persistence.py`, and `src/aignt_os/reporting.py` for the current persisted pipeline path and `RUN_REPORT.md` -- `src/aignt_os/adapters.py` and `src/aignt_os/supervisor.py` for the first real adapter and deterministic supervision behavior -- `src/aignt_os/contracts.py` and `src/aignt_os/config.py` for base contracts and settings +- `src/synapse_os/cli/app.py` for the public Typer CLI +- `src/synapse_os/runtime/` for the minimal persistent runtime lifecycle, worker loop, and dispatch service +- `src/synapse_os/specs/validator.py` for SPEC validation +- `src/synapse_os/state_machine.py` for the linear state machine +- `src/synapse_os/pipeline.py`, `src/synapse_os/persistence.py`, and `src/synapse_os/reporting.py` for the current persisted pipeline path and `RUN_REPORT.md` +- `src/synapse_os/adapters.py` and `src/synapse_os/supervisor.py` for the first real adapter and deterministic supervision behavior +- `src/synapse_os/contracts.py` and `src/synapse_os/config.py` for base contracts and settings `observability/` is still effectively future-facing, and future sessions should verify concrete implementation before assuming a dedicated observability module exists. @@ -187,7 +187,7 @@ The docs describe a larger target system, but the current codebase now includes The current runtime is a minimal dual-mode foundation: -- The CLI exposes `aignt version`, `aignt runtime {start,status,run,ready,stop}`, and `aignt runs {list,show,submit}`. +- The CLI exposes `synapse version`, `synapse runtime {start,status,run,ready,stop}`, and `synapse runs {list,show,submit}`. - `RuntimeService` manages a resident process and persists runtime state to a JSON file. - `RunDispatchService` already backs the public submit path and resolves synchronous vs. queued dispatch. - `RuntimeStateStore` treats missing state as `stopped` and corrupted or mismatched persisted state as `inconsistent`. @@ -224,7 +224,7 @@ To validate a SPEC locally: ```bash uv run --no-sync python -c " from pathlib import Path -from aignt_os.specs.validator import validate_spec_file +from synapse_os.specs.validator import validate_spec_file result = validate_spec_file(Path('features//SPEC.md')) print(result) " @@ -266,7 +266,7 @@ The architecture docs are important and should guide naming and design, but the ### Use the official terminology -When referring to the internal runtime flow, use **AIgnt-Synapse-Flow** and make clear at least once that it is the repository's own pipeline engine. +When referring to the internal runtime flow, use **Synapse-Flow** and make clear at least once that it is the repository's own pipeline engine. Keep these terms stable: @@ -290,7 +290,7 @@ Do not treat a green local hook as equivalent to the operational preflight. ### Configuration and environment variables -All `AppSettings` fields are overridable via environment variables with the `AIGNT_OS_` prefix (e.g., `AIGNT_OS_ENVIRONMENT`, `AIGNT_OS_RUNTIME_STATE_DIR`). Never use `os.environ` directly — always read settings through `AppSettings`. +All `AppSettings` fields are overridable via environment variables with the `SYNAPSE_OS_` prefix (e.g., `SYNAPSE_OS_ENVIRONMENT`, `SYNAPSE_OS_RUNTIME_STATE_DIR`). Never use `os.environ` directly — always read settings through `AppSettings`. ### Follow the repo's Python execution style diff --git a/.github/instructions/python.instructions.md b/.github/instructions/python.instructions.md index f808143..1406a6f 100644 --- a/.github/instructions/python.instructions.md +++ b/.github/instructions/python.instructions.md @@ -31,10 +31,10 @@ Use `python -m pytest` e `python -m mypy` — não os wrappers bare (`pytest`, ` ## Estrutura do projeto -- Código de produção em `src/aignt_os/`. -- Layout: `src/aignt_os//` com `__init__.py` explícito. -- Contratos em `src/aignt_os/contracts.py` — preserve as distinções existentes (ex: `stdout_raw` vs `stdout_clean`). -- Configurações via `src/aignt_os/config.py` com Pydantic Settings — não use `os.environ` diretamente. +- Código de produção em `src/synapse_os/`. +- Layout: `src/synapse_os//` com `__init__.py` explícito. +- Contratos em `src/synapse_os/contracts.py` — preserve as distinções existentes (ex: `stdout_raw` vs `stdout_clean`). +- Configurações via `src/synapse_os/config.py` com Pydantic Settings — não use `os.environ` diretamente. ## Pydantic e contratos @@ -44,12 +44,12 @@ Use `python -m pytest` e `python -m mypy` — não os wrappers bare (`pytest`, ` ## Imports -- Imports absolutos: `from aignt_os.contracts import ...` +- Imports absolutos: `from synapse_os.contracts import ...` - Não use imports relativos (`from ..contracts import ...`) exceto dentro do mesmo subpacote. - Ordem: stdlib → third-party → local (ruff isort cuida disso automaticamente). ## Proibições -- Não crie módulos fora de `src/aignt_os/` para código de produção. +- Não crie módulos fora de `src/synapse_os/` para código de produção. - Não adicione dependências pesadas sem justificativa alinhada ao MVP. - Não antecipe subsistemas não implementados (`adapters/`, `orchestrator/`, `pipeline/`, `memory/`, `db/`). diff --git a/.github/instructions/spec.instructions.md b/.github/instructions/spec.instructions.md index d8673d9..05203d6 100644 --- a/.github/instructions/spec.instructions.md +++ b/.github/instructions/spec.instructions.md @@ -62,7 +62,7 @@ Para validar uma SPEC localmente: ```bash uv run --no-sync python -c " -from aignt_os.specs.validator import SpecValidator +from synapse_os.specs.validator import SpecValidator v = SpecValidator() result = v.validate_file('features//SPEC.md') print(result) diff --git a/.github/workflows/operational-ci.yml b/.github/workflows/operational-ci.yml index f55216f..68ee9bb 100644 --- a/.github/workflows/operational-ci.yml +++ b/.github/workflows/operational-ci.yml @@ -29,13 +29,13 @@ jobs: - name: Validate branch alignment env: - AIGNT_EVENT_NAME: ${{ github.event_name }} - AIGNT_HEAD_REF: ${{ github.head_ref }} - AIGNT_REF_NAME: ${{ github.ref_name }} + SYNAPSE_EVENT_NAME: ${{ github.event_name }} + SYNAPSE_HEAD_REF: ${{ github.head_ref }} + SYNAPSE_REF_NAME: ${{ github.ref_name }} run: | - branch_name="$AIGNT_REF_NAME" - if [[ "$AIGNT_EVENT_NAME" == "pull_request" ]]; then - branch_name="$AIGNT_HEAD_REF" + branch_name="$SYNAPSE_REF_NAME" + if [[ "$SYNAPSE_EVENT_NAME" == "pull_request" ]]; then + branch_name="$SYNAPSE_HEAD_REF" fi ./scripts/validate-branch.sh --fetch --allow-main --base-ref origin/main --branch-name "$branch_name" diff --git a/.gitignore b/.gitignore index 0155de3..c7ac328 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,4 @@ build/ *.db artifacts/ .worktrees/ -.aignt-os/ +.synapse-os/ diff --git a/AGENTS.md b/AGENTS.md index 708360a..393ff6c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,10 +1,10 @@ # AGENTS.md ## Objetivo do repositório -Este repositório implementa o AIgnt OS, um meta-orquestrador de agentes de IA via CLI. +Este repositório implementa o SynapseOS, um meta-orquestrador de agentes de IA via CLI. A implementação deve seguir a arquitetura e decisões já documentadas, sem reinventar o projeto a cada feature. -O runtime interno deve ser referido como **AIgnt-Synapse-Flow**, deixando claro que ele é a **engine própria de pipeline** do AIgnt OS. +O runtime interno deve ser referido como **Synapse-Flow**, deixando claro que ele é a **engine própria de pipeline** do SynapseOS. ## Fontes de verdade Antes de iniciar qualquer trabalho, leia nesta ordem: @@ -28,7 +28,7 @@ Em caso de conflito: - Prefira mudanças pequenas, localizadas e reversíveis. - Nunca altere docs centrais sem necessidade real da feature. - Preserve o caráter **CLI-first**, **spec-first** e **feature-by-feature** do projeto. -- Use sempre o nome **AIgnt-Synapse-Flow** ao se referir ao runtime interno do AIgnt OS, deixando explícito ao menos uma vez por documento que ele é a **engine própria de pipeline** do AIgnt OS. +- Use sempre o nome **Synapse-Flow** ao se referir ao runtime interno do SynapseOS, deixando explícito ao menos uma vez por documento que ele é a **engine própria de pipeline** do SynapseOS. ## Convenção de nomes para agents/skills - Use o padrão `-`. @@ -266,7 +266,7 @@ Neste repositório, a operação do Codex deve ser container-first via ./scripts O serviço codex-dev existe só para desenvolvimento assistido. -O serviço aignt-os continua sendo o container de runtime da aplicação e do AIgnt-Synapse-Flow, a engine própria de pipeline do AIgnt OS. +O serviço synapse-os continua sendo o container de runtime da aplicação e do Synapse-Flow, a engine própria de pipeline do SynapseOS. Não rode o Codex diretamente no host quando a tarefa exigir execução prática em container. diff --git a/CHANGELOG.md b/CHANGELOG.md index b692ec2..9cd2782 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,24 +4,24 @@ Baseline atual apos as merges mais recentes em `main`: -- `aignt runs watch ` consolidado como dashboard TUI local, com explorer de artifacts e visualizacao de logs com buffer limitado +- `synapse runs watch ` consolidado como dashboard TUI local, com explorer de artifacts e visualizacao de logs com buffer limitado - dashboard TUI com filtros visuais por falha (`f`), atividade (`r`) e restauracao da lista completa (`x`) -- `aignt runs cancel ` e atalho `k` no dashboard para cancelamento local e gracioso de runs +- `synapse runs cancel ` e atalho `k` no dashboard para cancelamento local e gracioso de runs - runtime com timeout global por step e retry simples para falhas transientes - auth local com RBAC (`viewer`, `operator`, `admin`) e documentacao publica de `--role` - abstracao local de `auth_provider=file` pronta para futuros backends sem promover auth remota ## 0.1.0 -Primeira release tecnica coerente da etapa 2 do AIgnt OS. +Primeira release tecnica coerente da etapa 2 do SynapseOS. Superficie publica consolidada: -- `aignt doctor` para diagnostico local advisory do fluxo minimo atual -- `aignt runs submit ` com `--mode auto|sync|async` e `--stop-at` -- `aignt runs show ` para inspecao de runs persistidas -- `aignt runs show --preview report` -- `aignt runs show --preview .clean` +- `synapse doctor` para diagnostico local advisory do fluxo minimo atual +- `synapse runs submit ` com `--mode auto|sync|async` e `--stop-at` +- `synapse runs show ` para inspecao de runs persistidas +- `synapse runs show --preview report` +- `synapse runs show --preview .clean` Limites conhecidos: diff --git a/CLAUDE.md b/CLAUDE.md index fec5776..14d908d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -58,7 +58,7 @@ Use `--full-runtime` only when the change touches boot, lifecycle, persistence, ```bash uv run --no-sync python -c " from pathlib import Path -from aignt_os.specs.validator import validate_spec_file +from synapse_os.specs.validator import validate_spec_file result = validate_spec_file(Path('features//SPEC.md')) print(result) " @@ -70,14 +70,14 @@ The public API is `validate_spec_file(path: Path) -> SpecDocument` — there is ## Architecture overview -AIgnt OS is a CLI-first meta-orchestrator for external AI tools (Gemini, Codex, Claude, etc.). Two flows exist and must not be confused: +SynapseOS is a CLI-first meta-orchestrator for external AI tools (Gemini, Codex, Claude, etc.). Two flows exist and must not be confused: 1. **Official feature development workflow** (humans/agents working in the repo): ``` DOCKER_PREFLIGHT → SPEC → TEST_RED → CODE_GREEN → REFACTOR → QUALITY_GATE → SECURITY_REVIEW → REPORT → COMMIT ``` -2. **Internal runtime state flow** (AIgnt-Synapse-Flow, the repository's own pipeline engine): +2. **Internal runtime state flow** (Synapse-Flow, the repository's own pipeline engine): ``` REQUEST → SPEC_DISCOVERY → SPEC_NORMALIZATION → SPEC_VALIDATION → PLAN → TEST_RED → CODE_GREEN → REVIEW → SECURITY → DOCUMENT → COMPLETE ``` @@ -86,17 +86,17 @@ AIgnt OS is a CLI-first meta-orchestrator for external AI tools (Gemini, Codex, | Module | Role | |---|---| -| `src/aignt_os/cli/app.py` | Typer CLI entry point (`aignt` command) | -| `src/aignt_os/state_machine.py` | `AIgntStateMachine` — linear state machine for AIgnt-Synapse-Flow | -| `src/aignt_os/pipeline.py` | `PipelineEngine` — executes steps, coordinates `StepExecutor` impls | -| `src/aignt_os/persistence.py` | `RunRepository` (SQLAlchemy/SQLite) + `ArtifactStore` (filesystem) + `PersistedPipelineRunner` | -| `src/aignt_os/adapters.py` | `BaseCLIAdapter` — async subprocess execution with circuit breaker | -| `src/aignt_os/supervisor.py` | Deterministic failure handling (retry / reroute / fail) | -| `src/aignt_os/runtime/` | `RuntimeService`, `RuntimeWorker`, `RunDispatchService`, `RuntimeStateStore` | -| `src/aignt_os/specs/validator.py` | SPEC validation engine | -| `src/aignt_os/contracts.py` | Domain models via Pydantic v2 | -| `src/aignt_os/config.py` | `AppSettings` (pydantic-settings, `AIGNT_OS_` env prefix) | -| `src/aignt_os/reporting.py` | `RUN_REPORT.md` generation at `DOCUMENT` state | +| `src/synapse_os/cli/app.py` | Typer CLI entry point (`synapse` command) | +| `src/synapse_os/state_machine.py` | `SynapseStateMachine` — linear state machine for Synapse-Flow | +| `src/synapse_os/pipeline.py` | `PipelineEngine` — executes steps, coordinates `StepExecutor` impls | +| `src/synapse_os/persistence.py` | `RunRepository` (SQLAlchemy/SQLite) + `ArtifactStore` (filesystem) + `PersistedPipelineRunner` | +| `src/synapse_os/adapters.py` | `BaseCLIAdapter` — async subprocess execution with circuit breaker | +| `src/synapse_os/supervisor.py` | Deterministic failure handling (retry / reroute / fail) | +| `src/synapse_os/runtime/` | `RuntimeService`, `RuntimeWorker`, `RunDispatchService`, `RuntimeStateStore` | +| `src/synapse_os/specs/validator.py` | SPEC validation engine | +| `src/synapse_os/contracts.py` | Domain models via Pydantic v2 | +| `src/synapse_os/config.py` | `AppSettings` (pydantic-settings, `SYNAPSE_OS_` env prefix) | +| `src/synapse_os/reporting.py` | `RUN_REPORT.md` generation at `DOCUMENT` state | ### Runtime modes @@ -119,14 +119,14 @@ Feature directories: `features/F-/SPEC.md` ### Terminology -- **AIgnt-Synapse-Flow** = the repository's own pipeline engine (always name it this way) +- **Synapse-Flow** = the repository's own pipeline engine (always name it this way) - `SPEC` = the formal feature specification - `run` = one pipeline execution - `worker` / `runtime` = the resident long-lived mode ### Configuration -All `AppSettings` fields use the `AIGNT_OS_` prefix. Never use `os.environ` directly — always go through `AppSettings`. +All `AppSettings` fields use the `SYNAPSE_OS_` prefix. Never use `os.environ` directly — always go through `AppSettings`. ### Contracts diff --git a/CONTEXT.md b/CONTEXT.md index cea95d9..3d5b1db 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -1,8 +1,8 @@ # CONTEXT.md -## O que é o AIgnt OS -AIgnt OS é um meta-orquestrador de agentes de IA via CLI. -Ele não é o agente principal de raciocínio; seu papel é coordenar múltiplas ferramentas externas de IA por meio de subprocessos, parsing estruturado, handoffs controlados e do **AIgnt-Synapse-Flow**, a **engine própria de pipeline** do AIgnt OS. +## O que é o SynapseOS +SynapseOS é um meta-orquestrador de agentes de IA via CLI. +Ele não é o agente principal de raciocínio; seu papel é coordenar múltiplas ferramentas externas de IA por meio de subprocessos, parsing estruturado, handoffs controlados e do **Synapse-Flow**, a **engine própria de pipeline** do SynapseOS. ## Objetivo do projeto Construir um runtime de desenvolvimento autônomo e controlado que: @@ -34,8 +34,8 @@ SPEC → REPORT → COMMIT -## Subetapas internas do AIgnt-Synapse-Flow -Dentro do fluxo oficial, o AIgnt-Synapse-Flow pode decompor a execução em estados internos como: +## Subetapas internas do Synapse-Flow +Dentro do fluxo oficial, o Synapse-Flow pode decompor a execução em estados internos como: REQUEST → SPEC_DISCOVERY → SPEC_NORMALIZATION @@ -52,7 +52,7 @@ No MVP, a implementação prática continua linear, mas o operador deve seguir p ## Componentes centrais - Orchestrator Engine -- AIgnt-Synapse-Flow +- Synapse-Flow - Pipeline Manager - State Machine Manager - CLI Adapter Layer @@ -79,7 +79,7 @@ No MVP, a implementação prática continua linear, mas o operador deve seguir p - preflight completo de runtime: reservado para workflow dedicado ou pedido explícito em tarefas de boot/ciclo de vida/persistência/integração - `repo-preflight`: skill responsável pelo preflight operacional em Docker/container - `security-review`: gate de segurança antes de `REPORT` e `COMMIT` -- AIgnt-Synapse-Flow: engine própria de pipeline interna ao projeto, state-driven, linear no MVP +- Synapse-Flow: engine própria de pipeline interna ao projeto, state-driven, linear no MVP ## O que NÃO fazer no MVP - não implementar DAG distribuída completa @@ -140,7 +140,7 @@ O repositório privilegia progresso incremental, commits pequenos e baixa ambigu ## Linguagem e terminologia Sempre usar: -- `AIgnt-Synapse-Flow`, deixando explícito ao menos uma vez que ele é a engine própria de pipeline do AIgnt OS +- `Synapse-Flow`, deixando explícito ao menos uma vez que ele é a engine própria de pipeline do SynapseOS Usar “SPEC” para o artefato formal da feature. Usar “run” para uma execução da pipeline. diff --git a/Dockerfile b/Dockerfile index 7da1194..348f2ff 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,5 +23,5 @@ RUN python -m pip install --upgrade pip \ USER appuser -ENTRYPOINT ["aignt"] +ENTRYPOINT ["synapse"] CMD ["--help"] diff --git a/ERROR_LOG.md b/ERROR_LOG.md index c9507f8..c51e3e8 100644 --- a/ERROR_LOG.md +++ b/ERROR_LOG.md @@ -23,8 +23,8 @@ ## 2026-03-13 - PR `#65` da F30 mergeada com `repo-checks` falhando por formatacao global, depois resolvido pela `#66` - Contexto: fechamento Git da `F30-auth-registry-cli` apos quality gate local e abertura da PR `#65`. -- Ação/comando relacionado: `gh pr checks 65`, `gh run view 23034742953 --job 66900277313 --log-failed` e revalidacao local com `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync ruff format --check .`. -- Erro observado: o job `repo-checks` da PR falhou porque `ruff format --check .` ainda listava 6 arquivos fora do padrao (`src/aignt_os/persistence.py`, `tests/integration/test_runs_cli.py`, `tests/unit/test_cli_adapter.py`, `tests/unit/test_parsing_engine.py`, `tests/unit/test_persistence.py`, `tests/unit/test_security.py`). +- Ação/comando relacionado: `gh pr checks 65`, `gh run view 23034742953 --job 66900277313 --log-failed` e revalidacao local com `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync ruff format --check .`. +- Erro observado: o job `repo-checks` da PR falhou porque `ruff format --check .` ainda listava 6 arquivos fora do padrao (`src/synapse_os/persistence.py`, `tests/integration/test_runs_cli.py`, `tests/unit/test_cli_adapter.py`, `tests/unit/test_parsing_engine.py`, `tests/unit/test_persistence.py`, `tests/unit/test_security.py`). - Causa identificada: divida de formatacao preexistente na baseline atual, fora do diff funcional da `F30`. - Ação tomada: a PR foi mergeada com aprovacao explicita por excecao; a correcao do gate virou a proxima frente prioritaria de estabilizacao da baseline. - Status: resolvido; a baseline foi restaurada na PR `#66` e o handoff pos-`F32` nao deve mais tratar este incidente como bloqueio aberto. @@ -33,7 +33,7 @@ ## 2026-03-12 - Regressao de compatibilidade no monkeypatch de `_dispatch_service` durante a F29 - Contexto: implementacao e validacao final da `F29-auth-rbac-foundation`. -- Ação/comando relacionado: `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_config.py tests/unit/test_auth.py tests/integration/test_cli_auth_rbac.py tests/integration/test_runs_submit_cli.py tests/integration/test_runtime_cli.py tests/integration/test_cli_error_model.py -q` +- Ação/comando relacionado: `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_config.py tests/unit/test_auth.py tests/integration/test_cli_auth_rbac.py tests/integration/test_runs_submit_cli.py tests/integration/test_runtime_cli.py tests/integration/test_cli_error_model.py -q` - Erro observado: `tests/integration/test_cli_error_model.py::test_runs_submit_unexpected_dispatch_failure_returns_execution_error_code` falhou com `TypeError` porque o monkeypatch local de `_dispatch_service` nao aceitava o novo keyword argument `initiated_by`. - Causa identificada: a F29 ampliou `_dispatch_service()` para aceitar override de provenance autenticada, mas o call site de `runs submit` perdeu compatibilidade com o patch zero-arg exercitado pelos testes legados da F21. - Ação tomada: o call site foi ajustado para chamar `_dispatch_service()` sem argumentos quando nao houver principal autenticado e usar o override apenas no caminho autenticado. @@ -53,22 +53,22 @@ ## 2026-03-11 17:44 -03 - Worktree fria da F09 sem dependencias dev para coleta de testes - Contexto: implementacao da `F09-supervisor-mvp` em worktree nova. -- Ação/comando relacionado: `pytest tests/unit/test_supervisor.py ... tests/integration/test_pipeline_persistence.py` e `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run pytest ...` +- Ação/comando relacionado: `pytest tests/unit/test_supervisor.py ... tests/integration/test_pipeline_persistence.py` e `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run pytest ...` - Erro observado: `ModuleNotFoundError: No module named 'typer'` durante a carga de `tests/integration/conftest.py`. - Causa identificada: a worktree foi aberta sem bootstrap de dependencias dev; a coleta dos testes de integracao depende de `typer`. -- Ação tomada: `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv sync --locked --extra dev` e reexecucao da suite no ambiente sincronizado. +- Ação tomada: `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv sync --locked --extra dev` e reexecucao da suite no ambiente sincronizado. - Status: resolvido localmente. - Observação futura: em worktree fria, sincronizar extras de desenvolvimento antes de rodar suites que carregam `tests/integration/conftest.py`. ## 2026-03-11 17:44 -03 - `mypy src tests` continua falhando por modulo duplicado `conftest` - Contexto: validacao final da `F09-supervisor-mvp` antes do handoff. -- Ação/comando relacionado: `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run mypy src tests` +- Ação/comando relacionado: `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run mypy src tests` - Erro observado: `tests/unit/conftest.py: error: Duplicate module named "conftest" (also at "tests/integration/conftest.py")`. -- Causa identificada: a invocacao ampla `mypy src tests` conflitou primeiro com os dois `conftest.py` como modulos top-level e, apos resolver o namespace, expôs que a arvore `tests/` nao seguia o mesmo contrato strict aplicado a `src/aignt_os`. +- Causa identificada: a invocacao ampla `mypy src tests` conflitou primeiro com os dois `conftest.py` como modulos top-level e, apos resolver o namespace, expôs que a arvore `tests/` nao seguia o mesmo contrato strict aplicado a `src/synapse_os`. - Ação tomada: na branch `chore/test-layout-typecheck-hardening`, a arvore `tests/` recebeu package markers (`tests/`, `tests/unit/`, `tests/integration/`, `tests/pipeline/`) e o `pyproject.toml` passou a declarar override explícito de `mypy` para `tests` e `tests.*`. A revalidação com `uv run mypy src tests`, `uv run --no-sync python -m mypy`, `pytest` e `./scripts/commit-check.sh --sync-dev --skip-docker` fechou verde. - Status: resolvido. -- Observação futura: manter o contrato strict de `mypy` centrado em `src/aignt_os`; tipagem estrita da arvore `tests/` só deve virar frente própria se houver benefício real. +- Observação futura: manter o contrato strict de `mypy` centrado em `src/synapse_os`; tipagem estrita da arvore `tests/` só deve virar frente própria se houver benefício real. ## 2026-03-11 - `test_adapter_parser_flow` falhou por fixture ANSI como texto literal @@ -94,9 +94,9 @@ - Contexto: tentativa de preparar o merge da `F06-pipeline-engine-linear`. - Ação/comando relacionado: `gh pr checks 28`, `gh run view 22966152999 --job 66670192469 --log-failed` e reproducao local com `PYTHONPATH=src ... python -m pytest tests/unit/test_pipeline_engine.py -k invalid -q`. -- Erro observado: o CI falhou em `tests/unit/test_pipeline_engine.py::test_pipeline_engine_blocks_plan_when_spec_is_invalid` com `AttributeError: module 'aignt_os.pipeline' has no attribute 'SpecValidationError'`. -- Causa identificada: o teste da `F06` ja modelava `SpecValidationError` como parte da API publica de `aignt_os.pipeline`, mas o modulo nao reexportava esse simbolo vindo de `aignt_os.specs`. -- Ação tomada: o modulo `src/aignt_os/pipeline.py` passou a reexportar `SpecValidationError`; a revalidacao local com `pytest`, `ruff`, `mypy` e `./scripts/commit-check.sh --sync-dev --skip-branch-validation --skip-docker --skip-security` voltou a fechar verde. +- Erro observado: o CI falhou em `tests/unit/test_pipeline_engine.py::test_pipeline_engine_blocks_plan_when_spec_is_invalid` com `AttributeError: module 'synapse_os.pipeline' has no attribute 'SpecValidationError'`. +- Causa identificada: o teste da `F06` ja modelava `SpecValidationError` como parte da API publica de `synapse_os.pipeline`, mas o modulo nao reexportava esse simbolo vindo de `synapse_os.specs`. +- Ação tomada: o modulo `src/synapse_os/pipeline.py` passou a reexportar `SpecValidationError`; a revalidacao local com `pytest`, `ruff`, `mypy` e `./scripts/commit-check.sh --sync-dev --skip-branch-validation --skip-docker --skip-security` voltou a fechar verde. - Status: resolvido localmente; PR pendente de atualizacao no GitHub. - Observação futura: quando a feature introduzir novo modulo de orquestracao, manter teste e API publica alinhados explicitamente para evitar regressao em `repo-checks`. @@ -154,7 +154,7 @@ - Contexto: execução local de testes após corrigir baseline operacional. - Ação/comando relacionado: `./.venv/bin/pytest` -- Erro observado: `ModuleNotFoundError: No module named 'aignt_os'` em testes de config, contracts e CLI. +- Erro observado: `ModuleNotFoundError: No module named 'synapse_os'` em testes de config, contracts e CLI. - Causa identificada: execução local usando `.venv` sem instalar o pacote ou sem `PYTHONPATH=src`; o caminho operacional do CI continua sendo `uv run pytest`. - Ação tomada: validação local da suíte foi feita com `PYTHONPATH=src ./.venv/bin/pytest`. - Status: contornado na sessão. @@ -196,7 +196,7 @@ - Ação/comando relacionado: `UV_CACHE_DIR=.cache/uv uv run ruff format --check .` - Erro observado: arquivos preexistentes fora do padrão de formatação. - Causa identificada: dívida de formatação já presente no repositório, não ligada ao runtime persistente. -- Ação tomada: a pendência ficou aberta inicialmente; em 2026-03-10 o repositório foi revalidado com `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync ruff format --check .` e o gate voltou a fechar verde no estado atual. +- Ação tomada: a pendência ficou aberta inicialmente; em 2026-03-10 o repositório foi revalidado com `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync ruff format --check .` e o gate voltou a fechar verde no estado atual. - Status: resolvido no estado atual do repositório. - Observação futura: revalidar após mudanças amplas de documentação ou baseline para garantir que `ruff format --check .` continue apto a operar como gate completo. @@ -204,7 +204,7 @@ - Contexto: tentativa de validar a feature de runtime persistente após integrar a branch no merge operacional. - Ação/comando relacionado: `PYTHONPATH=src ./.venv/bin/pytest tests/integration/test_runtime_cli.py tests/unit/test_runtime_service_security.py tests/unit/test_runtime_state.py` -- Erro observado: `bad interpreter` apontando para `/home/g0dsssp33d/work/projetcs/aignt-os/.venv/bin/python3`. +- Erro observado: `bad interpreter` apontando para `/home/g0dsssp33d/work/projetcs/synapse-os/.venv/bin/python3`. - Causa identificada: virtualenv preexistente criada com caminho antigo/incorreto. - Ação tomada: a validação migrou para um ambiente local novo dedicado (`.venv-codex-runtime`). - Status: contornado na sessão. @@ -213,7 +213,7 @@ ## 2026-03-09 08:42 - `uv run pytest` não enxergou dependências de runtime após `uv sync` - Contexto: validação da suíte específica do runtime persistente depois de sincronizar dependências dev. -- Ação/comando relacionado: `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run pytest tests/integration/test_runtime_cli.py tests/unit/test_runtime_service_security.py tests/unit/test_runtime_state.py` +- Ação/comando relacionado: `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run pytest tests/integration/test_runtime_cli.py tests/unit/test_runtime_service_security.py tests/unit/test_runtime_state.py` - Erro observado: `ModuleNotFoundError: No module named 'typer'` durante a coleta. - Causa identificada: o runner usado pelo `uv run` permaneceu desalinhado com o ambiente esperado para a sessão. - Ação tomada: instalação do projeto e extras de desenvolvimento em uma virtualenv local dedicada (`.venv-codex-runtime`) e reexecução da suíte por esse ambiente. @@ -245,7 +245,7 @@ - Contexto: revalidação operacional do fluxo local após `uv sync --locked --extra dev` em ambiente com rede liberada. - Ação/comando relacionado: `./scripts/commit-check.sh --no-sync --skip-branch-validation --skip-docker --skip-security`, `uv run --no-sync mypy`, `uv run --no-sync pytest` - Erro observado: `uv run --no-sync mypy` falhou com `No such file or directory`; o mesmo padrão afetava wrappers da `.venv` usados no passo de testes. -- Causa identificada: wrappers de `.venv/bin/mypy` e `.venv/bin/pytest` apontavam para caminho antigo/incorreto em `/home/g0dsssp33d/work/projetcs/aignt-os/.venv/bin/python3`. +- Causa identificada: wrappers de `.venv/bin/mypy` e `.venv/bin/pytest` apontavam para caminho antigo/incorreto em `/home/g0dsssp33d/work/projetcs/synapse-os/.venv/bin/python3`. - Ação tomada: o fluxo operacional em `scripts/commit-check.sh` passou a executar `python -m mypy` e `python -m pytest` via `uv`; os testes operacionais do script foram ajustados para refletir o novo contrato. - Status: resolvido. - Observação futura: manter o fluxo com `python -m ...` reduz dependência de wrappers quebrados da `.venv`, mas a virtualenv local antiga ainda pode merecer limpeza dedicada fora desta frente. @@ -254,7 +254,7 @@ - Contexto: tentativa de fechar a feature `F02-spec-engine-mvp` com PR já aberta no GitHub. - Ação/comando relacionado: `gh pr checks 19`, inspeção dos logs do GitHub Actions e revalidação local com `ruff`, `mypy`, `pytest` e `./scripts/commit-check.sh --sync-dev --skip-branch-validation --skip-docker --skip-security --allow-main`. -- Erro observado: `repo-checks` falhou por formatação pendente em `src/aignt_os/specs/validator.py`, import order em `tests/unit/test_spec_validator.py` e `mypy` reclamando de `Library stubs not installed for "yaml"`. +- Erro observado: `repo-checks` falhou por formatação pendente em `src/synapse_os/specs/validator.py`, import order em `tests/unit/test_spec_validator.py` e `mypy` reclamando de `Library stubs not installed for "yaml"`. - Causa identificada: o delta da F02 foi commitado sem alinhar completamente os gates locais de formatação, lint e tipagem exigidos pelo CI. - Ação tomada: correção mínima no `SpecValidator` e no teste afetado, com revalidação local completa dos mesmos gates usados no CI. - Status: resolvido na branch atual. diff --git a/PENDING_LOG.md b/PENDING_LOG.md index be6b302..392b986 100644 --- a/PENDING_LOG.md +++ b/PENDING_LOG.md @@ -3,7 +3,7 @@ ## Decisões incorporadas recentemente - Em 2026-03-13, `origin/main` absorveu a merge de `F42-tui-filters` pela PR `#86`, adicionando filtros visuais locais no dashboard TUI para falhas (`f`), atividade (`r`) e restauracao da lista completa (`x`). -- Em 2026-03-13, `origin/main` absorveu a merge de `F40-local-cancellation` pela PR `#87`, consolidando `aignt runs cancel ` e o atalho `k` no dashboard como cancelamento local e gracioso de runs. +- Em 2026-03-13, `origin/main` absorveu a merge de `F40-local-cancellation` pela PR `#87`, consolidando `synapse runs cancel ` e o atalho `k` no dashboard como cancelamento local e gracioso de runs. - Com `F42` e `F40`, a TUI local atual passa a cobrir watch, logs por `Enter`, explorer de artifacts por `a`, filtros visuais e cancelamento local, sem abrir scheduler, fila remota ou cancelamento distribuido. - O drift remanescente voltou a ser documental: `memory.md`, `PENDING_LOG.md`, `ERROR_LOG.md`, `README.md` e `CHANGELOG.md` ficaram atrasados em relacao ao baseline real pos-`F42`/`F40`, e `features/F40-local-cancellation/` e `features/F42-tui-filters/` ficaram sem artefatos minimos de fechamento. - A frente ativa imediata passa a ser a chore doc-only `chore-post-f40-f42-baseline-sync`, para consolidar handoff e documentacao publica antes da proxima decisao de produto. @@ -22,13 +22,13 @@ - Em 2026-03-13, a `F34-async-submit-runtime-ownership` foi mergeada em `main` pela PR `#70`, fazendo `runs submit` autenticado aceitar dispatch resolvido para `async` apenas quando o runtime residente pertence ao mesmo principal, preservando fallback legado sem `started_by`. - Em 2026-03-13, a `F35-worker-runtime-ownership-filter` foi mergeada em `main` pela PR `#71`, fazendo o worker do runtime residente consumir apenas runs compativeis com o principal que iniciou o runtime, sem falhar nem lockar runs incompatíveis. -- Em 2026-03-13, a `F36-worker-owner-skip-observability` foi mergeada em `main` pela PR `#72`, tornando auditavel o skip do worker com evento `runtime_owner_skip` nas runs incompatíveis e mantendo o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS. +- Em 2026-03-13, a `F36-worker-owner-skip-observability` foi mergeada em `main` pela PR `#72`, tornando auditavel o skip do worker com evento `runtime_owner_skip` nas runs incompatíveis e mantendo o Synapse-Flow como a engine propria de pipeline do SynapseOS. - Com `F32`, `F34`, `F35` e `F36`, o bucket local de `resident_transport_auth` deixa de ser backlog funcional aberto e passa a ser baseline absorvido; o residual real de `G-11` fica restrito a operacao remota/multi-host. - A frente ativa imediata deixa de ser triagem de produto e passa a ser a chore doc-only `F37-post-f36-g11-sync`, para alinhar handoff e backlog ao estado pos-`#72` antes da proxima decisao de produto. - A proxima decisao de produto fica bloqueada ate `PENDING_LOG.md`, `memory.md` e `docs/IDEAS.md` refletirem o baseline real pos-`F36`. - Em 2026-03-13, a `F32-runtime-resident-principal-binding` foi mergeada em `main` pela PR `#68`, entregando o primeiro slice concreto do bucket `resident_transport_auth` sem abrir socket, IPC ou operacao remota. -- A `F32` persistiu `started_by` no estado do runtime quando auth local esta habilitada, passou a exibir esse binding em `aignt runtime status` e endureceu `aignt runtime stop` contra operador diferente quando o binding existe. +- A `F32` persistiu `started_by` no estado do runtime quando auth local esta habilitada, passou a exibir esse binding em `synapse runtime status` e endureceu `synapse runtime stop` contra operador diferente quando o binding existe. - Com a `F32`, o residual de `G-11` deixa de ser apenas fundacao local absorvida versus backlog futuro: o bucket `resident_transport_auth` ja tem um primeiro slice entregue, enquanto operacao remota/multi-host continua explicitamente adiada. - A frente ativa imediata deixou de ser feature de produto e passou a ser chore doc-only de handoff: `F33-post-f32-handoff-sync`, para alinhar memoria operacional e backlog ao estado pos-`#68` antes da proxima triagem. - A proxima decisao de produto fica bloqueada ate `PENDING_LOG.md`, `ERROR_LOG.md`, `memory.md` e `docs/IDEAS.md` refletirem o baseline real pos-`F32`. @@ -38,7 +38,7 @@ - A `F31` foi aberta como frente doc-only para decompor formalmente o residual de `G-11` em `local_cli_auth` ja absorvido, `resident_transport_auth` ainda pendente e `remote_multi_host_auth` explicitamente adiado. - O proximo trabalho de codigo fica bloqueado ate essa decomposicao documental fechar uma SPEC pequena e verificavel para o bucket `resident_transport_auth`. -- Em 2026-03-13, a `F30-auth-registry-cli` foi mergeada em `main` pela PR `#65`, adicionando `aignt auth init|issue|disable`, `token_id` no registry local e alinhamento de `docs/IDEAS.md`/README ao baseline pos-F30. +- Em 2026-03-13, a `F30-auth-registry-cli` foi mergeada em `main` pela PR `#65`, adicionando `synapse auth init|issue|disable`, `token_id` no registry local e alinhamento de `docs/IDEAS.md`/README ao baseline pos-F30. - A `F30` fechou o follow-up local de auth iniciado pela `F29`; o residual real de `G-11` ficou reduzido ao recorte grande de operacao remota/socket, explicitamente adiado. - O fechamento Git da `F30` exigiu merge explicito porque o job `repo-checks` permaneceu vermelho por `ruff format --check .` em 6 arquivos preexistentes fora do diff funcional da feature. - Com isso, a proxima frente logica deixou de ser backlog de produto e passou a ser estabilizacao da baseline: restaurar `repo-checks` e sincronizar o handoff pos-F30 antes de abrir nova SPEC. @@ -52,48 +52,48 @@ - O backlog remanescente da `IDEA-001` ficou reduzido principalmente a `G-09` (circuit breaker para adapters) e `G-11` (autenticação/autorização), com `G-09` como menor recorte técnico natural para a próxima triagem. - Em 2026-03-12, o baseline documental foi realinhado ao estado real do repositório: `main` já incorpora `F17-artifact-preview` e `F22-release-readiness`, fechando a etapa 2 no código, na CLI pública e na release técnica. -- A `F17-artifact-preview` foi mergeada em `main`, consolidando `aignt runs show --preview report` e `--preview .clean` com leitura textual truncada e sem abrir leitura arbitrária do host. +- A `F17-artifact-preview` foi mergeada em `main`, consolidando `synapse runs show --preview report` e `--preview .clean` com leitura textual truncada e sem abrir leitura arbitrária do host. - A `F22-release-readiness` foi mergeada em `main`, consolidando `CHANGELOG.md`, `docs/release/phase-2-technical-release.md`, README alinhado ao quickstart `sync-first` e boundary explícito para artifact preview. - A próxima decisão do projeto deixou de ser fechar PRs da etapa 2 e passou a ser abrir a primeira SPEC pós-`F22`; `docs/IDEAS.md` permanece como backlog candidato, com `IDEA-001 / G-02` como menor recorte imediato se houver risco real em observabilidade pública. -- A `F13-rich-cli-output` foi concluida localmente como frente pequena de UX na CLI, sem ampliar a arquitetura: `aignt runtime status` passou a renderizar painel Rich com status e PID, mantendo `stderr` e exit code de falha no estado inconsistente. -- A F13 introduziu `src/aignt_os/cli/rendering.py` como helper minima de apresentacao e adicionou cobertura dedicada em `tests/unit/test_cli_rich_output.py` e `tests/integration/test_runtime_cli.py`. +- A `F13-rich-cli-output` foi concluida localmente como frente pequena de UX na CLI, sem ampliar a arquitetura: `synapse runtime status` passou a renderizar painel Rich com status e PID, mantendo `stderr` e exit code de falha no estado inconsistente. +- A F13 introduziu `src/synapse_os/cli/rendering.py` como helper minima de apresentacao e adicionou cobertura dedicada em `tests/unit/test_cli_rich_output.py` e `tests/integration/test_runtime_cli.py`. - A validacao local da F13 fechou verde com `validate_spec_file()` da SPEC, `pytest tests/unit/test_cli_rich_output.py tests/integration/test_runtime_cli.py`, `./scripts/commit-check.sh --no-sync --skip-branch-validation --skip-docker --skip-security` e `./scripts/security-gate.sh`. -- O recorte da F13 permaneceu deliberadamente restrito a `aignt runtime status`, sem `Textual`, sem watch mode, sem novo subcomando publico e sem necessidade de `DOCKER_PREFLIGHT`. -- A `F14-runs-observability-cli` foi concluida localmente como frente pequena de observabilidade CLI-first, adicionando `aignt runs list` e `aignt runs show ` sem abrir TUI. -- A F14 reaproveitou `RunRepository` e `ArtifactStore`, estendeu `src/aignt_os/cli/rendering.py` para listagem/detalhe de runs e manteve o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS. +- O recorte da F13 permaneceu deliberadamente restrito a `synapse runtime status`, sem `Textual`, sem watch mode, sem novo subcomando publico e sem necessidade de `DOCKER_PREFLIGHT`. +- A `F14-runs-observability-cli` foi concluida localmente como frente pequena de observabilidade CLI-first, adicionando `synapse runs list` e `synapse runs show ` sem abrir TUI. +- A F14 reaproveitou `RunRepository` e `ArtifactStore`, estendeu `src/synapse_os/cli/rendering.py` para listagem/detalhe de runs e manteve o Synapse-Flow como a engine propria de pipeline do SynapseOS. - A validacao local da F14 fechou verde com `validate_spec_file()` da SPEC, `pytest` focado de CLI/persistencia, `./scripts/commit-check.sh --no-sync --skip-branch-validation --skip-docker --skip-security` e `./scripts/security-gate.sh`. - O recorte da F14 permaneceu deliberadamente restrito a leitura de runs persistidas: sem watch mode, sem streaming, sem Textual e sem `DOCKER_PREFLIGHT`. -- A PR `#42` da `F14-runs-observability-cli` foi mergeada em `main`, consolidando `aignt runs list` e `aignt runs show ` como superficie publica atual do projeto. +- A PR `#42` da `F14-runs-observability-cli` foi mergeada em `main`, consolidando `synapse runs list` e `synapse runs show ` como superficie publica atual do projeto. - A etapa seguinte do projeto foi definida e documentada como fila oficial em `docs/architecture/PHASE_2_ROADMAP.md`, seguindo o cenario misto: `F15 -> F16 -> F21 -> F18 -> F19 -> F20 -> F17 -> F22`. - Uma proposta posterior de guardrails pre-etapa-2 (input, secrets, rate limiting e audit trail) foi triada e nao foi promovida a duas features autonomas; o backlog oficial preserva a etapa 2 como proxima trilha principal. - O unico recorte excepcional aceito antes da etapa 2, se houver risco real, e mascaramento de secrets em campos `_clean` e artifacts de leitura publica; o restante deve ser absorvido em `F15` e `F21`. -- A `F15-public-run-submission` foi implementada localmente com `aignt runs submit `, `--mode auto|sync|async` e `--stop-at`, reaproveitando o `RunDispatchService` interno e fixando `SPEC_VALIDATION` como default operacional seguro. +- A `F15-public-run-submission` foi implementada localmente com `synapse runs submit `, `--mode auto|sync|async` e `--stop-at`, reaproveitando o `RunDispatchService` interno e fixando `SPEC_VALIDATION` como default operacional seguro. - O hardening principal da F15 ficou no proprio dispatch: a SPEC e validada antes de qualquer submit, inclusive em `async`, para evitar persistencia de runs invalidas. - A validacao local da F15 fechou verde com `validate_spec_file()` da SPEC, `pytest` focado de dispatch/runs/runtime, `./scripts/commit-check.sh --no-sync --skip-branch-validation --skip-docker --skip-security` e `./scripts/security-gate.sh`. -- A PR `#43` da `F15-public-run-submission` foi mergeada em `main`, consolidando `aignt runs submit ` como superficie publica atual junto de `aignt runs list/show`. +- A PR `#43` da `F15-public-run-submission` foi mergeada em `main`, consolidando `synapse runs submit ` como superficie publica atual junto de `synapse runs list/show`. - A chore documental pos-F15 alinhou `README.md`, `WORKTREE_FEATURES.md`, `memory.md`, `PENDING_LOG.md` e `.github/copilot-instructions.md` ao baseline atual da etapa 2. - O baseline real atual tambem ja incorpora a `F16-run-detail-expansion`, a `F21-cli-error-model-and-exit-codes` e a `F18-canonical-happy-path`: as tres frentes tem `SPEC.md` propria, notes/checklists, comportamento materializado na CLI e cobertura dedicada em testes unitarios e de integracao. - A revalidacao focada do baseline da etapa 2 fechou verde com `uv run --no-sync python -m pytest tests/unit/test_cli_runs_rendering.py tests/integration/test_runs_submit_cli.py tests/integration/test_cli_error_model.py -q`, totalizando `12 passed`. - O handoff operacional foi realinhado para refletir a fila remanescente correta da etapa 2: `F19 -> F20 -> F17 -> F22`. -- A `F19-environment-doctor` foi concluida e mergeada pela PR `#51`, consolidando `aignt doctor` como diagnostico local e advisory do fluxo publico atual. -- A `F20-public-onboarding` foi concluida e mergeada pela PR `#52`, consolidando o quickstart publico sync-first e o boundary entre `aignt doctor` e `repo-preflight`. +- A `F19-environment-doctor` foi concluida e mergeada pela PR `#51`, consolidando `synapse doctor` como diagnostico local e advisory do fluxo publico atual. +- A `F20-public-onboarding` foi concluida e mergeada pela PR `#52`, consolidando o quickstart publico sync-first e o boundary entre `synapse doctor` e `repo-preflight`. - Com a merge de `F19` e `F20`, a fila remanescente real da etapa 2 passou a ser `F17 -> F22`. -- A `F17-artifact-preview` foi concluida localmente com preview textual controlado em `aignt runs show --preview `, suportando `report` e `.clean` sem abrir leitura arbitraria do host. +- A `F17-artifact-preview` foi concluida localmente com preview textual controlado em `synapse runs show --preview `, suportando `report` e `.clean` sem abrir leitura arbitraria do host. - O delta da F17 manteve o contrato de erros da F21 (`Usage error:`/`2`, `Not found:`/`3`) e limitou a leitura ao inicio do artifact, com truncamento explicito apos no maximo 40 linhas. - A PR `#53` da `F17-artifact-preview` foi aberta contra `main`, deixando a frente pronta para revisao sem merge antecipado. - A `F22-release-readiness` foi concluida localmente como frente documental e de validacao final, adicionando `CHANGELOG.md`, release notes versionada e boundary explicito entre quickstart sync-first e artifact preview. -- A `F10-run-report-one-real-adapter` foi concluida e mergeada em `main`, fechando o MVP inicial do AIgnt-Synapse-Flow com `DOCUMENT`, `RUN_REPORT.md` e o primeiro adapter real (`CodexCLIAdapter`). +- A `F10-run-report-one-real-adapter` foi concluida e mergeada em `main`, fechando o MVP inicial do Synapse-Flow com `DOCUMENT`, `RUN_REPORT.md` e o primeiro adapter real (`CodexCLIAdapter`). - A `F12-codex-adapter-operational-hardening` foi concluida e mergeada pela PR `#38`, com `main` local e `origin/main` sincronizados em `ahead=0 behind=0`. - O hardening da F12 manteve `CLIExecutionResult` como contrato de execucao e adicionou classificacao operacional explicita do Codex (`timeout`, `return_code_nonzero`, `launcher_unavailable`, `container_unavailable`, `authentication_unavailable`) sem reabrir a pipeline. - O `DOCKER_PREFLIGHT` real e o smoke container-first do Codex foram validados; o unico bloqueio observado foi autenticacao ausente (`401 Unauthorized`), tratado como bloqueio operacional externo e nao como defeito do adapter. - A chore `test-layout-typecheck-hardening` estabilizou a arvore `tests/` com package markers explicitos, removendo a colisao operacional entre `tests/unit/conftest.py` e `tests/integration/conftest.py`. -- O repositório agora aceita `uv run mypy src tests`, mas isso foi fechado via override explícito do `mypy` para `tests` e `tests.*`, preservando o contrato strict no pacote `src/aignt_os`. +- O repositório agora aceita `uv run mypy src tests`, mas isso foi fechado via override explícito do `mypy` para `tests` e `tests.*`, preservando o contrato strict no pacote `src/synapse_os`. -- A `F09-supervisor-mvp` foi materializada com `SPEC.md`, `NOTES.md` e `CHECKLIST.md` proprios, mantendo o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS e limitando o recorte a supervisor deterministico, pipeline linear ate `SECURITY` e persistencia de decisoes do supervisor. -- A pipeline agora suporta `CODE_GREEN`, `REVIEW` e `SECURITY`; a state machine passou a aceitar `REVIEW -> CODE_GREEN` para rework, e o novo modulo `aignt_os.supervisor` decide entre `retry`, `reroute`, `return_to_code_green` e `fail` de forma deterministica. +- A `F09-supervisor-mvp` foi materializada com `SPEC.md`, `NOTES.md` e `CHECKLIST.md` proprios, mantendo o Synapse-Flow como a engine propria de pipeline do SynapseOS e limitando o recorte a supervisor deterministico, pipeline linear ate `SECURITY` e persistencia de decisoes do supervisor. +- A pipeline agora suporta `CODE_GREEN`, `REVIEW` e `SECURITY`; a state machine passou a aceitar `REVIEW -> CODE_GREEN` para rework, e o novo modulo `synapse_os.supervisor` decide entre `retry`, `reroute`, `return_to_code_green` e `fail` de forma deterministica. - A persistencia de runs da F09 passou a registrar eventos `supervisor_decision`, e a validacao local da feature fechou verde com `233` testes passando, `ruff check`, `uv run --no-sync python -m mypy`, `./scripts/security-gate.sh` e `./scripts/commit-check.sh --skip-docker`. - O recorte da F09 manteve `retry` e `reroute` dentro da mesma execucao da pipeline; nao houve retomada persistida entre polls do worker nem ampliacao para `DOCUMENT` ou `RUN_REPORT.md`. @@ -104,14 +104,14 @@ - Fixtures novas criadas: `tests/fixtures/docker/valid_compose_config.txt`, `invalid_compose_config.txt`, `tests/fixtures/reports/expected_run_report.md`, `tests/fixtures/cli_outputs/gemini_plan.txt`, `codex_tests.txt`, `claude_review.txt`. - Security review da branch `chore/tdd-integration-hardening` foi aprovado sem ressalvas: zero mudanças em código de produção, todos os padrões de subprocess existentes são legítimos, uso de `unicode_escape` em fixtures é controlado e sem risco de injeção. -- A correcao de follow-up da `F06-pipeline-engine-linear` reexportou `SpecValidationError` em `aignt_os.pipeline`, alinhando a API publica da engine com o teste de bloqueio por SPEC invalida e restaurando o `repo-checks` local no mesmo caminho usado pelo CI. -- A `F06-pipeline-engine-linear` passou a ter `SPEC.md` propria, `NOTES.md`, contratos tipados de pipeline (`PipelineStep`, `StepExecutionResult`, `PipelineContext`) e uma `PipelineEngine` linear em fake mode para o AIgnt-Synapse-Flow. +- A correcao de follow-up da `F06-pipeline-engine-linear` reexportou `SpecValidationError` em `synapse_os.pipeline`, alinhando a API publica da engine com o teste de bloqueio por SPEC invalida e restaurando o `repo-checks` local no mesmo caminho usado pelo CI. +- A `F06-pipeline-engine-linear` passou a ter `SPEC.md` propria, `NOTES.md`, contratos tipados de pipeline (`PipelineStep`, `StepExecutionResult`, `PipelineContext`) e uma `PipelineEngine` linear em fake mode para o Synapse-Flow. - O recorte da `F06-pipeline-engine-linear` ficou deliberadamente restrito a `SPEC_VALIDATION`, `PLAN` e `TEST_RED`, reutilizando `SpecValidator` e state machine ja existentes, sem persistencia, worker, supervisor ou adapters reais. - A validacao local da `F06-pipeline-engine-linear` fechou verde com `SPEC` validada, `88` testes passando via `python -m pytest`, `ruff check`, `ruff format --check`, `mypy` e `./scripts/branch-sync-check.sh` em `ahead=0 behind=0`. - O `security-review` do delta da `F06-pipeline-engine-linear` foi concluido sem ressalvas: a feature nao adiciona shell, subprocesso novo, Docker, workflow ou automacao operacional, e mantem a execucao de pipeline em fake mode com contexto em memoria e validacao explicita da SPEC antes de `PLAN`. - A `F05-cli-adapter-base` passou a ter `SPEC.md` propria, `NOTES.md`, um `BaseCLIAdapter` assíncrono via `asyncio.create_subprocess_exec` e a evolucao de `CLIExecutionResult` para incluir `tool_name`, `stdout/stderr` raw/clean, `duration_ms` e `timed_out`. -- O recorte da `F05-cli-adapter-base` ficou deliberadamente restrito a contrato de execucao, subprocesso async, timeout e sanitizacao leve de ANSI, preservando o Parsing Engine da `F04` como responsavel por limpeza mais rica e extracao de artefatos antes dos hand-offs do AIgnt-Synapse-Flow. +- O recorte da `F05-cli-adapter-base` ficou deliberadamente restrito a contrato de execucao, subprocesso async, timeout e sanitizacao leve de ANSI, preservando o Parsing Engine da `F04` como responsavel por limpeza mais rica e extracao de artefatos antes dos hand-offs do Synapse-Flow. - A validacao local da `F05-cli-adapter-base` fechou verde com `SPEC` validada, `84` testes passando via `python -m pytest`, `ruff check`, `ruff format --check`, `mypy` e `./scripts/branch-sync-check.sh` em `ahead=0 behind=0`. - O `security-review` do delta da `F05-cli-adapter-base` foi concluido sem ressalvas: a implementacao usa `create_subprocess_exec` sem shell, preserva output bruto separado do output limpo, aplica timeout com encerramento explicito do processo e mantem a sanitizacao conservadora no adapter. @@ -142,7 +142,7 @@ - A branch de integração `chore/merge-operational-candidates` consolidou `chore-resolve-operational-merge-conflicts`, `feat-agent-skills` e `features/f11-runtime-persistente-minimo`. - A validação prática da feature de runtime persistente foi fechada na branch de integração com `17` testes passando em ambiente local dedicado. - A branch `chore/devcontainer-codex-isolation` introduziu um ambiente isolado de desenvolvimento do Codex com `.devcontainer/`, `compose.dev.yaml`, `scripts/dev-codex.sh` e profile versionado em `.codex/config.toml`. -- O fluxo container-first do Codex ficou documentado em `AGENTS.md` e `README.md`, mantendo `codex-dev` separado do serviço de runtime `aignt-os`. +- O fluxo container-first do Codex ficou documentado em `AGENTS.md` e `README.md`, mantendo `codex-dev` separado do serviço de runtime `synapse-os`. - A validação operacional local confirmou `codex-dev` com usuário não-root, `read_only`, `no-new-privileges`, `cap_drop: [ALL]`, sem `docker.sock`, sem mount do `$HOME` do host e com bind mount restrito ao repositório em `/workspace`. - A Branch Sync Gate foi incorporada como regra operacional leve em `AGENTS.md`, com `./scripts/branch-sync-check.sh` para detectar drift e `./scripts/branch-sync-update.sh` para atualização conservadora da branch. - As ressalvas baixas do security-review sobre a Branch Sync Gate foram mitigadas e o parecer final ficou aprovado, sem risco novo relevante. @@ -163,7 +163,7 @@ - O `security-review` da `F02-spec-engine-mvp` foi aprovado com ressalvas baixas: manter `yaml.safe_load` e, na integracao futura, restringir o chamador a paths esperados de `SPEC.md` dentro do workspace da run. - A PR `#19` da `F02-spec-engine-mvp` teve o gate `repo-checks` restaurado com correcao minima de formatacao, import order e compatibilidade de `mypy` no `SpecValidator`, sem ampliar o escopo da feature. - O `security-review` mais recente da correcao da F02 aprovou o delta com ressalva baixa e localizada: o `# type: ignore[import-untyped]` em `yaml` e aceitavel neste recorte, mas pode ser removido depois com tipagem mais explicita ou `types-PyYAML`. -- A `F03-state-machine-mvp` passou a ter `SPEC.md` propria, state machine minima do AIgnt-Synapse-Flow com transicoes lineares validas, bloqueio de `PLAN` antes de `SPEC_VALIDATION` e estado terminal `FAILED`, com testes verdes e PR `#20` aberta. +- A `F03-state-machine-mvp` passou a ter `SPEC.md` propria, state machine minima do Synapse-Flow com transicoes lineares validas, bloqueio de `PLAN` antes de `SPEC_VALIDATION` e estado terminal `FAILED`, com testes verdes e PR `#20` aberta. - O `security-review` da `F03-state-machine-mvp` foi aprovado com ressalvas baixas: os estados ainda sao modelados como strings livres e `TERMINAL_STATES` ainda nao e usada explicitamente nas validacoes internas. - A `F03-state-machine-mvp` ficou autocontida na worktree atual com materializacao de `features/F03-state-machine-mvp/SPEC.md`, mantendo alinhamento com o recorte aprovado da feature. - A validacao local da `F03-state-machine-mvp` confirmou `5` testes unitarios verdes para a state machine minima, e o proximo passo logico permanece fechar `REPORT/COMMIT` antes de abrir a `F04`. @@ -187,7 +187,7 @@ - Fixture `noisy_mixed_output.txt` e `noisy_no_code_block.txt` armazenam sequências ANSI como literais `\u001b`. Todo helper que os lê para testar comportamento de ANSI precisa de `unicode_escape=True`. Considerar adicionar comentário nos próprios arquivos de fixture documentando isso. - A ampliação de `TRANSPORT_NOISE_PREFIXES` para incluir prefixos como `[rpc]` deve ser decisão explícita documentada na SPEC da feature responsável — não uma adição silenciosa. - Os testes de `test_review_rework.py` exercitam a state machine diretamente para estados CODE_GREEN/REVIEW/SECURITY que ainda não estão implementados no `PipelineEngine`. Quando o Supervisor/pipeline for implementado para esses estados, esses testes servem como documentação de comportamento esperado e devem ser migrados para testes de integração. -- O retry/reroute da F09 permanece restrito a uma unica execucao do AIgnt-Synapse-Flow; retomada persistida entre polls do worker e requeue duravel continuam fora de escopo. +- O retry/reroute da F09 permanece restrito a uma unica execucao do Synapse-Flow; retomada persistida entre polls do worker e requeue duravel continuam fora de escopo. - Em worktree fria, `pytest` e `uv run pytest` podem falhar na coleta ate que `uv sync --locked --extra dev` tenha sido executado. - O fallback de `GITHUB_TOKEN` para `GITHUB_PERSONAL_ACCESS_TOKEN` continua aceitavel para o baseline atual, mas pode merecer opt-in explicito se gerar ambiguidade operacional em ambientes com tokens preexistentes. @@ -207,9 +207,9 @@ ## TUI — Ideia de feature futura (análise de viabilidade concluída) -- **Rich enriquecido (F13-rich-cli-output)**: concluida localmente como primeira adocao de Rich em `src/`, restrita a `aignt runtime status` e sem abrir TUI completa. +- **Rich enriquecido (F13-rich-cli-output)**: concluida localmente como primeira adocao de Rich em `src/`, restrita a `synapse runtime status` e sem abrir TUI completa. - **Observabilidade CLI de runs (F14-runs-observability-cli)**: concluida localmente e fecha a lacuna minima de inspecao antes de qualquer TUI. -- **TUI watch (F14-tui-watch-command)**: `aignt tui` como subcomando opcional usando Textual. Pré-requisito atualizado: F13 + F14 + implementação de `observability/` (diretório ainda vazio). Hook ideal já existe: `PipelineObserver` em `pipeline.py`. +- **TUI watch (F14-tui-watch-command)**: `synapse tui` como subcomando opcional usando Textual. Pré-requisito atualizado: F13 + F14 + implementação de `observability/` (diretório ainda vazio). Hook ideal já existe: `PipelineObserver` em `pipeline.py`. - **Constraint Typer×asyncio**: `asyncio.run(app.run_async())` dentro do comando Typer é a forma de coexistência; funcional mas exige cuidado com event loop. - **TTY em container**: Rich degrada automaticamente sem TTY; Textual exige guarda `sys.stdout.isatty()`. - **Não implementar antes**: apesar da F14 resolver a observabilidade minima via CLI, TUI real continua dependendo de recorte proprio de watch/streaming e da camada `observability/`. diff --git a/README.md b/README.md index 324c838..65d52f3 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,16 @@ -# AIgnt OS +# SynapseOS > Meta-orquestrador de agentes de IA via CLI — produz software com rastreabilidade, resiliência e baixo custo operacional. --- -## O que é o AIgnt OS? +## O que é o SynapseOS? -O AIgnt OS é um **orquestrador de ferramentas externas de IA via CLI**. Em vez de chamar APIs diretamente, ele executa ferramentas como Gemini CLI, Codex CLI, Claude CLI e outras por subprocess, coordenando hand-offs entre etapas de uma esteira de desenvolvimento autônomo. +O SynapseOS é um **orquestrador de ferramentas externas de IA via CLI**. Em vez de chamar APIs diretamente, ele executa ferramentas como Gemini CLI, Codex CLI, Claude CLI e outras por subprocess, coordenando hand-offs entre etapas de uma esteira de desenvolvimento autônomo. O sistema recebe uma tarefa, produz uma especificação estruturada, planeja a execução, aciona agentes externos, limpa e valida suas saídas, reage a falhas e entrega um relatório auditável por run. -O runtime interno é coordenado pelo **AIgnt-Synapse-Flow**, a **engine própria de pipeline** do AIgnt OS. +O runtime interno é coordenado pelo **Synapse-Flow**, a **engine própria de pipeline** do SynapseOS. ### Princípios fundamentais @@ -27,7 +27,7 @@ O runtime interno é coordenado pelo **AIgnt-Synapse-Flow**, a **engine própria ## Baseline Atual do Repositório -O AIgnt OS ja ultrapassou o recorte inicial de MVP e hoje expõe um baseline tecnico coerente para submissao, observabilidade e operacao local de runs. O AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS e o repositorio atual ja incorpora: +O SynapseOS ja ultrapassou o recorte inicial de MVP e hoje expõe um baseline tecnico coerente para submissao, observabilidade e operacao local de runs. O Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS e o repositorio atual ja incorpora: - etapa 2 consolidada com `doctor`, `runs submit`, `runs show`, artifact preview e onboarding publico local - guardrails pos-release absorvidos (`F23 -> F27`) para sanitizacao, boundary de workspace/artifacts, AST guard, provenance e concorrencia local @@ -42,21 +42,21 @@ O AIgnt OS ja ultrapassou o recorte inicial de MVP e hoje expõe um baseline tec SPEC → TEST_RED → CODE_GREEN → REFACTOR → QUALITY_GATE → SECURITY_REVIEW → REPORT → COMMIT ``` -Dentro do macroestágio `SPEC`, o AIgnt-Synapse-Flow pode decompor a execução em `SPEC_DISCOVERY`, `SPEC_NORMALIZATION` e `SPEC_VALIDATION`. +Dentro do macroestágio `SPEC`, o Synapse-Flow pode decompor a execução em `SPEC_DISCOVERY`, `SPEC_NORMALIZATION` e `SPEC_VALIDATION`. O `DOCKER_PREFLIGHT` do projeto continua sendo gate operacional condicional. Por padrão, ele é leve: valida apenas `compose config`, sem build nem `up`. O build explícito fica para workflows e comandos de imagem, e o runtime completo fica para workflow dedicado de integração/runtime ou para execução explícita quando a feature tocar boot, ciclo de vida, persistência ou integração. Os hooks locais continuam leves e não substituem o `DOCKER_PREFLIGHT` operacional real. ### Superfície pública atual da CLI -- `aignt doctor` -- `aignt runs submit --mode auto|sync|async --stop-at ` -- `aignt runs list` -- `aignt runs show ` -- `aignt runs show --preview report` -- `aignt runs watch ` -- `aignt runs cancel ` -- `aignt auth init|issue|disable` -- `aignt runtime start|status|run|ready|stop` +- `synapse doctor` +- `synapse runs submit --mode auto|sync|async --stop-at ` +- `synapse runs list` +- `synapse runs show ` +- `synapse runs show --preview report` +- `synapse runs watch ` +- `synapse runs cancel ` +- `synapse auth init|issue|disable` +- `synapse runtime start|status|run|ready|stop` ### Boundaries atuais do baseline @@ -116,7 +116,7 @@ O `DOCKER_PREFLIGHT` do projeto continua sendo gate operacional condicional. Por ## Como navegar no repositório ``` -aignt-os/ +synapse-os/ ├── docs/ │ ├── architecture/ # Documentação técnica de referência │ │ ├── SDD.md # Software Design Document — arquitetura completa @@ -137,7 +137,7 @@ aignt-os/ │ ├── 007-local-llms-offline-reasoning.md │ ├── 008-spec-driven-development.md │ ├── 009-runtime-dual-cli-worker.md -│ ├── 010-adopt-aignt-synapse-flow-name.md +│ ├── 010-adopt-synapse-synapse-flow-name.md │ ├── 011-lightweight-docker-preflight-default.md │ └── 012-mandatory-integration-tests.md │ @@ -148,7 +148,7 @@ aignt-os/ │ └── init_feature_worktrees.sh # Script para criar worktrees das features │ ├── src/ -│ └── aignt_os/ # Código-fonte principal +│ └── synapse_os/ # Código-fonte principal │ └── tests/ # Suíte de testes ├── unit/ # Testes unitários (parser, spec, state machine…) @@ -187,14 +187,14 @@ O caminho oficial atual da primeira run continua local e `sync-first`. Use esta ### Quickstart oficial -1. Diagnostique o ambiente local com `aignt doctor`. -2. Se o doctor fechar sem falha bloqueante, envie a SPEC com `aignt runs submit --mode sync --stop-at SPEC_VALIDATION`. +1. Diagnostique o ambiente local com `synapse doctor`. +2. Se o doctor fechar sem falha bloqueante, envie a SPEC com `synapse runs submit --mode sync --stop-at SPEC_VALIDATION`. 3. Capture o `run_id` retornado pelo submit. -4. Inspecione o resultado com `aignt runs show `. +4. Inspecione o resultado com `synapse runs show `. ### Boundary operacional -- `aignt doctor` e diagnostico local e advisory: ele verifica `runtime_state`, `runs_db` e `artifacts_dir` no ambiente atual. +- `synapse doctor` e diagnostico local e advisory: ele verifica `runtime_state`, `runs_db` e `artifacts_dir` no ambiente atual. - O doctor nao substitui `repo-preflight` para cenarios com Docker, container, build de imagem, boot de runtime persistente, persistencia operacional ou integracao real. - Se a sua primeira execucao depender desses cenarios, saia do quickstart e rode o preflight operacional do projeto via `repo-preflight` (`./scripts/docker-preflight.sh`). - `runtime_state=warn` nao bloqueia o caminho minimo atual, porque a demonstracao oficial continua local e `sync-first`; o status `warn` e advisory, nao falha bloqueante. @@ -205,8 +205,8 @@ O preview de artifacts e uma capacidade adicional da CLI publica, nao um requisi Exemplos suportados: -- `aignt runs show --preview report` -- `aignt runs show --preview PLAN.clean` +- `synapse runs show --preview report` +- `synapse runs show --preview PLAN.clean` Limites do recorte atual: @@ -217,12 +217,12 @@ Limites do recorte atual: ## TUI Watch e Cancelamento Local -O dashboard TUI atual do AIgnt OS continua local e terminal-first. Ele observa uma run especifica ja persistida e renderiza o estado atual do AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS, sem abrir web UI nem operacao distribuida. +O dashboard TUI atual do SynapseOS continua local e terminal-first. Ele observa uma run especifica ja persistida e renderiza o estado atual do Synapse-Flow, a engine propria de pipeline do SynapseOS, sem abrir web UI nem operacao distribuida. Superficie publica atual: -- `aignt runs watch ` abre o dashboard TUI local da run -- `aignt runs cancel ` solicita cancelamento local e gracioso da run +- `synapse runs watch ` abre o dashboard TUI local da run +- `synapse runs cancel ` solicita cancelamento local e gracioso da run Atalhos reais do dashboard atual: @@ -242,14 +242,14 @@ Boundary do recorte atual: ## Auth Registry Local -A `F29` introduziu auth opt-in para os comandos mutaveis da CLI, a `F30` adicionou o provisionamento local desse registry sem editar JSON manualmente, a `F44` desacoplou o provider atual em torno de `auth_provider=file` e a `F47` consolidou RBAC local com roles fixas (`viewer`, `operator`, `admin`). O AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS; esta capacidade permanece estritamente local e nao abre socket, auth remota ou RBAC distribuido. +A `F29` introduziu auth opt-in para os comandos mutaveis da CLI, a `F30` adicionou o provisionamento local desse registry sem editar JSON manualmente, a `F44` desacoplou o provider atual em torno de `auth_provider=file` e a `F47` consolidou RBAC local com roles fixas (`viewer`, `operator`, `admin`). O Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS; esta capacidade permanece estritamente local e nao abre socket, auth remota ou RBAC distribuido. Fluxo minimo de provisionamento: -1. Inicialize o registry com `aignt auth init --principal-id local-admin --role admin`. -2. Emita um token adicional com `aignt auth issue --principal-id local-viewer --role viewer`. -3. Emita um token operacional com `aignt auth issue --principal-id local-operator --role operator`. -4. Se precisar revogar um token emitido, use `aignt auth disable --token-id `. +1. Inicialize o registry com `synapse auth init --principal-id local-admin --role admin`. +2. Emita um token adicional com `synapse auth issue --principal-id local-viewer --role viewer`. +3. Emita um token operacional com `synapse auth issue --principal-id local-operator --role operator`. +4. Se precisar revogar um token emitido, use `synapse auth disable --token-id `. Boundary de roles no recorte atual: @@ -273,7 +273,7 @@ Boundary do recorte atual: |---|---|---| | `runtime_state = warn` | O runtime persistente esta parado, mas o fluxo minimo atual ainda pode seguir. | Continue no quickstart `sync-first`; so escale para preflight/runtime se precisar de modo operacional mais pesado. | | `runtime_state = fail` | O estado persistido do runtime esta inconsistente. | Corrija o estado local antes de prosseguir; se a execucao depender de runtime persistente ou container, use `repo-preflight`. | -| `runs_db = fail` | O caminho de persistencia SQLite nao pode ser preparado pelo processo atual. | Ajuste permissao ou configuracao do path antes de rodar `aignt runs submit`. | +| `runs_db = fail` | O caminho de persistencia SQLite nao pode ser preparado pelo processo atual. | Ajuste permissao ou configuracao do path antes de rodar `synapse runs submit`. | | `artifacts_dir = fail` | O diretório de artifacts nao pode ser preparado pelo processo atual. | Ajuste permissao ou configuracao do path antes de inspecionar outputs persistidos. | | `SPEC invalida` no submit | A SPEC nao passou em `SPEC_VALIDATION`. | Corrija o front matter YAML e as secoes `# Contexto` e `# Objetivo` antes de reenviar. | @@ -293,7 +293,7 @@ O desenvolvimento continua feature-by-feature, com `SPEC.md` validada antes de c ### Ambiente isolado do Codex -- O runtime da aplicação continua no serviço `aignt-os` definido em `compose.yaml`. +- O runtime da aplicação continua no serviço `synapse-os` definido em `compose.yaml`. - O Codex roda isolado no serviço `codex-dev` definido em `compose.dev.yaml`, com apenas o repositório montado em `/workspace`. - Para subir o ambiente e abrir o Codex dentro do container de desenvolvimento, use `./scripts/dev-codex.sh`. - Para subir também o runtime existente junto com o ambiente de desenvolvimento, use `./scripts/dev-codex.sh --with-runtime`. diff --git a/RUN_REPORT.md b/RUN_REPORT.md index caa9ac1..9a1af6e 100644 --- a/RUN_REPORT.md +++ b/RUN_REPORT.md @@ -1,7 +1,7 @@ # Relatório de Execução - Feature F39: Dashboard Logs ## Resumo -Adição da funcionalidade de visualização de logs (`stdout`/`stderr`) no dashboard TUI (`aignt runs watch`), permitindo a inspeção detalhada de steps executados. (Anteriormente referenciada como F34, regularizada para F39). +Adição da funcionalidade de visualização de logs (`stdout`/`stderr`) no dashboard TUI (`synapse runs watch`), permitindo a inspeção detalhada de steps executados. (Anteriormente referenciada como F34, regularizada para F39). ## Escopo Entregue - **Interface TUI**: @@ -14,7 +14,7 @@ Adição da funcionalidade de visualização de logs (`stdout`/`stderr`) no dash - Correção na renderização de `StepDetail` para evitar problemas de concorrência com o gerenciamento de contexto do `textual`. ## Alterações Técnicas -- Arquivo modificado: `src/aignt_os/cli/dashboard.py` (adição de `LogViewer` e `action_show_logs`). +- Arquivo modificado: `src/synapse_os/cli/dashboard.py` (adição de `LogViewer` e `action_show_logs`). - Testes adicionados: `tests/unit/test_dashboard_logic.py` (focados na lógica de controle e acesso a arquivos). - Testes removidos: `tests/unit/test_dashboard_ui.py` (substituídos por testes de lógica mais robustos e menos propensos a flakiness em CI). diff --git a/SPEC.md b/SPEC.md index 4a3863e..4bf5053 100644 --- a/SPEC.md +++ b/SPEC.md @@ -18,11 +18,11 @@ related_adrs: - docs/adr/009-runtime-dual-cli-worker.md acceptance_criteria: - O projeto instala e executa via pyproject.toml sem erro estrutural. - - Existe um comando CLI mínimo do pacote aignt_os que responde sem falhar. + - Existe um comando CLI mínimo do pacote synapse_os que responde sem falhar. - Existem modelos/contratos iniciais para TaskRequest, RunContext, CLIExecutionResult e ParsedArtifact. - Existe configuração básica centralizada para a aplicação. - Existe ao menos um teste automatizado para CLI mínima e um teste para contratos/modelos. - - A organização do código respeita src/aignt_os e tests/. + - A organização do código respeita src/synapse_os e tests/. inputs: - Estrutura base do repositório - Documentação arquitetural existente @@ -43,14 +43,14 @@ out_of_scope: --- # Contexto -Esta feature cria a base mínima de código para permitir o início do desenvolvimento guiado por SPEC e TDD no AIgnt OS. +Esta feature cria a base mínima de código para permitir o início do desenvolvimento guiado por SPEC e TDD no SynapseOS. # Objetivo Estabelecer o primeiro incremento funcional do projeto em Python com CLI mínima e contratos estruturais do domínio. # Escopo ## Incluído -- scaffold inicial do pacote `aignt_os` +- scaffold inicial do pacote `synapse_os` - ponto de entrada mínimo da CLI - modelos base do domínio - configuração inicial @@ -64,7 +64,7 @@ Estabelecer o primeiro incremento funcional do projeto em Python com CLI mínima - relatórios de execução completos # Requisitos funcionais -1. O comando `aignt` deve iniciar sem erro estrutural. +1. O comando `synapse` deve iniciar sem erro estrutural. 2. A CLI mínima deve oferecer uma resposta simples de diagnóstico ou placeholder. 3. O sistema deve expor contratos iniciais fortemente tipados. 4. O projeto deve ter testes automatizados mínimos. diff --git a/compose.copilot.yaml b/compose.copilot.yaml index 1f2a11a..d356684 100644 --- a/compose.copilot.yaml +++ b/compose.copilot.yaml @@ -6,7 +6,7 @@ # O config de auth é copiado para a tmpfs pelo dev-copilot.sh ao iniciar. # # Uso: ./scripts/dev-copilot.sh [--build] [-- ] -# Alias sugerido: sonnet='cd ~/work/projects/aignt-os && ./scripts/dev-copilot.sh' +# Alias sugerido: sonnet='cd ~/work/projects/synapse-os && ./scripts/dev-copilot.sh' services: copilot-dev: @@ -14,9 +14,9 @@ services: context: . dockerfile: .devcontainer/Dockerfile args: - DEV_UID: ${AIGNT_DEV_UID:-1000} - DEV_GID: ${AIGNT_DEV_GID:-1000} - image: aignt-os-codex-dev:dev + DEV_UID: ${SYNAPSE_DEV_UID:-1000} + DEV_GID: ${SYNAPSE_DEV_GID:-1000} + image: synapse-os-codex-dev:dev command: ["sleep", "infinity"] environment: HOME: /home/codex @@ -28,7 +28,7 @@ services: XDG_DATA_HOME: /home/codex/.local/share GITHUB_PERSONAL_ACCESS_TOKEN: ${GITHUB_PERSONAL_ACCESS_TOKEN:-} GITHUB_TOKEN: ${GITHUB_TOKEN:-} - user: "${AIGNT_DEV_UID:-1000}:${AIGNT_DEV_GID:-1000}" + user: "${SYNAPSE_DEV_UID:-1000}:${SYNAPSE_DEV_GID:-1000}" volumes: - .:/workspace # Binário do Copilot CLI — montado read-only do host (133 MB, não copiado na imagem) diff --git a/compose.dev.yaml b/compose.dev.yaml index ebf60e8..b8d87e0 100644 --- a/compose.dev.yaml +++ b/compose.dev.yaml @@ -4,9 +4,9 @@ services: context: . dockerfile: .devcontainer/Dockerfile args: - DEV_UID: ${AIGNT_DEV_UID:-1000} - DEV_GID: ${AIGNT_DEV_GID:-1000} - image: aignt-os-codex-dev:dev + DEV_UID: ${SYNAPSE_DEV_UID:-1000} + DEV_GID: ${SYNAPSE_DEV_GID:-1000} + image: synapse-os-codex-dev:dev command: ["sleep", "infinity"] environment: HOME: /home/codex @@ -18,7 +18,7 @@ services: XDG_DATA_HOME: /home/codex/.local/share GITHUB_PERSONAL_ACCESS_TOKEN: ${GITHUB_PERSONAL_ACCESS_TOKEN:-} GITHUB_TOKEN: ${GITHUB_TOKEN:-} - user: "${AIGNT_DEV_UID:-1000}:${AIGNT_DEV_GID:-1000}" + user: "${SYNAPSE_DEV_UID:-1000}:${SYNAPSE_DEV_GID:-1000}" volumes: - .:/workspace - codex-home:/home/codex/.codex diff --git a/compose.yaml b/compose.yaml index 279c893..274e68a 100644 --- a/compose.yaml +++ b/compose.yaml @@ -1,21 +1,21 @@ services: - aignt-os: + synapse-os: build: context: . dockerfile: Dockerfile args: - APP_UID: ${AIGNT_OS_UID:-1000} - APP_GID: ${AIGNT_OS_GID:-1000} - image: aignt-os:dev + APP_UID: ${SYNAPSE_OS_UID:-1000} + APP_GID: ${SYNAPSE_OS_GID:-1000} + image: synapse-os:dev command: ["runtime", "run"] environment: - AIGNT_OS_ENVIRONMENT: development - user: "${AIGNT_OS_UID:-1000}:${AIGNT_OS_GID:-1000}" + SYNAPSE_OS_ENVIRONMENT: development + user: "${SYNAPSE_OS_UID:-1000}:${SYNAPSE_OS_GID:-1000}" volumes: - ./artifacts:/app/artifacts working_dir: /app healthcheck: - test: ["CMD", "aignt", "runtime", "ready"] + test: ["CMD", "synapse", "runtime", "ready"] interval: 2s timeout: 2s retries: 15 diff --git a/docs/IDEAS.md b/docs/IDEAS.md index d49c00e..76491a2 100644 --- a/docs/IDEAS.md +++ b/docs/IDEAS.md @@ -2,7 +2,7 @@ ## Sobre este documento -Este documento registra ideias, melhorias e candidatos de evolução do AIgnt OS que +Este documento registra ideias, melhorias e candidatos de evolução do SynapseOS que **ainda não são SPECs** — não têm escopo fechado, critérios de aceite validados por testes nem feature aberta na fila ativa. @@ -164,7 +164,7 @@ Ao promover: | **Absorção recomendada** | ver tabela interna por item | | **Depende de** | — | -Esta IDEA consolida os gaps de proteção identificados na análise de guardrails do AIgnt OS. +Esta IDEA consolida os gaps de proteção identificados na análise de guardrails do SynapseOS. Cada item tem prioridade e absorção independentes. Parte do programa já foi absorvida em `F23 -> F27`; os itens remanescentes continuam candidatos a novas SPECs próprias. @@ -186,7 +186,7 @@ em `F23 -> F27`; os itens remanescentes continuam candidatos a novas SPECs próp ### Problema -O AIgnt-Synapse-Flow — a engine própria de pipeline do AIgnt OS — expõe superfície de +O Synapse-Flow — a engine própria de pipeline do SynapseOS — expõe superfície de ataque crescente à medida que a Fase 2 amplia a interface pública (`runs submit`, `runs show`, `runs list`). Os gaps de maior risco imediato são: @@ -229,7 +229,7 @@ Absorções já concluídas no baseline atual: - `F47`: RBAC local com roles `viewer`, `operator` e `admin` Centralização técnica já realizada: -- `src/aignt_os/security.py` foi criado como módulo de segurança compartilhado +- `src/synapse_os/security.py` foi criado como módulo de segurança compartilhado - a sanitização pública passou a reutilizar helpers compartilhados no baseline atual Boundary ainda adiado: diff --git a/docs/adr/001-cli-orchestration.md b/docs/adr/001-cli-orchestration.md index f1ffe6a..5175e7a 100644 --- a/docs/adr/001-cli-orchestration.md +++ b/docs/adr/001-cli-orchestration.md @@ -4,7 +4,7 @@ Aceito ## Contexto -O AIgnt OS precisa integrar múltiplas ferramentas externas de IA com foco em eficiência de custo, flexibilidade operacional e execução local em Linux. Muitas das ferramentas-alvo já expõem CLIs utilizáveis e podem ser acessadas com menos atrito operacional do que integrações por API. +O SynapseOS precisa integrar múltiplas ferramentas externas de IA com foco em eficiência de custo, flexibilidade operacional e execução local em Linux. Muitas das ferramentas-alvo já expõem CLIs utilizáveis e podem ser acessadas com menos atrito operacional do que integrações por API. ## Decisão Usar orquestração via CLI, executando ferramentas externas por subprocess, como mecanismo principal de integração. diff --git a/docs/adr/003-state-machine-pipeline-engine.md b/docs/adr/003-state-machine-pipeline-engine.md index 0af0f8f..46b1aff 100644 --- a/docs/adr/003-state-machine-pipeline-engine.md +++ b/docs/adr/003-state-machine-pipeline-engine.md @@ -1,15 +1,15 @@ -# ADR-003 — Adotar state machine + AIgnt-Synapse-Flow +# ADR-003 — Adotar state machine + Synapse-Flow ## Status Aceito ## Contexto -O AIgnt OS precisa coordenar uma esteira com estados explícitos, retries, rollback lógico, hand-offs auditáveis e futura evolução para DAG. Scripts lineares isolados comprometeriam rastreabilidade, manutenção e controle fino do domínio. +O SynapseOS precisa coordenar uma esteira com estados explícitos, retries, rollback lógico, hand-offs auditáveis e futura evolução para DAG. Scripts lineares isolados comprometeriam rastreabilidade, manutenção e controle fino do domínio. ## Decisão O sistema adotará: - **state machine** para governar estados e transições; -- o **AIgnt-Synapse-Flow**, a **engine própria de pipeline** do AIgnt OS, em Python para coordenar os steps, hand-offs, retries e integração com o supervisor. +- o **Synapse-Flow**, a **engine própria de pipeline** do SynapseOS, em Python para coordenar os steps, hand-offs, retries e integração com o supervisor. ## Consequências ### Positivas @@ -20,7 +20,7 @@ O sistema adotará: ### Negativas - maior responsabilidade de implementação interna; -- necessidade de testes rigorosos do AIgnt-Synapse-Flow. +- necessidade de testes rigorosos do Synapse-Flow. ## Alternativas consideradas - pipeline linear hardcoded; diff --git a/docs/adr/007-local-llms-offline-reasoning.md b/docs/adr/007-local-llms-offline-reasoning.md index ce4dbf5..0eb06c4 100644 --- a/docs/adr/007-local-llms-offline-reasoning.md +++ b/docs/adr/007-local-llms-offline-reasoning.md @@ -4,7 +4,7 @@ Aceito ## Contexto -O AIgnt OS busca eficiência de custo, resiliência parcial offline e mais privacidade para tarefas auxiliares. +O SynapseOS busca eficiência de custo, resiliência parcial offline e mais privacidade para tarefas auxiliares. ## Decisão Integrar LLMs locais para tarefas de suporte, como sumarização semântica, explicações, extração de padrões e geração de commit messages. diff --git a/docs/adr/008-spec-driven-development.md b/docs/adr/008-spec-driven-development.md index dc04be4..d54226d 100644 --- a/docs/adr/008-spec-driven-development.md +++ b/docs/adr/008-spec-driven-development.md @@ -4,7 +4,7 @@ Aceito ## Contexto -O AIgnt OS precisa reduzir ambiguidade entre `REQUEST`, `PLAN`, `TEST_RED` e `CODE_GREEN`. Uma SPEC em texto livre dificulta validação, enquanto um schema puro prejudica legibilidade e contexto para humanos e IAs. +O SynapseOS precisa reduzir ambiguidade entre `REQUEST`, `PLAN`, `TEST_RED` e `CODE_GREEN`. Uma SPEC em texto livre dificulta validação, enquanto um schema puro prejudica legibilidade e contexto para humanos e IAs. ## Decisão Adotar **Spec-Driven Development** com uma SPEC híbrida: @@ -18,7 +18,7 @@ A esteira passa a ser: SPEC → TEST_RED → CODE_GREEN → REFACTOR → SECURITY_REVIEW → REPORT → COMMIT ``` -Dentro do macroestágio `SPEC`, o AIgnt-Synapse-Flow continua usando `SPEC_DISCOVERY`, `SPEC_NORMALIZATION` e `SPEC_VALIDATION` como subetapas internas. +Dentro do macroestágio `SPEC`, o Synapse-Flow continua usando `SPEC_DISCOVERY`, `SPEC_NORMALIZATION` e `SPEC_VALIDATION` como subetapas internas. O `DOCKER_PREFLIGHT` permanece como gate operacional condicional antes de execução prática dependente de Docker, sem fazer parte da abertura padrão da esteira. diff --git a/docs/adr/009-runtime-dual-cli-worker.md b/docs/adr/009-runtime-dual-cli-worker.md index 3596153..1979de1 100644 --- a/docs/adr/009-runtime-dual-cli-worker.md +++ b/docs/adr/009-runtime-dual-cli-worker.md @@ -4,7 +4,7 @@ Aceito ## Contexto -O AIgnt OS será usado principalmente via CLI, mas certas runs exigirão retries longos, acompanhamento de estado e execução sem bloquear a interface. Adotar uma infraestrutura de filas distribuídas desde o início aumentaria desnecessariamente a complexidade operacional do MVP. +O SynapseOS será usado principalmente via CLI, mas certas runs exigirão retries longos, acompanhamento de estado e execução sem bloquear a interface. Adotar uma infraestrutura de filas distribuídas desde o início aumentaria desnecessariamente a complexidade operacional do MVP. ## Decisão O MVP adotará um runtime dual: @@ -14,7 +14,7 @@ O MVP adotará um runtime dual: ## Consequências ### Positivas - suporte a tarefas longas desde o início; -- reaproveitamento da mesma base técnica do AIgnt-Synapse-Flow, a engine própria de pipeline do AIgnt OS; +- reaproveitamento da mesma base técnica do Synapse-Flow, a engine própria de pipeline do SynapseOS; - menor complexidade que Celery/Temporal no MVP; - preservação da experiência CLI. diff --git a/docs/adr/010-adopt-aignt-synapse-flow-name.md b/docs/adr/010-adopt-aignt-synapse-flow-name.md index 21dd3a2..7f51d97 100644 --- a/docs/adr/010-adopt-aignt-synapse-flow-name.md +++ b/docs/adr/010-adopt-aignt-synapse-flow-name.md @@ -1,10 +1,10 @@ -# ADR-010 — Adotar AIgnt-Synapse-Flow como nome formal da engine própria de pipeline +# ADR-010 — Adotar Synapse-Flow como nome formal da engine própria de pipeline ## Status Aceito ## Contexto -O projeto já adotou o AIgnt-Synapse-Flow como conceito técnico central para coordenar estados, hand-offs, retries e integração com o supervisor, mas ainda sem nome formal padronizado nos documentos. Até aqui, os textos o descrevem apenas de forma genérica como engine própria de pipeline, o que dificulta comunicação operacional, rastreabilidade documental e padronização entre skills, ADRs e workflows. +O projeto já adotou o Synapse-Flow como conceito técnico central para coordenar estados, hand-offs, retries e integração com o supervisor, mas ainda sem nome formal padronizado nos documentos. Até aqui, os textos o descrevem apenas de forma genérica como engine própria de pipeline, o que dificulta comunicação operacional, rastreabilidade documental e padronização entre skills, ADRs e workflows. Ao mesmo tempo, o fluxo oficial do projeto passou a exigir a sequência: @@ -12,14 +12,14 @@ Ao mesmo tempo, o fluxo oficial do projeto passou a exigir a sequência: SPEC → TEST_RED → CODE_GREEN → REFACTOR → QUALITY_GATE → SECURITY_REVIEW → REPORT → COMMIT ``` -Essa formalização aumenta a necessidade de um nome estável para o AIgnt-Synapse-Flow, a engine própria de pipeline do AIgnt OS. +Essa formalização aumenta a necessidade de um nome estável para o Synapse-Flow, a engine própria de pipeline do SynapseOS. ## Decisão -Adotar **AIgnt-Synapse-Flow** como nome formal da engine própria de pipeline do AIgnt OS. +Adotar **Synapse-Flow** como nome formal da engine própria de pipeline do SynapseOS. Regras derivadas: -- o termo `AIgnt-Synapse-Flow` deve ser usado nos documentos alterados quando o conceito for mencionado; -- ao menos uma vez por documento alterado, deve ficar explícito que o AIgnt-Synapse-Flow é a engine própria de pipeline do AIgnt OS; +- o termo `Synapse-Flow` deve ser usado nos documentos alterados quando o conceito for mencionado; +- ao menos uma vez por documento alterado, deve ficar explícito que o Synapse-Flow é a engine própria de pipeline do SynapseOS; - o fluxo oficial de trabalho por feature passa a ser documentado separadamente das subetapas internas do runtime. ## Consequências @@ -35,6 +35,6 @@ Regras derivadas: - pode gerar coexistência temporária entre nomenclaturas antigas e novas durante a transição. ## Alternativas consideradas -- continuar usando apenas a descrição genérica de engine própria de pipeline, sem formalizar o nome AIgnt-Synapse-Flow; +- continuar usando apenas a descrição genérica de engine própria de pipeline, sem formalizar o nome Synapse-Flow; - adotar um nome genérico como `Pipeline Engine`; - renomear toda a arquitetura para refletir a engine, ampliando escopo além do necessário. diff --git a/docs/adr/012-mandatory-integration-tests.md b/docs/adr/012-mandatory-integration-tests.md index 0d2b379..e29b37e 100644 --- a/docs/adr/012-mandatory-integration-tests.md +++ b/docs/adr/012-mandatory-integration-tests.md @@ -4,7 +4,7 @@ Aceito ## Contexto -O AIgnt OS adota TDD explícito com cobertura progressiva das features. Até a feature F07, os testes eram predominantemente unitários — suficientes para validar contratos isolados, mas insuficientes para garantir comportamento real em features que envolvem I/O de filesystem, lifecycle de processo, adaptadores com subprocesso ou encadeamento entre módulos via entrypoint público. +O SynapseOS adota TDD explícito com cobertura progressiva das features. Até a feature F07, os testes eram predominantemente unitários — suficientes para validar contratos isolados, mas insuficientes para garantir comportamento real em features que envolvem I/O de filesystem, lifecycle de processo, adaptadores com subprocesso ou encadeamento entre módulos via entrypoint público. A expansão da suíte para 215 testes (F01–F07 + TDD hardening) evidenciou que certos critérios de aceite não podem ser verificados com testes unitários puros: um test unitário com mocks pode passar mesmo quando a integração real falha silenciosamente. diff --git a/docs/ai-ops/PENDING_LOG.md b/docs/ai-ops/PENDING_LOG.md index 78cd9bf..00ec4c5 100644 --- a/docs/ai-ops/PENDING_LOG.md +++ b/docs/ai-ops/PENDING_LOG.md @@ -56,7 +56,7 @@ Liste aqui observações que ainda não são tarefas, mas merecem monitoramento. ### [2026-03-09] Nome formal da engine -- **Resumo:** a engine própria de pipeline passa a se chamar AIgnt-Synapse-Flow +- **Resumo:** a engine própria de pipeline passa a se chamar Synapse-Flow - **Motivo:** reduzir ambiguidade terminológica - **Impacto:** SDD, TDD, AGENTS, CONTEXT e ADRs - **Status:** ativa diff --git a/docs/architecture/CRONOGRAMA_10_DIAS.md b/docs/architecture/CRONOGRAMA_10_DIAS.md index b9d2636..5b0944f 100644 --- a/docs/architecture/CRONOGRAMA_10_DIAS.md +++ b/docs/architecture/CRONOGRAMA_10_DIAS.md @@ -1,4 +1,4 @@ -# Cronograma de 10 dias — AIgnt OS MVP +# Cronograma de 10 dias — SynapseOS MVP > Documento histórico do MVP inicial. O roadmap ativo da etapa 2, agora pos-F15, está em `docs/architecture/PHASE_2_ROADMAP.md`. diff --git a/docs/architecture/IMPLEMENTATION_STACK.md b/docs/architecture/IMPLEMENTATION_STACK.md index c08d997..8c97afd 100644 --- a/docs/architecture/IMPLEMENTATION_STACK.md +++ b/docs/architecture/IMPLEMENTATION_STACK.md @@ -1,7 +1,7 @@ -# Implementation Stack — AIgnt OS +# Implementation Stack — SynapseOS ## Objetivo -Registrar a stack Python recomendada para implementar o AIgnt OS conforme a arquitetura definida. +Registrar a stack Python recomendada para implementar o SynapseOS conforme a arquitetura definida. ## MVP - **Python 3.12** @@ -9,7 +9,7 @@ Registrar a stack Python recomendada para implementar o AIgnt OS conforme a arqu - **Typer** para CLI - **Rich** para UX terminal - **python-statemachine** para estados -- **AIgnt-Synapse-Flow** em Python como engine própria de pipeline +- **Synapse-Flow** em Python como engine própria de pipeline - **asyncio** para concorrência - **asyncio.create_subprocess_exec()** para execução de CLIs - **Pydantic v2** para contratos internos @@ -36,7 +36,7 @@ Trade-offs: - exige que `repo-preflight` prepare e valide o runtime antes de `spec-editor`. - por isso, o preflight padrão deve permanecer leve (`compose config`), com build e runtime completo reservados para workflows ou execuções explícitas. -### AIgnt-Synapse-Flow +### Synapse-Flow Permite controle fino de hand-offs, retry, rollback e estágios específicos do domínio sem complexidade operacional de um orquestrador pesado. ### python-statemachine diff --git a/docs/architecture/PHASE_2_ROADMAP.md b/docs/architecture/PHASE_2_ROADMAP.md index d92ef85..ce71b09 100644 --- a/docs/architecture/PHASE_2_ROADMAP.md +++ b/docs/architecture/PHASE_2_ROADMAP.md @@ -2,13 +2,13 @@ ## Objetivo -Registrar a proxima etapa do projeto apos a conclusao do MVP inicial e dos follow-ups `F13` e `F14`, mantendo o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS e priorizando evolucao incremental da CLI publica. +Registrar a proxima etapa do projeto apos a conclusao do MVP inicial e dos follow-ups `F13` e `F14`, mantendo o Synapse-Flow como a engine propria de pipeline do SynapseOS e priorizando evolucao incremental da CLI publica. ## Estado de partida - `main` sincronizada e baseline estavel - MVP inicial concluido ate `DOCUMENT` -- `aignt runs list`, `aignt runs show ` e `aignt runs submit ` ja expostos pela CLI publica +- `synapse runs list`, `synapse runs show ` e `synapse runs submit ` ja expostos pela CLI publica - nenhuma nova feature de produto aberta no momento ## Estrategia adotada @@ -44,7 +44,7 @@ Alocacao recomendada quando esses itens voltarem: ### F15 — Public Run Submission - **Objetivo**: abrir um caminho oficial para criar runs pela CLI publica. - **Valor para a fase**: transforma o sistema de apenas inspecionavel em executavel por interface publica. -- **Superficie publica afetada**: `aignt runs submit `, `--mode auto|sync|async`, `--stop-at `. +- **Superficie publica afetada**: `synapse runs submit `, `--mode auto|sync|async`, `--stop-at `. - **Dependencias**: F14, runtime dual, dispatch interno ja existente. - **Fora de escopo**: preview de artifacts, onboarding, TUI. - **Criterio de pronto**: um operador consegue iniciar uma run e obter `run_id`, `status` e `mode`. @@ -53,7 +53,7 @@ Alocacao recomendada quando esses itens voltarem: ### F16 — Run Detail Expansion - **Objetivo**: aprofundar `runs show` para explicar onde a run esta, falhou ou travou. - **Valor para a fase**: reduz atrito operacional logo apos a submissao publica. -- **Superficie publica afetada**: extensoes de `aignt runs show` para steps, events e artifacts listados com mais contexto. +- **Superficie publica afetada**: extensoes de `synapse runs show` para steps, events e artifacts listados com mais contexto. - **Dependencias**: F14 concluida; idealmente F15 concluida ou em reta final. - **Fora de escopo**: preview bruto de conteudo e TUI. - **Criterio de pronto**: um operador consegue localizar o proximo ponto de diagnostico apenas pela CLI. @@ -80,7 +80,7 @@ Alocacao recomendada quando esses itens voltarem: ### F19 — Environment Doctor - **Objetivo**: oferecer diagnostico local para os pre-requisitos do fluxo publico. - **Valor para a fase**: reduz troubleshooting antes da primeira run real. -- **Superficie publica afetada**: `aignt doctor`. +- **Superficie publica afetada**: `synapse doctor`. - **Dependencias**: happy path ja conhecido o suficiente para virar checklist. - **Fora de escopo**: auto-correcao de ambiente. - **Criterio de pronto**: o usuario entende o que falta para executar o fluxo oficial. @@ -100,7 +100,7 @@ Alocacao recomendada quando esses itens voltarem: ### F17 — Artifact Preview - **Objetivo**: permitir consulta de report e outputs uteis pela CLI. - **Valor para a fase**: melhora conforto de operacao depois do caminho principal estar estavel. -- **Superficie publica afetada**: extensoes de `aignt runs show ` para preview controlado de `RUN_REPORT.md` e de output limpo por step. +- **Superficie publica afetada**: extensoes de `synapse runs show ` para preview controlado de `RUN_REPORT.md` e de output limpo por step. - **Dependencias**: F16 e caminho canonico ja consolidados. - **Fora de escopo**: dump irrestrito de arquivos e leitura arbitraria do host. - **Criterio de pronto**: o usuario le report e outputs-chave sem abrir arquivos manualmente. diff --git a/docs/architecture/SDD.md b/docs/architecture/SDD.md index d6914ca..141a997 100644 --- a/docs/architecture/SDD.md +++ b/docs/architecture/SDD.md @@ -1,9 +1,9 @@ -# Software Design Document (SDD) — AIgnt OS v3 +# Software Design Document (SDD) — SynapseOS v3 ## 1. Visão Geral ### 1.1 Propósito -AIgnt OS é um meta-orquestrador de agentes de IA via CLI. Seu papel é coordenar múltiplas ferramentas externas de IA, organizar hand-offs entre etapas de uma esteira controlada e produzir artefatos de software com rastreabilidade, resiliência e baixo custo operacional. +SynapseOS é um meta-orquestrador de agentes de IA via CLI. Seu papel é coordenar múltiplas ferramentas externas de IA, organizar hand-offs entre etapas de uma esteira controlada e produzir artefatos de software com rastreabilidade, resiliência e baixo custo operacional. ### 1.2 Objetivos - Orquestrar ferramentas de IA via CLI de forma uniforme. @@ -37,7 +37,7 @@ O sistema recebe uma tarefa, produz uma especificação estruturada, planeja sua - Observabilidade do MVP: **local**, com logs estruturados e `RUN_REPORT.md` por execução. - Memória semântica no MVP: **advisory/read-only**. - SPEC oficial: **Markdown estruturado com front matter YAML obrigatório**. -- Núcleo de orquestração: **AIgnt-Synapse-Flow**, a **engine própria de pipeline** do AIgnt OS, state-driven e implementada em Python. +- Núcleo de orquestração: **Synapse-Flow**, a **engine própria de pipeline** do SynapseOS, state-driven e implementada em Python. --- @@ -62,7 +62,7 @@ Responsável por estado, pipeline, supervisão, memória e decisão. Componentes: - Orchestrator Engine -- AIgnt-Synapse-Flow +- Synapse-Flow - State Machine Manager - Pipeline Manager - Adaptive Supervisor @@ -106,7 +106,7 @@ Regras: - `security-review` atua como gate antes de `REPORT` e `COMMIT`. - O fluxo oficial organiza o trabalho por feature sem substituir os estados internos do runtime. -### 5.2 Subetapas internas do AIgnt-Synapse-Flow +### 5.2 Subetapas internas do Synapse-Flow ```text REQUEST → SPEC_DISCOVERY → SPEC_NORMALIZATION → SPEC_VALIDATION → PLAN → TEST_RED → CODE_GREEN → QUALITY_GATE → REVIEW → SECURITY → DOCUMENT → COMPLETE @@ -116,7 +116,7 @@ O macroestágio `SPEC` do fluxo oficial engloba `SPEC_DISCOVERY`, `SPEC_NORMALIZ ### 5.3 Mapeamento macro ↔ estados internos -| Macroestágio (fluxo oficial) | Estados internos do AIgnt-Synapse-Flow | +| Macroestágio (fluxo oficial) | Estados internos do Synapse-Flow | |---|---| | `SPEC` | `SPEC_DISCOVERY` → `SPEC_NORMALIZATION` → `SPEC_VALIDATION` | | `TEST_RED` | `PLAN` → `TEST_RED` | @@ -152,7 +152,7 @@ Usado para: ### 6.2 Worker/daemon residente leve Usado para: - consumir runs pendentes, -- executar o AIgnt-Synapse-Flow, +- executar o Synapse-Flow, - aplicar retries longos, - persistir progresso, - gerar artefatos e relatório final. @@ -220,7 +220,7 @@ O runtime dual permite preservar a experiência CLI e, ao mesmo tempo, suportar ## 8. Módulos Principais ### 8.1 Orchestrator Engine -Coordena a execução ponta a ponta, cria o contexto da run, invoca o AIgnt-Synapse-Flow e consolida resultados. +Coordena a execução ponta a ponta, cria o contexto da run, invoca o Synapse-Flow e consolida resultados. ### 8.2 State Machine Manager Modela e valida estados e transições. @@ -261,7 +261,7 @@ Subcomponentes sugeridos: ### 8.5 CLI Adapter Layer Abstrai a execução das ferramentas externas. -Contrato mínimo (implementado em `src/aignt_os/contracts.py`): +Contrato mínimo (implementado em `src/synapse_os/contracts.py`): ```python @dataclass @@ -330,8 +330,8 @@ Responsabilidades: - decidir se a execução será inline ou assíncrona, - consolidar estado final. -### 8.10 AIgnt-Synapse-Flow -O AIgnt-Synapse-Flow é a engine própria de pipeline do AIgnt OS. Ele coordena os estados internos da run, os hand-offs entre steps, o encadeamento `SPEC → TEST_RED → CODE_GREEN → REFACTOR → SECURITY_REVIEW → REPORT` e a integração com supervisor, memória e adapters. +### 8.10 Synapse-Flow +O Synapse-Flow é a engine própria de pipeline do SynapseOS. Ele coordena os estados internos da run, os hand-offs entre steps, o encadeamento `SPEC → TEST_RED → CODE_GREEN → REFACTOR → SECURITY_REVIEW → REPORT` e a integração com supervisor, memória e adapters. --- @@ -340,7 +340,7 @@ O AIgnt-Synapse-Flow é a engine própria de pipeline do AIgnt OS. Ele coordena 2. Usuário envia uma tarefa. 3. O CLI cria ou dispara uma run. 4. O Spec Engine produz e valida a SPEC. -5. O AIgnt-Synapse-Flow seleciona o step atual. +5. O Synapse-Flow seleciona o step atual. 6. O Adapter executa a ferramenta externa. 7. O Parsing Engine limpa e valida a saída. 8. O Supervisor decide o próximo movimento. @@ -433,7 +433,7 @@ Conteúdo mínimo: ### Curto prazo - paralelizar alguns steps com `asyncio`; - permitir worker residente consumir múltiplas runs; -- expandir o AIgnt-Synapse-Flow para DAG simples. +- expandir o Synapse-Flow para DAG simples. ### Médio prazo - DAG pipeline real; @@ -449,7 +449,7 @@ Conteúdo mínimo: --- ## 15. Documentos Relacionados -- TDD do AIgnt OS +- TDD do SynapseOS - template oficial de SPEC - documentação de stack e runtime - ADR-001 a ADR-009 diff --git a/docs/architecture/SPEC_FORMAT.md b/docs/architecture/SPEC_FORMAT.md index 1a2de7a..acf70c9 100644 --- a/docs/architecture/SPEC_FORMAT.md +++ b/docs/architecture/SPEC_FORMAT.md @@ -1,4 +1,4 @@ -# SPEC Format — AIgnt OS +# SPEC Format — SynapseOS ## Decisão O formato oficial da SPEC no MVP é **Markdown estruturado com front matter YAML obrigatório**. diff --git a/docs/architecture/SPEC_TEMPLATE_v2.md b/docs/architecture/SPEC_TEMPLATE_v2.md index bed39f6..066e846 100644 --- a/docs/architecture/SPEC_TEMPLATE_v2.md +++ b/docs/architecture/SPEC_TEMPLATE_v2.md @@ -1,4 +1,4 @@ -# SPEC Template — AIgnt OS v2 +# SPEC Template — SynapseOS v2 > Formato oficial de SPEC para o MVP: **Markdown estruturado com bloco YAML obrigatório**. diff --git a/docs/architecture/TDD.md b/docs/architecture/TDD.md index 5debcd3..7343a2f 100644 --- a/docs/architecture/TDD.md +++ b/docs/architecture/TDD.md @@ -1,7 +1,7 @@ -# Test-Driven Development Strategy — AIgnt OS v3 +# Test-Driven Development Strategy — SynapseOS v3 ## 1. Objetivo -Definir a estratégia de testes para implementar o AIgnt OS com foco em confiabilidade do **AIgnt-Synapse-Flow**, a engine própria de pipeline do projeto, dos adapters CLI, do formato de SPEC, do runtime dual (CLI + worker leve) e dos hand-offs entre etapas. +Definir a estratégia de testes para implementar o SynapseOS com foco em confiabilidade do **Synapse-Flow**, a engine própria de pipeline do projeto, dos adapters CLI, do formato de SPEC, do runtime dual (CLI + worker leve) e dos hand-offs entre etapas. ## 2. Princípios - Validar `DOCKER_PREFLIGHT` antes de iniciar execução prática dependente de Docker. @@ -9,7 +9,7 @@ Definir a estratégia de testes para implementar o AIgnt OS com foco em confiabi - Separar testes de unidade, integração, pipeline e worker. - Simular ferramentas CLI com outputs realistas. - Validar hand-offs entre steps, não apenas comportamento interno. -- Garantir que o AIgnt-Synapse-Flow permaneça refatorável. +- Garantir que o Synapse-Flow permaneça refatorável. - Fazer `TEST_RED` derivar testes da SPEC validada, não do prompt cru. - Tratar `SECURITY_REVIEW` como gate antes de `REPORT` e `COMMIT`. @@ -74,7 +74,7 @@ Cobrem: - adapter + parser, - pipeline manager + supervisor, - persistência de run, -- CLI + AIgnt-Synapse-Flow, +- CLI + Synapse-Flow, - worker + repositório de runs. ### 5.3 CLI simulation tests @@ -113,7 +113,7 @@ Garantem que: 5. Cleaner/parser básico. 6. Base adapter async. 7. Step executor. -8. AIgnt-Synapse-Flow linear. +8. Synapse-Flow linear. 9. Persistência SQLite. 10. Worker leve. 11. Supervisor com retry/reroute. @@ -283,7 +283,7 @@ Adapters e integrações assíncronas usam `pytest-asyncio`. A configuração `a A suíte deve garantir: - hand-offs confiáveis, - validação rígida da SPEC, -- previsibilidade do AIgnt-Synapse-Flow, +- previsibilidade do Synapse-Flow, - worker seguro para retries longos, - `DOCKER_PREFLIGHT` executável e verificável, - `SECURITY_REVIEW` funcionando como gate, diff --git a/docs/architecture/WORKTREE_FEATURES.md b/docs/architecture/WORKTREE_FEATURES.md index d89888e..4e7dbf8 100644 --- a/docs/architecture/WORKTREE_FEATURES.md +++ b/docs/architecture/WORKTREE_FEATURES.md @@ -1,4 +1,4 @@ -# Worktree de Features — AIgnt OS +# Worktree de Features — SynapseOS ## Objetivo Organizar o desenvolvimento do projeto em features pequenas, isoladas por branch/worktree, seguindo a esteira definida no SDD e a ordem recomendada no TDD. @@ -7,7 +7,7 @@ Organizar o desenvolvimento do projeto em features pequenas, isoladas por branch - Trabalhar **uma feature por vez**. - Cada feature deve ter sua própria `SPEC.md`. - Nenhuma feature entra em código antes da SPEC e dos testes mínimos. -- O MVP de 10 dias deve priorizar **núcleo funcional**: SPEC, state machine, parser, adapter base, AIgnt-Synapse-Flow linear como engine própria de pipeline, persistência, worker leve e `RUN_REPORT.md`. +- O MVP de 10 dias deve priorizar **núcleo funcional**: SPEC, state machine, parser, adapter base, Synapse-Flow linear como engine própria de pipeline, persistência, worker leve e `RUN_REPORT.md`. - Adapters reais ficam limitados a **1 adapter real prioritário** no prazo de 10 dias. ## Sequência recomendada de features do MVP inicial @@ -37,7 +37,7 @@ Organizar o desenvolvimento do projeto em features pequenas, isoladas por branch **Entrega:** `BaseCLIAdapter`, `CLIExecutionResult`, timeout e sanitização. **Branch/worktree:** `feature/f05-cli-adapter-base` -### F06 — AIgnt-Synapse-Flow Linear +### F06 — Synapse-Flow Linear **Objetivo:** executar a esteira linear com step executor e hand-offs mínimos. **Entrega:** `PipelineStep`, `StepExecutor`, `PipelineEngine`, fluxo até `PLAN` ou fluxo completo em fake mode. **Branch/worktree:** `feature/f06-pipeline-engine-linear` @@ -76,17 +76,17 @@ Organizar o desenvolvimento do projeto em features pequenas, isoladas por branch ### F13 — Rich CLI Output **Objetivo:** melhorar a UX inicial da CLI sem abrir TUI. -**Entrega:** saída enriquecida com Rich para `aignt runtime status`. +**Entrega:** saída enriquecida com Rich para `synapse runtime status`. **Branch/worktree:** `feature/f13-rich-cli-output` ### F14 — Runs Observability CLI **Objetivo:** expor inspeção pública de runs persistidas. -**Entrega:** `aignt runs list` e `aignt runs show `. +**Entrega:** `synapse runs list` e `synapse runs show `. **Branch/worktree:** `feature/f14-runs-observability-cli` ### F15 — Public Run Submission **Objetivo:** expor submissao publica de runs pela CLI a partir de uma SPEC validada. -**Entrega:** `aignt runs submit ` com `--mode auto|sync|async` e `--stop-at`. +**Entrega:** `synapse runs submit ` com `--mode auto|sync|async` e `--stop-at`. **Branch/worktree:** `feature/f15-public-run-submission` ## Etapa 2 concluída diff --git a/docs/operations/LIFECYCLE.md b/docs/operations/LIFECYCLE.md index 19a568f..1d16b7e 100644 --- a/docs/operations/LIFECYCLE.md +++ b/docs/operations/LIFECYCLE.md @@ -1,6 +1,6 @@ # Operação e Ciclo de Vida (Lifecycle) -Este documento centraliza as instruções operacionais para desenvolvimento local (bootstrap), gerenciamento do runtime residente e controle de execução do pipeline (AIgnt-Synapse-Flow). +Este documento centraliza as instruções operacionais para desenvolvimento local (bootstrap), gerenciamento do runtime residente e controle de execução do pipeline (Synapse-Flow). ## 1. Bootstrap e Desenvolvimento Local @@ -46,7 +46,7 @@ O `DOCKER_PREFLIGHT` é um gate operacional. ## 2. Runtime Lifecycle -O AIgnt OS opera em modelo dual: **CLI Efêmera** (cliente) e **Runtime Residente** (servidor/worker). +O SynapseOS opera em modelo dual: **CLI Efêmera** (cliente) e **Runtime Residente** (servidor/worker). O runtime residente é responsável por: * Executar o loop do Worker (processamento de steps). @@ -57,11 +57,11 @@ O runtime residente é responsável por: | Comando | Descrição | | :--- | :--- | -| `aignt runtime start` | Inicia o processo residente em background (daemon). | -| `aignt runtime stop` | Para o processo residente graciosamente. | -| `aignt runtime status` | Exibe o status do processo (PID, uptime) e do worker. | -| `aignt runtime run` | Executa o runtime em foreground (bloqueante), útil para debug. | -| `aignt runtime ready` | Verifica se o runtime está pronto para aceitar comandos (healthcheck). | +| `synapse runtime start` | Inicia o processo residente em background (daemon). | +| `synapse runtime stop` | Para o processo residente graciosamente. | +| `synapse runtime status` | Exibe o status do processo (PID, uptime) e do worker. | +| `synapse runtime run` | Executa o runtime em foreground (bloqueante), útil para debug. | +| `synapse runtime ready` | Verifica se o runtime está pronto para aceitar comandos (healthcheck). | **Nota**: O runtime deve estar ativo (`start` ou `run`) para que as runs submetidas em modo `async` sejam processadas pelo worker. Runs em modo `sync` são processadas pelo próprio processo da CLI. @@ -69,40 +69,40 @@ O runtime residente é responsável por: ## 3. Pipeline Management (Runs) -O gerenciamento de execuções do AIgnt-Synapse-Flow é feito via subcomandos `runs`. +O gerenciamento de execuções do Synapse-Flow é feito via subcomandos `runs`. ### Submissão de Runs ```bash # Modo síncrono (bloqueia terminal, roda na CLI) - Ideal para debug/dev -aignt runs submit features/F00-exemplo/SPEC.md --mode sync +synapse runs submit features/F00-exemplo/SPEC.md --mode sync # Modo assíncrono (envia para fila, requer runtime start) - Produção -aignt runs submit features/F00-exemplo/SPEC.md --mode async +synapse runs submit features/F00-exemplo/SPEC.md --mode async # Parada programada (Stop At) -aignt runs submit ... --stop-at PLAN +synapse runs submit ... --stop-at PLAN ``` ### Monitoramento e Controle | Comando | Descrição | | :--- | :--- | -| `aignt runs list` | Lista as runs recentes e seus status. | -| `aignt runs show ` | Exibe detalhes de uma run, incluindo status dos steps e artifacts. | -| `aignt runs watch` | Abre o Dashboard TUI para monitoramento em tempo real. | -| `aignt runs cancel ` | Solicita o cancelamento de uma run em execução. | +| `synapse runs list` | Lista as runs recentes e seus status. | +| `synapse runs show ` | Exibe detalhes de uma run, incluindo status dos steps e artifacts. | +| `synapse runs watch` | Abre o Dashboard TUI para monitoramento em tempo real. | +| `synapse runs cancel ` | Solicita o cancelamento de uma run em execução. | ### Cancelamento (F40) -O cancelamento (`aignt runs cancel ` ou tecla `k` no TUI) envia um sinal para o motor de execução. +O cancelamento (`synapse runs cancel ` ou tecla `k` no TUI) envia um sinal para o motor de execução. * **Comportamento**: O cancelamento não é imediato (kill). O engine verifica o sinal entre steps. * **Estado Final**: A run transita para `cancelling` e termina como `cancelled`. * **Cleanup**: Artefatos gerados até o momento são preservados. ### Filtros de Dashboard (F42) -No comando `aignt runs watch`: +No comando `synapse runs watch`: * Use as teclas de seta para navegar. * Pressione `Enter` para ver logs do step. * Pressione `f` para filtrar steps (ex: mostrar apenas steps com falha). @@ -113,9 +113,9 @@ No comando `aignt runs watch`: O sistema possui um Auth Registry local baseado em arquivo para controle de acesso via CLI. -* `aignt auth init`: Inicializa o registry e cria o admin. -* `aignt auth issue`: Emite novos tokens com roles (`viewer`, `operator`, `admin`). -* `aignt auth disable`: Revoga tokens. +* `synapse auth init`: Inicializa o registry e cria o admin. +* `synapse auth issue`: Emite novos tokens com roles (`viewer`, `operator`, `admin`). +* `synapse auth disable`: Revoga tokens. --- @@ -123,7 +123,7 @@ O sistema possui um Auth Registry local baseado em arquivo para controle de aces ### Aignt Doctor -Use `aignt doctor` para diagnosticar o ambiente: +Use `synapse doctor` para diagnosticar o ambiente: * Verifica instalação do `uv`, `git`, `docker`. * Verifica integridade do banco de dados SQLite. * Verifica permissões de diretórios de artifacts e estado. @@ -132,4 +132,4 @@ Use `aignt doctor` para diagnosticar o ambiente: * **Logs da CLI**: Saída padrão no terminal. * **Logs do Runtime**: Se iniciado com `start`, os logs vão para onde o daemon gerenciador definir (ou stdout se usar `run`). -* **Logs de Steps**: Acessíveis via `aignt runs show ` (caminhos dos arquivos de log) ou visualizador de logs no Dashboard (`Enter`). +* **Logs de Steps**: Acessíveis via `synapse runs show ` (caminhos dos arquivos de log) ou visualizador de logs no Dashboard (`Enter`). diff --git a/docs/release/phase-2-technical-release.md b/docs/release/phase-2-technical-release.md index 207cf32..80fecb4 100644 --- a/docs/release/phase-2-technical-release.md +++ b/docs/release/phase-2-technical-release.md @@ -2,23 +2,23 @@ ## Summary -Esta release tecnica consolida a etapa 2 do AIgnt OS sem abrir nova feature de produto alem da superficie publica ja entregue. O AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS, e a release foca em tornar o fluxo atual mais auditavel, documentado e reproduzivel. +Esta release tecnica consolida a etapa 2 do SynapseOS sem abrir nova feature de produto alem da superficie publica ja entregue. O Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS, e a release foca em tornar o fluxo atual mais auditavel, documentado e reproduzivel. ## Public surface -- `aignt doctor` -- `aignt runs submit ` -- `aignt runs show ` -- `aignt runs show --preview report` -- `aignt runs show --preview .clean` +- `synapse doctor` +- `synapse runs submit ` +- `synapse runs show ` +- `synapse runs show --preview report` +- `synapse runs show --preview .clean` ## Supported flow O fluxo minimo oficial continua local e `sync-first`: -1. `aignt doctor` -2. `aignt runs submit --mode sync --stop-at SPEC_VALIDATION` -3. `aignt runs show ` +1. `synapse doctor` +2. `synapse runs submit --mode sync --stop-at SPEC_VALIDATION` +3. `synapse runs show ` Artifact preview permanece opcional e depende de artifacts persistidos ja existentes, como `RUN_REPORT.md` e `clean_output` por step. diff --git a/features/F01-bootstrap-contracts/SPEC.md b/features/F01-bootstrap-contracts/SPEC.md index c3261d8..eeb7b71 100644 --- a/features/F01-bootstrap-contracts/SPEC.md +++ b/features/F01-bootstrap-contracts/SPEC.md @@ -1,7 +1,7 @@ --- id: F01-bootstrap-contracts type: feature -summary: Estabelecer o bootstrap mínimo em Python do AIgnt OS com CLI básica, contratos iniciais, configuração base e testes iniciais. +summary: Estabelecer o bootstrap mínimo em Python do SynapseOS com CLI básica, contratos iniciais, configuração base e testes iniciais. workspace: . inputs: - user_request @@ -41,11 +41,11 @@ security_notes: # Contexto -O projeto precisa de uma base mínima executável para começar o ciclo spec-first e TDD sem antecipar componentes maiores do MVP. Esta feature existe para criar um ponto de partida pequeno, verificável e coerente com a arquitetura definida para o AIgnt OS. +O projeto precisa de uma base mínima executável para começar o ciclo spec-first e TDD sem antecipar componentes maiores do MVP. Esta feature existe para criar um ponto de partida pequeno, verificável e coerente com a arquitetura definida para o SynapseOS. # Objetivo -Entregar o menor bootstrap útil em Python para o AIgnt OS com: +Entregar o menor bootstrap útil em Python para o SynapseOS com: - pacote Python inicial; - CLI mínima funcional; - contratos/modelos iniciais com Pydantic; @@ -124,7 +124,7 @@ Fica explicitamente fora desta feature: ## 8. Artefatos Esperados - `features/F01-bootstrap-contracts/SPEC.md` -- código inicial em `src/aignt_os/` +- código inicial em `src/synapse_os/` - testes iniciais em `tests/` - `features/F01-bootstrap-contracts/NOTES.md` apenas se surgir lacuna relevante durante RED/GREEN diff --git a/features/F02-spec-engine-mvp/SPEC.md b/features/F02-spec-engine-mvp/SPEC.md index 45c014a..426c4b6 100644 --- a/features/F02-spec-engine-mvp/SPEC.md +++ b/features/F02-spec-engine-mvp/SPEC.md @@ -1,7 +1,7 @@ --- id: F02-spec-engine-mvp type: feature -summary: Validar a SPEC hibrida do AIgnt OS com parser de front matter YAML, checagem estrutural minima e bloqueio explicito quando o documento for invalido. +summary: Validar a SPEC hibrida do SynapseOS com parser de front matter YAML, checagem estrutural minima e bloqueio explicito quando o documento for invalido. workspace: . inputs: - docs/architecture/SPEC_FORMAT.md @@ -29,7 +29,7 @@ acceptance_criteria: non_goals: - gerar ou editar SPEC automaticamente - implementar state machine - - implementar pipeline do AIgnt-Synapse-Flow + - implementar pipeline do Synapse-Flow - validar semantica profunda de cada secao narrativa - integrar adapters, worker ou persistencia dependencies: @@ -38,9 +38,9 @@ dependencies: # Contexto -O AIgnt OS adota desenvolvimento spec-first e depende de uma SPEC hibrida com front matter YAML obrigatorio. No estado atual do projeto, a arquitetura e o formato estao definidos em documentacao, mas ainda falta o primeiro incremento executavel que valide esse contrato antes da pipeline avancar. +O SynapseOS adota desenvolvimento spec-first e depende de uma SPEC hibrida com front matter YAML obrigatorio. No estado atual do projeto, a arquitetura e o formato estao definidos em documentacao, mas ainda falta o primeiro incremento executavel que valide esse contrato antes da pipeline avancar. -Essa feature introduz apenas o menor recorte necessario para iniciar `SPEC_VALIDATION` no AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS, sem antecipar state machine, parser generico ou fluxo completo da pipeline. +Essa feature introduz apenas o menor recorte necessario para iniciar `SPEC_VALIDATION` no Synapse-Flow, a engine propria de pipeline do SynapseOS, sem antecipar state machine, parser generico ou fluxo completo da pipeline. # Objetivo diff --git a/features/F03-state-machine-mvp/SPEC.md b/features/F03-state-machine-mvp/SPEC.md index 8dc1cdc..a70730f 100644 --- a/features/F03-state-machine-mvp/SPEC.md +++ b/features/F03-state-machine-mvp/SPEC.md @@ -1,7 +1,7 @@ --- id: F03-state-machine-mvp type: feature -summary: Modelar a state machine minima do AIgnt-Synapse-Flow com estados principais da pipeline e validacao explicita de transicoes validas e invalidas no MVP. +summary: Modelar a state machine minima do Synapse-Flow com estados principais da pipeline e validacao explicita de transicoes validas e invalidas no MVP. workspace: . inputs: - docs/architecture/SDD.md @@ -38,7 +38,7 @@ dependencies: # Contexto -O AIgnt OS adota o AIgnt-Synapse-Flow como a engine propria de pipeline do projeto, e essa engine depende de uma modelagem state-driven auditavel. A arquitetura ja define os estados principais no SDD, mas ainda falta o primeiro incremento executavel dessa state machine para validar transicoes do fluxo do MVP. +O SynapseOS adota o Synapse-Flow como a engine propria de pipeline do projeto, e essa engine depende de uma modelagem state-driven auditavel. A arquitetura ja define os estados principais no SDD, mas ainda falta o primeiro incremento executavel dessa state machine para validar transicoes do fluxo do MVP. Depois da F02, que entrega a validacao minima da SPEC, o proximo passo natural do nucleo e explicitar os estados e as regras de transicao sem antecipar executor de passos, supervisor ou pipeline completa. @@ -85,7 +85,7 @@ Entregar a state machine minima do MVP com: # Requisitos funcionais -1. O sistema deve representar explicitamente os estados principais do AIgnt-Synapse-Flow no MVP. +1. O sistema deve representar explicitamente os estados principais do Synapse-Flow no MVP. 2. O estado inicial da run deve permitir entrada controlada no fluxo a partir de `REQUEST`. 3. O sistema deve permitir a progressao linear do macrofluxo interno: `REQUEST -> SPEC_DISCOVERY -> SPEC_NORMALIZATION -> SPEC_VALIDATION -> PLAN -> TEST_RED -> CODE_GREEN -> REVIEW -> SECURITY -> DOCUMENT -> COMPLETE`. @@ -136,4 +136,4 @@ Entregar a state machine minima do MVP com: # Observacoes -Esta feature modela apenas a state machine minima do AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS. Ela nao executa steps reais nem decide retry, reroute ou rollback; esses comportamentos ficam para features posteriores. +Esta feature modela apenas a state machine minima do Synapse-Flow, a engine propria de pipeline do SynapseOS. Ela nao executa steps reais nem decide retry, reroute ou rollback; esses comportamentos ficam para features posteriores. diff --git a/features/F04-parsing-engine-mvp/SPEC.md b/features/F04-parsing-engine-mvp/SPEC.md index aa62ee4..b494e07 100644 --- a/features/F04-parsing-engine-mvp/SPEC.md +++ b/features/F04-parsing-engine-mvp/SPEC.md @@ -40,7 +40,7 @@ dependencies: # Contexto -O AIgnt OS trata parsing como preocupacao arquitetural central porque as ferramentas CLI produzem saidas textuais ruidosas, misturando texto util, ruido operacional, codigos ANSI e blocos de artefatos. Depois da F02 e da F03, o proximo incremento natural do nucleo e criar o primeiro Parsing Engine executavel para preparar hand-offs confiaveis no AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS. +O SynapseOS trata parsing como preocupacao arquitetural central porque as ferramentas CLI produzem saidas textuais ruidosas, misturando texto util, ruido operacional, codigos ANSI e blocos de artefatos. Depois da F02 e da F03, o proximo incremento natural do nucleo e criar o primeiro Parsing Engine executavel para preparar hand-offs confiaveis no Synapse-Flow, a engine propria de pipeline do SynapseOS. O recorte desta feature precisa permanecer pequeno: limpar texto, extrair blocos relevantes e validar artefatos basicos sem antecipar adapter async, supervisor, reroute ou suporte detalhado por ferramenta. diff --git a/features/F05-cli-adapter-base/NOTES.md b/features/F05-cli-adapter-base/NOTES.md index a32d393..ad9e085 100644 --- a/features/F05-cli-adapter-base/NOTES.md +++ b/features/F05-cli-adapter-base/NOTES.md @@ -2,4 +2,4 @@ - A F05 evolui `CLIExecutionResult` para refletir o contrato real de execucao CLI assíncrona, sem mover contratos de parsing da F04 para o mesmo módulo. - O `BaseCLIAdapter` fica restrito a montar comando, executar subprocesso async, capturar streams e aplicar sanitização leve; adapters reais continuam fora deste recorte. -- A sanitização local da F05 remove apenas ANSI e whitespace periférico para evitar conflito com o Parsing Engine MVP, que continua sendo o componente responsável por limpeza e extração mais profundas antes dos hand-offs do AIgnt-Synapse-Flow. +- A sanitização local da F05 remove apenas ANSI e whitespace periférico para evitar conflito com o Parsing Engine MVP, que continua sendo o componente responsável por limpeza e extração mais profundas antes dos hand-offs do Synapse-Flow. diff --git a/features/F05-cli-adapter-base/SPEC.md b/features/F05-cli-adapter-base/SPEC.md index b21e3e4..a30ef77 100644 --- a/features/F05-cli-adapter-base/SPEC.md +++ b/features/F05-cli-adapter-base/SPEC.md @@ -41,7 +41,7 @@ dependencies: # Contexto -Depois da F04, o AIgnt OS já possui um Parsing Engine MVP para separar output bruto, output limpo e artefatos. O próximo incremento natural do núcleo é fechar a camada base de execução CLI assíncrona, seguindo o ADR-004 e o SDD, para que o AIgnt-Synapse-Flow, a engine própria de pipeline do AIgnt OS, tenha um contrato uniforme ao chamar ferramentas externas. +Depois da F04, o SynapseOS já possui um Parsing Engine MVP para separar output bruto, output limpo e artefatos. O próximo incremento natural do núcleo é fechar a camada base de execução CLI assíncrona, seguindo o ADR-004 e o SDD, para que o Synapse-Flow, a engine própria de pipeline do SynapseOS, tenha um contrato uniforme ao chamar ferramentas externas. Esta feature deve permanecer pequena: criar o adapter base, endurecer o contrato de resultado e tratar timeout/sanitização mínima sem antecipar adapters reais, pipeline, worker ou integrações mais pesadas. @@ -69,7 +69,7 @@ Entregar a base assíncrona de execução CLI com: - adapters específicos de Codex, Gemini, Claude ou outras ferramentas - parsing de fenced blocks, validação sintática de artefatos ou heurísticas por ferramenta -- retries, reroute, supervisor ou integração com AIgnt-Synapse-Flow além do contrato base +- retries, reroute, supervisor ou integração com Synapse-Flow além do contrato base - execução prática em Docker ou validação operacional de container - persistência, relatório de run ou worker residente diff --git a/features/F06-pipeline-engine-linear/NOTES.md b/features/F06-pipeline-engine-linear/NOTES.md index 1aa7745..55933e3 100644 --- a/features/F06-pipeline-engine-linear/NOTES.md +++ b/features/F06-pipeline-engine-linear/NOTES.md @@ -1,5 +1,5 @@ # NOTES -- A F06 introduz a primeira camada de pipeline do AIgnt-Synapse-Flow em fake mode, acima da state machine, do SpecValidator e dos contratos ja implementados. +- A F06 introduz a primeira camada de pipeline do Synapse-Flow em fake mode, acima da state machine, do SpecValidator e dos contratos ja implementados. - O recorte deliberadamente executa trabalho real apenas em `SPEC_VALIDATION`, `PLAN` e `TEST_RED`; os estados anteriores permanecem como transicoes lineares da state machine. - O hand-off da F06 fica em memoria e tipado, sem persistencia, sem CLI publica nova e sem chamar adapter real ou parser detalhado dentro da pipeline. diff --git a/features/F06-pipeline-engine-linear/SPEC.md b/features/F06-pipeline-engine-linear/SPEC.md index f21d1d5..76227c0 100644 --- a/features/F06-pipeline-engine-linear/SPEC.md +++ b/features/F06-pipeline-engine-linear/SPEC.md @@ -1,7 +1,7 @@ --- id: F06-pipeline-engine-linear type: feature -summary: Implementar a primeira engine linear do AIgnt-Synapse-Flow com PipelineStep, StepExecutor e PipelineEngine em fake mode até PLAN ou TEST_RED. +summary: Implementar a primeira engine linear do Synapse-Flow com PipelineStep, StepExecutor e PipelineEngine em fake mode até PLAN ou TEST_RED. workspace: . inputs: - docs/architecture/SDD.md @@ -16,7 +16,7 @@ outputs: - pipeline_engine_linear - fake_mode_pipeline_tests constraints: - - manter escopo estritamente na pipeline linear do AIgnt-Synapse-Flow + - manter escopo estritamente na pipeline linear do Synapse-Flow - reutilizar a state machine, o SpecValidator e os contratos ja existentes - nao implementar persistencia, worker, supervisor ou adapter real - nao depender de Docker, rede ou ferramentas externas reais @@ -42,13 +42,13 @@ dependencies: # Contexto -Depois da F05, o projeto ja possui os blocos minimos para subir um nivel de abstracao: validacao de SPEC, state machine linear, parser MVP e adapter base async. O proximo incremento natural do nucleo e ligar esses contratos por meio do AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS, em uma pipeline linear pequena e totalmente controlada. +Depois da F05, o projeto ja possui os blocos minimos para subir um nivel de abstracao: validacao de SPEC, state machine linear, parser MVP e adapter base async. O proximo incremento natural do nucleo e ligar esses contratos por meio do Synapse-Flow, a engine propria de pipeline do SynapseOS, em uma pipeline linear pequena e totalmente controlada. Esta feature deve permanecer restrita a fake mode. O objetivo nao e orquestrar ferramentas reais ainda, e sim introduzir a primeira camada de `PipelineStep`, `StepExecutor` e `PipelineEngine` capaz de validar a SPEC e encadear hand-offs minimos para `PLAN` e `TEST_RED`. # Objetivo -Entregar a primeira engine linear do AIgnt-Synapse-Flow com: +Entregar a primeira engine linear do Synapse-Flow com: - contratos tipados de pipeline; - validacao real da SPEC no step `SPEC_VALIDATION`; - execucao linear controlada em fake mode; @@ -134,4 +134,4 @@ Entregar a primeira engine linear do AIgnt-Synapse-Flow com: # Observacoes -Esta feature nao implementa planner real nem writer real de testes. O fake mode existe apenas para exercitar a primeira orquestracao linear do AIgnt-Synapse-Flow. Persistencia, worker, supervisor e runtime mais completo continuam para as features seguintes. +Esta feature nao implementa planner real nem writer real de testes. O fake mode existe apenas para exercitar a primeira orquestracao linear do Synapse-Flow. Persistencia, worker, supervisor e runtime mais completo continuam para as features seguintes. diff --git a/features/F07-persistence-artifacts/SPEC.md b/features/F07-persistence-artifacts/SPEC.md index 4167126..ac0149b 100644 --- a/features/F07-persistence-artifacts/SPEC.md +++ b/features/F07-persistence-artifacts/SPEC.md @@ -1,7 +1,7 @@ --- id: F07-persistence-artifacts type: feature -summary: Persistir runs, steps, eventos e artefatos do AIgnt-Synapse-Flow em SQLite + filesystem sem puxar escopo de worker. +summary: Persistir runs, steps, eventos e artefatos do Synapse-Flow em SQLite + filesystem sem puxar escopo de worker. workspace: . inputs: - docs/architecture/SDD.md @@ -20,7 +20,7 @@ constraints: - nao substituir nem reutilizar o runtime-state.json da F11 como repositorio de runs - nao implementar worker, polling, lease, retomada ou scheduler - nao introduzir nova CLI publica nesta feature - - manter o AIgnt-Synapse-Flow como engine propria de pipeline do AIgnt OS + - manter o Synapse-Flow como engine propria de pipeline do SynapseOS acceptance_criteria: - Existe um RunRepository em SQLite para persistir runs, steps e eventos da pipeline. - Existe um ArtifactStore em filesystem para persistir outputs raw, outputs clean e artefatos nomeados por run e step. @@ -42,13 +42,13 @@ dependencies: # Contexto -Depois da F06, o AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS, ja consegue validar SPEC e encadear hand-offs minimos em memoria. O proximo incremento natural do MVP e tornar a run auditavel fora da memoria do processo, registrando metadados operacionais em SQLite e artefatos em filesystem. +Depois da F06, o Synapse-Flow, a engine propria de pipeline do SynapseOS, ja consegue validar SPEC e encadear hand-offs minimos em memoria. O proximo incremento natural do MVP e tornar a run auditavel fora da memoria do processo, registrando metadados operacionais em SQLite e artefatos em filesystem. Ja existe persistencia local endurecida para o lifecycle do runtime na F11, mas ela cobre apenas `runtime-state.json` do processo residente. Essa persistencia nao substitui a necessidade de um repositorio operacional para runs da pipeline. # Objetivo -Entregar a base minima de persistencia operacional do AIgnt OS para runs lineares: +Entregar a base minima de persistencia operacional do SynapseOS para runs lineares: - `RunRepository` em SQLite para runs, steps e eventos; - `ArtifactStore` em filesystem para raw, clean e artefatos nomeados por step; - lock inicial por run; diff --git a/features/F08-worker-runtime-dual/SPEC.md b/features/F08-worker-runtime-dual/SPEC.md index af4b791..d206d20 100644 --- a/features/F08-worker-runtime-dual/SPEC.md +++ b/features/F08-worker-runtime-dual/SPEC.md @@ -1,7 +1,7 @@ --- id: F08-worker-runtime-dual type: feature -summary: Adicionar worker leve para consumir runs pendentes e uma camada interna de dispatch sync/async sobre a persistencia operacional e o runtime dual do AIgnt OS. +summary: Adicionar worker leve para consumir runs pendentes e uma camada interna de dispatch sync/async sobre a persistencia operacional e o runtime dual do SynapseOS. inputs: - docs/architecture/SDD.md - docs/architecture/TDD.md @@ -19,7 +19,7 @@ constraints: - reutilizar o runtime dual e a persistencia operacional ja existentes - manter um unico worker por workspace no MVP - nao introduzir retry, reroute, scheduler complexo ou RUN_REPORT nesta feature - - manter o AIgnt-Synapse-Flow como engine propria de pipeline do AIgnt OS + - manter o Synapse-Flow como engine propria de pipeline do SynapseOS acceptance_criteria: - Existe uma camada interna de dispatch com modos `sync`, `async` e `auto`. - O modo `auto` executa inline quando o runtime nao esta pronto e enfileira a run quando o runtime esta pronto. @@ -42,7 +42,7 @@ dependencies: # Contexto -A F07 ja persistiu runs, steps, eventos e artefatos do AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS, mas deixou explicitamente fora do escopo o worker, o polling e a retomada basica. Em paralelo, a feature de runtime persistente minimo ja entregou o lifecycle do processo residente com `start`, `status`, `run`, `ready` e `stop`, incluindo hardening local do arquivo de estado. +A F07 ja persistiu runs, steps, eventos e artefatos do Synapse-Flow, a engine propria de pipeline do SynapseOS, mas deixou explicitamente fora do escopo o worker, o polling e a retomada basica. Em paralelo, a feature de runtime persistente minimo ja entregou o lifecycle do processo residente com `start`, `status`, `run`, `ready` e `stop`, incluindo hardening local do arquivo de estado. O gap atual do MVP nao esta em mais uma superficie publica de CLI. O gap esta em conectar essas duas bases: criar runs pendentes de forma controlada, decidir entre execucao inline ou assincrona e permitir que o processo foreground do runtime drene a fila simples de runs pendentes. diff --git a/features/F09-supervisor-mvp/NOTES.md b/features/F09-supervisor-mvp/NOTES.md index b3a2d44..211df19 100644 --- a/features/F09-supervisor-mvp/NOTES.md +++ b/features/F09-supervisor-mvp/NOTES.md @@ -1,6 +1,6 @@ # F09 Notes -- A F09 expande o AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS, apenas ate `SECURITY`. +- A F09 expande o Synapse-Flow, a engine propria de pipeline do SynapseOS, apenas ate `SECURITY`. - O recorte escolhido mantem retry e reroute dentro da mesma execucao da pipeline para evitar resumir estado parcial entre polls do worker. - O worker da F08 continua o hospedeiro do processamento assíncrono, mas a decisao de retry/rework fica concentrada na pipeline e no supervisor. - Persistencia de decisao do supervisor entra como evento de run, nao como nova tabela. diff --git a/features/F09-supervisor-mvp/SPEC.md b/features/F09-supervisor-mvp/SPEC.md index 3d072b0..aab615b 100644 --- a/features/F09-supervisor-mvp/SPEC.md +++ b/features/F09-supervisor-mvp/SPEC.md @@ -1,7 +1,7 @@ --- id: F09-supervisor-mvp type: feature -summary: Adicionar um supervisor deterministico ao runtime linear para suportar retry, reroute simples e rework de review no AIgnt-Synapse-Flow. +summary: Adicionar um supervisor deterministico ao runtime linear para suportar retry, reroute simples e rework de review no Synapse-Flow. inputs: - CONTEXT.md - docs/architecture/SDD.md @@ -13,7 +13,7 @@ outputs: - extended_pipeline_steps - supervisor_tests constraints: - - manter o AIgnt-Synapse-Flow como engine propria de pipeline do AIgnt OS + - manter o Synapse-Flow como engine propria de pipeline do SynapseOS - manter a pipeline linear e state-driven no MVP - nao introduzir heuristica aberta, memoria semantica decisoria ou multiplos workers - nao gerar RUN_REPORT.md nesta feature @@ -39,7 +39,7 @@ dependencies: # Contexto -A F08 conectou persistencia operacional e runtime dual, permitindo que o worker leve consuma runs pendentes do AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS. O gap restante do MVP nao esta mais na fila simples nem no lock local. O gap esta no comportamento da pipeline quando um step falha, quando uma revisao pede retrabalho e quando existe mais de um executor possivel para o mesmo step. +A F08 conectou persistencia operacional e runtime dual, permitindo que o worker leve consuma runs pendentes do Synapse-Flow, a engine propria de pipeline do SynapseOS. O gap restante do MVP nao esta mais na fila simples nem no lock local. O gap esta no comportamento da pipeline quando um step falha, quando uma revisao pede retrabalho e quando existe mais de um executor possivel para o mesmo step. O repositório ja documenta esse recorte no `TDD.md` e nos testes de rework/failure recovery, mas a implementacao atual ainda para em `TEST_RED` e trata falha como terminal imediata. A F09 fecha esse degrau com um supervisor pequeno, deterministico e explicitamente limitado ao MVP. diff --git a/features/F10-run-report-one-real-adapter/NOTES.md b/features/F10-run-report-one-real-adapter/NOTES.md index 00cb470..7af270f 100644 --- a/features/F10-run-report-one-real-adapter/NOTES.md +++ b/features/F10-run-report-one-real-adapter/NOTES.md @@ -1,6 +1,6 @@ # F10 Notes -- A F10 fecha o MVP do AIgnt-Synapse-Flow com `DOCUMENT`, `RUN_REPORT.md` e um unico adapter real. +- A F10 fecha o MVP do Synapse-Flow com `DOCUMENT`, `RUN_REPORT.md` e um unico adapter real. - O `CodexCLIAdapter` e o alvo escolhido porque o repositório ja possui launcher container-first versionado em `./scripts/dev-codex.sh`. - `DOCUMENT` permanece um passo local e deterministico; o relatorio final nao depende de outra chamada agentica. - Metadados de step entram apenas no nivel minimo necessario para auditoria local: ferramenta, return code, duracao e timeout. diff --git a/features/F10-run-report-one-real-adapter/SPEC.md b/features/F10-run-report-one-real-adapter/SPEC.md index 87a3e48..adab9d4 100644 --- a/features/F10-run-report-one-real-adapter/SPEC.md +++ b/features/F10-run-report-one-real-adapter/SPEC.md @@ -1,7 +1,7 @@ --- id: F10-run-report-one-real-adapter type: feature -summary: Fechar o MVP com geracao de RUN_REPORT.md e integracao minima do Codex CLI como primeiro adapter real do AIgnt-Synapse-Flow. +summary: Fechar o MVP com geracao de RUN_REPORT.md e integracao minima do Codex CLI como primeiro adapter real do Synapse-Flow. inputs: - CONTEXT.md - docs/architecture/SDD.md @@ -14,7 +14,7 @@ outputs: - pipeline_document_step - report_and_adapter_tests constraints: - - manter o AIgnt-Synapse-Flow como engine propria de pipeline do AIgnt OS + - manter o Synapse-Flow como engine propria de pipeline do SynapseOS - manter o recorte em um unico adapter real - reutilizar o fluxo container-first ja existente via ./scripts/dev-codex.sh - nao introduzir novos adapters reais, scheduler complexo ou CLI publica adicional nesta feature @@ -38,7 +38,7 @@ dependencies: # Contexto -Depois da F09, o AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS, ja consegue executar a run linear ate `SECURITY` com retry e rework deterministico. O gap restante do MVP esta no fechamento auditavel da run e na prova de que o runtime realmente consegue integrar pelo menos uma ferramenta externa de forma controlada. +Depois da F09, o Synapse-Flow, a engine propria de pipeline do SynapseOS, ja consegue executar a run linear ate `SECURITY` com retry e rework deterministico. O gap restante do MVP esta no fechamento auditavel da run e na prova de que o runtime realmente consegue integrar pelo menos uma ferramenta externa de forma controlada. O repositório ja tem a fixture de `RUN_REPORT.md`, o launcher container-first `./scripts/dev-codex.sh` e a base abstrata para adapters CLI. Falta conectar essas peças ao fluxo persistido, expandir a pipeline ate `DOCUMENT` e materializar um caminho minimo de ponta a ponta com um adapter real. diff --git a/features/F11-repo-automation/SPEC.md b/features/F11-repo-automation/SPEC.md index c5ed44f..7b57b5f 100644 --- a/features/F11-repo-automation/SPEC.md +++ b/features/F11-repo-automation/SPEC.md @@ -1,7 +1,7 @@ --- id: F11-repo-automation type: feature -summary: Implementar a infraestrutura operacional de containerização e automação do repositório para subir o AIgnt OS em Docker e validar fluxo de branch/commit. +summary: Implementar a infraestrutura operacional de containerização e automação do repositório para subir o SynapseOS em Docker e validar fluxo de branch/commit. workspace: . inputs: - repository_structure @@ -43,7 +43,7 @@ security_notes: # Contexto -O AIgnt OS já possui bootstrap mínimo em Python, mas ainda não possui camada operacional pronta para containerização, build repetível, rebuild baseado em mudanças relevantes e validações de branch/commit compatíveis com um fluxo seguro de repositório. +O SynapseOS já possui bootstrap mínimo em Python, mas ainda não possui camada operacional pronta para containerização, build repetível, rebuild baseado em mudanças relevantes e validações de branch/commit compatíveis com um fluxo seguro de repositório. # Objetivo @@ -77,7 +77,7 @@ Fica explicitamente fora desta feature: ## 5. Regras Funcionais -1. O container deve executar a CLI `aignt` sem depender de componentes ainda não implementados. +1. O container deve executar a CLI `synapse` sem depender de componentes ainda não implementados. 2. O build local deve ser acionável por script auditável. 3. O rebuild deve considerar mudanças em arquivos relevantes para imagem e runtime operacional. 4. A validação contra `main` deve ser explícita e configurável. @@ -96,7 +96,7 @@ Fica explicitamente fora desta feature: ### AC1. Container - Existe `Dockerfile` compatível com Python 3.12. -- A imagem instala o projeto e expõe `aignt --help` como comando padrão verificável. +- A imagem instala o projeto e expõe `synapse --help` como comando padrão verificável. ### AC2. Build/Rebuild - Existe script de build explícito. diff --git a/features/F12-codex-adapter-operational-hardening/NOTES.md b/features/F12-codex-adapter-operational-hardening/NOTES.md index d6d5d7f..d29cd12 100644 --- a/features/F12-codex-adapter-operational-hardening/NOTES.md +++ b/features/F12-codex-adapter-operational-hardening/NOTES.md @@ -1,7 +1,7 @@ # F12 Notes - A F12 e um follow-up pequeno da F10, restrito ao hardening operacional do `CodexCLIAdapter`. -- O foco nao e expandir o produto, e sim tornar explicito o smoke real minimo do primeiro adapter real do AIgnt-Synapse-Flow. +- O foco nao e expandir o produto, e sim tornar explicito o smoke real minimo do primeiro adapter real do Synapse-Flow. - `DOCKER_PREFLIGHT` deve voltar ao centro desta frente porque a validacao pratica depende do launcher container-first. - Se o problema encontrado for de ambiente e nao de codigo, o fluxo deve parar e encaminhar para `debug-failure` ou `repo-automation`. - O hardening foi mantido isolado no adapter: `CLIExecutionResult` continua sendo o contrato de execucao, enquanto a classificacao operacional do Codex fica em `CodexExecutionAssessment`. diff --git a/features/F12-codex-adapter-operational-hardening/SPEC.md b/features/F12-codex-adapter-operational-hardening/SPEC.md index 1af4707..66df352 100644 --- a/features/F12-codex-adapter-operational-hardening/SPEC.md +++ b/features/F12-codex-adapter-operational-hardening/SPEC.md @@ -14,7 +14,7 @@ outputs: - codex_operational_validation - codex_hardening_tests constraints: - - manter o AIgnt-Synapse-Flow como engine propria de pipeline do AIgnt OS + - manter o Synapse-Flow como engine propria de pipeline do SynapseOS - manter o fluxo container-first via ./scripts/dev-codex.sh - nao adicionar nova CLI publica nem segundo adapter real - nao reabrir escopo de runtime distribuido, DAG ou multiplos workers @@ -41,7 +41,7 @@ dependencies: # Contexto -Com a F10 mergeada, o AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS, ja fecha o MVP com `DOCUMENT`, `RUN_REPORT.md` e o primeiro adapter real (`CodexCLIAdapter`). O gap remanescente nao esta mais no contrato do adapter nem na persistencia do relatorio, e sim na validacao operacional do caminho real do Codex via launcher container-first. +Com a F10 mergeada, o Synapse-Flow, a engine propria de pipeline do SynapseOS, ja fecha o MVP com `DOCUMENT`, `RUN_REPORT.md` e o primeiro adapter real (`CodexCLIAdapter`). O gap remanescente nao esta mais no contrato do adapter nem na persistencia do relatorio, e sim na validacao operacional do caminho real do Codex via launcher container-first. Hoje o repositório cobre a montagem do comando e o contrato do adapter majoritariamente com mocks e smoke parcial de launcher. Ainda falta um recorte pequeno e explícito que diga qual e o smoke real minimo do `CodexCLIAdapter`, como falhas operacionais devem aparecer e quando esse caminho precisa passar por `DOCKER_PREFLIGHT`. diff --git a/features/F13-rich-cli-output/NOTES.md b/features/F13-rich-cli-output/NOTES.md index 8375edf..916a31e 100644 --- a/features/F13-rich-cli-output/NOTES.md +++ b/features/F13-rich-cli-output/NOTES.md @@ -1,6 +1,6 @@ # F13 Notes -- A F13 e a primeira adocao de Rich em `src/`, mas o recorte fica intencionalmente restrito a `aignt runtime status`. +- A F13 e a primeira adocao de Rich em `src/`, mas o recorte fica intencionalmente restrito a `synapse runtime status`. - O foco e melhorar a legibilidade operacional da CLI sem alterar o lifecycle do runtime nem abrir uma TUI. - A saida deve continuar legivel em captura de teste e em ambiente sem TTY; cor e estilo sao bonus, nao dependencia funcional. - O comando `runtime status` pode expor o PID quando houver runtime ativo, porque esse dado ja existe no estado persistido e aumenta utilidade operacional. diff --git a/features/F13-rich-cli-output/SPEC.md b/features/F13-rich-cli-output/SPEC.md index 2befda1..5bc4b2f 100644 --- a/features/F13-rich-cli-output/SPEC.md +++ b/features/F13-rich-cli-output/SPEC.md @@ -1,7 +1,7 @@ --- id: F13-rich-cli-output type: feature -summary: Enriquecer a saida do comando `aignt runtime status` com Rich, mantendo o recorte pequeno e sem abrir uma TUI. +summary: Enriquecer a saida do comando `synapse runtime status` com Rich, mantendo o recorte pequeno e sem abrir uma TUI. inputs: - CONTEXT.md - docs/architecture/SDD.md @@ -9,25 +9,25 @@ inputs: - docs/architecture/SPEC_FORMAT.md - memory.md - PENDING_LOG.md - - src/aignt_os/cli/app.py + - src/synapse_os/cli/app.py outputs: - rich_runtime_status_output - cli_rendering_helper - runtime_status_tests constraints: - - manter o AIgnt-Synapse-Flow como engine propria de pipeline do AIgnt OS - - manter o recorte limitado ao comando `aignt runtime status` + - manter o Synapse-Flow como engine propria de pipeline do SynapseOS + - manter o recorte limitado ao comando `synapse runtime status` - nao introduzir Textual, watch mode ou nova TUI - nao alterar o comportamento operacional do runtime nem o contrato de erro - nao exigir DOCKER_PREFLIGHT, pois a frente nao depende de validacao pratica em Docker acceptance_criteria: - - "`aignt runtime status` usa Rich para apresentar o estado do runtime em formato mais legivel do que a linha crua atual." + - "`synapse runtime status` usa Rich para apresentar o estado do runtime em formato mais legivel do que a linha crua atual." - "Existe pelo menos um teste de integracao cobrindo a saida enriquecida do comando para runtime em execucao." - "Existe pelo menos um teste cobrindo o caso inconsistente sem perder a saida em `stderr` nem o exit code de falha." - "A saida enriquecida continua utilizavel em ambiente sem TTY e em captura de testes." - "A frente nao amplia a CLI publica nem adiciona dependencia nova." non_goals: - - criar `aignt tui` + - criar `synapse tui` - enriquecer todos os comandos da CLI na mesma feature - mudar o lifecycle do runtime - adicionar observabilidade nova ou watch mode @@ -41,13 +41,13 @@ dependencies: # Contexto -O MVP inicial ja entrega runtime persistente minimo, worker leve e o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS. Porem, a CLI ainda apresenta `aignt runtime status` com `typer.echo()` em formato cru, suficiente para maquina mas pouco legivel para uso operacional diario. +O MVP inicial ja entrega runtime persistente minimo, worker leve e o Synapse-Flow como a engine propria de pipeline do SynapseOS. Porem, a CLI ainda apresenta `synapse runtime status` com `typer.echo()` em formato cru, suficiente para maquina mas pouco legivel para uso operacional diario. Rich ja faz parte da stack de producao do projeto e ainda nao foi usado no codigo de `src/`. Isso abre uma frente pequena e de baixo risco para melhorar UX de terminal sem alterar arquitetura, sem dependencias novas e sem abrir uma TUI completa. # Objetivo -Entregar a primeira saida CLI enriquecida com Rich no projeto, restrita ao comando `aignt runtime status`, preservando a semantica atual de sucesso e falha e garantindo boa degradacao fora de TTY. +Entregar a primeira saida CLI enriquecida com Rich no projeto, restrita ao comando `synapse runtime status`, preservando a semantica atual de sucesso e falha e garantindo boa degradacao fora de TTY. # Escopo @@ -67,7 +67,7 @@ Entregar a primeira saida CLI enriquecida com Rich no projeto, restrita ao coman # Requisitos funcionais -1. O comando `aignt runtime status` deve continuar refletindo o estado real do runtime. +1. O comando `synapse runtime status` deve continuar refletindo o estado real do runtime. 2. Quando o runtime estiver em execucao, a saida deve exibir o status de forma enriquecida e incluir o PID persistido. 3. Quando o runtime estiver inconsistente, a saida enriquecida deve continuar indo para `stderr` e o comando deve continuar encerrando com codigo de falha. 4. O comando nao deve depender de TTY para produzir saida legivel. @@ -89,14 +89,14 @@ Entregar a primeira saida CLI enriquecida com Rich no projeto, restrita ao coman ## Cenario 1: runtime em execucao - Dado um runtime ativo -- Quando `aignt runtime status` for executado +- Quando `synapse runtime status` for executado - Entao a CLI exibe uma saida enriquecida com Rich - E a saida inclui pelo menos o status e o PID ## Cenario 2: runtime inconsistente - Dado um estado persistido inconsistente -- Quando `aignt runtime status` for executado +- Quando `synapse runtime status` for executado - Entao a saida enriquecida e emitida em `stderr` - E o comando falha com exit code diferente de zero diff --git a/features/F14-runs-observability-cli/CHECKLIST.md b/features/F14-runs-observability-cli/CHECKLIST.md index 6c28406..ba7b82e 100644 --- a/features/F14-runs-observability-cli/CHECKLIST.md +++ b/features/F14-runs-observability-cli/CHECKLIST.md @@ -1,7 +1,7 @@ # F14 Checklist - [x] SPEC da F14 criada e validavel -- [x] REDs cobrindo `aignt runs list` e `aignt runs show ` +- [x] REDs cobrindo `synapse runs list` e `synapse runs show ` - [x] Rendering Rich minima implementada para listagem e detalhe - [x] Testes da F14 verdes - [x] Revisao de seguranca registrada diff --git a/features/F14-runs-observability-cli/NOTES.md b/features/F14-runs-observability-cli/NOTES.md index cfca1f2..732f753 100644 --- a/features/F14-runs-observability-cli/NOTES.md +++ b/features/F14-runs-observability-cli/NOTES.md @@ -1,8 +1,8 @@ # F14 Notes - A F14 fecha a lacuna entre a persistencia ja existente e a CLI publica, sem ampliar o escopo para TUI. -- O foco e tornar consultavel, de forma humana, o que o AIgnt-Synapse-Flow ja persiste como engine propria de pipeline do AIgnt OS. -- O recorte recomendado e pequeno: `aignt runs list` e `aignt runs show `. +- O foco e tornar consultavel, de forma humana, o que o Synapse-Flow ja persiste como engine propria de pipeline do SynapseOS. +- O recorte recomendado e pequeno: `synapse runs list` e `synapse runs show `. - A feature nao deve criar um novo service layer se `RunRepository` e `ArtifactStore` ja resolverem a leitura necessaria. - Para erro de `run_id` ausente, o contrato deve ser operacional e previsivel, sem traceback de ORM vazando para a CLI. - A saida precisa continuar legivel em captura de testes e fora de TTY; estilo visual e bonus, nao dependencia funcional. diff --git a/features/F14-runs-observability-cli/SPEC.md b/features/F14-runs-observability-cli/SPEC.md index eadfbdf..f5ce055 100644 --- a/features/F14-runs-observability-cli/SPEC.md +++ b/features/F14-runs-observability-cli/SPEC.md @@ -9,26 +9,26 @@ inputs: - docs/architecture/SPEC_FORMAT.md - memory.md - PENDING_LOG.md - - src/aignt_os/cli/app.py - - src/aignt_os/persistence.py + - src/synapse_os/cli/app.py + - src/synapse_os/persistence.py outputs: - runs_cli_commands - rich_runs_rendering - runs_cli_tests constraints: - - manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS + - manter o Synapse-Flow como a engine propria de pipeline do SynapseOS - manter o recorte limitado a inspecao de runs persistidas ja existentes - nao introduzir TUI, Textual, watch mode ou polling continuo - reutilizar apenas `RunRepository` e `ArtifactStore` ja existentes - nao exigir DOCKER_PREFLIGHT, pois a frente nao depende de validacao pratica em Docker acceptance_criteria: - - "`aignt runs list` lista runs persistidas usando a CLI publica e apresenta pelo menos `run_id`, `status` e `current_state`." - - "`aignt runs show ` apresenta metadados da run, steps persistidos, eventos persistidos e paths de artefatos quando existirem." - - "Existe pelo menos um teste de integracao cobrindo `aignt runs list` e pelo menos um teste de integracao cobrindo `aignt runs show ` contra dados persistidos reais." + - "`synapse runs list` lista runs persistidas usando a CLI publica e apresenta pelo menos `run_id`, `status` e `current_state`." + - "`synapse runs show ` apresenta metadados da run, steps persistidos, eventos persistidos e paths de artefatos quando existirem." + - "Existe pelo menos um teste de integracao cobrindo `synapse runs list` e pelo menos um teste de integracao cobrindo `synapse runs show ` contra dados persistidos reais." - "Quando o `run_id` nao existir, a CLI retorna falha previsivel sem traceback cru." - "A saida enriquecida continua utilizavel em ambiente sem TTY e em captura de testes." non_goals: - - criar `aignt tui` + - criar `synapse tui` - adicionar watch mode - disparar novas runs pela mesma feature - alterar pipeline, worker ou modelo de persistencia @@ -43,7 +43,7 @@ dependencies: # Contexto -O projeto ja persiste runs, steps, eventos e artefatos locais, e o AIgnt-Synapse-Flow continua como a engine propria de pipeline do AIgnt OS. Porem, a CLI publica ainda expõe apenas comandos de lifecycle do runtime, deixando a observabilidade operacional dependente de leitura manual do banco SQLite e do filesystem. +O projeto ja persiste runs, steps, eventos e artefatos locais, e o Synapse-Flow continua como a engine propria de pipeline do SynapseOS. Porem, a CLI publica ainda expõe apenas comandos de lifecycle do runtime, deixando a observabilidade operacional dependente de leitura manual do banco SQLite e do filesystem. A proxima janela logica apos a F13 e preencher essa lacuna de observabilidade com baixo risco: primeiro tornar os dados persistidos consultaveis via CLI, e so depois reavaliar uma TUI futura. @@ -55,9 +55,9 @@ Entregar uma frente pequena e CLI-first para inspecionar runs persistidas, com f ## Incluido -- novo grupo publico `aignt runs` -- comando `aignt runs list` -- comando `aignt runs show ` +- novo grupo publico `synapse runs` +- comando `synapse runs list` +- comando `synapse runs show ` - rendering Rich para listagem e detalhe de run - testes de integracao contra persistencia real - teste unitario do rendering detalhado em ambiente sem TTY @@ -71,14 +71,14 @@ Entregar uma frente pequena e CLI-first para inspecionar runs persistidas, com f # Requisitos funcionais -1. O comando `aignt runs list` deve consultar o repositório configurado e listar as runs persistidas. -2. O comando `aignt runs show ` deve consultar uma run especifica e exibir: +1. O comando `synapse runs list` deve consultar o repositório configurado e listar as runs persistidas. +2. O comando `synapse runs show ` deve consultar uma run especifica e exibir: - metadados principais da run - steps persistidos - eventos persistidos - paths de artefatos persistidos, quando existirem -3. Quando nao houver runs, `aignt runs list` deve responder de forma legivel e previsivel. -4. Quando o `run_id` nao existir, `aignt runs show ` deve falhar com mensagem operacional clara. +3. Quando nao houver runs, `synapse runs list` deve responder de forma legivel e previsivel. +4. Quando o `run_id` nao existir, `synapse runs show ` deve falhar com mensagem operacional clara. # Requisitos nao funcionais @@ -98,13 +98,13 @@ Entregar uma frente pequena e CLI-first para inspecionar runs persistidas, com f ## Cenario 1: listagem de runs persistidas - Dado um repositório com runs persistidas -- Quando `aignt runs list` for executado +- Quando `synapse runs list` for executado - Entao a CLI exibe pelo menos `run_id`, `status` e `current_state` ## Cenario 2: detalhe de run persistida - Dado uma run persistida com steps, eventos e artefatos -- Quando `aignt runs show ` for executado +- Quando `synapse runs show ` for executado - Entao a CLI exibe os metadados da run - E exibe os steps persistidos - E exibe os eventos persistidos @@ -113,7 +113,7 @@ Entregar uma frente pequena e CLI-first para inspecionar runs persistidas, com f ## Cenario 3: run ausente - Dado um `run_id` inexistente -- Quando `aignt runs show ` for executado +- Quando `synapse runs show ` for executado - Entao a CLI falha sem traceback cru - E informa que a run nao foi encontrada diff --git a/features/F15-public-run-submission/CHECKLIST.md b/features/F15-public-run-submission/CHECKLIST.md index 55866b5..03fdb0a 100644 --- a/features/F15-public-run-submission/CHECKLIST.md +++ b/features/F15-public-run-submission/CHECKLIST.md @@ -1,8 +1,8 @@ # F15 Checklist - [x] SPEC da F15 criada e validavel -- [x] REDs cobrindo `aignt runs submit` em `sync`, `async`/`auto` e erro previsivel +- [x] REDs cobrindo `synapse runs submit` em `sync`, `async`/`auto` e erro previsivel - [x] `RunDispatchService` endurecido para validar SPEC antes do dispatch -- [x] Comando publico `aignt runs submit ` implementado +- [x] Comando publico `synapse runs submit ` implementado - [x] Testes da F15 verdes - [x] Revisao de seguranca registrada diff --git a/features/F15-public-run-submission/SPEC.md b/features/F15-public-run-submission/SPEC.md index ed43857..ca6df26 100644 --- a/features/F15-public-run-submission/SPEC.md +++ b/features/F15-public-run-submission/SPEC.md @@ -9,21 +9,21 @@ inputs: - docs/architecture/SPEC_FORMAT.md - memory.md - PENDING_LOG.md - - src/aignt_os/cli/app.py - - src/aignt_os/runtime/dispatch.py - - src/aignt_os/persistence.py + - src/synapse_os/cli/app.py + - src/synapse_os/runtime/dispatch.py + - src/synapse_os/persistence.py outputs: - runs_submit_cli_command - dispatch_validation_guardrails - runs_submit_tests constraints: - - manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS + - manter o Synapse-Flow como a engine propria de pipeline do SynapseOS - manter a entrada publica restrita a um caminho de SPEC explicitamente informado - reutilizar `RunDispatchService`, `PersistedPipelineRunner`, `RunRepository` e `RuntimeService` ja existentes - nao introduzir nova service layer, nova fila ou mudanca em schema SQLite - nao exigir TUI, watch mode, preview de artifacts ou novo modelo global de erros fora do minimo desta frente acceptance_criteria: - - "`aignt runs submit ` submete uma SPEC valida pela CLI publica e sempre retorna pelo menos `run_id`, `status` e `mode`." + - "`synapse runs submit ` submete uma SPEC valida pela CLI publica e sempre retorna pelo menos `run_id`, `status` e `mode`." - "Quando `--mode sync` for usado, a run e concluida inline e o resultado reporta `status=completed` e `mode=sync`." - "Quando `--mode async` for usado, a run e enfileirada como pendente e o resultado reporta `status=queued` e `mode=async`." - "Quando `--mode auto` for usado, a CLI resolve para `async` se o runtime estiver pronto e para `sync` caso contrario." @@ -45,19 +45,19 @@ dependencies: # Contexto -O projeto ja possui runtime dual, persistencia de runs e um `RunDispatchService` interno capaz de resolver dispatch `sync` ou `async`, mantendo o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS. Porem, essa capacidade ainda nao esta exposta na CLI publica: hoje a superficie publica permite inspecionar runs, mas nao criar uma nova run a partir de uma SPEC. +O projeto ja possui runtime dual, persistencia de runs e um `RunDispatchService` interno capaz de resolver dispatch `sync` ou `async`, mantendo o Synapse-Flow como a engine propria de pipeline do SynapseOS. Porem, essa capacidade ainda nao esta exposta na CLI publica: hoje a superficie publica permite inspecionar runs, mas nao criar uma nova run a partir de uma SPEC. A etapa 2 foi priorizada exatamente para fechar essa lacuna. A F15 deve abrir o caminho publico minimo de execucao sem criar nova engine ou novo modelo operacional. # Objetivo -Entregar um comando publico `aignt runs submit ` que valide a SPEC informada, resolva o modo de dispatch (`sync`, `async` ou `auto`) e retorne um contrato textual minimo, util para humanos e para captura em testes. +Entregar um comando publico `synapse runs submit ` que valide a SPEC informada, resolva o modo de dispatch (`sync`, `async` ou `auto`) e retorne um contrato textual minimo, util para humanos e para captura em testes. # Escopo ## Incluido -- comando publico `aignt runs submit ` +- comando publico `synapse runs submit ` - flags `--mode auto|sync|async` e `--stop-at ` com defaults operacionais seguros - validacao previa de existencia e formato minimo da SPEC - reutilizacao do `RunDispatchService` interno @@ -73,7 +73,7 @@ Entregar um comando publico `aignt runs submit ` que valide a SPEC in # Requisitos funcionais -1. O comando `aignt runs submit ` deve aceitar um path de SPEC e rejeitar caminhos ausentes. +1. O comando `synapse runs submit ` deve aceitar um path de SPEC e rejeitar caminhos ausentes. 2. Antes de despachar a run, a SPEC deve passar por validacao minima de formato. 3. O comando deve aceitar `--mode auto|sync|async`. 4. O comando deve aceitar `--stop-at ` para limitar a execucao ao estado suportado informado. @@ -106,21 +106,21 @@ Entregar um comando publico `aignt runs submit ` que valide a SPEC in ## Cenario 1: submit sincrono - Dado uma SPEC valida -- Quando `aignt runs submit --mode sync --stop-at SPEC_VALIDATION` for executado +- Quando `synapse runs submit --mode sync --stop-at SPEC_VALIDATION` for executado - Entao a CLI retorna `run_id`, `status=completed` e `mode=sync` - E a run fica persistida com estado final coerente ## Cenario 2: submit assincrono - Dado uma SPEC valida -- Quando `aignt runs submit --mode async --stop-at SPEC_VALIDATION` for executado +- Quando `synapse runs submit --mode async --stop-at SPEC_VALIDATION` for executado - Entao a CLI retorna `run_id`, `status=queued` e `mode=async` - E a run fica persistida como pendente ## Cenario 3: modo auto - Dado uma SPEC valida -- Quando `aignt runs submit --mode auto` for executado com runtime pronto +- Quando `synapse runs submit --mode auto` for executado com runtime pronto - Entao a CLI resolve o dispatch para `async` - E quando o runtime nao estiver pronto @@ -129,7 +129,7 @@ Entregar um comando publico `aignt runs submit ` que valide a SPEC in ## Cenario 4: erro de input - Dado um path inexistente ou uma SPEC invalida -- Quando `aignt runs submit ` for executado +- Quando `synapse runs submit ` for executado - Entao a CLI falha sem traceback cru - E nenhuma run invalida e persistida diff --git a/features/F16-run-detail-expansion/NOTES.md b/features/F16-run-detail-expansion/NOTES.md index 09d9f56..d6eecfb 100644 --- a/features/F16-run-detail-expansion/NOTES.md +++ b/features/F16-run-detail-expansion/NOTES.md @@ -1,6 +1,6 @@ # F16 Notes -- A F16 aprofunda apenas `aignt runs show `; nao abre novo comando nem preview de conteudo. +- A F16 aprofunda apenas `synapse runs show `; nao abre novo comando nem preview de conteudo. - O foco e reduzir o tempo ate o proximo passo de diagnostico usando somente dados ja persistidos. - O resumo de diagnostico deve ser derivado de `RunRecord`, `RunStepRecord`, `RunEventRecord` e paths do `ArtifactStore`. - `raw_output_path` e `clean_output_path` devem aparecer apenas como paths, sem leitura de arquivo. diff --git a/features/F16-run-detail-expansion/SPEC.md b/features/F16-run-detail-expansion/SPEC.md index 2ba0f3c..bed5302 100644 --- a/features/F16-run-detail-expansion/SPEC.md +++ b/features/F16-run-detail-expansion/SPEC.md @@ -1,7 +1,7 @@ --- id: F16-run-detail-expansion type: feature -summary: Aprofundar o diagnostico de `aignt runs show ` para orientar o proximo passo operacional sem abrir preview de conteudo nem nova TUI. +summary: Aprofundar o diagnostico de `synapse runs show ` para orientar o proximo passo operacional sem abrir preview de conteudo nem nova TUI. inputs: - CONTEXT.md - docs/architecture/SDD.md @@ -9,23 +9,23 @@ inputs: - docs/architecture/SPEC_FORMAT.md - memory.md - PENDING_LOG.md - - src/aignt_os/cli/app.py - - src/aignt_os/cli/rendering.py - - src/aignt_os/persistence.py + - src/synapse_os/cli/app.py + - src/synapse_os/cli/rendering.py + - src/synapse_os/persistence.py outputs: - expanded_run_detail_rendering - run_detail_tests - feature_notes_and_checklist constraints: - - manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS - - manter a superficie publica restrita ao comando existente `aignt runs show ` + - manter o Synapse-Flow como a engine propria de pipeline do SynapseOS + - manter a superficie publica restrita ao comando existente `synapse runs show ` - nao introduzir nova flag, novo subcomando, TUI, watch mode ou preview de conteudo de artifacts - reutilizar apenas `RunRepository`, `ArtifactStore` e os registros persistidos ja existentes - nao alterar schema SQLite nem layout de artifacts no filesystem - nao exigir DOCKER_PREFLIGHT, pois a frente nao depende de validacao pratica em Docker acceptance_criteria: - - "`aignt runs show ` passa a exibir um resumo de diagnostico com `status`, `current_state`, ultimo evento relevante, timestamp mais recente e orientacao objetiva de proximo passo." - - "Quando houver steps persistidos, `aignt runs show ` exibe paths de `raw_output` e `clean_output` associados ao step, sem ler o conteudo desses arquivos." + - "`synapse runs show ` passa a exibir um resumo de diagnostico com `status`, `current_state`, ultimo evento relevante, timestamp mais recente e orientacao objetiva de proximo passo." + - "Quando houver steps persistidos, `synapse runs show ` exibe paths de `raw_output` e `clean_output` associados ao step, sem ler o conteudo desses arquivos." - "A secao de eventos passa a exibir timestamp persistido para facilitar diagnostico cronologico." - "Existe pelo menos um teste de integracao cobrindo run `completed` e pelo menos um cobrindo run `failed` ou `pending`, verificando o resumo de diagnostico e as novas informacoes operacionais." - "A saida enriquecida continua legivel sem TTY e `run_id` inexistente continua falhando sem traceback cru." @@ -44,13 +44,13 @@ dependencies: # Contexto -A CLI publica ja expõe `aignt runs list`, `aignt runs show ` e `aignt runs submit `, enquanto o AIgnt-Synapse-Flow continua como a engine propria de pipeline do AIgnt OS. Porem, o detalhe atual de `runs show` ainda exige leitura mental excessiva: faltam resumo de diagnostico, cronologia mais clara e indicacao objetiva do proximo ponto de investigacao. +A CLI publica ja expõe `synapse runs list`, `synapse runs show ` e `synapse runs submit `, enquanto o Synapse-Flow continua como a engine propria de pipeline do SynapseOS. Porem, o detalhe atual de `runs show` ainda exige leitura mental excessiva: faltam resumo de diagnostico, cronologia mais clara e indicacao objetiva do proximo ponto de investigacao. A fila oficial da etapa 2 prioriza justamente reduzir esse atrito logo apos a submissao publica. A F16 deve aprofundar a visibilidade de uma run sem abrir nova superficie publica nem antecipar preview de artifacts, que permanece reservado para a F17. # Objetivo -Entregar uma expansao pequena e localizada de `aignt runs show ` para que um operador consiga identificar rapidamente onde a run esta, qual foi o ultimo sinal persistido e qual e o proximo passo operacional mais util. +Entregar uma expansao pequena e localizada de `synapse runs show ` para que um operador consiga identificar rapidamente onde a run esta, qual foi o ultimo sinal persistido e qual e o proximo passo operacional mais util. # Escopo @@ -67,12 +67,12 @@ Entregar uma expansao pequena e localizada de `aignt runs show ` para qu - preview de conteudo de artifact - filtros, watch mode ou streaming -- nova flag ou novo subcomando em `aignt runs` +- nova flag ou novo subcomando em `synapse runs` - mudanca em schema SQLite, `RunRepository` ou `ArtifactStore` # Requisitos funcionais -1. `aignt runs show ` deve apresentar um resumo de diagnostico no topo da saida. +1. `synapse runs show ` deve apresentar um resumo de diagnostico no topo da saida. 2. O resumo deve incluir pelo menos: - `status` - `current_state` @@ -103,7 +103,7 @@ Entregar uma expansao pequena e localizada de `aignt runs show ` para qu ## Cenario 1: run concluida com sinais persistidos - Dado uma run concluida com steps, eventos e artifacts -- Quando `aignt runs show ` for executado +- Quando `synapse runs show ` for executado - Entao a CLI exibe um resumo de diagnostico - E exibe o ultimo evento persistido - E exibe paths de `raw_output` e `clean_output` @@ -112,7 +112,7 @@ Entregar uma expansao pequena e localizada de `aignt runs show ` para qu ## Cenario 2: run falha ou pendente - Dado uma run falha ou pendente com persistencia parcial -- Quando `aignt runs show ` for executado +- Quando `synapse runs show ` for executado - Entao a CLI informa o estado atual - E informa o proximo passo operacional recomendado - E continua legivel mesmo sem todos os dados opcionais @@ -120,7 +120,7 @@ Entregar uma expansao pequena e localizada de `aignt runs show ` para qu ## Cenario 3: run ausente - Dado um `run_id` inexistente -- Quando `aignt runs show ` for executado +- Quando `synapse runs show ` for executado - Entao a CLI falha sem traceback cru - E informa que a run nao foi encontrada diff --git a/features/F17-artifact-preview/CHECKLIST.md b/features/F17-artifact-preview/CHECKLIST.md index 69f699f..a3cdd78 100644 --- a/features/F17-artifact-preview/CHECKLIST.md +++ b/features/F17-artifact-preview/CHECKLIST.md @@ -1,7 +1,7 @@ # F17 Checklist - [x] SPEC da F17 criada e validavel -- [x] Superficie publica mantida em `aignt runs show ` com um unico seletor `--preview` +- [x] Superficie publica mantida em `synapse runs show ` com um unico seletor `--preview` - [x] Targets suportados restritos a `report` e `.clean` - [x] Preview truncado apos no maximo 40 linhas, sem dump irrestrito - [x] REDs cobrindo rendering sem TTY, preview de report, preview de clean output, target invalido e artifact ausente diff --git a/features/F17-artifact-preview/NOTES.md b/features/F17-artifact-preview/NOTES.md index 9280e3c..4c8a5db 100644 --- a/features/F17-artifact-preview/NOTES.md +++ b/features/F17-artifact-preview/NOTES.md @@ -1,8 +1,8 @@ # F17 Notes -- A F17 mantem a superficie publica concentrada em `aignt runs show ` e adiciona apenas um seletor opcional: `--preview `. +- A F17 mantem a superficie publica concentrada em `synapse runs show ` e adiciona apenas um seletor opcional: `--preview `. - O contrato inicial de preview fica deliberadamente restrito a `report` e `.clean`; `raw_output` continua fora de escopo por seguranca e ruido operacional. - O preview deve mostrar apenas o inicio do conteudo, com truncamento explicito apos no maximo 40 linhas, para evitar dump irrestrito de artifacts grandes. -- O preview e renderizado como painel adicional dentro de `aignt runs show `, preservando o detalhe atual da run quando `--preview` nao e informado. +- O preview e renderizado como painel adicional dentro de `synapse runs show `, preservando o detalhe atual da run quando `--preview` nao e informado. - O path exibido no preview fica relativo ao diretório de artifacts persistidos da propria run, evitando leitura arbitraria fora da arvore controlada pelo `ArtifactStore`. - Se a leitura controlada de `clean_output` revelar necessidade real de mascaramento adicional de segredos, isso deve virar endurecimento explicito ou follow-up proprio, nao expansao silenciosa da F17. diff --git a/features/F17-artifact-preview/REPORT.md b/features/F17-artifact-preview/REPORT.md index a8be4ad..d6548f8 100644 --- a/features/F17-artifact-preview/REPORT.md +++ b/features/F17-artifact-preview/REPORT.md @@ -2,23 +2,23 @@ ## Resumo executivo -- A F17 adiciona preview textual controlado de artifacts uteis diretamente em `aignt runs show `. +- A F17 adiciona preview textual controlado de artifacts uteis diretamente em `synapse runs show `. - O recorte permaneceu pequeno: `--preview report` para `RUN_REPORT.md` e `--preview .clean` para output limpo persistido por step. - O contrato da F21 foi preservado: target invalido retorna `Usage error:`/`2`, artifact ausente retorna `Not found:`/`3`, sempre sem traceback cru. ## Escopo alterado -- Extensao de `aignt runs show ` com a opcao `--preview`. +- Extensao de `synapse runs show ` com a opcao `--preview`. - Rendering de preview como painel adicional na CLI, sem quebrar o detalhe atual da run. - Leitura controlada de artifacts persistidos da propria run, com truncamento explicito apos no maximo 40 linhas. - Materializacao da feature em `features/F17-artifact-preview/` com `SPEC.md`, `NOTES.md`, `CHECKLIST.md` e este `REPORT.md`. ## Validacoes executadas -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_cli_runs_rendering.py tests/integration/test_runs_cli.py -q` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_cli_runs_rendering.py tests/integration/test_runs_cli.py tests/integration/test_cli_error_model.py tests/integration/test_runs_submit_cli.py -q` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync ruff check src/aignt_os/cli/app.py src/aignt_os/cli/rendering.py tests/unit/test_cli_runs_rendering.py tests/integration/test_runs_cli.py` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m mypy src/aignt_os/cli/app.py src/aignt_os/cli/rendering.py tests/unit/test_cli_runs_rendering.py tests/integration/test_runs_cli.py` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_cli_runs_rendering.py tests/integration/test_runs_cli.py -q` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_cli_runs_rendering.py tests/integration/test_runs_cli.py tests/integration/test_cli_error_model.py tests/integration/test_runs_submit_cli.py -q` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync ruff check src/synapse_os/cli/app.py src/synapse_os/cli/rendering.py tests/unit/test_cli_runs_rendering.py tests/integration/test_runs_cli.py` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m mypy src/synapse_os/cli/app.py src/synapse_os/cli/rendering.py tests/unit/test_cli_runs_rendering.py tests/integration/test_runs_cli.py` - `./scripts/security-gate.sh` ## Security review diff --git a/features/F17-artifact-preview/SPEC.md b/features/F17-artifact-preview/SPEC.md index 181224e..dc3ebc6 100644 --- a/features/F17-artifact-preview/SPEC.md +++ b/features/F17-artifact-preview/SPEC.md @@ -1,7 +1,7 @@ --- id: F17-artifact-preview type: feature -summary: Adicionar preview textual controlado de artifacts uteis em `aignt runs show ` sem abrir leitura arbitraria do host nem dump irrestrito de outputs. +summary: Adicionar preview textual controlado de artifacts uteis em `synapse runs show ` sem abrir leitura arbitraria do host nem dump irrestrito de outputs. inputs: - CONTEXT.md - docs/architecture/SDD.md @@ -10,25 +10,25 @@ inputs: - docs/architecture/PHASE_2_ROADMAP.md - features/F16-run-detail-expansion/SPEC.md - features/F21-cli-error-model-and-exit-codes/SPEC.md - - src/aignt_os/cli/app.py - - src/aignt_os/cli/rendering.py - - src/aignt_os/persistence.py + - src/synapse_os/cli/app.py + - src/synapse_os/cli/rendering.py + - src/synapse_os/persistence.py outputs: - artifact_preview_cli_contract - artifact_preview_tests - feature_notes constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" - - "manter a superficie publica concentrada no comando existente `aignt runs show `" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" + - "manter a superficie publica concentrada no comando existente `synapse runs show `" - "usar um unico seletor opcional de preview: `--preview `" - "limitar os targets suportados a `report` e `.clean`" - "nao permitir leitura arbitraria por path informado pelo usuario" - "nao alterar schema SQLite, layout de artifacts no filesystem, worker ou pipeline" - "nao exigir DOCKER_PREFLIGHT, porque a frente so le sinais persistidos locais" acceptance_criteria: - - "`aignt runs show ` continua exibindo o detalhe atual por padrao e passa a aceitar `--preview ` sem quebrar o caminho existente." - - "`aignt runs show --preview report` exibe um preview textual do `RUN_REPORT.md` persistido para a run, incluindo o path de origem e um trecho truncado quando necessario." - - "`aignt runs show --preview .clean` exibe um preview textual do `clean_output` persistido do step solicitado, sem expor `raw_output`." + - "`synapse runs show ` continua exibindo o detalhe atual por padrao e passa a aceitar `--preview ` sem quebrar o caminho existente." + - "`synapse runs show --preview report` exibe um preview textual do `RUN_REPORT.md` persistido para a run, incluindo o path de origem e um trecho truncado quando necessario." + - "`synapse runs show --preview .clean` exibe um preview textual do `clean_output` persistido do step solicitado, sem expor `raw_output`." - "O preview e limitado ao inicio do arquivo, com truncamento explicito apos no maximo 40 linhas, para evitar dump irrestrito de artifacts grandes." - "Preview alvo invalido retorna `Usage error:` com exit code `2`, e preview solicitado para conteudo inexistente retorna `Not found:` com exit code `3`, sempre sem traceback cru." - "Existe pelo menos um teste de integracao cobrindo preview de report e pelo menos um teste de integracao cobrindo target invalido ou preview ausente via CLI publica." @@ -49,19 +49,19 @@ dependencies: # Contexto -Depois da `F16`, a CLI publica do AIgnt OS ja consegue explicar melhor o estado de uma run e listar onde estao seus outputs e artifacts persistidos, enquanto o AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS. Porem, o operador ainda precisa sair da superficie publica da CLI para abrir manualmente `RUN_REPORT.md` ou um `clean_output` relevante quando quer confirmar o conteudo de um sinal persistido. +Depois da `F16`, a CLI publica do SynapseOS ja consegue explicar melhor o estado de uma run e listar onde estao seus outputs e artifacts persistidos, enquanto o Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS. Porem, o operador ainda precisa sair da superficie publica da CLI para abrir manualmente `RUN_REPORT.md` ou um `clean_output` relevante quando quer confirmar o conteudo de um sinal persistido. -A `F17` existe para reduzir esse atrito sem transformar `aignt runs show` em dump arbitrario de arquivos. O objetivo e oferecer preview controlado dos artifacts mais uteis ao fluxo publico atual, mantendo a leitura restrita a alvos explicitamente suportados e previsiveis. +A `F17` existe para reduzir esse atrito sem transformar `synapse runs show` em dump arbitrario de arquivos. O objetivo e oferecer preview controlado dos artifacts mais uteis ao fluxo publico atual, mantendo a leitura restrita a alvos explicitamente suportados e previsiveis. # Objetivo -Entregar preview textual controlado de report e output limpo por step dentro de `aignt runs show `, preservando o contrato atual da CLI e evitando leitura arbitraria de arquivos ou ampliacao indevida da superficie publica. +Entregar preview textual controlado de report e output limpo por step dentro de `synapse runs show `, preservando o contrato atual da CLI e evitando leitura arbitraria de arquivos ou ampliacao indevida da superficie publica. # Escopo ## Incluido -- extensao pequena de `aignt runs show ` com `--preview ` +- extensao pequena de `synapse runs show ` com `--preview ` - preview de `RUN_REPORT.md` persistido da run - preview de `clean_output` persistido por step - truncamento explicito para manter a leitura curta e segura @@ -78,7 +78,7 @@ Entregar preview textual controlado de report e output limpo por step dentro de # Requisitos funcionais -1. `aignt runs show ` deve manter o comportamento atual quando `--preview` nao for informado. +1. `synapse runs show ` deve manter o comportamento atual quando `--preview` nao for informado. 2. A CLI deve aceitar um unico argumento opcional `--preview `. 3. Os targets validos devem ser: - `report` @@ -118,7 +118,7 @@ Entregar preview textual controlado de report e output limpo por step dentro de ## Cenario 1: preview do report da run - Dado uma run com `RUN_REPORT.md` persistido -- Quando `aignt runs show --preview report` for executado +- Quando `synapse runs show --preview report` for executado - Entao a CLI retorna exit code `0` - E exibe o path do report - E exibe um preview textual truncado quando necessario @@ -126,7 +126,7 @@ Entregar preview textual controlado de report e output limpo por step dentro de ## Cenario 2: preview de output limpo por step - Dado uma run com `clean_output` persistido para um step -- Quando `aignt runs show --preview PLAN.clean` for executado +- Quando `synapse runs show --preview PLAN.clean` for executado - Entao a CLI retorna exit code `0` - E exibe o path de `clean_output` - E nao exibe `raw_output` como conteudo do preview @@ -134,7 +134,7 @@ Entregar preview textual controlado de report e output limpo por step dentro de ## Cenario 3: target invalido ou preview ausente - Dado um target invalido ou um artifact previewable ausente -- Quando `aignt runs show --preview ` for executado +- Quando `synapse runs show --preview ` for executado - Entao a CLI falha com o exit code correto do contrato da F21 - E a mensagem permanece curta e sem traceback cru diff --git a/features/F18-canonical-happy-path/CHECKLIST.md b/features/F18-canonical-happy-path/CHECKLIST.md index a0a5068..39592f5 100644 --- a/features/F18-canonical-happy-path/CHECKLIST.md +++ b/features/F18-canonical-happy-path/CHECKLIST.md @@ -1,9 +1,9 @@ # F18 Checklist - [x] SPEC da F18 criada e validavel -- [x] Comando inicial canonico definido como `aignt runs submit --mode sync --stop-at SPEC_VALIDATION` +- [x] Comando inicial canonico definido como `synapse runs submit --mode sync --stop-at SPEC_VALIDATION` - [x] Estado terminal de sucesso definido explicitamente para o recorte atual -- [x] Auditoria obrigatoria por `aignt runs show ` registrada na SPEC +- [x] Auditoria obrigatoria por `synapse runs show ` registrada na SPEC - [x] Fora de escopo explicito para runtime persistente, doctor, onboarding e variantes pesadas - [x] REDs cobrindo a sequencia canonica `runs submit -> runs show` - [x] Implementacao minima ajustada para orientar `completed @ SPEC_VALIDATION` como happy path canonico diff --git a/features/F18-canonical-happy-path/NOTES.md b/features/F18-canonical-happy-path/NOTES.md index b089ce3..77a266b 100644 --- a/features/F18-canonical-happy-path/NOTES.md +++ b/features/F18-canonical-happy-path/NOTES.md @@ -10,5 +10,5 @@ - Se surgir ambiguidade futura sobre promover estados apos `SPEC_VALIDATION` ao happy path oficial, isso deve virar nova decisao de feature e nao expandir a F18 por inercia. - A implementacao minima da frente ficou restrita ao rendering de `runs show`: runs `completed @ SPEC_VALIDATION` agora exibem orientacao explicita de happy path canonico concluido. - O teste de integracao da F18 extrai o `run_id` diretamente da saida de `runs submit` e reutiliza esse valor em `runs show`, sem consultar SQLite nem filesystem manualmente. -- Validacao local executada com `uv run --no-sync pytest tests/integration/test_runs_submit_cli.py tests/integration/test_runs_cli.py tests/unit/test_cli_runs_rendering.py`, `uv run --no-sync ruff check src/aignt_os/cli/rendering.py tests/integration/test_runs_submit_cli.py tests/unit/test_cli_runs_rendering.py`, `uv run --no-sync python -m mypy src/aignt_os/cli/rendering.py` e `./scripts/security-gate.sh`. +- Validacao local executada com `uv run --no-sync pytest tests/integration/test_runs_submit_cli.py tests/integration/test_runs_cli.py tests/unit/test_cli_runs_rendering.py`, `uv run --no-sync ruff check src/synapse_os/cli/rendering.py tests/integration/test_runs_submit_cli.py tests/unit/test_cli_runs_rendering.py`, `uv run --no-sync python -m mypy src/synapse_os/cli/rendering.py` e `./scripts/security-gate.sh`. - Security review local fechou sem ressalvas: a frente nao adiciona shell, subprocesso, leitura arbitraria de arquivo nem ampliacao de superficie publica. diff --git a/features/F18-canonical-happy-path/REPORT.md b/features/F18-canonical-happy-path/REPORT.md index 90cba3d..f5e7997 100644 --- a/features/F18-canonical-happy-path/REPORT.md +++ b/features/F18-canonical-happy-path/REPORT.md @@ -9,8 +9,8 @@ ## Validacoes executadas - `uv run --no-sync pytest tests/integration/test_runs_submit_cli.py tests/integration/test_runs_cli.py tests/unit/test_cli_runs_rendering.py` -- `uv run --no-sync ruff check src/aignt_os/cli/rendering.py tests/integration/test_runs_submit_cli.py tests/unit/test_cli_runs_rendering.py` -- `uv run --no-sync python -m mypy src/aignt_os/cli/rendering.py` +- `uv run --no-sync ruff check src/synapse_os/cli/rendering.py tests/integration/test_runs_submit_cli.py tests/unit/test_cli_runs_rendering.py` +- `uv run --no-sync python -m mypy src/synapse_os/cli/rendering.py` - `./scripts/security-gate.sh` ## Riscos residuais diff --git a/features/F18-canonical-happy-path/SPEC.md b/features/F18-canonical-happy-path/SPEC.md index a5a2e28..eaca5fa 100644 --- a/features/F18-canonical-happy-path/SPEC.md +++ b/features/F18-canonical-happy-path/SPEC.md @@ -8,8 +8,8 @@ inputs: - docs/architecture/TDD.md - docs/architecture/SPEC_FORMAT.md - docs/architecture/PHASE_2_ROADMAP.md - - src/aignt_os/cli/app.py - - src/aignt_os/cli/rendering.py + - src/synapse_os/cli/app.py + - src/synapse_os/cli/rendering.py - tests/integration/test_runs_submit_cli.py - tests/integration/test_runs_cli.py outputs: @@ -17,15 +17,15 @@ outputs: - canonical_cli_flow_tests - feature_notes_and_checklist constraints: - - manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS + - manter o Synapse-Flow como a engine propria de pipeline do SynapseOS - manter o recorte restrito a um fluxo sincrono, auditavel e reproduzivel pela CLI publica ja existente - - reutilizar apenas `aignt runs submit ` e `aignt runs show ` como superficie publica obrigatoria do caminho canonico + - reutilizar apenas `synapse runs submit ` e `synapse runs show ` como superficie publica obrigatoria do caminho canonico - nao introduzir novo subcomando, nova flag publica, TUI, watch mode, preview de artifact, schema SQLite novo ou runtime paralelo adicional - nao exigir DOCKER_PREFLIGHT nesta frente, porque o recorte default nao depende de Docker, boot completo de runtime nem integracao em container acceptance_criteria: - - "Existe um caminho canonico documentado pela feature em que `aignt runs submit --mode sync --stop-at SPEC_VALIDATION` conclui a run inline e retorna pelo menos `run_id`, `status=completed` e `mode=sync`." + - "Existe um caminho canonico documentado pela feature em que `synapse runs submit --mode sync --stop-at SPEC_VALIDATION` conclui a run inline e retorna pelo menos `run_id`, `status=completed` e `mode=sync`." - "No recorte da F18, o sucesso terminal do happy path e definido explicitamente como `status=completed` com `current_state=SPEC_VALIDATION`, sem exigir execucao publica alem desse ponto." - - "Apos a submissao bem-sucedida, `aignt runs show ` exibe sinais suficientes para auditoria do happy path: `status`, `current_state`, ultimo sinal relevante, `spec_path` e referencias a dados persistidos da run." + - "Apos a submissao bem-sucedida, `synapse runs show ` exibe sinais suficientes para auditoria do happy path: `status`, `current_state`, ultimo sinal relevante, `spec_path` e referencias a dados persistidos da run." - "Existe pelo menos um teste de integracao cobrindo a sequencia canonica completa da CLI publica: submeter uma SPEC valida em `sync`, capturar o `run_id` retornado e inspecionar a mesma run com `runs show`." - "A feature define explicitamente os pre-requisitos minimos da demonstracao e deixa fora de escopo runtime persistente, doctor de ambiente, onboarding publico e qualquer variante assincrona como caminho oficial primario." non_goals: @@ -45,13 +45,13 @@ dependencies: # Contexto -Depois de F15, F16 e F21, a CLI publica do AIgnt OS ja permite submeter uma SPEC valida, concluir uma run sincronamente no menor recorte suportado e inspecionar a run persistida. O AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS, mas ainda falta consolidar qual sequencia de comandos representa o happy path oficial da etapa 2. +Depois de F15, F16 e F21, a CLI publica do SynapseOS ja permite submeter uma SPEC valida, concluir uma run sincronamente no menor recorte suportado e inspecionar a run persistida. O Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS, mas ainda falta consolidar qual sequencia de comandos representa o happy path oficial da etapa 2. A lacuna atual nao e de capacidade tecnica isolada, e sim de contrato operacional: sem uma definicao canonica, a demonstracao publica da ferramenta continua dispersa entre comandos existentes, defaults implicitos e variantes que aumentam custo de validacao sem necessidade. # Objetivo -Definir o menor caminho publico, reproduzivel e auditavel de ponta a ponta para demonstrar sucesso na CLI do AIgnt OS: submeter uma SPEC valida em modo sincrono, obter uma run concluida e inspecionar essa run com `aignt runs show `. +Definir o menor caminho publico, reproduzivel e auditavel de ponta a ponta para demonstrar sucesso na CLI do SynapseOS: submeter uma SPEC valida em modo sincrono, obter uma run concluida e inspecionar essa run com `synapse runs show `. # Escopo @@ -74,14 +74,14 @@ Definir o menor caminho publico, reproduzivel e auditavel de ponta a ponta para # Requisitos funcionais 1. A F18 deve definir como comando inicial canonico: - - `aignt runs submit --mode sync --stop-at SPEC_VALIDATION` + - `synapse runs submit --mode sync --stop-at SPEC_VALIDATION` 2. A feature deve declarar explicitamente que, no recorte atual, o happy path oficial usa `--mode sync` para evitar pre-requisitos externos frageis. 3. O sucesso terminal do caminho canonico deve ser: - `status=completed` - `current_state=SPEC_VALIDATION` 4. A saida de `runs submit` no caminho canonico deve permitir ao operador recuperar o `run_id` sem consultar arquivos internos manualmente. 5. A feature deve definir como passo de auditoria obrigatorio: - - `aignt runs show ` + - `synapse runs show ` 6. A saida de `runs show` usada no happy path deve comprovar pelo menos: - identificacao da run - `status` @@ -111,7 +111,7 @@ Definir o menor caminho publico, reproduzivel e auditavel de ponta a ponta para ## Cenario 1: demonstracao canonica sincrona - Dado uma SPEC valida acessivel por path -- Quando `aignt runs submit --mode sync --stop-at SPEC_VALIDATION` for executado +- Quando `synapse runs submit --mode sync --stop-at SPEC_VALIDATION` for executado - Entao a CLI retorna `run_id` - E retorna `status=completed` - E retorna `mode=sync` @@ -120,7 +120,7 @@ Definir o menor caminho publico, reproduzivel e auditavel de ponta a ponta para ## Cenario 2: auditoria da run concluida - Dado o `run_id` retornado pela submissao canonica -- Quando `aignt runs show ` for executado +- Quando `synapse runs show ` for executado - Entao a CLI exibe o resumo diagnostico da run concluida - E exibe `status=completed` - E exibe `current_state=SPEC_VALIDATION` diff --git a/features/F19-environment-doctor/CHECKLIST.md b/features/F19-environment-doctor/CHECKLIST.md index f660762..0b9beb6 100644 --- a/features/F19-environment-doctor/CHECKLIST.md +++ b/features/F19-environment-doctor/CHECKLIST.md @@ -1,7 +1,7 @@ # F19 Checklist - [x] SPEC da F19 criada e validavel -- [x] Superficie publica fechada em `aignt doctor` +- [x] Superficie publica fechada em `synapse doctor` - [x] Fora de escopo explicito para Docker, credenciais externas, auto-fix e onboarding - [x] REDs cobrindo rendering sem TTY e CLI publica do doctor - [x] Implementacao minima adicionada para `runtime_state`, `runs_db` e `artifacts_dir` diff --git a/features/F19-environment-doctor/NOTES.md b/features/F19-environment-doctor/NOTES.md index d6668d2..5159bab 100644 --- a/features/F19-environment-doctor/NOTES.md +++ b/features/F19-environment-doctor/NOTES.md @@ -1,6 +1,6 @@ # F19 Notes -- A F19 adota `aignt doctor` como superficie publica principal, em vez de `aignt runtime doctor`, porque o recorte e diagnosticar o ambiente do fluxo publico atual e nao apenas o lifecycle do runtime. +- A F19 adota `synapse doctor` como superficie publica principal, em vez de `synapse runtime doctor`, porque o recorte e diagnosticar o ambiente do fluxo publico atual e nao apenas o lifecycle do runtime. - O doctor da F19 continua propositalmente local: sem Docker, sem credenciais externas, sem MCP e sem auto-fix. - Runtime parado continua sendo `warn`, nao `fail`, porque o caminho canonico atual da etapa 2 permanece sincrono e nao exige worker residente para a primeira demonstracao oficial. - Se surgir necessidade real de validar Docker/container como pre-requisito do fluxo minimo, isso deve acionar `repo-preflight` e possivelmente revisar a SPEC da F19, em vez de ampliar esta frente silenciosamente. diff --git a/features/F19-environment-doctor/REPORT.md b/features/F19-environment-doctor/REPORT.md index 5a144b2..a185bff 100644 --- a/features/F19-environment-doctor/REPORT.md +++ b/features/F19-environment-doctor/REPORT.md @@ -2,13 +2,13 @@ ## Resumo executivo -- A F19 adiciona `aignt doctor` como diagnostico local pequeno para o fluxo publico atual da CLI. +- A F19 adiciona `synapse doctor` como diagnostico local pequeno para o fluxo publico atual da CLI. - O recorte permaneceu local e nao mutante: checks para `runtime_state`, `runs_db` e `artifacts_dir`, com status `pass`/`warn`/`fail` e orientacao objetiva. - O handoff documental da etapa 2 tambem foi alinhado ao baseline real para manter a fila oficial coerente antes do PR. ## Escopo alterado -- Implementacao do comando `aignt doctor` e do rendering associado em `src/aignt_os/cli/`. +- Implementacao do comando `synapse doctor` e do rendering associado em `src/synapse_os/cli/`. - Testes unitarios e de integracao para o doctor. - Materializacao da feature em `features/F19-environment-doctor/` com `SPEC.md`, `NOTES.md`, `CHECKLIST.md` e este `REPORT.md`. - Alinhamento de `README.md`, `memory.md`, `PENDING_LOG.md`, `docs/architecture/PHASE_2_ROADMAP.md`, `docs/architecture/WORKTREE_FEATURES.md` e `.github/copilot-instructions.md` ao baseline da etapa 2. @@ -17,8 +17,8 @@ - `uv run --no-sync python -m pytest tests/unit/test_cli_doctor_rendering.py tests/integration/test_doctor_cli.py -q` - `uv run --no-sync python -m pytest tests/unit/test_cli_runs_rendering.py tests/unit/test_cli_rich_output.py tests/integration/test_runs_cli.py tests/integration/test_runtime_cli.py tests/integration/test_cli_error_model.py -q` -- `uv run --no-sync ruff check src/aignt_os/cli/app.py src/aignt_os/cli/rendering.py tests/unit/test_cli_doctor_rendering.py tests/integration/test_doctor_cli.py` -- `uv run --no-sync python -m mypy src/aignt_os/cli/app.py src/aignt_os/cli/rendering.py tests/unit/test_cli_doctor_rendering.py tests/integration/test_doctor_cli.py` +- `uv run --no-sync ruff check src/synapse_os/cli/app.py src/synapse_os/cli/rendering.py tests/unit/test_cli_doctor_rendering.py tests/integration/test_doctor_cli.py` +- `uv run --no-sync python -m mypy src/synapse_os/cli/app.py src/synapse_os/cli/rendering.py tests/unit/test_cli_doctor_rendering.py tests/integration/test_doctor_cli.py` - `./scripts/branch-sync-check.sh` em `feature/f19-environment-doctor` com `ahead=0 behind=0` ## Security review diff --git a/features/F19-environment-doctor/SPEC.md b/features/F19-environment-doctor/SPEC.md index f7a319e..c315b3b 100644 --- a/features/F19-environment-doctor/SPEC.md +++ b/features/F19-environment-doctor/SPEC.md @@ -8,26 +8,26 @@ inputs: - docs/architecture/TDD.md - docs/architecture/SPEC_FORMAT.md - docs/architecture/PHASE_2_ROADMAP.md - - src/aignt_os/cli/app.py - - src/aignt_os/config.py - - src/aignt_os/runtime/service.py - - src/aignt_os/persistence.py + - src/synapse_os/cli/app.py + - src/synapse_os/config.py + - src/synapse_os/runtime/service.py + - src/synapse_os/persistence.py outputs: - environment_doctor_cli_contract - doctor_rendering_and_exit_code_tests - feature_notes constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "manter o recorte restrito a diagnostico local e somente leitura logica, sem autocorrecao do ambiente" - - "expor um unico comando publico novo: `aignt doctor`" + - "expor um unico comando publico novo: `synapse doctor`" - "reutilizar `AppSettings`, `RuntimeService`, `RunRepository` e `ArtifactStore` apenas para verificacoes leves do ambiente atual" - "nao exigir DOCKER_PREFLIGHT, porque o recorte default nao depende de Docker, build, boot completo de runtime nem integracao em container" - "nao introduzir TUI, watch mode, shell novo, subprocesso arbitrario nem verificacoes dependentes de credencial externa" acceptance_criteria: - - "`aignt doctor` passa a exibir um resumo legivel do ambiente local com status geral e checks nomeados para `runtime_state`, `runs_db` e `artifacts_dir`." + - "`synapse doctor` passa a exibir um resumo legivel do ambiente local com status geral e checks nomeados para `runtime_state`, `runs_db` e `artifacts_dir`." - "Cada check informa `pass`, `warn` ou `fail` e uma orientacao objetiva de proximo passo, sem traceback cru." - "O doctor detecta pelo menos: estado de runtime inconsistente, parent directory nao gravavel para `runs_db_path` e parent directory nao gravavel para `artifacts_dir`." - - "Quando o ambiente minimo do fluxo publico atual estiver pronto, `aignt doctor` retorna exit code `0`; quando houver falha bloqueante de ambiente, retorna exit code `5` conforme o contrato da F21." + - "Quando o ambiente minimo do fluxo publico atual estiver pronto, `synapse doctor` retorna exit code `0`; quando houver falha bloqueante de ambiente, retorna exit code `5` conforme o contrato da F21." - "Existe pelo menos um teste de integracao cobrindo ambiente saudavel e pelo menos um cobrindo falha bloqueante de ambiente via CLI publica." non_goals: - "autocorrigir permissoes, criar containers ou iniciar/parar o runtime" @@ -45,19 +45,19 @@ dependencies: # Contexto -Depois de `F15`, `F16`, `F21` e `F18`, a CLI publica do AIgnt OS ja expõe um caminho canonico minimo para submeter e inspecionar uma run, enquanto o AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS. O atrito seguinte nao e de fluxo da run em si, mas de diagnostico do ambiente local antes da primeira execucao real por um operador. +Depois de `F15`, `F16`, `F21` e `F18`, a CLI publica do SynapseOS ja expõe um caminho canonico minimo para submeter e inspecionar uma run, enquanto o Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS. O atrito seguinte nao e de fluxo da run em si, mas de diagnostico do ambiente local antes da primeira execucao real por um operador. Hoje, quando o diretório de estado, o banco SQLite ou a area de artifacts estao mal configurados, o operador precisa inferir isso indiretamente por falhas em `runs submit`, `runtime status` ou outros comandos. A `F19` existe para transformar esse diagnostico em um comando publico pequeno, objetivo e testavel. # Objetivo -Entregar um doctor de ambiente enxuto, acessivel por `aignt doctor`, capaz de verificar os pre-requisitos locais minimos do fluxo publico atual e orientar o operador sobre o proximo passo sem alterar o ambiente automaticamente. +Entregar um doctor de ambiente enxuto, acessivel por `synapse doctor`, capaz de verificar os pre-requisitos locais minimos do fluxo publico atual e orientar o operador sobre o proximo passo sem alterar o ambiente automaticamente. # Escopo ## Incluido -- um comando publico novo: `aignt doctor` +- um comando publico novo: `synapse doctor` - resumo geral do ambiente com checks nomeados - verificacao leve de paths configurados para runtime state, SQLite e artifacts - verificacao do estado atual do runtime como `pass`, `warn` ou `fail` @@ -75,7 +75,7 @@ Entregar um doctor de ambiente enxuto, acessivel por `aignt doctor`, capaz de ve # Requisitos funcionais -1. A CLI deve expor `aignt doctor` como comando publico de diagnostico local. +1. A CLI deve expor `synapse doctor` como comando publico de diagnostico local. 2. O comando deve apresentar um resumo com status geral do ambiente. 3. O doctor deve listar checks nomeados, no minimo: - `runtime_state` @@ -120,7 +120,7 @@ Entregar um doctor de ambiente enxuto, acessivel por `aignt doctor`, capaz de ve - Dado um ambiente local com paths configurados acessiveis - E runtime parado de forma coerente -- Quando `aignt doctor` for executado +- Quando `synapse doctor` for executado - Entao a CLI retorna exit code `0` - E exibe status geral `pass` - E exibe checks nomeados para `runtime_state`, `runs_db` e `artifacts_dir` @@ -129,7 +129,7 @@ Entregar um doctor de ambiente enxuto, acessivel por `aignt doctor`, capaz de ve ## Cenario 2: runtime inconsistente - Dado um estado persistido de runtime inconsistente -- Quando `aignt doctor` for executado +- Quando `synapse doctor` for executado - Entao a CLI retorna exit code `5` - E o check `runtime_state` aparece como `fail` - E a saida continua sem traceback cru @@ -137,7 +137,7 @@ Entregar um doctor de ambiente enxuto, acessivel por `aignt doctor`, capaz de ve ## Cenario 3: path nao gravavel para persistencia - Dado um ambiente em que `runs_db_path` ou `artifacts_dir` nao pode ser preparado pelo processo atual -- Quando `aignt doctor` for executado +- Quando `synapse doctor` for executado - Entao a CLI retorna exit code `5` - E o check correspondente aparece como `fail` - E a orientacao sugere corrigir permissao ou configuracao de path diff --git a/features/F20-public-onboarding/CHECKLIST.md b/features/F20-public-onboarding/CHECKLIST.md index 84a617f..e3ec74c 100644 --- a/features/F20-public-onboarding/CHECKLIST.md +++ b/features/F20-public-onboarding/CHECKLIST.md @@ -1,7 +1,7 @@ # F20 Checklist - [x] SPEC da F20 criada e validavel -- [x] Boundary entre `aignt doctor` e `repo-preflight` explicitado no contrato da feature +- [x] Boundary entre `synapse doctor` e `repo-preflight` explicitado no contrato da feature - [x] REDs cobrindo contrato documental do quickstart e smoke da sequencia publica - [x] Quickstart oficial curto materializado no `README.md` - [x] Troubleshooting essencial cobrindo `runtime_state`, `runs_db`, `artifacts_dir` e `SPEC invalida` diff --git a/features/F20-public-onboarding/NOTES.md b/features/F20-public-onboarding/NOTES.md index 8f00cde..dc45554 100644 --- a/features/F20-public-onboarding/NOTES.md +++ b/features/F20-public-onboarding/NOTES.md @@ -1,5 +1,5 @@ # F20 Notes -- A mitigacao do risco residual da F19 entra na F20 pelo eixo de onboarding: explicitar o que `aignt doctor` garante e o que continua pertencendo ao `repo-preflight`. +- A mitigacao do risco residual da F19 entra na F20 pelo eixo de onboarding: explicitar o que `synapse doctor` garante e o que continua pertencendo ao `repo-preflight`. - O quickstart da F20 deve continuar sync-first e local-first, porque esse e o caminho canonico hoje; fluxos async, Docker-first ou runtime persistente nao podem virar caminho principal por inercia. - Se a fase futura exigir Docker ou runtime completo como requisito minimo da primeira run, a revisao correta sera de contrato entre F19 e F20, nao um ajuste textual isolado em README. diff --git a/features/F20-public-onboarding/REPORT.md b/features/F20-public-onboarding/REPORT.md index 4799d5e..3be6aed 100644 --- a/features/F20-public-onboarding/REPORT.md +++ b/features/F20-public-onboarding/REPORT.md @@ -3,7 +3,7 @@ ## Resumo executivo - A F20 adiciona um onboarding publico curto para a primeira run diretamente no `README.md`. -- A mitigacao do risco residual da F19 entrou pelo eixo correto: clarificar expectativa do operador, sem ampliar `aignt doctor` nem substituir preflight operacional. +- A mitigacao do risco residual da F19 entrou pelo eixo correto: clarificar expectativa do operador, sem ampliar `synapse doctor` nem substituir preflight operacional. - O caminho oficial permaneceu local e `sync-first`, com troubleshooting essencial e boundary explicito para `repo-preflight`. ## Escopo alterado @@ -14,15 +14,15 @@ ## Validacoes executadas -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_public_onboarding_docs.py tests/integration/test_public_onboarding_flow.py -q` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_public_onboarding_docs.py tests/integration/test_public_onboarding_flow.py tests/integration/test_doctor_cli.py tests/integration/test_runs_submit_cli.py tests/integration/test_runs_cli.py -q` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync ruff check tests/unit/test_public_onboarding_docs.py tests/integration/test_public_onboarding_flow.py` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m mypy tests/unit/test_public_onboarding_docs.py tests/integration/test_public_onboarding_flow.py` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_public_onboarding_docs.py tests/integration/test_public_onboarding_flow.py -q` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_public_onboarding_docs.py tests/integration/test_public_onboarding_flow.py tests/integration/test_doctor_cli.py tests/integration/test_runs_submit_cli.py tests/integration/test_runs_cli.py -q` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync ruff check tests/unit/test_public_onboarding_docs.py tests/integration/test_public_onboarding_flow.py` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m mypy tests/unit/test_public_onboarding_docs.py tests/integration/test_public_onboarding_flow.py` ## Security review - Risco identificado: baixo. O delta nao adiciona shell, subprocesso novo, Docker, rede, leitura arbitraria nem mudanca no contrato de execucao da CLI. -- Mitigacao aplicada: o onboarding deixa explicito que `aignt doctor` e advisory/local e nao deve ser usado como bypass de `repo-preflight` para cenarios operacionais mais pesados. +- Mitigacao aplicada: o onboarding deixa explicito que `synapse doctor` e advisory/local e nao deve ser usado como bypass de `repo-preflight` para cenarios operacionais mais pesados. - Parecer: aprovado com ressalvas baixas. ## Riscos residuais diff --git a/features/F20-public-onboarding/SPEC.md b/features/F20-public-onboarding/SPEC.md index 0c0d05a..5bed3f8 100644 --- a/features/F20-public-onboarding/SPEC.md +++ b/features/F20-public-onboarding/SPEC.md @@ -16,21 +16,21 @@ outputs: - onboarding_troubleshooting_contract - feature_notes constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "manter o recorte restrito a onboarding publico curto, sem documentacao enciclopedica" - "usar o caminho canonico atual da CLI publica sem inventar comandos novos" - - "explicitar no onboarding que `aignt doctor` e diagnostico local e advisory, nao preflight operacional completo" + - "explicitar no onboarding que `synapse doctor` e diagnostico local e advisory, nao preflight operacional completo" - "encaminhar tarefas dependentes de Docker, container, build, boot, persistencia operacional ou integracao para `repo-preflight`, sem duplicar esse fluxo na F20" - "nao introduzir auto-setup, script de bootstrap novo, TUI nem validacao pratica dependente de Docker" acceptance_criteria: - "Existe um quickstart publico curto e oficial que orienta a primeira run usando a CLI publica atual, do diagnostico inicial ate a inspecao do resultado." - - "O onboarding explica explicitamente o boundary entre `aignt doctor` e `repo-preflight`, incluindo quando o doctor basta e quando o operador deve escalar para preflight operacional." + - "O onboarding explica explicitamente o boundary entre `synapse doctor` e `repo-preflight`, incluindo quando o doctor basta e quando o operador deve escalar para preflight operacional." - "O onboarding inclui troubleshooting essencial para os checks de `runtime_state`, `runs_db` e `artifacts_dir`, sem prometer auto-correcao." - "A documentacao resultante continua alinhada ao caminho canonico da F18 e nao contradiz os contratos publicos de erro e exit code da F21." - "A frente deixa claro que o fluxo minimo atual continua local e sync-first, e que Docker, credenciais externas e runtime completo so entram quando houver necessidade operacional explicita." non_goals: - "escrever documentacao completa de arquitetura, instalacao ou operacao avancada" - - "alterar o comportamento de `aignt doctor`, `aignt runs submit` ou `aignt runs show`" + - "alterar o comportamento de `synapse doctor`, `synapse runs submit` ou `synapse runs show`" - "substituir `repo-preflight` por checklist manual no quickstart" - "introduzir exemplos multiplos de adapters reais, TUI ou quickstart paralelo para modos async" security_notes: @@ -44,20 +44,20 @@ dependencies: # Contexto -Depois de `F15`, `F16`, `F21`, `F18` e `F19`, o AIgnt OS ja possui um caminho publico minimo para diagnosticar o ambiente local, submeter uma run e inspecionar o resultado, enquanto o AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS. O risco residual remanescente nao e de falta de comando, e sim de expectativa: um operador novo pode supor que `aignt doctor` substitui preflight operacional completo ou que o quickstart precisa cobrir todos os cenarios de Docker, runtime persistente e credenciais externas. +Depois de `F15`, `F16`, `F21`, `F18` e `F19`, o SynapseOS ja possui um caminho publico minimo para diagnosticar o ambiente local, submeter uma run e inspecionar o resultado, enquanto o Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS. O risco residual remanescente nao e de falta de comando, e sim de expectativa: um operador novo pode supor que `synapse doctor` substitui preflight operacional completo ou que o quickstart precisa cobrir todos os cenarios de Docker, runtime persistente e credenciais externas. A `F20` existe para reduzir esse atrito de entrada sem ampliar o produto. O objetivo nao e escrever documentacao extensa, mas consolidar um caminho curto, oficial e coerente com o baseline atual, deixando claro quando o fluxo minimo e suficiente e quando o operador precisa sair do onboarding e seguir um gate operacional proprio. # Objetivo -Entregar um onboarding publico curto e oficial para a primeira run, capaz de orientar um operador externo pelo caminho canonico atual da CLI e de explicitar o boundary entre diagnostico local (`aignt doctor`) e preflight operacional (`repo-preflight`) sem alterar o comportamento dos comandos existentes. +Entregar um onboarding publico curto e oficial para a primeira run, capaz de orientar um operador externo pelo caminho canonico atual da CLI e de explicitar o boundary entre diagnostico local (`synapse doctor`) e preflight operacional (`repo-preflight`) sem alterar o comportamento dos comandos existentes. # Escopo ## Incluido - quickstart oficial curto para a primeira run com a CLI publica atual -- troubleshooting essencial para `aignt doctor`, `aignt runs submit` e `aignt runs show` +- troubleshooting essencial para `synapse doctor`, `synapse runs submit` e `synapse runs show` - explicacao objetiva do boundary entre diagnostico local e preflight operacional - alinhamento da documentacao publica ao caminho canonico sync-first atual - `NOTES.md` da feature para registrar decisoes de recorte e linguagem @@ -77,7 +77,7 @@ Entregar um onboarding publico curto e oficial para a primeira run, capaz de ori - validar a leitura do estado resultante - submeter uma run - inspecionar a run criada -3. O onboarding deve usar `aignt doctor` como diagnostico local inicial e deixar explicito que ele nao substitui `repo-preflight`. +3. O onboarding deve usar `synapse doctor` como diagnostico local inicial e deixar explicito que ele nao substitui `repo-preflight`. 4. O onboarding deve definir quando escalar para preflight operacional, no minimo para cenarios que dependam de: - Docker ou container - build de imagem @@ -99,7 +99,7 @@ Entregar um onboarding publico curto e oficial para a primeira run, capaz de ori # Casos de erro -- operador interpreta `aignt doctor` como garantia de ambiente completo para Docker ou runtime persistente +- operador interpreta `synapse doctor` como garantia de ambiente completo para Docker ou runtime persistente - operador encontra `runtime_state=warn` e nao sabe se isso bloqueia a primeira run sync - operador recebe `runs_db=fail` ou `artifacts_dir=fail` e nao encontra orientacao objetiva de correcao - onboarding orienta fluxo que contradiz o caminho canonico da F18 ou o contrato de erro da F21 @@ -118,7 +118,7 @@ Entregar um onboarding publico curto e oficial para a primeira run, capaz de ori - Dado um operador que precisa validar um cenario dependente de Docker ou runtime persistente - Quando ele consultar o onboarding oficial -- Entao ele encontra uma orientacao explicita de que `aignt doctor` nao substitui `repo-preflight` +- Entao ele encontra uma orientacao explicita de que `synapse doctor` nao substitui `repo-preflight` - E entende quando precisa sair do quickstart e escalar para preflight operacional ## Cenario 3: troubleshooting essencial do doctor @@ -130,4 +130,4 @@ Entregar um onboarding publico curto e oficial para a primeira run, capaz de ori # Observacoes -Esta frente mitiga o risco residual da F19 pelo eixo correto: clareza de contrato e expectativa do operador, nao ampliacao silenciosa do `aignt doctor`. Se o projeto passar a exigir Docker, runtime persistente ativo ou credenciais externas como parte do fluxo minimo oficial, a revisao necessaria deve atingir explicitamente a F19 e a F20, em vez de tentar absorver esse crescimento por texto ambiguo no onboarding. +Esta frente mitiga o risco residual da F19 pelo eixo correto: clareza de contrato e expectativa do operador, nao ampliacao silenciosa do `synapse doctor`. Se o projeto passar a exigir Docker, runtime persistente ativo ou credenciais externas como parte do fluxo minimo oficial, a revisao necessaria deve atingir explicitamente a F19 e a F20, em vez de tentar absorver esse crescimento por texto ambiguo no onboarding. diff --git a/features/F21-cli-error-model-and-exit-codes/SPEC.md b/features/F21-cli-error-model-and-exit-codes/SPEC.md index 343fe4b..0c89229 100644 --- a/features/F21-cli-error-model-and-exit-codes/SPEC.md +++ b/features/F21-cli-error-model-and-exit-codes/SPEC.md @@ -1,14 +1,14 @@ --- id: F21-cli-error-model-and-exit-codes type: feature -summary: Organizar categorias de erro e exit codes previsiveis para a CLI publica do AIgnt OS. +summary: Organizar categorias de erro e exit codes previsiveis para a CLI publica do SynapseOS. inputs: - CONTEXT.md - docs/architecture/SDD.md - docs/architecture/TDD.md - docs/architecture/SPEC_FORMAT.md - docs/architecture/PHASE_2_ROADMAP.md - - src/aignt_os/cli/app.py + - src/synapse_os/cli/app.py - tests/integration/test_runtime_cli.py - tests/integration/test_runs_cli.py - tests/integration/test_runs_submit_cli.py @@ -17,7 +17,7 @@ outputs: - cli_error_tests - feature_notes_and_checklist constraints: - - manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS + - manter o Synapse-Flow como a engine propria de pipeline do SynapseOS - manter o recorte restrito ao contrato de erro da CLI publica atual - nao introduzir novos subcomandos, novo modo verbose nem debug profundo - preservar os caminhos de sucesso existentes com exit code `0` @@ -44,7 +44,7 @@ dependencies: # Contexto -A CLI publica do AIgnt OS ja expõe `runs submit`, `runs show` e o grupo `runtime`, enquanto o AIgnt-Synapse-Flow continua como a engine propria de pipeline do AIgnt OS. Porem, os caminhos de falha ainda usam uma mistura de `typer.BadParameter`, `typer.Exit(code=1)` e mensagens ad hoc, o que dificulta automacoes e torna os erros menos previsiveis para operadores. +A CLI publica do SynapseOS ja expõe `runs submit`, `runs show` e o grupo `runtime`, enquanto o Synapse-Flow continua como a engine propria de pipeline do SynapseOS. Porem, os caminhos de falha ainda usam uma mistura de `typer.BadParameter`, `typer.Exit(code=1)` e mensagens ad hoc, o que dificulta automacoes e torna os erros menos previsiveis para operadores. A etapa 2 prioriza endurecer o contrato operacional da CLI antes de consolidar o caminho canonico de demonstracao. A F21 existe para transformar falhas recorrentes em um modelo pequeno, legivel e testavel. diff --git a/features/F22-release-readiness/REPORT.md b/features/F22-release-readiness/REPORT.md index 58874da..57241dd 100644 --- a/features/F22-release-readiness/REPORT.md +++ b/features/F22-release-readiness/REPORT.md @@ -16,9 +16,9 @@ ## Validacoes executadas -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_release_readiness_docs.py tests/integration/test_release_readiness_flow.py -q` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync ruff check README.md CHANGELOG.md docs/release/phase-2-technical-release.md tests/unit/test_release_readiness_docs.py tests/integration/test_release_readiness_flow.py` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m mypy tests/unit/test_release_readiness_docs.py tests/integration/test_release_readiness_flow.py` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_release_readiness_docs.py tests/integration/test_release_readiness_flow.py -q` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync ruff check README.md CHANGELOG.md docs/release/phase-2-technical-release.md tests/unit/test_release_readiness_docs.py tests/integration/test_release_readiness_flow.py` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m mypy tests/unit/test_release_readiness_docs.py tests/integration/test_release_readiness_flow.py` ## Security review diff --git a/features/F22-release-readiness/SPEC.md b/features/F22-release-readiness/SPEC.md index 2d944a6..af826a5 100644 --- a/features/F22-release-readiness/SPEC.md +++ b/features/F22-release-readiness/SPEC.md @@ -12,13 +12,13 @@ inputs: - CHANGELOG.md - features/F17-artifact-preview/SPEC.md - features/F20-public-onboarding/SPEC.md - - src/aignt_os/cli/app.py + - src/synapse_os/cli/app.py outputs: - release_readiness_docs - release_readiness_tests - feature_notes constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "nao abrir nova superficie publica de produto alem da CLI e docs ja existentes" - "nao alterar schema SQLite, worker, state machine ou pipeline por inercia" - "preservar o quickstart publico atual como local e sync-first" @@ -47,7 +47,7 @@ dependencies: # Contexto -A etapa 2 do AIgnt OS ja consolidou submit publico, detalhe de run, contrato de erros, caminho canonico, doctor, onboarding e preview controlado de artifacts, enquanto o AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS. Falta empacotar esse estado como uma release tecnica coerente e auditavel, sem prometer maturidade acima da realmente entregue. +A etapa 2 do SynapseOS ja consolidou submit publico, detalhe de run, contrato de erros, caminho canonico, doctor, onboarding e preview controlado de artifacts, enquanto o Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS. Falta empacotar esse estado como uma release tecnica coerente e auditavel, sem prometer maturidade acima da realmente entregue. # Objetivo diff --git a/features/F23-security-sanitization-foundation/REPORT.md b/features/F23-security-sanitization-foundation/REPORT.md index 16cceb6..0868c5d 100644 --- a/features/F23-security-sanitization-foundation/REPORT.md +++ b/features/F23-security-sanitization-foundation/REPORT.md @@ -8,7 +8,7 @@ ## Escopo entregue -- Novo modulo compartilhado `src/aignt_os/security.py` concentrando strip de bidi controls, normalizacao Unicode NFKC, remocao opcional de ANSI e masking configuravel de segredos. +- Novo modulo compartilhado `src/synapse_os/security.py` concentrando strip de bidi controls, normalizacao Unicode NFKC, remocao opcional de ANSI e masking configuravel de segredos. - Endurecimento de `BaseCLIAdapter` para sanitizar `stdout_clean` e `stderr_clean` sem tocar `stdout_raw` e `stderr_raw`. - Endurecimento do parsing para sanitizar `stdout_clean` sem quebrar a extracao de artifacts fenced. - Endurecimento de `ArtifactStore` para sanitizar `clean.txt`, named artifacts publicos e `RUN_REPORT.md`, preservando `raw.txt` intacto. @@ -20,8 +20,8 @@ - Leitura e alinhamento com `CONTEXT.md`, `docs/architecture/SDD.md`, `docs/architecture/TDD.md` e `docs/architecture/SPEC_FORMAT.md`. - Validacao da SPEC da feature com `validate_spec_file(Path('features/F23-security-sanitization-foundation/SPEC.md'))`. - `uv run --no-sync python -m pytest tests/unit/test_security.py tests/unit/test_config.py tests/unit/test_cli_adapter.py tests/unit/test_parsing_engine.py tests/unit/test_persistence.py tests/integration/test_runs_cli.py -q` -- `uv run --no-sync ruff check src/aignt_os/security.py src/aignt_os/config.py src/aignt_os/adapters.py src/aignt_os/parsing.py src/aignt_os/persistence.py tests/unit/test_security.py tests/unit/test_config.py tests/unit/test_cli_adapter.py tests/unit/test_parsing_engine.py tests/unit/test_persistence.py tests/integration/test_runs_cli.py` -- `uv run --no-sync mypy src/aignt_os/security.py src/aignt_os/config.py src/aignt_os/adapters.py src/aignt_os/parsing.py src/aignt_os/persistence.py` +- `uv run --no-sync ruff check src/synapse_os/security.py src/synapse_os/config.py src/synapse_os/adapters.py src/synapse_os/parsing.py src/synapse_os/persistence.py tests/unit/test_security.py tests/unit/test_config.py tests/unit/test_cli_adapter.py tests/unit/test_parsing_engine.py tests/unit/test_persistence.py tests/integration/test_runs_cli.py` +- `uv run --no-sync mypy src/synapse_os/security.py src/synapse_os/config.py src/synapse_os/adapters.py src/synapse_os/parsing.py src/synapse_os/persistence.py` - `./scripts/security-gate.sh` ## Security review diff --git a/features/F23-security-sanitization-foundation/SPEC.md b/features/F23-security-sanitization-foundation/SPEC.md index 76d58bc..0548d5f 100644 --- a/features/F23-security-sanitization-foundation/SPEC.md +++ b/features/F23-security-sanitization-foundation/SPEC.md @@ -8,16 +8,16 @@ inputs: - docs/architecture/TDD.md - docs/architecture/SPEC_FORMAT.md - docs/IDEAS.md - - src/aignt_os/config.py - - src/aignt_os/adapters.py - - src/aignt_os/parsing.py - - src/aignt_os/persistence.py + - src/synapse_os/config.py + - src/synapse_os/adapters.py + - src/synapse_os/parsing.py + - src/synapse_os/persistence.py outputs: - security_sanitization_module - security_sanitization_tests - feature_notes constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "trabalhar apenas o recorte de G-01, G-02 e G-04" - "preservar `stdout_raw`, `stderr_raw`, `raw_output` e qualquer output bruto intactos" - "aplicar strip de bidi controls, normalizacao NFKC e masking apenas em campos `*_clean` e artefatos publicos" @@ -49,7 +49,7 @@ dependencies: # Contexto -Depois do fechamento da etapa 2, o AIgnt OS ja expoe uma superficie publica CLI-first com submit, diagnostico, detail, preview e release readiness, enquanto o AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS. Porem, a IDEA-001 registrou que ainda faltam guardrails basicos de sanitizacao antes de avancar para endurecimentos maiores. +Depois do fechamento da etapa 2, o SynapseOS ja expoe uma superficie publica CLI-first com submit, diagnostico, detail, preview e release readiness, enquanto o Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS. Porem, a IDEA-001 registrou que ainda faltam guardrails basicos de sanitizacao antes de avancar para endurecimentos maiores. Os riscos mais imediatos neste recorte sao: diff --git a/features/F24-workspace-boundary-hardening/REPORT.md b/features/F24-workspace-boundary-hardening/REPORT.md index c6be5f9..e03db7a 100644 --- a/features/F24-workspace-boundary-hardening/REPORT.md +++ b/features/F24-workspace-boundary-hardening/REPORT.md @@ -9,7 +9,7 @@ ## Escopo entregue - `AppSettings.workspace_root` com default em `Path.cwd()` e override por ambiente. -- Helper compartilhado em `src/aignt_os/security.py` para canonicalizar paths dentro de uma root confiavel. +- Helper compartilhado em `src/synapse_os/security.py` para canonicalizar paths dentro de uma root confiavel. - `RunDispatchService` endurecido para aceitar SPEC apenas dentro de `workspace_root` e persistir `spec_path` canonicalizado. - `ArtifactStore.list_artifact_paths()` filtrando artifacts/symlinks cujo destino resolvido escape `artifacts_dir`. - Preview publico endurecido para bloquear `clean_output_path` e report paths fora de `artifacts_dir`, inclusive quando vierem do banco. @@ -20,8 +20,8 @@ - Leitura e alinhamento com `CONTEXT.md`, `docs/architecture/SDD.md`, `docs/architecture/TDD.md` e `docs/architecture/SPEC_FORMAT.md`. - Validacao da SPEC com `validate_spec_file(Path('features/F24-workspace-boundary-hardening/SPEC.md'))`. - `uv run --no-sync python -m pytest tests/unit/test_security.py tests/unit/test_config.py tests/unit/test_runtime_dispatch.py tests/integration/test_runs_submit_cli.py tests/integration/test_public_onboarding_flow.py tests/integration/test_worker_runtime_flow.py tests/integration/test_cli_error_model.py tests/integration/test_runs_cli.py -q` -- `uv run --no-sync ruff check src/aignt_os/security.py src/aignt_os/config.py src/aignt_os/runtime/dispatch.py src/aignt_os/persistence.py src/aignt_os/cli/app.py tests/unit/test_security.py tests/unit/test_config.py tests/unit/test_runtime_dispatch.py tests/integration/test_runs_submit_cli.py tests/integration/test_public_onboarding_flow.py tests/integration/test_worker_runtime_flow.py tests/integration/test_cli_error_model.py tests/integration/test_runs_cli.py` -- `uv run --no-sync mypy src/aignt_os/security.py src/aignt_os/config.py src/aignt_os/runtime/dispatch.py src/aignt_os/persistence.py src/aignt_os/cli/app.py` +- `uv run --no-sync ruff check src/synapse_os/security.py src/synapse_os/config.py src/synapse_os/runtime/dispatch.py src/synapse_os/persistence.py src/synapse_os/cli/app.py tests/unit/test_security.py tests/unit/test_config.py tests/unit/test_runtime_dispatch.py tests/integration/test_runs_submit_cli.py tests/integration/test_public_onboarding_flow.py tests/integration/test_worker_runtime_flow.py tests/integration/test_cli_error_model.py tests/integration/test_runs_cli.py` +- `uv run --no-sync mypy src/synapse_os/security.py src/synapse_os/config.py src/synapse_os/runtime/dispatch.py src/synapse_os/persistence.py src/synapse_os/cli/app.py` - `./scripts/security-gate.sh` ## Security review @@ -33,7 +33,7 @@ ## Riscos residuais - A F24 nao retroage runs antigas ja persistidas; ela endurece a leitura/listagem publica no estado atual da CLI. -- O root confiavel do workspace no MVP depende de configuracao correta de `AIGNT_OS_WORKSPACE_ROOT` quando o operador quiser trabalhar fora de `Path.cwd()`. +- O root confiavel do workspace no MVP depende de configuracao correta de `SYNAPSE_OS_WORKSPACE_ROOT` quando o operador quiser trabalhar fora de `Path.cwd()`. - Integridade por hash da SPEC, audit trail e autenticacao continuam em features posteriores da IDEA-001. ## Proximos passos diff --git a/features/F24-workspace-boundary-hardening/SPEC.md b/features/F24-workspace-boundary-hardening/SPEC.md index ea1837a..d3403c9 100644 --- a/features/F24-workspace-boundary-hardening/SPEC.md +++ b/features/F24-workspace-boundary-hardening/SPEC.md @@ -8,17 +8,17 @@ inputs: - docs/architecture/TDD.md - docs/architecture/SPEC_FORMAT.md - docs/IDEAS.md - - src/aignt_os/config.py - - src/aignt_os/runtime/dispatch.py - - src/aignt_os/cli/app.py - - src/aignt_os/persistence.py - - src/aignt_os/security.py + - src/synapse_os/config.py + - src/synapse_os/runtime/dispatch.py + - src/synapse_os/cli/app.py + - src/synapse_os/persistence.py + - src/synapse_os/security.py outputs: - workspace_boundary_guards - boundary_regression_tests - feature_notes constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "trabalhar apenas o recorte de G-05 + G-10 restante apos a F23" - "nao alterar schema SQLite ou adicionar migrations" - "nao alterar a superficie publica do CLI alem do endurecimento de erros de boundary" @@ -51,7 +51,7 @@ dependencies: Depois da F23, o projeto passou a higienizar conteudo publico, mas ainda aceita e exibe caminhos com boundary parcial. `runs submit` hoje valida existencia e formato da SPEC, porem nao limita a origem do arquivo a uma raiz confiavel do workspace. `runs show --preview` ja canonicaliza alguns caminhos, mas a listagem publica de artifacts ainda pode anunciar entradas escapadas por symlink e a run continua aceitando `clean_output_path` persistido externamente ao diretório de artifacts. -No MVP, o AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS e trabalha com um unico workspace local por run. A F24 fecha esse contrato de isolamento sem abrir migrations, auth ou runtime completo. +No MVP, o Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS e trabalha com um unico workspace local por run. A F24 fecha esse contrato de isolamento sem abrir migrations, auth ou runtime completo. # Objetivo diff --git a/features/F25-generated-artifact-ast-guard/REPORT.md b/features/F25-generated-artifact-ast-guard/REPORT.md index 57d67b6..e21bc90 100644 --- a/features/F25-generated-artifact-ast-guard/REPORT.md +++ b/features/F25-generated-artifact-ast-guard/REPORT.md @@ -21,8 +21,8 @@ - Leitura e alinhamento com `CONTEXT.md`, `docs/architecture/SDD.md`, `docs/architecture/TDD.md` e `docs/architecture/SPEC_FORMAT.md`. - Validacao da SPEC com `validate_spec_file(Path('features/F25-generated-artifact-ast-guard/SPEC.md'))`. - `uv run --no-sync python -m pytest tests/unit/test_parsing_engine.py tests/unit/test_persistence.py tests/unit/test_report_generator.py tests/integration/test_pipeline_persistence.py tests/integration/test_adapter_parser_flow.py tests/integration/test_runs_cli.py -q` -- `uv run --no-sync ruff check src/aignt_os/parsing.py src/aignt_os/persistence.py tests/unit/test_parsing_engine.py tests/unit/test_persistence.py tests/unit/test_report_generator.py tests/integration/test_pipeline_persistence.py tests/integration/test_adapter_parser_flow.py tests/integration/test_runs_cli.py` -- `uv run --no-sync mypy src/aignt_os/parsing.py src/aignt_os/persistence.py` +- `uv run --no-sync ruff check src/synapse_os/parsing.py src/synapse_os/persistence.py tests/unit/test_parsing_engine.py tests/unit/test_persistence.py tests/unit/test_report_generator.py tests/integration/test_pipeline_persistence.py tests/integration/test_adapter_parser_flow.py tests/integration/test_runs_cli.py` +- `uv run --no-sync mypy src/synapse_os/parsing.py src/synapse_os/persistence.py` - `./scripts/security-gate.sh` ## Security review diff --git a/features/F25-generated-artifact-ast-guard/SPEC.md b/features/F25-generated-artifact-ast-guard/SPEC.md index d8959e0..a3685b1 100644 --- a/features/F25-generated-artifact-ast-guard/SPEC.md +++ b/features/F25-generated-artifact-ast-guard/SPEC.md @@ -8,15 +8,15 @@ inputs: - docs/architecture/TDD.md - docs/architecture/SPEC_FORMAT.md - docs/IDEAS.md - - src/aignt_os/parsing.py - - src/aignt_os/persistence.py - - src/aignt_os/pipeline.py + - src/synapse_os/parsing.py + - src/synapse_os/persistence.py + - src/synapse_os/pipeline.py outputs: - ast_guard_validation - artifact_promotion_guard - feature_notes constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "trabalhar apenas o recorte de G-03" - "nao alterar schema SQLite ou adicionar migrations" - "nao alterar a superficie publica do CLI alem do comportamento ja audivel de falha da run" diff --git a/features/F26-run-provenance-integrity/REPORT.md b/features/F26-run-provenance-integrity/REPORT.md index 80db513..fc49346 100644 --- a/features/F26-run-provenance-integrity/REPORT.md +++ b/features/F26-run-provenance-integrity/REPORT.md @@ -20,8 +20,8 @@ - Leitura e alinhamento com `CONTEXT.md`, `docs/architecture/SDD.md`, `docs/architecture/TDD.md` e `docs/architecture/SPEC_FORMAT.md`. - Validacao da SPEC com `validate_spec_file(Path('features/F26-run-provenance-integrity/SPEC.md'))`. - `uv run --no-sync python -m pytest tests/unit/test_config.py tests/unit/test_persistence.py tests/unit/test_runtime_dispatch.py tests/unit/test_worker_runtime.py tests/unit/test_cli_runs_rendering.py tests/unit/test_report_generator.py tests/integration/test_pipeline_persistence.py tests/integration/test_runs_submit_cli.py tests/integration/test_runs_cli.py tests/integration/test_worker_runtime_flow.py -q` -- `uv run --no-sync ruff check src/aignt_os/security.py src/aignt_os/config.py src/aignt_os/runtime/dispatch.py src/aignt_os/persistence.py src/aignt_os/cli/rendering.py src/aignt_os/reporting.py tests/unit/test_config.py tests/unit/test_persistence.py tests/unit/test_runtime_dispatch.py tests/unit/test_worker_runtime.py tests/unit/test_cli_runs_rendering.py tests/unit/test_report_generator.py tests/integration/test_pipeline_persistence.py tests/integration/test_runs_submit_cli.py tests/integration/test_runs_cli.py tests/integration/test_worker_runtime_flow.py` -- `uv run --no-sync mypy src/aignt_os/security.py src/aignt_os/config.py src/aignt_os/runtime/dispatch.py src/aignt_os/persistence.py src/aignt_os/cli/rendering.py src/aignt_os/reporting.py` +- `uv run --no-sync ruff check src/synapse_os/security.py src/synapse_os/config.py src/synapse_os/runtime/dispatch.py src/synapse_os/persistence.py src/synapse_os/cli/rendering.py src/synapse_os/reporting.py tests/unit/test_config.py tests/unit/test_persistence.py tests/unit/test_runtime_dispatch.py tests/unit/test_worker_runtime.py tests/unit/test_cli_runs_rendering.py tests/unit/test_report_generator.py tests/integration/test_pipeline_persistence.py tests/integration/test_runs_submit_cli.py tests/integration/test_runs_cli.py tests/integration/test_worker_runtime_flow.py` +- `uv run --no-sync mypy src/synapse_os/security.py src/synapse_os/config.py src/synapse_os/runtime/dispatch.py src/synapse_os/persistence.py src/synapse_os/cli/rendering.py src/synapse_os/reporting.py` - `./scripts/security-gate.sh` ## Security review diff --git a/features/F26-run-provenance-integrity/SPEC.md b/features/F26-run-provenance-integrity/SPEC.md index 09e31d8..7551307 100644 --- a/features/F26-run-provenance-integrity/SPEC.md +++ b/features/F26-run-provenance-integrity/SPEC.md @@ -8,15 +8,15 @@ inputs: - docs/architecture/TDD.md - docs/architecture/SPEC_FORMAT.md - docs/IDEAS.md - - src/aignt_os/runtime/dispatch.py - - src/aignt_os/persistence.py - - src/aignt_os/reporting.py + - src/synapse_os/runtime/dispatch.py + - src/synapse_os/persistence.py + - src/synapse_os/reporting.py outputs: - run_provenance_persistence - security_audit_trail - feature_notes constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "trabalhar apenas o recorte de G-06 e G-08" - "nao introduzir Alembic ou infraestrutura nova de migration" - "nao alterar a CLI publica alem da exposicao de provenance em runs show e RUN_REPORT.md" @@ -45,7 +45,7 @@ dependencies: # Contexto -Depois de fechar sanitizacao publica na F23, boundary de workspace na F24 e AST guard na F25, o proximo gap de seguranca da IDEA-001 fica na rastreabilidade da run. Hoje o AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS, persiste `spec_path`, steps e events, mas ainda nao registra quem iniciou a run nem garante que a SPEC consumida pelo worker continua identica ao arquivo validado no submit. +Depois de fechar sanitizacao publica na F23, boundary de workspace na F24 e AST guard na F25, o proximo gap de seguranca da IDEA-001 fica na rastreabilidade da run. Hoje o Synapse-Flow, a engine propria de pipeline do SynapseOS, persiste `spec_path`, steps e events, mas ainda nao registra quem iniciou a run nem garante que a SPEC consumida pelo worker continua identica ao arquivo validado no submit. Esse gap aparece com mais clareza no runtime dual: uma run pode ser enfileirada em `async`, a SPEC pode ser alterada no workspace antes do worker consumi-la e o sistema atual nao deixa evidencias suficientes para auditoria posterior. A mesma superficie tambem limita a explicacao de falhas de guardrail ja existentes, porque o audit trail atual se resume a `run_failed` e `supervisor_decision`. diff --git a/features/F27-adapter-concurrency-guard/REPORT.md b/features/F27-adapter-concurrency-guard/REPORT.md index 1d8e080..d117414 100644 --- a/features/F27-adapter-concurrency-guard/REPORT.md +++ b/features/F27-adapter-concurrency-guard/REPORT.md @@ -3,7 +3,7 @@ ## Resumo executivo - A F27 foi implementada como um guard de concorrencia local no adapter layer. -- O recorte ficou fechado em `G-07`, sem abrir circuit breaker persistido, coordenacao cross-process ou mudancas no runtime do AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS. +- O recorte ficou fechado em `G-07`, sem abrir circuit breaker persistido, coordenacao cross-process ou mudancas no runtime do Synapse-Flow, a engine propria de pipeline do SynapseOS. - A mitigacao central ficou em `BaseCLIAdapter.execute()`, que agora adquire um `asyncio.Semaphore` compartilhado por processo antes de abrir o subprocesso. ## Escopo entregue @@ -18,8 +18,8 @@ - Leitura e alinhamento com `CONTEXT.md`, `docs/architecture/SDD.md`, `docs/architecture/TDD.md` e `docs/architecture/SPEC_FORMAT.md`. - Validacao da SPEC com `validate_spec_file(Path('features/F27-adapter-concurrency-guard/SPEC.md'))`. - `uv run --no-sync python -m pytest tests/unit/test_config.py tests/unit/test_cli_adapter.py tests/integration/test_adapter_concurrency_flow.py -q` -- `uv run --no-sync ruff check src/aignt_os/adapters.py src/aignt_os/config.py tests/unit/test_cli_adapter.py tests/unit/test_config.py tests/integration/test_adapter_concurrency_flow.py` -- `uv run --no-sync mypy src/aignt_os/adapters.py src/aignt_os/config.py` +- `uv run --no-sync ruff check src/synapse_os/adapters.py src/synapse_os/config.py tests/unit/test_cli_adapter.py tests/unit/test_config.py tests/integration/test_adapter_concurrency_flow.py` +- `uv run --no-sync mypy src/synapse_os/adapters.py src/synapse_os/config.py` - `./scripts/security-gate.sh` ## Security review diff --git a/features/F27-adapter-concurrency-guard/SPEC.md b/features/F27-adapter-concurrency-guard/SPEC.md index fcb4f4f..2ce2cc7 100644 --- a/features/F27-adapter-concurrency-guard/SPEC.md +++ b/features/F27-adapter-concurrency-guard/SPEC.md @@ -8,14 +8,14 @@ inputs: - docs/architecture/TDD.md - docs/architecture/SPEC_FORMAT.md - docs/IDEAS.md - - src/aignt_os/adapters.py - - src/aignt_os/config.py + - src/synapse_os/adapters.py + - src/synapse_os/config.py outputs: - adapter_concurrency_guard - adapter_config_contract - feature_notes constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "trabalhar apenas o recorte de G-07" - "nao implementar circuit breaker persistido, estado entre runs ou G-09 nesta frente" - "nao alterar o contrato publico da CLI nem exigir novo subcomando" @@ -48,7 +48,7 @@ dependencies: Depois da F26, o proximo gap logico da IDEA-001 ainda aberto no runtime atual fica na protecao contra excesso de subprocessos no adapter layer. Hoje `BaseCLIAdapter.execute()` abre o subprocesso diretamente e nao existe nenhum guard compartilhado por processo para limitar quantas chamadas de adapters podem entrar ao mesmo tempo. -No shape atual do repositório, ainda nao existe uma camada de coordenacao robusta o bastante para justificar circuit breaker persistido entre runs. O menor recorte util e coerente com o MVP e adicionar apenas o limite de concorrencia local no processo, preservando o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS e sem reabrir o runtime dual. +No shape atual do repositório, ainda nao existe uma camada de coordenacao robusta o bastante para justificar circuit breaker persistido entre runs. O menor recorte util e coerente com o MVP e adicionar apenas o limite de concorrencia local no processo, preservando o Synapse-Flow como a engine propria de pipeline do SynapseOS e sem reabrir o runtime dual. # Objetivo diff --git a/features/F28-adapter-circuit-breaker/REPORT.md b/features/F28-adapter-circuit-breaker/REPORT.md index 0b90ad0..373916a 100644 --- a/features/F28-adapter-circuit-breaker/REPORT.md +++ b/features/F28-adapter-circuit-breaker/REPORT.md @@ -3,12 +3,12 @@ ## Resumo executivo - A F28 foi implementada como um circuit breaker persistido para o adapter real atual. -- O recorte ficou fechado em `G-09`, limitado ao `CodexCLIAdapter`, sem reabrir auth, SQLite, CLI publica ou coordenacao distribuida do AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS. +- O recorte ficou fechado em `G-09`, limitado ao `CodexCLIAdapter`, sem reabrir auth, SQLite, CLI publica ou coordenacao distribuida do Synapse-Flow, a engine propria de pipeline do SynapseOS. - O breaker agora persiste estado local em arquivo, bloqueia spawns repetidos durante cooldown e volta a permitir probe apos expirar a janela. ## Escopo entregue -- Novo store local em `src/aignt_os/runtime/circuit_breaker.py` com escrita atomica e permissoes restritas. +- Novo store local em `src/synapse_os/runtime/circuit_breaker.py` com escrita atomica e permissoes restritas. - `AppSettings` estendido com threshold, cooldown e path derivado do arquivo do breaker. - `CodexCLIAdapter` endurecido para consultar o breaker antes do spawn e atualizar o estado apos classificar o resultado. - `CodexExecutionAssessment` ampliado com a categoria `circuit_open`. @@ -19,8 +19,8 @@ - Leitura e alinhamento com `CONTEXT.md`, `docs/architecture/SDD.md`, `docs/architecture/TDD.md` e `docs/architecture/SPEC_FORMAT.md`. - Validacao da SPEC com `validate_spec_file(Path('features/F28-adapter-circuit-breaker/SPEC.md'))`. - `uv run --no-sync python -m pytest tests/unit/test_config.py tests/unit/test_adapter_circuit_breaker.py tests/unit/test_cli_adapter.py tests/integration/test_codex_adapter_operational.py -q` -- `uv run --no-sync ruff check src/aignt_os/adapters.py src/aignt_os/config.py src/aignt_os/contracts.py src/aignt_os/runtime/circuit_breaker.py tests/unit/test_config.py tests/unit/test_adapter_circuit_breaker.py tests/unit/test_cli_adapter.py tests/integration/test_codex_adapter_operational.py` -- `uv run --no-sync python -m mypy src/aignt_os/adapters.py src/aignt_os/config.py src/aignt_os/contracts.py src/aignt_os/runtime/circuit_breaker.py` +- `uv run --no-sync ruff check src/synapse_os/adapters.py src/synapse_os/config.py src/synapse_os/contracts.py src/synapse_os/runtime/circuit_breaker.py tests/unit/test_config.py tests/unit/test_adapter_circuit_breaker.py tests/unit/test_cli_adapter.py tests/integration/test_codex_adapter_operational.py` +- `uv run --no-sync python -m mypy src/synapse_os/adapters.py src/synapse_os/config.py src/synapse_os/contracts.py src/synapse_os/runtime/circuit_breaker.py` ## Security review diff --git a/features/F28-adapter-circuit-breaker/SPEC.md b/features/F28-adapter-circuit-breaker/SPEC.md index cbc6b19..f596f9d 100644 --- a/features/F28-adapter-circuit-breaker/SPEC.md +++ b/features/F28-adapter-circuit-breaker/SPEC.md @@ -8,15 +8,15 @@ inputs: - docs/architecture/TDD.md - docs/architecture/SPEC_FORMAT.md - docs/IDEAS.md - - src/aignt_os/adapters.py - - src/aignt_os/config.py - - src/aignt_os/runtime/state.py + - src/synapse_os/adapters.py + - src/synapse_os/config.py + - src/synapse_os/runtime/state.py outputs: - adapter_circuit_breaker_state - adapter_health_guard - feature_notes constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "trabalhar apenas o recorte de G-09" - "integrar o breaker persistido apenas ao CodexCLIAdapter nesta frente" - "nao alterar a CLI publica nem exigir novo subcomando" @@ -49,7 +49,7 @@ dependencies: Depois da F27, o adapter layer ja possui classificacao operacional explicita do Codex e um guard de concorrencia local por processo, mas ainda nao existe memoria persistida de health/cooldown entre runs. Hoje o `CodexCLIAdapter` continua tentando spawns repetidos mesmo quando o ambiente ja deixou claro que esta bloqueado por launcher, container ou autenticacao. -No baseline atual, o AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS e opera em modo local, CLI-first e single-host. O menor recorte util para `G-09` e adicionar apenas um circuit breaker persistido em arquivo local, sem abrir SQLite, auth ou coordenacao distribuida. +No baseline atual, o Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS e opera em modo local, CLI-first e single-host. O menor recorte util para `G-09` e adicionar apenas um circuit breaker persistido em arquivo local, sem abrir SQLite, auth ou coordenacao distribuida. # Objetivo diff --git a/features/F29-auth-rbac-foundation/REPORT.md b/features/F29-auth-rbac-foundation/REPORT.md index e38f3dc..796219a 100644 --- a/features/F29-auth-rbac-foundation/REPORT.md +++ b/features/F29-auth-rbac-foundation/REPORT.md @@ -2,30 +2,30 @@ ## Resumo executivo -- A F29 introduziu uma fundacao local e opt-in de autenticacao com RBAC para a CLI do AIgnt OS. +- A F29 introduziu uma fundacao local e opt-in de autenticacao com RBAC para a CLI do SynapseOS. - O recorte ficou deliberadamente limitado ao baseline atual: `runs submit` e `runtime start|run|stop` agora podem exigir token, enquanto a leitura local continua aberta. -- O AIgnt-Synapse-Flow permanece a engine propria de pipeline do AIgnt OS; a frente reaproveitou `initiated_by` e o contrato publico de erro da CLI sem abrir socket, auth remota ou gerenciamento completo de credenciais. +- O Synapse-Flow permanece a engine propria de pipeline do SynapseOS; a frente reaproveitou `initiated_by` e o contrato publico de erro da CLI sem abrir socket, auth remota ou gerenciamento completo de credenciais. ## Escopo entregue -- Novo modulo `src/aignt_os/auth.py` com: +- Novo modulo `src/synapse_os/auth.py` com: - registry privado em JSON com escrita atomica - principals e tokens por hash SHA-256 - verificacao de permissao por papel (`viewer`, `operator`) - `AppSettings` estendido com `auth_enabled` e `auth_registry_file`. -- `src/aignt_os/cli/errors.py` ampliado com exit codes `7` e `8` para authn/authz. -- `src/aignt_os/cli/app.py` endurecido para: +- `src/synapse_os/cli/errors.py` ampliado com exit codes `7` e `8` para authn/authz. +- `src/synapse_os/cli/app.py` endurecido para: - exigir token apenas em comandos mutaveis quando auth estiver habilitada - - aceitar `--auth-token` com fallback em `AIGNT_OS_AUTH_TOKEN` + - aceitar `--auth-token` com fallback em `SYNAPSE_OS_AUTH_TOKEN` - persistir `principal_id` autenticado em `initiated_by` no submit bem-sucedido - Cobertura unitaria e de integracao para registry, baseline sem auth, falha de autenticacao, falha de autorizacao, fail-closed por registry ausente e provenance autenticada. ## Validacoes executadas - Validacao da SPEC com `validate_spec_file(Path('features/F29-auth-rbac-foundation/SPEC.md'))`. -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_config.py tests/unit/test_auth.py tests/integration/test_cli_auth_rbac.py tests/integration/test_runs_submit_cli.py tests/integration/test_runtime_cli.py tests/integration/test_cli_error_model.py -q` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync ruff check src/aignt_os/auth.py src/aignt_os/config.py src/aignt_os/cli/errors.py src/aignt_os/cli/app.py tests/unit/test_config.py tests/unit/test_auth.py tests/integration/test_cli_auth_rbac.py` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m mypy src/aignt_os/auth.py src/aignt_os/config.py src/aignt_os/cli/errors.py src/aignt_os/cli/app.py` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_config.py tests/unit/test_auth.py tests/integration/test_cli_auth_rbac.py tests/integration/test_runs_submit_cli.py tests/integration/test_runtime_cli.py tests/integration/test_cli_error_model.py -q` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync ruff check src/synapse_os/auth.py src/synapse_os/config.py src/synapse_os/cli/errors.py src/synapse_os/cli/app.py tests/unit/test_config.py tests/unit/test_auth.py tests/integration/test_cli_auth_rbac.py` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m mypy src/synapse_os/auth.py src/synapse_os/config.py src/synapse_os/cli/errors.py src/synapse_os/cli/app.py` ## Security review diff --git a/features/F29-auth-rbac-foundation/SPEC.md b/features/F29-auth-rbac-foundation/SPEC.md index 0dffc74..f0ab159 100644 --- a/features/F29-auth-rbac-foundation/SPEC.md +++ b/features/F29-auth-rbac-foundation/SPEC.md @@ -8,17 +8,17 @@ inputs: - docs/architecture/TDD.md - docs/architecture/SPEC_FORMAT.md - docs/IDEAS.md - - src/aignt_os/cli/app.py - - src/aignt_os/cli/errors.py - - src/aignt_os/config.py - - src/aignt_os/runtime/dispatch.py - - src/aignt_os/persistence.py + - src/synapse_os/cli/app.py + - src/synapse_os/cli/errors.py + - src/synapse_os/config.py + - src/synapse_os/runtime/dispatch.py + - src/synapse_os/persistence.py outputs: - auth_rbac_contract - cli_auth_guards - feature_notes constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "trabalhar apenas o menor recorte util de G-11 no baseline atual" - "proteger apenas `runs submit` e `runtime start|run|stop` nesta frente" - "manter leitura local (`doctor`, `version`, `runs list|show`, `runtime status|ready`) sem token" @@ -29,7 +29,7 @@ acceptance_criteria: - "AppSettings expoe `auth_enabled: bool = False` e o path derivado `auth_registry_file` sob `runtime_state_dir`." - "Existe um registry local em arquivo JSON com escrita atomica e permissoes restritas para principals e tokens por hash SHA-256, sem persistir token em claro." - "Quando `auth_enabled=false`, o comportamento atual da CLI publica permanece inalterado." - - "Quando `auth_enabled=true`, `runs submit` e `runtime start|run|stop` exigem autenticacao via `--auth-token` com fallback em `AIGNT_OS_AUTH_TOKEN`." + - "Quando `auth_enabled=true`, `runs submit` e `runtime start|run|stop` exigem autenticacao via `--auth-token` com fallback em `SYNAPSE_OS_AUTH_TOKEN`." - "A CLI diferencia falha de autenticacao (`Authentication error:`, exit code `7`) e falha de autorizacao (`Authorization error:`, exit code `8`)." - "O papel `viewer` continua restrito a leitura e o papel `operator` permite `runs.submit` e `runtime.manage`." - "Um submit autenticado com sucesso persiste `initiated_by` com o `principal_id` autenticado em vez de `local_cli`." @@ -51,13 +51,13 @@ dependencies: # Contexto -Depois da `F28`, o backlog remanescente da `IDEA-001` ficou concentrado em `G-11`: autenticacao e autorizacao. No baseline atual, a CLI publica do AIgnt OS ja expoe `runs submit`, `runs list`, `runs show`, `doctor` e o grupo `runtime`, enquanto o AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS. Porem, ainda nao existe qualquer camada de auth local, e a ideia original menciona `socket + RBAC`, algo grande demais para abrir diretamente no MVP atual. +Depois da `F28`, o backlog remanescente da `IDEA-001` ficou concentrado em `G-11`: autenticacao e autorizacao. No baseline atual, a CLI publica do SynapseOS ja expoe `runs submit`, `runs list`, `runs show`, `doctor` e o grupo `runtime`, enquanto o Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS. Porem, ainda nao existe qualquer camada de auth local, e a ideia original menciona `socket + RBAC`, algo grande demais para abrir diretamente no MVP atual. O menor recorte util e coerente com o estado real do repositorio e introduzir uma base opt-in de autenticacao com RBAC estrutural apenas na CLI local. Isso permite endurecer os comandos mutaveis agora, reaproveitar `initiated_by` para provenance e evitar abrir transporte novo antes da hora. # Objetivo -Adicionar uma fundacao local de autenticacao e autorizacao para a CLI do AIgnt OS, com registry privado de credentials por hash, papeis estaticos (`viewer` e `operator`) e enforcement apenas nos comandos mutaveis atuais, preservando o baseline existente quando auth estiver desabilitada. +Adicionar uma fundacao local de autenticacao e autorizacao para a CLI do SynapseOS, com registry privado de credentials por hash, papeis estaticos (`viewer` e `operator`) e enforcement apenas nos comandos mutaveis atuais, preservando o baseline existente quando auth estiver desabilitada. # Escopo @@ -66,7 +66,7 @@ Adicionar uma fundacao local de autenticacao e autorizacao para a CLI do AIgnt O - registry local de auth em arquivo JSON privado - modelos/contratos para principal, token hash e roles - enforcement opt-in em `runs submit` e `runtime start|run|stop` -- fallback de token por `--auth-token` ou `AIGNT_OS_AUTH_TOKEN` +- fallback de token por `--auth-token` ou `SYNAPSE_OS_AUTH_TOKEN` - extensao do contrato publico de erro da CLI para authn/authz - wiring de `principal_id` em `initiated_by` para submit autenticado - testes unitarios e de integracao para auth/RBAC diff --git a/features/F30-auth-registry-cli/CHECKLIST.md b/features/F30-auth-registry-cli/CHECKLIST.md index 0e0ffbc..cfdb4fc 100644 --- a/features/F30-auth-registry-cli/CHECKLIST.md +++ b/features/F30-auth-registry-cli/CHECKLIST.md @@ -2,7 +2,7 @@ - [x] SPEC da F30 criada e validavel - [x] Recorte limitado a provisionamento local do registry -- [x] `aignt auth init|issue|disable` implementados +- [x] `synapse auth init|issue|disable` implementados - [x] `token_id` persistido sem vazar token bruto - [x] REDs cobrindo init, issue, conflito de role e disable - [x] Quality gate local relevante executado com `pytest`, `ruff` e `mypy` diff --git a/features/F30-auth-registry-cli/NOTES.md b/features/F30-auth-registry-cli/NOTES.md index 89bee7d..2498d19 100644 --- a/features/F30-auth-registry-cli/NOTES.md +++ b/features/F30-auth-registry-cli/NOTES.md @@ -1,7 +1,7 @@ # F30 Notes - A F30 continua o recorte local da `F29`, sem abrir socket ou auth remota. -- A CLI publica nova fica restrita a `aignt auth init|issue|disable`. +- A CLI publica nova fica restrita a `synapse auth init|issue|disable`. - O registry continua persistindo apenas `token_sha256`, nunca token bruto. - `token_id` existe apenas para identificar disable sem expor hash SHA-256. - A criacao de principal novo em `issue` exige `--role`; conflito de role falha como uso invalido. diff --git a/features/F30-auth-registry-cli/REPORT.md b/features/F30-auth-registry-cli/REPORT.md index 1a456b6..14b394c 100644 --- a/features/F30-auth-registry-cli/REPORT.md +++ b/features/F30-auth-registry-cli/REPORT.md @@ -3,20 +3,20 @@ ## Resumo executivo - A F30 removeu a edicao manual do auth registry introduzido na F29, adicionando uma CLI local para bootstrap, emissao e disable de tokens. -- O recorte permaneceu estritamente local: o AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS e a frente nao abriu socket, auth remota ou RBAC distribuido. +- O recorte permaneceu estritamente local: o Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS e a frente nao abriu socket, auth remota ou RBAC distribuido. - O backlog documental tambem foi alinhado ao baseline pos-F28/F29/F30, deixando `docs/IDEAS.md` coerente com o estado real do repositorio. ## Escopo entregue -- Novo grupo `aignt auth` com: +- Novo grupo `synapse auth` com: - `auth init` para criar registry novo e emitir o primeiro token - `auth issue` para emitir token para principal existente ou criar principal novo com role explicita - `auth disable` para revogar token por `token_id` -- `src/aignt_os/auth.py` ampliado com: +- `src/synapse_os/auth.py` ampliado com: - `token_id` por token persistido - operacoes explicitas de inicializacao, emissao e disable - compatibilidade com registries antigos sem `token_id` -- `src/aignt_os/cli/app.py` ampliado com o novo grupo publico `auth` +- `src/synapse_os/cli/app.py` ampliado com o novo grupo publico `auth` - README atualizado com o fluxo local `init -> issue -> disable` - `docs/IDEAS.md` atualizado para refletir `F28`, `F29` e `F30` - cobertura unitaria e de integracao para lifecycle local de tokens @@ -24,9 +24,9 @@ ## Validacoes executadas - Validacao da SPEC com `validate_spec_file(Path('features/F30-auth-registry-cli/SPEC.md'))` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_auth.py tests/integration/test_cli_auth_registry.py tests/integration/test_cli_auth_rbac.py tests/unit/test_auth_registry_docs.py -q` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync ruff check src/aignt_os/auth.py src/aignt_os/cli/app.py tests/unit/test_auth.py tests/integration/test_cli_auth_registry.py tests/unit/test_auth_registry_docs.py` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m mypy src/aignt_os/auth.py src/aignt_os/cli/app.py` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_auth.py tests/integration/test_cli_auth_registry.py tests/integration/test_cli_auth_rbac.py tests/unit/test_auth_registry_docs.py -q` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync ruff check src/synapse_os/auth.py src/synapse_os/cli/app.py tests/unit/test_auth.py tests/integration/test_cli_auth_registry.py tests/unit/test_auth_registry_docs.py` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m mypy src/synapse_os/auth.py src/synapse_os/cli/app.py` - `./scripts/commit-check.sh --no-sync --skip-branch-validation --skip-docker --skip-security --skip-format` - `./scripts/security-gate.sh` diff --git a/features/F30-auth-registry-cli/SPEC.md b/features/F30-auth-registry-cli/SPEC.md index d32b8c5..52309a5 100644 --- a/features/F30-auth-registry-cli/SPEC.md +++ b/features/F30-auth-registry-cli/SPEC.md @@ -9,25 +9,25 @@ inputs: - docs/architecture/SPEC_FORMAT.md - docs/IDEAS.md - features/F29-auth-rbac-foundation/SPEC.md - - src/aignt_os/auth.py - - src/aignt_os/cli/app.py + - src/synapse_os/auth.py + - src/synapse_os/cli/app.py outputs: - auth_registry_cli - auth_registry_token_lifecycle - feature_notes constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "nao introduzir socket, daemon remoto, auth remota, SQLite nova ou RBAC distribuido" - "manter a persistencia do registry em JSON local com escrita atomica e permissoes privadas" - "nao persistir token bruto em disco, logs ou mensagens de erro" - "preservar o comportamento atual de `runs submit` e `runtime start|run|stop` quando auth ja estiver configurada" - "nao exigir DOCKER_PREFLIGHT porque a frente nao depende de Docker, boot em container ou integracao externa" acceptance_criteria: - - "Existe um grupo publico `aignt auth` com os comandos `init`, `issue` e `disable`." - - "`aignt auth init --principal-id ` cria um registry novo, falha se o arquivo ja existir e imprime um token bruto apenas uma vez junto do `token_id` gerado." - - "`aignt auth issue --principal-id ` emite um novo token para principal existente; quando o principal nao existir, o comando exige `--role viewer|operator`, cria o principal e retorna token bruto apenas uma vez com `token_id`." - - "`aignt auth issue` falha com erro de uso quando `--role` conflita com o principal ja persistido." - - "`aignt auth disable --token-id ` marca o token como desabilitado sem remover historico e retorna `Not found:` quando o token nao existir." + - "Existe um grupo publico `synapse auth` com os comandos `init`, `issue` e `disable`." + - "`synapse auth init --principal-id ` cria um registry novo, falha se o arquivo ja existir e imprime um token bruto apenas uma vez junto do `token_id` gerado." + - "`synapse auth issue --principal-id ` emite um novo token para principal existente; quando o principal nao existir, o comando exige `--role viewer|operator`, cria o principal e retorna token bruto apenas uma vez com `token_id`." + - "`synapse auth issue` falha com erro de uso quando `--role` conflita com o principal ja persistido." + - "`synapse auth disable --token-id ` marca o token como desabilitado sem remover historico e retorna `Not found:` quando o token nao existir." - "O registry persiste `token_id`, `principal_id`, `token_sha256` e `disabled`, sem token bruto em claro." - "Um token desabilitado deixa de autenticar `runs submit` e `runtime start|run|stop`, retornando `Authentication error:`." - "Existe cobertura unitaria para inicializacao, emissao, conflito de role e disable; e cobertura de integracao para a nova CLI publica." @@ -47,7 +47,7 @@ dependencies: # Contexto -A `F29-auth-rbac-foundation` introduziu a fundacao local de auth opt-in para os comandos mutaveis da CLI, mas deixou o provisionamento do registry como edicao manual de JSON. Isso cria atrito operacional desnecessario e torna a rotacao ou revogacao de tokens mais propensa a erro humano, embora o AIgnt-Synapse-Flow continue sendo a engine propria de pipeline do AIgnt OS e o baseline atual ja tenha enforcement de auth funcionando. +A `F29-auth-rbac-foundation` introduziu a fundacao local de auth opt-in para os comandos mutaveis da CLI, mas deixou o provisionamento do registry como edicao manual de JSON. Isso cria atrito operacional desnecessario e torna a rotacao ou revogacao de tokens mais propensa a erro humano, embora o Synapse-Flow continue sendo a engine propria de pipeline do SynapseOS e o baseline atual ja tenha enforcement de auth funcionando. O residual pequeno e coerente com o estado do repositorio nao e abrir auth remota nem socket. O menor recorte util e fornecer uma CLI local para bootstrap do registry e lifecycle basico de tokens, mantendo o storage atual, as roles atuais e o boundary local da `F29`. @@ -59,7 +59,7 @@ Adicionar uma CLI local de provisionamento para o auth registry, cobrindo bootst ## Incluido -- grupo publico `aignt auth` +- grupo publico `synapse auth` - comandos `init`, `issue` e `disable` - persistencia de `token_id` estavel por token - criacao implicita de principal em `issue` quando `--role` for informado @@ -106,7 +106,7 @@ Adicionar uma CLI local de provisionamento para o auth registry, cobrindo bootst ## Cenario 1: bootstrap inicial do registry - Dado que auth ainda nao foi provisionada localmente -- Quando `aignt auth init --principal-id local-operator` for executado +- Quando `synapse auth init --principal-id local-operator` for executado - Entao um registry novo e criado com um principal `operator` - E o comando retorna um `token_id` - E o comando imprime um token bruto apenas nessa execucao @@ -114,28 +114,28 @@ Adicionar uma CLI local de provisionamento para o auth registry, cobrindo bootst ## Cenario 2: emissao para principal existente - Dado um registry valido com principal `operator-user` -- Quando `aignt auth issue --principal-id operator-user` for executado +- Quando `synapse auth issue --principal-id operator-user` for executado - Entao um novo token e emitido para esse principal - E o token bruto nao fica persistido no arquivo ## Cenario 3: criacao explicita de principal novo - Dado um registry valido sem principal `viewer-user` -- Quando `aignt auth issue --principal-id viewer-user --role viewer` for executado +- Quando `synapse auth issue --principal-id viewer-user --role viewer` for executado - Entao o principal e criado - E um token novo e emitido para ele ## Cenario 4: conflito de role falha como uso invalido - Dado um registry valido com principal `viewer-user` -- Quando `aignt auth issue --principal-id viewer-user --role operator` for executado +- Quando `synapse auth issue --principal-id viewer-user --role operator` for executado - Entao a CLI retorna `Usage error:` - E nenhum novo token e persistido ## Cenario 5: disable revoga autenticacao - Dado um token emitido para um principal `operator` -- Quando `aignt auth disable --token-id ` for executado +- Quando `synapse auth disable --token-id ` for executado - Entao o token fica marcado como desabilitado no registry - E futuras chamadas autenticadas com esse token retornam `Authentication error:` diff --git a/features/F31-g11-remote-auth-decomposition/REPORT.md b/features/F31-g11-remote-auth-decomposition/REPORT.md index 8f14854..756fdc6 100644 --- a/features/F31-g11-remote-auth-decomposition/REPORT.md +++ b/features/F31-g11-remote-auth-decomposition/REPORT.md @@ -4,7 +4,7 @@ - A `F31-g11-remote-auth-decomposition` fechou a ambiguidade residual de `G-11` sem alterar comportamento de produto. - O delta permaneceu doc-only: SPEC, backlog e memoria operacional foram alinhados ao baseline pos-`#66`. -- O AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS; nenhuma implementacao de socket, transporte autenticado ou auth remota foi iniciada. +- O Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS; nenhuma implementacao de socket, transporte autenticado ou auth remota foi iniciada. ## Escopo entregue @@ -17,7 +17,7 @@ ## Validacoes executadas - `validate_spec_file(Path('features/F31-g11-remote-auth-decomposition/SPEC.md'))` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_auth_registry_docs.py -q` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_auth_registry_docs.py -q` - `./scripts/commit-check.sh --no-sync --skip-branch-validation --skip-docker --skip-security` - `./scripts/security-gate.sh` diff --git a/features/F31-g11-remote-auth-decomposition/SPEC.md b/features/F31-g11-remote-auth-decomposition/SPEC.md index 829f86e..cfbd1ed 100644 --- a/features/F31-g11-remote-auth-decomposition/SPEC.md +++ b/features/F31-g11-remote-auth-decomposition/SPEC.md @@ -12,13 +12,13 @@ inputs: - memory.md - features/F29-auth-rbac-foundation/SPEC.md - features/F30-auth-registry-cli/SPEC.md - - src/aignt_os/auth.py - - src/aignt_os/runtime/service.py + - src/synapse_os/auth.py + - src/synapse_os/runtime/service.py outputs: - g11_remote_backlog_decomposition - post_baseline_handoff_alignment constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "trabalhar apenas a decomposicao documental do residual de G-11" - "nao alterar o comportamento atual de CLI, runtime, auth local ou persistencia" - "nao introduzir socket, IPC autenticado, transporte em rede, RBAC novo ou coordenacao entre hosts" @@ -43,8 +43,8 @@ dependencies: # Contexto Depois da `F29-auth-rbac-foundation` e da `F30-auth-registry-cli`, o baseline atual do -AIgnt OS ja possui auth local opt-in na borda da CLI e lifecycle local do registry de -tokens. O AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS, +SynapseOS ja possui auth local opt-in na borda da CLI e lifecycle local do registry de +tokens. O Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS, mas o runtime atual segue estritamente local: processo residente leve, arquivo de estado local e nenhuma camada de socket, IPC autenticado ou operacao entre hosts. @@ -71,7 +71,7 @@ permanece explicitamente adiado fora do baseline atual. ## Fora de escopo - qualquer implementacao de socket, IPC, RPC ou transporte em rede -- qualquer alteracao em `src/aignt_os/auth.py` ou no runtime +- qualquer alteracao em `src/synapse_os/auth.py` ou no runtime - novas roles, policy engine ou RBAC distribuido - rotacao distribuida, revogacao entre hosts ou descoberta remota do runtime diff --git a/features/F32-runtime-resident-principal-binding/REPORT.md b/features/F32-runtime-resident-principal-binding/REPORT.md index 288c48e..9520ea2 100644 --- a/features/F32-runtime-resident-principal-binding/REPORT.md +++ b/features/F32-runtime-resident-principal-binding/REPORT.md @@ -4,7 +4,7 @@ - A `F32-runtime-resident-principal-binding` implementou o primeiro slice concreto do bucket `resident_transport_auth` sem abrir socket ou transporte remoto. - O runtime residente agora persiste `started_by` quando auth local esta habilitada, exibe esse binding em `runtime status` e endurece `runtime stop` contra outro operador quando o binding existe. -- O AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS; a frente permaneceu restrita ao lifecycle local do runtime. +- O Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS; a frente permaneceu restrita ao lifecycle local do runtime. ## Escopo entregue @@ -18,10 +18,10 @@ ## Validacoes executadas - `validate_spec_file(Path('features/F32-runtime-resident-principal-binding/SPEC.md'))` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_runtime_state.py tests/unit/test_cli_rich_output.py tests/integration/test_cli_auth_rbac.py -q` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync ruff check src/aignt_os/cli/app.py src/aignt_os/cli/rendering.py src/aignt_os/runtime/service.py src/aignt_os/runtime/state.py tests/unit/test_runtime_state.py tests/unit/test_cli_rich_output.py tests/integration/test_cli_auth_rbac.py` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m mypy src/aignt_os/cli/app.py src/aignt_os/cli/rendering.py src/aignt_os/runtime/service.py src/aignt_os/runtime/state.py` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_runtime_state.py tests/unit/test_runtime_service_security.py tests/unit/test_cli_rich_output.py tests/integration/test_runtime_cli.py tests/integration/test_cli_auth_rbac.py -q` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_runtime_state.py tests/unit/test_cli_rich_output.py tests/integration/test_cli_auth_rbac.py -q` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync ruff check src/synapse_os/cli/app.py src/synapse_os/cli/rendering.py src/synapse_os/runtime/service.py src/synapse_os/runtime/state.py tests/unit/test_runtime_state.py tests/unit/test_cli_rich_output.py tests/integration/test_cli_auth_rbac.py` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m mypy src/synapse_os/cli/app.py src/synapse_os/cli/rendering.py src/synapse_os/runtime/service.py src/synapse_os/runtime/state.py` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_runtime_state.py tests/unit/test_runtime_service_security.py tests/unit/test_cli_rich_output.py tests/integration/test_runtime_cli.py tests/integration/test_cli_auth_rbac.py -q` - `./scripts/commit-check.sh --no-sync --skip-branch-validation --skip-docker --skip-security` - `./scripts/security-gate.sh` diff --git a/features/F32-runtime-resident-principal-binding/SPEC.md b/features/F32-runtime-resident-principal-binding/SPEC.md index a48a862..9b15564 100644 --- a/features/F32-runtime-resident-principal-binding/SPEC.md +++ b/features/F32-runtime-resident-principal-binding/SPEC.md @@ -9,14 +9,14 @@ inputs: - docs/architecture/SPEC_FORMAT.md - features/F29-auth-rbac-foundation/SPEC.md - features/F31-g11-remote-auth-decomposition/SPEC.md - - src/aignt_os/cli/app.py - - src/aignt_os/runtime/state.py - - src/aignt_os/runtime/service.py + - src/synapse_os/cli/app.py + - src/synapse_os/runtime/state.py + - src/synapse_os/runtime/service.py outputs: - runtime_started_by_binding - runtime_auth_red_tests constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "trabalhar apenas o menor recorte implementavel do bucket `resident_transport_auth`" - "nao introduzir socket, IPC, transporte em rede, RBAC novo ou coordenacao entre hosts" - "preservar compatibilidade com estado legado do runtime sem `started_by`" @@ -48,7 +48,7 @@ arquivo e auth apenas na borda da CLI. O menor recorte implementavel agora e vincular esse runtime residente ao principal autenticado que o iniciou. Isso endurece o lifecycle local sem inventar transporte novo -e preserva o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS. +e preserva o Synapse-Flow como a engine propria de pipeline do SynapseOS. # Objetivo diff --git a/features/F33-post-f32-handoff-sync/REPORT.md b/features/F33-post-f32-handoff-sync/REPORT.md index 963c553..a8e4f94 100644 --- a/features/F33-post-f32-handoff-sync/REPORT.md +++ b/features/F33-post-f32-handoff-sync/REPORT.md @@ -3,7 +3,7 @@ ## Resumo executivo - A `F33-post-f32-handoff-sync` realinhou o handoff operacional ao estado real do baseline apos a merge da `F32`. -- A frente permaneceu doc-only: nao houve mudanca funcional de CLI, runtime, auth registry nem do AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS. +- A frente permaneceu doc-only: nao houve mudanca funcional de CLI, runtime, auth registry nem do Synapse-Flow, a engine propria de pipeline do SynapseOS. - O backlog de `G-11` agora reflete explicitamente que a fundacao local foi absorvida em `F29`/`F30` e que a `F32` entregou o primeiro slice do bucket `resident_transport_auth`. ## Escopo alterado @@ -17,8 +17,8 @@ ## Validacoes executadas -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python - <<'PY' ... validate_spec_file(Path('features/F33-post-f32-handoff-sync/SPEC.md')) ... PY` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_auth_registry_docs.py -q` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python - <<'PY' ... validate_spec_file(Path('features/F33-post-f32-handoff-sync/SPEC.md')) ... PY` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_auth_registry_docs.py -q` - `./scripts/commit-check.sh --no-sync --skip-branch-validation --skip-docker --skip-security` - `./scripts/security-gate.sh` diff --git a/features/F33-post-f32-handoff-sync/SPEC.md b/features/F33-post-f32-handoff-sync/SPEC.md index 4787b75..26868a4 100644 --- a/features/F33-post-f32-handoff-sync/SPEC.md +++ b/features/F33-post-f32-handoff-sync/SPEC.md @@ -17,7 +17,7 @@ outputs: - post_f32_handoff_alignment - updated_g11_resident_auth_baseline_docs constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "restringir a frente a handoff e backlog docs; sem alteracao funcional de CLI, runtime ou auth" - "nao introduzir nova feature de produto, socket, IPC, transporte remoto ou ADR" - "nao exigir DOCKER_PREFLIGHT, porque a frente nao depende de Docker, build, boot ou integracao pratica" @@ -41,7 +41,7 @@ dependencies: A `F31-g11-remote-auth-decomposition` removeu a ambiguidade de `G-11` e a `F32-runtime-resident-principal-binding` entregou o primeiro slice concreto do bucket `resident_transport_auth` no baseline atual. -O AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS, e o runtime +O Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS, e o runtime segue local-only, sem socket, IPC autenticado ou operacao entre hosts. Apesar disso, o handoff operacional ainda parou antes da `F32`: `PENDING_LOG.md`, diff --git a/features/F33-tui-dashboard/SPEC.md b/features/F33-tui-dashboard/SPEC.md index 961973f..60200ff 100644 --- a/features/F33-tui-dashboard/SPEC.md +++ b/features/F33-tui-dashboard/SPEC.md @@ -9,7 +9,7 @@ outputs: - "Interface interativa no terminal exibindo estado, passos e logs da run" - "Encerramento limpo ao pressionar 'q' ou Ctrl+C" acceptance_criteria: - - "O comando `aignt runs watch ` deve abrir uma TUI sem travar a CLI" + - "O comando `synapse runs watch ` deve abrir uma TUI sem travar a CLI" - "A TUI deve exibir o ID, Status Atual, Estado Atual e Spec Path da run" - "A TUI deve listar os steps já executados com ícones de status (✅, ❌, ⏳)" - "A TUI deve permitir visualizar detalhes do step selecionado" @@ -27,8 +27,8 @@ non_goals: # Contexto -Atualmente, o operador precisa executar repetidamente `aignt runs show ` ou usar `watch -n 1 ...` para acompanhar o progresso de uma run longa. Isso é ineficiente e oferece uma experiência de usuário pobre ("cega"), dificultando a identificação rápida de travamentos ou falhas. +Atualmente, o operador precisa executar repetidamente `synapse runs show ` ou usar `watch -n 1 ...` para acompanhar o progresso de uma run longa. Isso é ineficiente e oferece uma experiência de usuário pobre ("cega"), dificultando a identificação rápida de travamentos ou falhas. # Objetivo -Implementar um comando `aignt runs watch` que exiba um dashboard textual (TUI) usando a biblioteca `textual`. O dashboard deve conectar-se ao banco de dados SQLite local em modo somente leitura (polling), exibindo o cabeçalho da run e a lista de steps conforme eles são persistidos pelo worker. +Implementar um comando `synapse runs watch` que exiba um dashboard textual (TUI) usando a biblioteca `textual`. O dashboard deve conectar-se ao banco de dados SQLite local em modo somente leitura (polling), exibindo o cabeçalho da run e a lista de steps conforme eles são persistidos pelo worker. diff --git a/features/F34-async-submit-runtime-ownership/REPORT.md b/features/F34-async-submit-runtime-ownership/REPORT.md index cadafec..e9e4e99 100644 --- a/features/F34-async-submit-runtime-ownership/REPORT.md +++ b/features/F34-async-submit-runtime-ownership/REPORT.md @@ -3,7 +3,7 @@ ## Resumo executivo - A `F34-async-submit-runtime-ownership` fecha o gap de ownership no `runs submit` autenticado quando o dispatch resolve para `async`. -- O gate reaproveita o binding `started_by` entregue pela `F32` e mantém o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS. +- O gate reaproveita o binding `started_by` entregue pela `F32` e mantém o Synapse-Flow como a engine propria de pipeline do SynapseOS. - O recorte permaneceu local-only: sem socket, sem IPC, sem alteracao no worker e sem mudanca no caminho `sync`. ## Escopo alterado @@ -17,10 +17,10 @@ ## Validacoes executadas - `validate_spec_file(Path('features/F34-async-submit-runtime-ownership/SPEC.md'))` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_runtime_dispatch.py tests/integration/test_cli_auth_rbac.py -q` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_runtime_dispatch.py tests/integration/test_cli_auth_rbac.py tests/integration/test_runs_submit_cli.py tests/integration/test_worker_runtime_flow.py -q` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync ruff check src/aignt_os/cli/app.py src/aignt_os/runtime/dispatch.py tests/unit/test_runtime_dispatch.py tests/integration/test_cli_auth_rbac.py` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m mypy src/aignt_os/cli/app.py src/aignt_os/runtime/dispatch.py` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_runtime_dispatch.py tests/integration/test_cli_auth_rbac.py -q` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_runtime_dispatch.py tests/integration/test_cli_auth_rbac.py tests/integration/test_runs_submit_cli.py tests/integration/test_worker_runtime_flow.py -q` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync ruff check src/synapse_os/cli/app.py src/synapse_os/runtime/dispatch.py tests/unit/test_runtime_dispatch.py tests/integration/test_cli_auth_rbac.py` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m mypy src/synapse_os/cli/app.py src/synapse_os/runtime/dispatch.py` - `./scripts/commit-check.sh --no-sync --skip-branch-validation --skip-docker --skip-security` - `./scripts/security-gate.sh` diff --git a/features/F34-async-submit-runtime-ownership/SPEC.md b/features/F34-async-submit-runtime-ownership/SPEC.md index 49dfeb3..4fd02fb 100644 --- a/features/F34-async-submit-runtime-ownership/SPEC.md +++ b/features/F34-async-submit-runtime-ownership/SPEC.md @@ -10,14 +10,14 @@ inputs: - features/F15-public-run-submission/SPEC.md - features/F29-auth-rbac-foundation/SPEC.md - features/F32-runtime-resident-principal-binding/SPEC.md - - src/aignt_os/cli/app.py - - src/aignt_os/runtime/dispatch.py - - src/aignt_os/runtime/service.py + - src/synapse_os/cli/app.py + - src/synapse_os/runtime/dispatch.py + - src/synapse_os/runtime/service.py outputs: - async_dispatch_runtime_ownership_gate - async_submit_auth_red_tests constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "restringir a frente ao dispatch autenticado de `runs submit`; sem mudar socket, IPC, transporte remoto ou auth registry" - "preservar compatibilidade quando `auth_enabled=false`" - "preservar fallback compativel para estado legado do runtime sem `started_by`" @@ -45,7 +45,7 @@ dependencies: Depois da `F29` e da `F30`, `runs submit` ja exige auth local quando ela estiver habilitada. Depois da `F32`, o runtime residente local passou a persistir `started_by` como o principal autenticado que o iniciou, sem abrir socket nem transporte novo. O -AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS. +Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS. Mesmo assim, o caminho autenticado de `runs submit` ainda aceita dispatch assinado como `async` sem verificar se o runtime residente disponivel pertence ao mesmo principal. diff --git a/features/F35-worker-runtime-ownership-filter/REPORT.md b/features/F35-worker-runtime-ownership-filter/REPORT.md index db31395..d5f5b3c 100644 --- a/features/F35-worker-runtime-ownership-filter/REPORT.md +++ b/features/F35-worker-runtime-ownership-filter/REPORT.md @@ -3,7 +3,7 @@ ## Resumo executivo - A `F35-worker-runtime-ownership-filter` fecha o ownership local no consumo da fila pelo worker do runtime residente. -- O worker agora filtra runs pendentes compatíveis com `started_by` quando o runtime autenticado está ativo, mantendo o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS. +- O worker agora filtra runs pendentes compatíveis com `started_by` quando o runtime autenticado está ativo, mantendo o Synapse-Flow como a engine propria de pipeline do SynapseOS. - O recorte permaneceu local-only: sem mudança de CLI pública, sem schema novo e sem transporte remoto. ## Escopo alterado @@ -17,9 +17,9 @@ ## Validacoes executadas - `validate_spec_file(Path('features/F35-worker-runtime-ownership-filter/SPEC.md'))` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_worker_runtime.py tests/integration/test_worker_runtime_flow.py -q` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync ruff check src/aignt_os/runtime/worker.py src/aignt_os/persistence.py tests/unit/test_worker_runtime.py tests/integration/test_worker_runtime_flow.py` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m mypy src/aignt_os/runtime/worker.py src/aignt_os/persistence.py` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_worker_runtime.py tests/integration/test_worker_runtime_flow.py -q` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync ruff check src/synapse_os/runtime/worker.py src/synapse_os/persistence.py tests/unit/test_worker_runtime.py tests/integration/test_worker_runtime_flow.py` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m mypy src/synapse_os/runtime/worker.py src/synapse_os/persistence.py` - `./scripts/commit-check.sh --no-sync --skip-branch-validation --skip-docker --skip-security` - `./scripts/security-gate.sh` diff --git a/features/F35-worker-runtime-ownership-filter/SPEC.md b/features/F35-worker-runtime-ownership-filter/SPEC.md index ec9108d..89ce716 100644 --- a/features/F35-worker-runtime-ownership-filter/SPEC.md +++ b/features/F35-worker-runtime-ownership-filter/SPEC.md @@ -9,15 +9,15 @@ inputs: - docs/architecture/SPEC_FORMAT.md - features/F32-runtime-resident-principal-binding/SPEC.md - features/F34-async-submit-runtime-ownership/SPEC.md - - src/aignt_os/runtime/worker.py - - src/aignt_os/persistence.py + - src/synapse_os/runtime/worker.py + - src/synapse_os/persistence.py - tests/unit/test_worker_runtime.py - tests/integration/test_worker_runtime_flow.py outputs: - worker_runtime_owner_filter - worker_owner_filter_red_tests constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "restringir a frente ao consumo da fila pelo worker; sem alterar CLI publica, socket, IPC, transporte remoto ou auth registry" - "preservar compatibilidade com runs legadas sem owner autenticado explicito" - "nao exigir DOCKER_PREFLIGHT porque a frente nao depende de Docker, build, boot em container ou integracao externa" @@ -42,7 +42,7 @@ dependencies: A `F32` vinculou o runtime residente local ao principal autenticado que o iniciou por meio de `started_by`. A `F34` fechou o gap no submit autenticado, impedindo enqueue assinado para `async` quando o runtime residente nao esta pronto ou pertence a outro -principal. O AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS. +principal. O Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS. Mesmo assim, o worker residente ainda consome a fila apenas por FIFO simples. Isso significa que um runtime autenticado pode executar runs pendentes de outro principal diff --git a/features/F36-worker-owner-skip-observability/REPORT.md b/features/F36-worker-owner-skip-observability/REPORT.md index 9497530..1c6568f 100644 --- a/features/F36-worker-owner-skip-observability/REPORT.md +++ b/features/F36-worker-owner-skip-observability/REPORT.md @@ -3,7 +3,7 @@ ## Resumo executivo - A `F36-worker-owner-skip-observability` torna auditavel quando o worker autenticado do runtime residente pula uma run pendente de outro principal por mismatch de ownership. -- O evento `runtime_owner_skip` passa a ser persistido na propria run incompatível, preservando o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS. +- O evento `runtime_owner_skip` passa a ser persistido na propria run incompatível, preservando o Synapse-Flow como a engine propria de pipeline do SynapseOS. - O recorte permaneceu local-only: sem mudanca de CLI publica, sem schema novo e sem transporte remoto. ## Escopo alterado @@ -18,9 +18,9 @@ ## Validacoes executadas - `validate_spec_file(Path('features/F36-worker-owner-skip-observability/SPEC.md'))` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_worker_runtime.py tests/integration/test_worker_runtime_flow.py -q` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync ruff check src/aignt_os/runtime/worker.py src/aignt_os/persistence.py tests/unit/test_worker_runtime.py tests/integration/test_worker_runtime_flow.py` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m mypy src/aignt_os/runtime/worker.py src/aignt_os/persistence.py` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_worker_runtime.py tests/integration/test_worker_runtime_flow.py -q` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync ruff check src/synapse_os/runtime/worker.py src/synapse_os/persistence.py tests/unit/test_worker_runtime.py tests/integration/test_worker_runtime_flow.py` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m mypy src/synapse_os/runtime/worker.py src/synapse_os/persistence.py` - `./scripts/commit-check.sh --no-sync --skip-branch-validation --skip-docker --skip-security` - `./scripts/security-gate.sh` diff --git a/features/F36-worker-owner-skip-observability/SPEC.md b/features/F36-worker-owner-skip-observability/SPEC.md index d8c54ee..cbc8aac 100644 --- a/features/F36-worker-owner-skip-observability/SPEC.md +++ b/features/F36-worker-owner-skip-observability/SPEC.md @@ -8,9 +8,9 @@ inputs: - docs/architecture/TDD.md - docs/architecture/SPEC_FORMAT.md - features/F35-worker-runtime-ownership-filter/SPEC.md - - src/aignt_os/runtime/worker.py - - src/aignt_os/persistence.py - - src/aignt_os/cli/rendering.py + - src/synapse_os/runtime/worker.py + - src/synapse_os/persistence.py + - src/synapse_os/cli/rendering.py - tests/unit/test_worker_runtime.py - tests/integration/test_worker_runtime_flow.py - tests/integration/test_runs_cli.py @@ -18,7 +18,7 @@ outputs: - worker_owner_skip_event - owner_skip_observability_red_tests constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "restringir a frente a observabilidade do skip no worker; sem mudar CLI publica, schema SQLite, socket, IPC ou transporte remoto" - "preservar a politica atual de skip e seguir para runs incompatíveis" - "nao exigir DOCKER_PREFLIGHT porque a frente nao depende de Docker, build, boot em container ou integracao externa" @@ -27,7 +27,7 @@ acceptance_criteria: - "A run incompatível continua `pending` e `locked=false`, e o worker segue para a próxima run compatível sem falhar a fila." - "Polls consecutivos sem mudança no motivo do skip nao duplicam o mesmo evento `runtime_owner_skip` na mesma run." - "Runs legadas compativeis (`unknown`, `system`, `local_cli`) nao recebem evento de skip." - - "Existe cobertura unitaria e de integracao para registro do evento, deduplicacao e exibicao em `aignt runs show `." + - "Existe cobertura unitaria e de integracao para registro do evento, deduplicacao e exibicao em `synapse runs show `." non_goals: - "alterar o contrato de `runs submit` ou `runtime start|run|stop|status`" - "criar novo comando publico, painel novo ou migration de persistencia" @@ -41,8 +41,8 @@ dependencies: A `F35` fechou o ownership local no consumo da fila: o worker autenticado so processa runs pendentes compativeis com `started_by`, pulando runs de outro principal e seguindo -para a proxima compativel. O AIgnt-Synapse-Flow continua sendo a engine propria de -pipeline do AIgnt OS. +para a proxima compativel. O Synapse-Flow continua sendo a engine propria de +pipeline do SynapseOS. O residual local mais imediato agora e observabilidade. Hoje o skip acontece de forma segura, mas a run incompatível continua pendente sem explicar por que nao foi @@ -96,7 +96,7 @@ principal, reutilizando os eventos persistidos e a observabilidade local ja exis ## Cenario 3: observabilidade aparece em runs show - Dado uma run pendente incompatível com `runtime_owner_skip` -- Quando `aignt runs show ` for executado +- Quando `synapse runs show ` for executado - Entao `Latest Signal` exibe `runtime_owner_skip @ REQUEST` - E a mensagem do evento aparece na secao de eventos diff --git a/features/F37-post-f36-g11-sync/REPORT.md b/features/F37-post-f36-g11-sync/REPORT.md index 2bf5e68..58dfc48 100644 --- a/features/F37-post-f36-g11-sync/REPORT.md +++ b/features/F37-post-f36-g11-sync/REPORT.md @@ -3,7 +3,7 @@ ## Resumo executivo - A `F37-post-f36-g11-sync` realinha backlog e handoff ao estado real do baseline apos a `F36`. -- A frente permaneceu doc-only: nao houve mudanca funcional de CLI, runtime, auth, persistencia nem do AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS. +- A frente permaneceu doc-only: nao houve mudanca funcional de CLI, runtime, auth, persistencia nem do Synapse-Flow, a engine propria de pipeline do SynapseOS. - O backlog de `G-11` agora deixa explicito que a fundacao local e o bucket residente local ja foram absorvidos no baseline atual, mantendo apenas `remote_multi_host_auth` como pendencia aberta. ## Escopo alterado @@ -16,10 +16,10 @@ ## Validacoes executadas -- `env PYTHONPATH=/tmp/aignt-os-worktrees/F37-post-f36-g11-sync/src /home/g0dsssp33d/work/projects/aignt-os/.venv-codex-runtime/bin/python - <<'PY' ... validate_spec_file(Path('features/F37-post-f36-g11-sync/SPEC.md')) ... PY` -- `env PYTHONPATH=/tmp/aignt-os-worktrees/F37-post-f36-g11-sync/src /home/g0dsssp33d/work/projects/aignt-os/.venv-codex-runtime/bin/python -m pytest tests/unit/test_auth_registry_docs.py -q` -- `env PYTHONPATH=/tmp/aignt-os-worktrees/F37-post-f36-g11-sync/src /home/g0dsssp33d/work/projects/aignt-os/.venv-codex-runtime/bin/python -m ruff check tests/unit/test_auth_registry_docs.py` -- `env UV_PROJECT_ENVIRONMENT=/home/g0dsssp33d/work/projects/aignt-os/.venv-codex-runtime UV_CACHE_DIR=/tmp/aignt-os-worktrees/F37-post-f36-g11-sync/.cache/uv ./scripts/commit-check.sh --no-sync --skip-branch-validation --skip-docker --skip-security` +- `env PYTHONPATH=/tmp/synapse-os-worktrees/F37-post-f36-g11-sync/src /home/g0dsssp33d/work/projects/synapse-os/.venv-codex-runtime/bin/python - <<'PY' ... validate_spec_file(Path('features/F37-post-f36-g11-sync/SPEC.md')) ... PY` +- `env PYTHONPATH=/tmp/synapse-os-worktrees/F37-post-f36-g11-sync/src /home/g0dsssp33d/work/projects/synapse-os/.venv-codex-runtime/bin/python -m pytest tests/unit/test_auth_registry_docs.py -q` +- `env PYTHONPATH=/tmp/synapse-os-worktrees/F37-post-f36-g11-sync/src /home/g0dsssp33d/work/projects/synapse-os/.venv-codex-runtime/bin/python -m ruff check tests/unit/test_auth_registry_docs.py` +- `env UV_PROJECT_ENVIRONMENT=/home/g0dsssp33d/work/projects/synapse-os/.venv-codex-runtime UV_CACHE_DIR=/tmp/synapse-os-worktrees/F37-post-f36-g11-sync/.cache/uv ./scripts/commit-check.sh --no-sync --skip-branch-validation --skip-docker --skip-security` - `./scripts/security-gate.sh` ## Review de seguranca diff --git a/features/F37-post-f36-g11-sync/SPEC.md b/features/F37-post-f36-g11-sync/SPEC.md index da64c5e..c6f31f4 100644 --- a/features/F37-post-f36-g11-sync/SPEC.md +++ b/features/F37-post-f36-g11-sync/SPEC.md @@ -18,7 +18,7 @@ outputs: - post_f36_g11_alignment - updated_g11_local_vs_remote_baseline_docs constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "restringir a frente a docs e handoff; sem alteracao funcional de CLI, runtime, auth ou persistencia" - "nao introduzir nova feature de produto, transporte remoto, socket, IPC ou ADR" - "nao exigir DOCKER_PREFLIGHT, porque a frente nao depende de Docker, build, boot ou integracao pratica" @@ -44,8 +44,8 @@ dependencies: A `F33-post-f32-handoff-sync` alinhou o baseline ao estado pos-`F32`, quando o bucket `resident_transport_auth` ainda tinha apenas o primeiro slice concreto absorvido. Depois disso, `main` incorporou a `F34`, a `F35` e a `F36`, fechando ownership local no submit, -no consumo da fila pelo worker e na observabilidade do skip. O AIgnt-Synapse-Flow -continua sendo a engine propria de pipeline do AIgnt OS, e nenhuma frente de transporte +no consumo da fila pelo worker e na observabilidade do skip. O Synapse-Flow +continua sendo a engine propria de pipeline do SynapseOS, e nenhuma frente de transporte remoto ou multi-host foi iniciada. Apesar disso, a documentacao central e o handoff duravel ainda pararam antes dessas diff --git a/features/F38-runtime-state-root-hardening/REPORT.md b/features/F38-runtime-state-root-hardening/REPORT.md index 4b7508f..57fabb1 100644 --- a/features/F38-runtime-state-root-hardening/REPORT.md +++ b/features/F38-runtime-state-root-hardening/REPORT.md @@ -3,7 +3,7 @@ ## Resumo executivo - A `F38-runtime-state-root-hardening` endurece o diretório de estado compartilhado de runtime, auth registry e circuit breaker contra escapes do `workspace_root`. -- O boundary passa a ser aplicado em `AppSettings`, preservando o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS sem abrir nova superficie publica. +- O boundary passa a ser aplicado em `AppSettings`, preservando o Synapse-Flow como a engine propria de pipeline do SynapseOS sem abrir nova superficie publica. - O recorte permaneceu não conflitante com a frente da TUI: sem tocar dashboard, watch mode, socket, IPC ou transporte remoto. ## Escopo alterado @@ -11,18 +11,18 @@ - `AppSettings` passa a resolver `runtime_state_dir` por canonicalizacao dentro de `workspace_root` - `runtime_state_file`, `auth_registry_file` e `adapter_circuit_breaker_state_file` passam a herdar o mesmo boundary confiável - `runtime`, `auth` e fluxos que dependem desses arquivos agora retornam erro de ambiente previsivel quando o state-dir configurado escapa da raiz confiável -- fixtures e integrações que usam `tmp_path` passam a declarar `AIGNT_OS_WORKSPACE_ROOT` explicitamente quando necessário +- fixtures e integrações que usam `tmp_path` passam a declarar `SYNAPSE_OS_WORKSPACE_ROOT` explicitamente quando necessário - `tests/integration/test_runs_submit_cli.py` foi alinhado para usar o mesmo `runtime_state_dir` do ambiente sob teste - `SPEC.md`, `NOTES.md`, `CHECKLIST.md` e este `REPORT.md` adicionados para a `F38` ## Validacoes executadas - `validate_spec_file(Path("features/F38-runtime-state-root-hardening/SPEC.md"))` -- `env PYTHONPATH=/tmp/aignt-os-worktrees/F38-runtime-state-root-hardening/src /tmp/aignt-os-worktrees/F38-runtime-state-root-hardening/.venv/bin/python -m pytest tests/unit/test_config.py tests/integration/test_runtime_cli.py tests/integration/test_cli_auth_registry.py tests/unit/test_cli_adapter.py tests/integration/test_doctor_cli.py tests/integration/test_cli_error_model.py tests/integration/test_worker_runtime_flow.py tests/integration/test_codex_adapter_operational.py -q` -- `env PYTHONPATH=/tmp/aignt-os-worktrees/F38-runtime-state-root-hardening/src /tmp/aignt-os-worktrees/F38-runtime-state-root-hardening/.venv/bin/python -m pytest tests/integration/test_runs_submit_cli.py -q` -- `env PYTHONPATH=/tmp/aignt-os-worktrees/F38-runtime-state-root-hardening/src /tmp/aignt-os-worktrees/F38-runtime-state-root-hardening/.venv/bin/python -m ruff check src/aignt_os/config.py src/aignt_os/cli/app.py tests/unit/test_config.py tests/unit/test_cli_adapter.py tests/integration/conftest.py tests/integration/test_runtime_cli.py tests/integration/test_cli_auth_registry.py tests/integration/test_cli_error_model.py tests/integration/test_doctor_cli.py tests/integration/test_worker_runtime_flow.py tests/integration/test_codex_adapter_operational.py tests/integration/test_runs_submit_cli.py` -- `env PYTHONPATH=/tmp/aignt-os-worktrees/F38-runtime-state-root-hardening/src /tmp/aignt-os-worktrees/F38-runtime-state-root-hardening/.venv/bin/python -m mypy src/aignt_os/config.py src/aignt_os/cli/app.py` -- `env UV_CACHE_DIR=/tmp/aignt-os-worktrees/F38-runtime-state-root-hardening/.cache/uv ./scripts/commit-check.sh --no-sync --skip-branch-validation --skip-docker --skip-security` +- `env PYTHONPATH=/tmp/synapse-os-worktrees/F38-runtime-state-root-hardening/src /tmp/synapse-os-worktrees/F38-runtime-state-root-hardening/.venv/bin/python -m pytest tests/unit/test_config.py tests/integration/test_runtime_cli.py tests/integration/test_cli_auth_registry.py tests/unit/test_cli_adapter.py tests/integration/test_doctor_cli.py tests/integration/test_cli_error_model.py tests/integration/test_worker_runtime_flow.py tests/integration/test_codex_adapter_operational.py -q` +- `env PYTHONPATH=/tmp/synapse-os-worktrees/F38-runtime-state-root-hardening/src /tmp/synapse-os-worktrees/F38-runtime-state-root-hardening/.venv/bin/python -m pytest tests/integration/test_runs_submit_cli.py -q` +- `env PYTHONPATH=/tmp/synapse-os-worktrees/F38-runtime-state-root-hardening/src /tmp/synapse-os-worktrees/F38-runtime-state-root-hardening/.venv/bin/python -m ruff check src/synapse_os/config.py src/synapse_os/cli/app.py tests/unit/test_config.py tests/unit/test_cli_adapter.py tests/integration/conftest.py tests/integration/test_runtime_cli.py tests/integration/test_cli_auth_registry.py tests/integration/test_cli_error_model.py tests/integration/test_doctor_cli.py tests/integration/test_worker_runtime_flow.py tests/integration/test_codex_adapter_operational.py tests/integration/test_runs_submit_cli.py` +- `env PYTHONPATH=/tmp/synapse-os-worktrees/F38-runtime-state-root-hardening/src /tmp/synapse-os-worktrees/F38-runtime-state-root-hardening/.venv/bin/python -m mypy src/synapse_os/config.py src/synapse_os/cli/app.py` +- `env UV_CACHE_DIR=/tmp/synapse-os-worktrees/F38-runtime-state-root-hardening/.cache/uv ./scripts/commit-check.sh --no-sync --skip-branch-validation --skip-docker --skip-security` - `./scripts/security-gate.sh` ## Review de seguranca @@ -35,7 +35,7 @@ - Mitigacoes aplicadas: - a canonicalizacao de `runtime_state_dir` reutiliza `resolve_path_within_root`, bloqueando escapes absolutos e por symlink - a CLI converte `ValueError` de configuração em `environment_error(...)` nos pontos que acessam runtime state e auth registry - - a suite de integração foi ajustada para declarar `AIGNT_OS_WORKSPACE_ROOT` de forma explícita onde o root confiável diverge do cwd do teste + - a suite de integração foi ajustada para declarar `SYNAPSE_OS_WORKSPACE_ROOT` de forma explícita onde o root confiável diverge do cwd do teste ## Riscos residuais diff --git a/features/F38-runtime-state-root-hardening/SPEC.md b/features/F38-runtime-state-root-hardening/SPEC.md index 573ed6e..8717fcc 100644 --- a/features/F38-runtime-state-root-hardening/SPEC.md +++ b/features/F38-runtime-state-root-hardening/SPEC.md @@ -7,24 +7,24 @@ inputs: - docs/architecture/SDD.md - docs/architecture/TDD.md - docs/architecture/SPEC_FORMAT.md - - src/aignt_os/config.py - - src/aignt_os/runtime/state.py - - src/aignt_os/auth.py - - src/aignt_os/runtime/circuit_breaker.py - - src/aignt_os/cli/app.py + - src/synapse_os/config.py + - src/synapse_os/runtime/state.py + - src/synapse_os/auth.py + - src/synapse_os/runtime/circuit_breaker.py + - src/synapse_os/cli/app.py outputs: - trusted_runtime_state_root - state_dir_hardening_red_tests constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "restringir a frente ao state-dir compartilhado de runtime/auth/circuit-breaker; sem tocar TUI, socket, IPC ou transporte remoto" - "preservar a CLI publica atual, mudando apenas o erro configuracional para state-dir fora da raiz confiável" - "nao exigir DOCKER_PREFLIGHT porque a frente nao depende de Docker, build, boot em container ou integracao externa" acceptance_criteria: - - "`AIGNT_OS_RUNTIME_STATE_DIR` passa a resolver apenas para um path canonico dentro de `workspace_root`, rejeitando escapes por path absoluto fora da raiz ou por symlink." + - "`SYNAPSE_OS_RUNTIME_STATE_DIR` passa a resolver apenas para um path canonico dentro de `workspace_root`, rejeitando escapes por path absoluto fora da raiz ou por symlink." - "`runtime_state_file`, `auth_registry_file` e `adapter_circuit_breaker_state_file` passam a herdar o mesmo boundary confiável." - - "`aignt runtime start` e `aignt auth init` falham com erro configuracional previsivel quando o state-dir configurado escapa da raiz confiável." - - "A configuracao valida atual continua funcionando quando `AIGNT_OS_WORKSPACE_ROOT` aponta para a raiz usada nos testes e no fluxo local." + - "`synapse runtime start` e `synapse auth init` falham com erro configuracional previsivel quando o state-dir configurado escapa da raiz confiável." + - "A configuracao valida atual continua funcionando quando `SYNAPSE_OS_WORKSPACE_ROOT` aponta para a raiz usada nos testes e no fluxo local." - "Existe cobertura unitaria e de integracao para configuracao valida, path invalido fora do workspace e escape por symlink." non_goals: - "alterar `runs_db_path` ou `artifacts_dir`" @@ -70,7 +70,7 @@ workspace, reutilizando canonicalizacao de path ja existente e mantendo erros pr - `runtime_state_dir` absoluto fora de `workspace_root` continuar aceito - symlink dentro do workspace escapar para um target fora da raiz confiável -- `aignt auth init` gerar traceback em vez de erro previsivel para state-dir invalido +- `synapse auth init` gerar traceback em vez de erro previsivel para state-dir invalido - fixtures atuais de runtime falharem por nao declarar `workspace_root` # Cenarios verificaveis diff --git a/features/F39-persistence-path-root-hardening/REPORT.md b/features/F39-persistence-path-root-hardening/REPORT.md index 0420b5f..3a45163 100644 --- a/features/F39-persistence-path-root-hardening/REPORT.md +++ b/features/F39-persistence-path-root-hardening/REPORT.md @@ -3,7 +3,7 @@ ## Resumo executivo - A `F39-persistence-path-root-hardening` endurece `runs_db_path` e `artifacts_dir` contra escapes do `workspace_root`. -- O boundary passa a ser aplicado em `AppSettings` e consumido pelos entrypoints de CLI, worker e dashboard, preservando o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS. +- O boundary passa a ser aplicado em `AppSettings` e consumido pelos entrypoints de CLI, worker e dashboard, preservando o Synapse-Flow como a engine propria de pipeline do SynapseOS. - O recorte permaneceu pequeno e independente da frente visual: sem alterar watch mode como produto, sem migracao de schema e sem tocar auth remota. ## Escopo alterado @@ -18,8 +18,8 @@ - `validate_spec_file(Path("features/F39-persistence-path-root-hardening/SPEC.md"))` - `pytest tests/unit/test_config.py tests/integration/test_runs_submit_cli.py tests/integration/test_runs_cli.py tests/integration/test_doctor_cli.py -q` -- `ruff check src/aignt_os/config.py src/aignt_os/cli/app.py src/aignt_os/runtime/worker.py src/aignt_os/cli/dashboard.py tests/unit/test_config.py tests/integration/test_runs_submit_cli.py tests/integration/test_runs_cli.py tests/integration/test_doctor_cli.py` -- `mypy src/aignt_os/config.py src/aignt_os/cli/app.py src/aignt_os/runtime/worker.py src/aignt_os/cli/dashboard.py` +- `ruff check src/synapse_os/config.py src/synapse_os/cli/app.py src/synapse_os/runtime/worker.py src/synapse_os/cli/dashboard.py tests/unit/test_config.py tests/integration/test_runs_submit_cli.py tests/integration/test_runs_cli.py tests/integration/test_doctor_cli.py` +- `mypy src/synapse_os/config.py src/synapse_os/cli/app.py src/synapse_os/runtime/worker.py src/synapse_os/cli/dashboard.py` - `./scripts/commit-check.sh --no-sync --skip-branch-validation --skip-docker --skip-security` - `./scripts/security-gate.sh` @@ -33,7 +33,7 @@ - Mitigacoes aplicadas: - canonicalizacao de `runs_db_path` e `artifacts_dir` com `resolve_path_within_root` - tradução consistente de `ValueError` em `Environment error:` nos entrypoints de CLI - - integração ajustada para declarar `AIGNT_OS_WORKSPACE_ROOT` coerente com os paths persistidos + - integração ajustada para declarar `SYNAPSE_OS_WORKSPACE_ROOT` coerente com os paths persistidos ## Riscos residuais diff --git a/features/F39-persistence-path-root-hardening/SPEC.md b/features/F39-persistence-path-root-hardening/SPEC.md index 58b0ad3..1d81742 100644 --- a/features/F39-persistence-path-root-hardening/SPEC.md +++ b/features/F39-persistence-path-root-hardening/SPEC.md @@ -7,10 +7,10 @@ inputs: - docs/architecture/SDD.md - docs/architecture/TDD.md - docs/architecture/SPEC_FORMAT.md - - src/aignt_os/config.py - - src/aignt_os/cli/app.py - - src/aignt_os/runtime/worker.py - - src/aignt_os/cli/dashboard.py + - src/synapse_os/config.py + - src/synapse_os/cli/app.py + - src/synapse_os/runtime/worker.py + - src/synapse_os/cli/dashboard.py - tests/unit/test_config.py - tests/integration/test_runs_submit_cli.py - tests/integration/test_runs_cli.py @@ -19,15 +19,15 @@ outputs: - trusted_persistence_paths - persistence_boundary_red_tests constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "restringir a frente a `runs_db_path` e `artifacts_dir`, sem tocar TUI como produto, auth remota ou transporte" - "preservar a CLI publica atual, mudando apenas o erro configuracional para paths de persistencia fora da raiz confiavel" - "nao exigir DOCKER_PREFLIGHT porque a frente nao depende de Docker, build, boot em container ou integracao externa" acceptance_criteria: - - "`AIGNT_OS_RUNS_DB_PATH` passa a resolver apenas para um path canonico dentro de `workspace_root`, rejeitando escapes por path absoluto fora da raiz ou por symlink." - - "`AIGNT_OS_ARTIFACTS_DIR` passa a resolver apenas para um path canonico dentro de `workspace_root`, rejeitando escapes por path absoluto fora da raiz ou por symlink." - - "`aignt runs submit`, `aignt runs list` e `aignt runs show` falham com `Environment error:` previsivel quando o banco ou artifacts configurados escapam da raiz confiavel." - - "`aignt doctor` marca `runs_db` e `artifacts_dir` como `fail` sem traceback quando a configuracao de persistencia escapa do `workspace_root`." + - "`SYNAPSE_OS_RUNS_DB_PATH` passa a resolver apenas para um path canonico dentro de `workspace_root`, rejeitando escapes por path absoluto fora da raiz ou por symlink." + - "`SYNAPSE_OS_ARTIFACTS_DIR` passa a resolver apenas para um path canonico dentro de `workspace_root`, rejeitando escapes por path absoluto fora da raiz ou por symlink." + - "`synapse runs submit`, `synapse runs list` e `synapse runs show` falham com `Environment error:` previsivel quando o banco ou artifacts configurados escapam da raiz confiavel." + - "`synapse doctor` marca `runs_db` e `artifacts_dir` como `fail` sem traceback quando a configuracao de persistencia escapa do `workspace_root`." - "Existe cobertura unitaria e de integracao para configuracao valida, path invalido fora do workspace e escape por symlink." non_goals: - "alterar `runtime_state_dir`, que ja foi endurecido na F38" @@ -46,7 +46,7 @@ dois pontos centrais de persistencia configuravel: `runs_db_path` e `artifacts_d Essa lacuna permite que a configuracao aponte para um banco SQLite ou diretorio de artifacts fora da raiz confiavel do workspace, o que quebra a consistencia do boundary operacional do -AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS. +Synapse-Flow, a engine propria de pipeline do SynapseOS. # Objetivo @@ -88,7 +88,7 @@ runs e diretório base de artifacts, mantendo erros previsiveis na CLI e sem amp - Dado `workspace_root` configurado - E `runs_db_path` apontando para um path absoluto fora dessa raiz -- Quando `aignt runs submit` ou `aignt runs list` forem executados +- Quando `synapse runs submit` ou `synapse runs list` forem executados - Entao a CLI falha com `Environment error:` previsivel ## Cenario 3: artifacts nao permitem escape por symlink diff --git a/features/F40-local-cancellation/CHECKLIST.md b/features/F40-local-cancellation/CHECKLIST.md index 7c48c29..f408f39 100644 --- a/features/F40-local-cancellation/CHECKLIST.md +++ b/features/F40-local-cancellation/CHECKLIST.md @@ -1,7 +1,7 @@ # F40 Checklist - [x] SPEC valida mantida como contrato da feature -- [x] `aignt runs cancel ` exposto na CLI publica +- [x] `synapse runs cancel ` exposto na CLI publica - [x] Dashboard TUI permite cancelar a run atual via tecla `k` - [x] Cancelamento permanece local e gracioso, sem `kill -9` - [x] Estado de cancelamento persiste no baseline atual diff --git a/features/F40-local-cancellation/NOTES.md b/features/F40-local-cancellation/NOTES.md index 8da265f..5a541a6 100644 --- a/features/F40-local-cancellation/NOTES.md +++ b/features/F40-local-cancellation/NOTES.md @@ -1,6 +1,6 @@ # F40 Notes - A feature ficou deliberadamente restrita a cancelamento local e gracioso de runs ja persistidas. -- A superficie publica entregue foi `aignt runs cancel ` e o atalho `k` no dashboard TUI atual. +- A superficie publica entregue foi `synapse runs cancel ` e o atalho `k` no dashboard TUI atual. - O baseline nao inclui cancelamento distribuido, fila remota, scheduler nem interrupcao forcada de subprocessos. -- O worker/runtime observa o sinal de cancelamento dentro do fluxo atual do AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS. +- O worker/runtime observa o sinal de cancelamento dentro do fluxo atual do Synapse-Flow, a engine propria de pipeline do SynapseOS. diff --git a/features/F40-local-cancellation/REPORT.md b/features/F40-local-cancellation/REPORT.md index a08efdf..97177bc 100644 --- a/features/F40-local-cancellation/REPORT.md +++ b/features/F40-local-cancellation/REPORT.md @@ -3,11 +3,11 @@ ## Resumo executivo - A `F40-local-cancellation` adicionou cancelamento local de runs via CLI e dashboard TUI. -- A feature preservou o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS e nao abriu fila remota, scheduler nem cancelamento distribuido. +- A feature preservou o Synapse-Flow como a engine propria de pipeline do SynapseOS e nao abriu fila remota, scheduler nem cancelamento distribuido. ## Escopo alterado -- superficie publica com `aignt runs cancel ` +- superficie publica com `synapse runs cancel ` - atalho `k` no dashboard TUI para a run atualmente observada - persistencia de sinalizacao de cancelamento para `pending` e `running` diff --git a/features/F40-local-cancellation/SPEC.md b/features/F40-local-cancellation/SPEC.md index f635dae..f30e987 100644 --- a/features/F40-local-cancellation/SPEC.md +++ b/features/F40-local-cancellation/SPEC.md @@ -3,7 +3,7 @@ id: F40-local-cancellation type: feature summary: "Cancelamento local de runs via CLI e TUI com sinalização de graceful shutdown." inputs: - - "Comando CLI `aignt runs cancel `" + - "Comando CLI `synapse runs cancel `" - "Atalho de teclado no dashboard TUI (ex: 'k')" outputs: - "Run transita para estado `cancelling` e depois `cancelled`" @@ -22,7 +22,7 @@ non_goals: # Contexto -Atualmente, uma run iniciada no AIgnt OS (especialmente em modo `worker` residente) só para quando termina todos os steps ou falha. Se o usuário perceber um erro ou mudar de ideia durante uma execução longa, a única opção é matar o processo do worker/CLI, o que pode deixar o estado inconsistente (`running` para sempre no banco) ou corromper arquivos. É necessário um mecanismo oficial para solicitar a interrupção. +Atualmente, uma run iniciada no SynapseOS (especialmente em modo `worker` residente) só para quando termina todos os steps ou falha. Se o usuário perceber um erro ou mudar de ideia durante uma execução longa, a única opção é matar o processo do worker/CLI, o que pode deixar o estado inconsistente (`running` para sempre no banco) ou corromper arquivos. É necessário um mecanismo oficial para solicitar a interrupção. # Objetivo diff --git a/features/F41-dashboard-artifacts-explorer/SPEC.md b/features/F41-dashboard-artifacts-explorer/SPEC.md index 1ba0d37..446a541 100644 --- a/features/F41-dashboard-artifacts-explorer/SPEC.md +++ b/features/F41-dashboard-artifacts-explorer/SPEC.md @@ -25,7 +25,7 @@ non_goals: # Contexto -O AIgnt OS gera diversos artefatos durante a execução (código, relatórios, diagramas) no diretório `artifacts/`. Atualmente, para visualizar esses arquivos, o operador precisa sair da TUI ou abrir um segundo terminal. A feature F17 trouxe o preview via CLI (`runs show --artifact`), mas a experiência na TUI (F33/F39) ainda carece dessa integração. +O SynapseOS gera diversos artefatos durante a execução (código, relatórios, diagramas) no diretório `artifacts/`. Atualmente, para visualizar esses arquivos, o operador precisa sair da TUI ou abrir um segundo terminal. A feature F17 trouxe o preview via CLI (`runs show --artifact`), mas a experiência na TUI (F33/F39) ainda carece dessa integração. # Objetivo diff --git a/features/F42-tui-filters/NOTES.md b/features/F42-tui-filters/NOTES.md index 5ee7a3f..2c1252b 100644 --- a/features/F42-tui-filters/NOTES.md +++ b/features/F42-tui-filters/NOTES.md @@ -1,6 +1,6 @@ # F42 Notes -- A feature ficou restrita a filtragem visual client-side no dashboard TUI atual de `aignt runs watch`. +- A feature ficou restrita a filtragem visual client-side no dashboard TUI atual de `synapse runs watch`. - O baseline entregue usa as teclas `f` para falhas, `r` para atividade e `x` para restaurar todos os steps. - O recorte nao adiciona busca textual, persistencia de filtro entre sessoes nem combinacao complexa de filtros. -- A feature opera apenas sobre a visualizacao local do AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS. +- A feature opera apenas sobre a visualizacao local do Synapse-Flow, a engine propria de pipeline do SynapseOS. diff --git a/features/F42-tui-filters/REPORT.md b/features/F42-tui-filters/REPORT.md index cea04d4..65f2922 100644 --- a/features/F42-tui-filters/REPORT.md +++ b/features/F42-tui-filters/REPORT.md @@ -2,8 +2,8 @@ ## Resumo executivo -- A `F42-tui-filters` adicionou filtros visuais simples ao dashboard TUI de `aignt runs watch`. -- A feature manteve o recorte local do AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS, sem alterar persistencia nem logica de execucao. +- A `F42-tui-filters` adicionou filtros visuais simples ao dashboard TUI de `synapse runs watch`. +- A feature manteve o recorte local do Synapse-Flow como a engine propria de pipeline do SynapseOS, sem alterar persistencia nem logica de execucao. ## Escopo alterado diff --git a/features/F42-tui-filters/SPEC.md b/features/F42-tui-filters/SPEC.md index fecbe63..d70270b 100644 --- a/features/F42-tui-filters/SPEC.md +++ b/features/F42-tui-filters/SPEC.md @@ -3,7 +3,7 @@ id: F42-tui-filters type: feature summary: "Filtros de visualização de steps no dashboard TUI para facilitar análise de runs longas ou com falhas." inputs: - - "Interação via teclado no dashboard TUI (aignt runs watch)" + - "Interação via teclado no dashboard TUI (synapse runs watch)" outputs: - "Lista de steps filtrada na interface" - "Indicador visual do filtro ativo" @@ -22,7 +22,7 @@ non_goals: # Contexto -O dashboard TUI (`aignt runs watch`) atualmente exibe uma lista linear de todos os steps executados em uma run. Em pipelines longos ou com muitas iterações (ex: loops de `worker`), essa lista pode crescer significativamente, dificultando a identificação rápida de falhas ou o acompanhamento dos steps ativos. A necessidade de "rolar" manualmente para encontrar erros é um ponto de atrito na UX, especialmente para triagem de falhas. +O dashboard TUI (`synapse runs watch`) atualmente exibe uma lista linear de todos os steps executados em uma run. Em pipelines longos ou com muitas iterações (ex: loops de `worker`), essa lista pode crescer significativamente, dificultando a identificação rápida de falhas ou o acompanhamento dos steps ativos. A necessidade de "rolar" manualmente para encontrar erros é um ponto de atrito na UX, especialmente para triagem de falhas. # Objetivo diff --git a/features/F44-auth-backend-abstraction/REPORT.md b/features/F44-auth-backend-abstraction/REPORT.md index 5c1981a..a965e79 100644 --- a/features/F44-auth-backend-abstraction/REPORT.md +++ b/features/F44-auth-backend-abstraction/REPORT.md @@ -9,12 +9,12 @@ Abstração do backend de autenticação para permitir a integração futura com - Adicionado campo `auth_provider` em `AppSettings` (default: "file"). - Validado via Pydantic para garantir apenas valores suportados. -### 2. Core de Autenticação (`src/aignt_os/auth.py`) +### 2. Core de Autenticação (`src/synapse_os/auth.py`) - Definido protocolo `AuthProvider` com método `authenticate`. - Implementada factory `get_auth_provider(settings)` para resolver a implementação correta. - `AuthRegistryStore` agora satisfaz implicitamente o protocolo `AuthProvider`. -### 3. CLI (`src/aignt_os/cli/app.py`) +### 3. CLI (`src/synapse_os/cli/app.py`) - Refatorado `_resolve_principal_id` para utilizar a factory `get_auth_provider`. - Comandos de gerenciamento de tokens (`auth init`, `auth issue`, `auth disable`) agora verificam se o provider ativo suporta gerenciamento local (atualmente restrito a "file"). diff --git a/features/F45-tui-performance-optimization/REPORT.md b/features/F45-tui-performance-optimization/REPORT.md index 0a25a32..a70192f 100644 --- a/features/F45-tui-performance-optimization/REPORT.md +++ b/features/F45-tui-performance-optimization/REPORT.md @@ -7,8 +7,8 @@ Added bounded log rendering for the dashboard log viewer so large persisted outp ## Changes - Added `tui_log_buffer_lines` to `AppSettings` with a default of `1000`. -- Added `truncate_logs()` in `src/aignt_os/cli/rendering.py` to keep only the newest lines and prepend a truncation marker. -- Updated `LogViewer` in `src/aignt_os/cli/dashboard.py` to optionally watch a log file, reload it when the file size changes, and render the truncated content. +- Added `truncate_logs()` in `src/synapse_os/cli/rendering.py` to keep only the newest lines and prepend a truncation marker. +- Updated `LogViewer` in `src/synapse_os/cli/dashboard.py` to optionally watch a log file, reload it when the file size changes, and render the truncated content. - Updated `RunDashboard.action_show_logs()` to pass the log file path into the viewer and truncate the initial payload before opening the modal. - Added unit coverage for truncation behavior and log viewer refresh handling. diff --git a/features/F45-tui-performance-optimization/SPEC.md b/features/F45-tui-performance-optimization/SPEC.md index 432a86c..0489e14 100644 --- a/features/F45-tui-performance-optimization/SPEC.md +++ b/features/F45-tui-performance-optimization/SPEC.md @@ -21,7 +21,7 @@ non_goals: # Context -The AIgnt OS dashboard can open persisted step logs inside a TUI modal. Large logs can degrade responsiveness and force the UI to repaint far more text than the operator needs. +The SynapseOS dashboard can open persisted step logs inside a TUI modal. Large logs can degrade responsiveness and force the UI to repaint far more text than the operator needs. # Objective diff --git a/features/F47-advanced-rbac/REPORT.md b/features/F47-advanced-rbac/REPORT.md index 024ab9b..7ca0c4a 100644 --- a/features/F47-advanced-rbac/REPORT.md +++ b/features/F47-advanced-rbac/REPORT.md @@ -24,7 +24,7 @@ security_review: ## Contexto -The AIgnt OS CLI previously operated with a flat authorization model (all valid tokens had full access). As the system scales to support different user personas (viewers vs operators vs admins), a more granular permission system was required. +The SynapseOS CLI previously operated with a flat authorization model (all valid tokens had full access). As the system scales to support different user personas (viewers vs operators vs admins), a more granular permission system was required. ## Mudanças Realizadas diff --git a/features/F47-advanced-rbac/SPEC.md b/features/F47-advanced-rbac/SPEC.md index 23d5270..aea2586 100644 --- a/features/F47-advanced-rbac/SPEC.md +++ b/features/F47-advanced-rbac/SPEC.md @@ -3,7 +3,7 @@ id: F47-advanced-rbac type: feature summary: "Implementação de controle de acesso baseado em papéis (RBAC) para comandos da CLI" inputs: - - "Flag --role no comando aignt auth issue" + - "Flag --role no comando synapse auth issue" - "Configuração de papéis e permissões no AuthRegistryStore" outputs: - "Tokens vinculados a papéis específicos (admin, operator, viewer)" @@ -23,7 +23,7 @@ non_goals: ## Contexto -Atualmente, a autenticação no AIgnt OS é binária: ou o cliente possui um token válido e tem acesso total (sujeito apenas a restrições de `initiated_by` para operações de runtime), ou não tem acesso. Com a evolução para um modelo multi-usuário ou multi-agente, é necessário limitar o raio de ação de certos tokens (ex: um dashboard de visualização não deve poder parar o runtime). +Atualmente, a autenticação no SynapseOS é binária: ou o cliente possui um token válido e tem acesso total (sujeito apenas a restrições de `initiated_by` para operações de runtime), ou não tem acesso. Com a evolução para um modelo multi-usuário ou multi-agente, é necessário limitar o raio de ação de certos tokens (ex: um dashboard de visualização não deve poder parar o runtime). ## Objetivo @@ -37,7 +37,7 @@ Implementar um sistema de RBAC (Role-Based Access Control) nativo na CLI. - Mapear `AuthRole` para lista de `Permission` (strings como `run:read`, `run:write`, `runtime:manage`, `auth:manage`). 2. **CLI de Auth**: - - Adicionar opção `--role` ao comando `aignt auth issue`. + - Adicionar opção `--role` ao comando `synapse auth issue`. 3. **Enforcement**: - Atualizar `Authenticator` ou `RequireAuth` para validar permissões exigidas por cada comando. diff --git a/features/F48-spec-validation-gate/SPEC.md b/features/F48-spec-validation-gate/SPEC.md index c135ac0..d52d839 100644 --- a/features/F48-spec-validation-gate/SPEC.md +++ b/features/F48-spec-validation-gate/SPEC.md @@ -17,7 +17,7 @@ non_goals: --- ## Contexto -Atualmente, o `PipelineEngine` assume que a SPEC é válida ou falha de forma não tratada durante a execução. O `SpecValidator` existe (`src/aignt_os/specs/validator.py`), mas não é invocado obrigatoriamente no início do pipeline de execução. Isso permite que SPECs quebradas avancem para estados inconsistentes. +Atualmente, o `PipelineEngine` assume que a SPEC é válida ou falha de forma não tratada durante a execução. O `SpecValidator` existe (`src/synapse_os/specs/validator.py`), mas não é invocado obrigatoriamente no início do pipeline de execução. Isso permite que SPECs quebradas avancem para estados inconsistentes. ## Objetivo Tornar a validação da SPEC um gate obrigatório na máquina de estados. Se a validação falhar: diff --git a/features/F49-pipeline-full-flow-integration/SPEC.md b/features/F49-pipeline-full-flow-integration/SPEC.md new file mode 100644 index 0000000..c36a069 --- /dev/null +++ b/features/F49-pipeline-full-flow-integration/SPEC.md @@ -0,0 +1,52 @@ +--- +id: F49-pipeline-full-flow-integration +type: feature +summary: Adicionar testes de integração do PipelineEngine cobrindo o fluxo completo CODE_GREEN → REVIEW → SECURITY → DOCUMENT → COMPLETE. +inputs: + - PipelineEngine com executores fake injetados para todos os estados + - SPEC.md válida de fixture +outputs: + - step_history com todos os estados executados em ordem + - context.current_state == "COMPLETE" ao final + - artefatos de cada estado acessíveis em context.artifacts +acceptance_criteria: + - Um teste de pipeline exercita o caminho completo CODE_GREEN → QUALITY_GATE → REVIEW → SECURITY → DOCUMENT → COMPLETE com executores fake para todos os estados e verifica que step_history contém todos eles em ordem. + - Um teste verifica que stop_at="DOCUMENT" retorna context.current_state == "DOCUMENT" e que COMPLETE não foi atingido. + - Um teste verifica que o artefato "run_report_md" produzido pelo executor fake do estado DOCUMENT está presente em context.artifacts. + - Um teste migrado de test_review_rework.py exercita a transição REVIEW → CODE_GREEN (rework) pelo PipelineEngine injetando um supervisor que retorna return_to_code_green, verificando que context.step_history registra o desvio. + - Um teste verifica que o caminho completo sem rework avança de TEST_RED até COMPLETE sem erro. +non_goals: + - Implementar executores reais para REVIEW, SECURITY ou DOCUMENT (esses executores permanecem injetáveis). + - Integrar reporting.py ao executor de DOCUMENT (escopo de feature futura). + - Adicionar novo comportamento ao PipelineEngine ou ao Synapse-Flow. + - Modificar stop_at nem PIPELINE_STOP_STATES. + - Testar comportamento de runtime persistido (PersistedPipelineRunner) ou worker. +--- + +# Contexto + +O `PipelineEngine` — parte central do Synapse-Flow, a engine própria de pipeline do SynapseOS — já despacha todos os estados do fluxo linear, incluindo `REVIEW`, `SECURITY` e `DOCUMENT`, via `_run_runtime_step()`. Porém: + +1. `tests/pipeline/test_happy_path.py` cobre o pipeline até `SECURITY` com `stop_at` parametrizado, mas não testa o estado `DOCUMENT` nem o fluxo completo até `COMPLETE`. +2. `tests/pipeline/test_review_rework.py` foi escrito como documentação de comportamento futuro, exercitando a state machine diretamente. O arquivo registra explicitamente: *"quando o Supervisor/pipeline for implementado para esses estados, migrar para testes de integração"*. Esse momento chegou com o suporte de F48 ao gate de validação e a consolidação do PIPELINE_STEPS. +3. O caminho `DOCUMENT → COMPLETE` nunca foi exercitado em nenhum teste de pipeline existente. + +Esse gap significa que o Synapse-Flow não tem cobertura de integração para o trecho final do seu fluxo oficial, tornando invisíveis regressões em qualquer mudança futura nos estados pós-SECURITY. + +# Objetivo + +Fechar o gap de cobertura do Synapse-Flow adicionando testes de integração do `PipelineEngine` que: + +1. Exercitam o fluxo completo `CODE_GREEN → QUALITY_GATE → REVIEW → SECURITY → DOCUMENT → COMPLETE` com executores fake, verificando `step_history` e `context.current_state`. +2. Validam `stop_at="DOCUMENT"` como ponto de parada legítimo. +3. Migram o comportamento de rework documentado em `test_review_rework.py` para testes que usam `PipelineEngine` diretamente, com supervisor injetado retornando `return_to_code_green` no estado `REVIEW`. +4. Garantem que artefatos produzidos pelos executores de `DOCUMENT` ficam acessíveis em `context.artifacts`. + +Nenhuma mudança de produção é necessária — a feature é exclusivamente de teste. + +## Restrições técnicas + +- Todos os novos testes ficam em `tests/pipeline/` para manter separação de níveis (`unit/` para contratos isolados, `pipeline/` para exercício do fluxo end-to-end com fakes). +- Os executores fake devem seguir o padrão já estabelecido em `test_happy_path.py` (`_FakeExecutor`). +- Para o teste de rework, usar `Supervisor` real com `max_retries=0` ou implementar supervisor stub que retorna `return_to_code_green` diretamente — sem mockar internos do PipelineEngine. +- `DOCKER_PREFLIGHT` não é necessário: nenhum subprocess real é invocado. diff --git a/features/chore-post-f40-f42-baseline-sync/REPORT.md b/features/chore-post-f40-f42-baseline-sync/REPORT.md index 32bd3b5..8c92704 100644 --- a/features/chore-post-f40-f42-baseline-sync/REPORT.md +++ b/features/chore-post-f40-f42-baseline-sync/REPORT.md @@ -3,7 +3,7 @@ ## Resumo executivo - A `chore-post-f40-f42-baseline-sync` alinha handoff, backlog e documentacao publica ao baseline real ja mergeado apos `F42` e `F40`. -- A frente permaneceu doc-only: nao houve mudanca funcional em CLI, runtime, TUI, auth, persistencia ou no AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS. +- A frente permaneceu doc-only: nao houve mudanca funcional em CLI, runtime, TUI, auth, persistencia ou no Synapse-Flow, a engine propria de pipeline do SynapseOS. - `F40` e `F42` agora contam com artefatos minimos de encerramento auditaveis. ## Escopo alterado @@ -12,7 +12,7 @@ - `features/F40-local-cancellation/{NOTES.md,CHECKLIST.md,REPORT.md}` criados - `features/F42-tui-filters/{NOTES.md,CHECKLIST.md,REPORT.md}` criados - `memory.md`, `PENDING_LOG.md` e `ERROR_LOG.md` atualizados para refletir o baseline pos-`F42`/`F40` -- `README.md` atualizado para documentar `aignt runs watch `, `aignt runs cancel ` e os atalhos reais do dashboard +- `README.md` atualizado para documentar `synapse runs watch `, `synapse runs cancel ` e os atalhos reais do dashboard - `CHANGELOG.md` atualizado com filtros TUI e cancelamento local no `Unreleased` - `tests/unit/test_watch_and_cancellation_docs.py` criado para travar a superficie documental atual diff --git a/features/chore-post-f40-f42-baseline-sync/SPEC.md b/features/chore-post-f40-f42-baseline-sync/SPEC.md index 4317ec5..05e8c2a 100644 --- a/features/chore-post-f40-f42-baseline-sync/SPEC.md +++ b/features/chore-post-f40-f42-baseline-sync/SPEC.md @@ -18,7 +18,7 @@ outputs: - post_f40_f42_baseline_sync - updated_public_docs_for_watch_and_cancel constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "restringir a frente a docs, handoff e testes documentais; sem alteracao funcional em src/" - "nao reabrir cancelamento distribuido, scheduler remoto, auth remota ou TUI fora do baseline ja mergeado" - "nao exigir DOCKER_PREFLIGHT porque a frente nao depende de boot, build, persistencia pratica em container ou integracao real" @@ -27,7 +27,7 @@ acceptance_criteria: - "`features/F40-local-cancellation/` e `features/F42-tui-filters/` passam a ter `NOTES.md`, `CHECKLIST.md` e `REPORT.md`, refletindo exatamente o baseline ja mergeado." - "`memory.md` e `PENDING_LOG.md` deixam de tratar `F40` e `F42` como recortes apenas no archive branch e passam a refletir essas merges como baseline atual de `main`." - "`ERROR_LOG.md` registra que a PR `#87` entrou com delta misto alem do recorte funcional da `F40`, e que a mitigacao aplicada foi uma chore de sync/handoff." - - "`README.md` documenta `aignt runs watch `, `aignt runs cancel ` e os atalhos reais `Enter`, `a`, `f`, `r`, `x` e `k`, deixando claro que o cancelamento atual e apenas local e gracioso." + - "`README.md` documenta `synapse runs watch `, `synapse runs cancel ` e os atalhos reais `Enter`, `a`, `f`, `r`, `x` e `k`, deixando claro que o cancelamento atual e apenas local e gracioso." - "`CHANGELOG.md` ganha um `Unreleased` coerente com o baseline atual, incluindo filtros no dashboard TUI e cancelamento local de runs." - "Existe cobertura documental automatizada travando a superficie publica atual de watch/cancel e a presenca dos artefatos retrocompletados de `F40` e `F42`." non_goals: @@ -48,7 +48,7 @@ tratando esses recortes como backlog apenas no archive branch. Alem disso, as du features ficaram sem `NOTES.md`, `CHECKLIST.md` e `REPORT.md`, e o `README.md` ainda nao documenta a superficie publica atual do dashboard TUI e do cancelamento local. -Como o AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS e +Como o Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS e nao houve aprovacao para nova frente de produto, o menor recorte util agora e uma chore doc-only para consolidar esse baseline antes da proxima `technical-triage`. @@ -84,7 +84,7 @@ sem mudar comportamento de produto e sem ampliar o escopo funcional ja mergeado. # Casos de erro - `memory.md` ou `PENDING_LOG.md` continuarem tratando `F40`/`F42` como backlog fora da fila ativa -- `README.md` continuar omitindo `aignt runs cancel ` ou os atalhos reais do dashboard +- `README.md` continuar omitindo `synapse runs cancel ` ou os atalhos reais do dashboard - `CHANGELOG.md` continuar sem mencionar filtros TUI ou cancelamento local - `F40` e `F42` continuarem sem artefatos minimos de encerramento @@ -101,7 +101,7 @@ sem mudar comportamento de produto e sem ampliar o escopo funcional ja mergeado. - Dado `README.md` atualizado - Quando a documentacao publica for lida -- Entao ela mostra `aignt runs watch ` e `aignt runs cancel ` +- Entao ela mostra `synapse runs watch ` e `synapse runs cancel ` - E ela delimita que o cancelamento atual e apenas local e gracioso ## Cenario 3: F40 e F42 ficam auditaveis como features ja concluídas diff --git a/features/chore-post-f47-baseline-handoff-sync/REPORT.md b/features/chore-post-f47-baseline-handoff-sync/REPORT.md index e5cbf8b..0586808 100644 --- a/features/chore-post-f47-baseline-handoff-sync/REPORT.md +++ b/features/chore-post-f47-baseline-handoff-sync/REPORT.md @@ -3,7 +3,7 @@ ## Resumo executivo - A `chore-post-f47-baseline-handoff-sync` alinha backlog, handoff e documentacao publica ao baseline real ja mergeado apos `F41`, `F43`, `F44`, `F45` e `F47`. -- A frente permaneceu doc-only: nao houve mudanca funcional em CLI, runtime, auth, persistencia ou no AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS. +- A frente permaneceu doc-only: nao houve mudanca funcional em CLI, runtime, auth, persistencia ou no Synapse-Flow, a engine propria de pipeline do SynapseOS. - O handoff duravel agora deixa explicito que o residual real de `G-11` ficou restrito a `remote_multi_host_auth`. ## Escopo alterado @@ -11,15 +11,15 @@ - `features/chore-post-f47-baseline-handoff-sync/{SPEC.md,NOTES.md,CHECKLIST.md,REPORT.md}` criados - `memory.md` e `PENDING_LOG.md` atualizados para refletir o baseline pos-`F47` - `docs/IDEAS.md` atualizado para registrar `F44` e `F47` no recorte local de auth -- `README.md` atualizado para documentar `aignt auth init|issue --role ...` e as roles `viewer`, `operator`, `admin` +- `README.md` atualizado para documentar `synapse auth init|issue --role ...` e as roles `viewer`, `operator`, `admin` - `CHANGELOG.md` atualizado com secao `Unreleased` - `tests/unit/test_auth_registry_docs.py` ajustado para travar o novo estado documental ## Validacoes executadas -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python - <<'PY' ... validate_spec_file(Path('features/chore-post-f47-baseline-handoff-sync/SPEC.md')) ... PY` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_auth_registry_docs.py -q` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv ./scripts/commit-check.sh --no-sync --skip-branch-validation --skip-docker --skip-security` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python - <<'PY' ... validate_spec_file(Path('features/chore-post-f47-baseline-handoff-sync/SPEC.md')) ... PY` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync python -m pytest tests/unit/test_auth_registry_docs.py -q` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv ./scripts/commit-check.sh --no-sync --skip-branch-validation --skip-docker --skip-security` - `./scripts/security-gate.sh` ## Riscos residuais diff --git a/features/chore-post-f47-baseline-handoff-sync/SPEC.md b/features/chore-post-f47-baseline-handoff-sync/SPEC.md index 2465169..b9baab4 100644 --- a/features/chore-post-f47-baseline-handoff-sync/SPEC.md +++ b/features/chore-post-f47-baseline-handoff-sync/SPEC.md @@ -17,7 +17,7 @@ outputs: - post_f47_baseline_handoff_sync - updated_auth_and_tui_docs_for_current_main constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "restringir a frente a docs, handoff e testes documentais; sem alteracao funcional em src/" - "nao introduzir nova feature de produto, nova automacao operacional, Docker ou ADR" - "nao reabrir backlog local/residente de auth nem promover transporte remoto a requisito atual" @@ -26,7 +26,7 @@ acceptance_criteria: - "Existe `features/chore-post-f47-baseline-handoff-sync/SPEC.md` valida descrevendo a frente como chore doc-only de alinhamento pos-`F47`." - "`memory.md` e `PENDING_LOG.md` deixam de tratar `F41`, `F43`, `F44`, `F45` e `F47` como apenas drafts/estado implícito e passam a refletir essas merges como baseline atual." - "`docs/IDEAS.md` passa a registrar que o recorte local de auth ja absorveu a fundacao (`F29`/`F30`), a abstracao de provider (`F44`), o bucket residente local (`F32`/`F34`/`F35`/`F36`) e o RBAC local (`F47`), mantendo somente `remote_multi_host_auth` como pendencia explicita." - - "`README.md` documenta o uso atual de `aignt auth init|issue --role ...` e os boundaries de `viewer`, `operator` e `admin` sem sugerir auth remota." + - "`README.md` documenta o uso atual de `synapse auth init|issue --role ...` e os boundaries de `viewer`, `operator` e `admin` sem sugerir auth remota." - "`CHANGELOG.md` ganha uma secao `Unreleased` curta e coerente com o baseline atual, cobrindo TUI, robustez de runtime e RBAC local." - "`tests/unit/test_auth_registry_docs.py` trava o novo estado de `docs/IDEAS.md` e `README.md`." non_goals: @@ -49,7 +49,7 @@ e `F47`, mas o handoff duravel ainda para no estado pos-`F37`/`F39`. Isso deixa `memory.md`, `PENDING_LOG.md`, `docs/IDEAS.md`, `README.md` e `CHANGELOG.md` parcialmente desalinhados do que a CLI e o backlog realmente fazem hoje. -Como o AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS e nao +Como o Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS e nao houve nova frente de produto aprovada, o menor recorte util agora e uma chore doc-only para consolidar esse baseline antes da proxima `technical-triage`. @@ -110,7 +110,7 @@ comportamento de produto e sem reabrir backlog local/residente ja absorvido. - Dado `README.md` atualizado - Quando a secao `Auth Registry Local` for lida -- Entao ela mostra `aignt auth init|issue --role ...` +- Entao ela mostra `synapse auth init|issue --role ...` - E delimita `viewer`, `operator` e `admin` sem sugerir auth remota ou distribuida # Observacoes diff --git a/features/chore-quality-gate-state/SPEC.md b/features/chore-quality-gate-state/SPEC.md index 9191a26..5b03711 100644 --- a/features/chore-quality-gate-state/SPEC.md +++ b/features/chore-quality-gate-state/SPEC.md @@ -31,7 +31,7 @@ non_goals: O `AGENTS.md` foi atualizado para incluir `QUALITY_GATE` como passo formal entre `REFACTOR` e `SECURITY_REVIEW`. O ADR-013 formalizou a decisão. Os documentos centrais (CONTEXT.md, SDD.md, TDD.md) foram atualizados. -O único artefato de código ainda não atualizado é a `LINEAR_STATE_FLOW` em `src/aignt_os/state_machine.py`, que atualmente define: +O único artefato de código ainda não atualizado é a `LINEAR_STATE_FLOW` em `src/synapse_os/state_machine.py`, que atualmente define: ```python LINEAR_STATE_FLOW: tuple[str, ...] = ( @@ -47,7 +47,7 @@ Adicionar `"QUALITY_GATE"` à `LINEAR_STATE_FLOW` entre `"CODE_GREEN"` e `"REVIE # Escopo ## Incluído -- Edição de `src/aignt_os/state_machine.py`: inserir `"QUALITY_GATE"` em `LINEAR_STATE_FLOW` +- Edição de `src/synapse_os/state_machine.py`: inserir `"QUALITY_GATE"` em `LINEAR_STATE_FLOW` - Edição de `tests/unit/test_state_machine.py`: adicionar testes de transição para `QUALITY_GATE` ## Fora de escopo diff --git a/features/chore-readme-current-baseline-refresh/REPORT.md b/features/chore-readme-current-baseline-refresh/REPORT.md index 6b573ec..1bc25e1 100644 --- a/features/chore-readme-current-baseline-refresh/REPORT.md +++ b/features/chore-readme-current-baseline-refresh/REPORT.md @@ -3,7 +3,7 @@ ## Resumo executivo - A `chore-readme-current-baseline-refresh` atualiza o `README.md` para funcionar como snapshot tecnico atual do repositorio no GitHub. -- A frente permaneceu doc-only: nao houve mudanca funcional em CLI, runtime, auth, persistencia ou no AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS. +- A frente permaneceu doc-only: nao houve mudanca funcional em CLI, runtime, auth, persistencia ou no Synapse-Flow, a engine propria de pipeline do SynapseOS. - O README deixa de depender de uma narrativa antiga centrada em `F18`/`F22` e passa a refletir o baseline pos-`F23 -> F47`. ## Escopo alterado diff --git a/features/chore-readme-current-baseline-refresh/SPEC.md b/features/chore-readme-current-baseline-refresh/SPEC.md index 9655166..e1f76f2 100644 --- a/features/chore-readme-current-baseline-refresh/SPEC.md +++ b/features/chore-readme-current-baseline-refresh/SPEC.md @@ -17,7 +17,7 @@ outputs: - refreshed_readme_current_baseline - updated_doc_regression_tests_for_github_readme constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "restringir a frente a documentacao e testes documentais; sem alteracao funcional em src/" - "tratar o README como snapshot tecnico atual do repositorio, nao como historico do roadmap" - "nao exigir DOCKER_PREFLIGHT porque a frente nao depende de boot, build, persistencia pratica em container ou integracao real" @@ -43,7 +43,7 @@ do repositorio continuar parecendo ancorada em `F18`/`F22`, apesar de `main` ja incorporar guardrails pos-release, auth local com RBAC, ownership local do runtime, dashboard TUI, cancelamento local e robustez adicional do runtime. -Como o AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS e +Como o Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS e nao ha mudanca funcional aprovada, o menor recorte util agora e uma chore doc-only para transformar o README em um retrato tecnico fiel do baseline atual. diff --git a/features/chore-repo-checks-baseline-restore/REPORT.md b/features/chore-repo-checks-baseline-restore/REPORT.md index 78cee68..cfb238e 100644 --- a/features/chore-repo-checks-baseline-restore/REPORT.md +++ b/features/chore-repo-checks-baseline-restore/REPORT.md @@ -4,12 +4,12 @@ - Esta chore restaurou o `repo-checks` na baseline atual removendo a divida confirmada de `ruff format --check .` em 6 arquivos. - O delta funcional permaneceu fechado: nos arquivos Python/teste houve apenas formatacao; o restante da frente foi sincronizacao de handoff pos-F30. -- O AIgnt-Synapse-Flow continua sendo a engine propria de pipeline do AIgnt OS; nenhuma mudanca de produto, workflow ou arquitetura foi introduzida. +- O Synapse-Flow continua sendo a engine propria de pipeline do SynapseOS; nenhuma mudanca de produto, workflow ou arquitetura foi introduzida. ## Escopo entregue - `ruff format` aplicado somente em: - - `src/aignt_os/persistence.py` + - `src/synapse_os/persistence.py` - `tests/integration/test_runs_cli.py` - `tests/unit/test_cli_adapter.py` - `tests/unit/test_parsing_engine.py` @@ -22,7 +22,7 @@ ## Validacoes executadas - Validacao da SPEC com `validate_spec_file(Path('features/chore-repo-checks-baseline-restore/SPEC.md'))` -- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/aignt-os/.cache/uv uv run --no-sync ruff format --check .` +- `env UV_CACHE_DIR=/home/g0dsssp33d/work/projects/synapse-os/.cache/uv uv run --no-sync ruff format --check .` - `./scripts/commit-check.sh --sync-dev --skip-branch-validation --skip-docker --skip-security` - `./scripts/security-gate.sh` diff --git a/features/chore-repo-checks-baseline-restore/SPEC.md b/features/chore-repo-checks-baseline-restore/SPEC.md index c7fc5b4..944a71c 100644 --- a/features/chore-repo-checks-baseline-restore/SPEC.md +++ b/features/chore-repo-checks-baseline-restore/SPEC.md @@ -16,7 +16,7 @@ outputs: - repo_checks_green - post_f30_handoff_sync constraints: - - "manter o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS" + - "manter o Synapse-Flow como a engine propria de pipeline do SynapseOS" - "corrigir apenas a divida confirmada de formatacao e o handoff pos-F30" - "nao alterar workflow, scripts operacionais ou contrato publico da CLI" - "nao introduzir nova feature de produto, auth remota ou qualquer recorte de G-11" diff --git a/features/chore-test-layout-typecheck-hardening/NOTES.md b/features/chore-test-layout-typecheck-hardening/NOTES.md index 957d4b4..3be33c9 100644 --- a/features/chore-test-layout-typecheck-hardening/NOTES.md +++ b/features/chore-test-layout-typecheck-hardening/NOTES.md @@ -3,4 +3,4 @@ - Esta chore existe para corrigir um erro operacional persistente fora do fluxo de produto. - O alvo principal é a colisao de namespace entre `conftest.py` em subarvores de `tests/`. - A mitigação final combinou package markers em `tests/` com override explícito do `mypy` para `tests` e `tests.*`. -- O contrato strict de `mypy` continua aplicado ao pacote `src/aignt_os`; a arvore de testes fica fora desse contrato nesta chore. +- O contrato strict de `mypy` continua aplicado ao pacote `src/synapse_os`; a arvore de testes fica fora desse contrato nesta chore. diff --git a/features/chore-test-layout-typecheck-hardening/SPEC.md b/features/chore-test-layout-typecheck-hardening/SPEC.md index 5823443..232414e 100644 --- a/features/chore-test-layout-typecheck-hardening/SPEC.md +++ b/features/chore-test-layout-typecheck-hardening/SPEC.md @@ -15,7 +15,7 @@ constraints: - manter o fluxo oficial `./scripts/commit-check.sh --sync-dev` como caminho operacional padrao - nao alterar logica de produto, runtime, pipeline ou adapters - nao introduzir dependencia de Docker nesta frente - - manter o AIgnt-Synapse-Flow como engine propria de pipeline do AIgnt OS sem mudancas comportamentais + - manter o Synapse-Flow como engine propria de pipeline do SynapseOS sem mudancas comportamentais acceptance_criteria: - `uv run mypy src tests` nao falha mais por `Duplicate module named "conftest"`. - `uv run --no-sync python -m mypy` continua verde no fluxo oficial do repositório. diff --git a/features/f11-runtime-persistente-minimo/SPEC.md b/features/f11-runtime-persistente-minimo/SPEC.md index 9df03b4..62e3f09 100644 --- a/features/f11-runtime-persistente-minimo/SPEC.md +++ b/features/f11-runtime-persistente-minimo/SPEC.md @@ -15,7 +15,7 @@ related_adrs: - docs/adr/002-python-orchestrator.md - docs/adr/003-state-machine-pipeline-engine.md - docs/adr/009-runtime-dual-cli-worker.md - - docs/adr/010-adopt-aignt-synapse-flow-name.md + - docs/adr/010-adopt-synapse-synapse-flow-name.md - docs/adr/011-lightweight-docker-preflight-default.md inputs: - CLI atual do projeto @@ -30,9 +30,9 @@ outputs: - persistencia local endurecida do estado do runtime - testes automatizados da feature acceptance_criteria: - - Existe exatamente um processo residente local do AIgnt OS por workspace durante o MVP desta feature. + - Existe exatamente um processo residente local do SynapseOS por workspace durante o MVP desta feature. - A CLI expõe comandos mínimos de lifecycle para start, status e stop do runtime persistente. - - Existe um modo legitimo de execucao persistente do runtime do AIgnt OS que pode ser usado pelo `compose` como processo principal do container sem recorrer a keepalive artificial. + - Existe um modo legitimo de execucao persistente do runtime do SynapseOS que pode ser usado pelo `compose` como processo principal do container sem recorrer a keepalive artificial. - O comando start cria o processo residente e persiste estado local suficiente para identificar pid, status e metadados mínimos que permitam validar a identidade do processo antes do stop. - O comando status informa de forma verificável se o runtime está ativo, parado ou inconsistente. - O modo persistente do runtime permanece em execucao ate receber sinal de encerramento ou erro real do processo. @@ -58,13 +58,13 @@ dependencies: # Contexto -O AIgnt OS ja adota um runtime dual no nivel arquitetural, mas ainda precisa do primeiro incremento pratico desse modelo. Esta feature cria apenas o degrau minimo para que a CLI consiga iniciar, inspecionar e parar um processo residente unico, preservando o foco do MVP e sem expandir o escopo para distribuicao, scheduler ou rede. +O SynapseOS ja adota um runtime dual no nivel arquitetural, mas ainda precisa do primeiro incremento pratico desse modelo. Esta feature cria apenas o degrau minimo para que a CLI consiga iniciar, inspecionar e parar um processo residente unico, preservando o foco do MVP e sem expandir o escopo para distribuicao, scheduler ou rede. -O runtime interno continua sendo coordenado pelo AIgnt-Synapse-Flow, a engine propria de pipeline do AIgnt OS, mas esta feature nao implementa a pipeline completa do worker. Ela apenas estabelece o lifecycle minimo do processo residente. +O runtime interno continua sendo coordenado pelo Synapse-Flow, a engine propria de pipeline do SynapseOS, mas esta feature nao implementa a pipeline completa do worker. Ela apenas estabelece o lifecycle minimo do processo residente. Como o runtime opera por processo residente local, o hardening minimo do controle por PID e do arquivo de estado faz parte do proprio contrato da feature. O objetivo nao e adicionar um subsistema completo de seguranca, mas evitar que `stop` confie apenas em PID persistido ou em estado facilmente adulteravel. -O `DOCKER_PREFLIGHT` real em host ja validou `compose config` e `build`, mas evidenciou que o container atual apenas executa `aignt --help`, sai com codigo `0` e nao permanece vivo. Portanto, o bloqueio de `CONTAINER_UP/HEALTHY` nao e de Docker nem do host: ele decorre da ausencia de um runtime persistente legitimo da aplicacao para ser usado como processo principal do container. +O `DOCKER_PREFLIGHT` real em host ja validou `compose config` e `build`, mas evidenciou que o container atual apenas executa `synapse --help`, sai com codigo `0` e nao permanece vivo. Portanto, o bloqueio de `CONTAINER_UP/HEALTHY` nao e de Docker nem do host: ele decorre da ausencia de um runtime persistente legitimo da aplicacao para ser usado como processo principal do container. # Objetivo diff --git a/features/init_feature_worktrees.sh b/features/init_feature_worktrees.sh index b651eb8..784ce1a 100755 --- a/features/init_feature_worktrees.sh +++ b/features/init_feature_worktrees.sh @@ -4,11 +4,11 @@ set -euo pipefail # Uso: # ./scripts/init_feature_worktrees.sh /caminho/para/repo [base-branch] # Exemplo: -# ./scripts/init_feature_worktrees.sh ~/code/aignt-os main +# ./scripts/init_feature_worktrees.sh ~/code/synapse-os main REPO_PATH="${1:-.}" BASE_BRANCH="${2:-main}" -WORKTREE_ROOT="${REPO_PATH%/}/../aignt-os-worktrees" +WORKTREE_ROOT="${REPO_PATH%/}/../synapse-os-worktrees" FEATURES=( "feature/f01-bootstrap-contracts:F01-bootstrap-contracts" diff --git a/main.py b/main.py index c664168..60a60fc 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,5 @@ def main(): - print("Hello from aignt-os!") + print("Hello from synapse-os!") if __name__ == "__main__": diff --git a/memory.md b/memory.md index 0f1558f..c0c3e3b 100644 --- a/memory.md +++ b/memory.md @@ -2,77 +2,58 @@ ## Global project state -- AIgnt OS continua como meta-orquestrador CLI-first; o AIgnt-Synapse-Flow segue como a engine propria de pipeline do projeto. -- A baseline operacional atual combina `DOCKER_PREFLIGHT` leve por padrao, fluxo container-first para o Codex, Branch Sync Gate e separacao entre memoria duravel (`memory.md`) e log operacional (`PENDING_LOG.md` e `ERROR_LOG.md`). -- A governanca de prompts dos agents segue formato contextual explicito, com contexto, leituras obrigatorias, objetivo, escopo, nao-faca, criterios de aceite e formato de entrega. -- O MVP de produto agora chega ate `DOCUMENT`: a F10 adicionou `RUN_REPORT.md` por run e o primeiro adapter real via `CodexCLIAdapter`. -- A F13 introduziu a primeira saida enriquecida com Rich em `src/`, mantendo o AIgnt-Synapse-Flow como a engine propria de pipeline do AIgnt OS e limitando o recorte a `aignt runtime status`. -- A F14 adicionou observabilidade CLI-first sobre runs persistidas com `aignt runs list` e `aignt runs show `, reaproveitando `RunRepository` e `ArtifactStore` sem abrir TUI. -- A etapa 2 documentada em `docs/architecture/PHASE_2_ROADMAP.md` foi concluida em `main`: o baseline atual ja consolidou `F15 -> F16 -> F21 -> F18 -> F19 -> F20 -> F17 -> F22` como release tecnica coerente. -- O baseline atual tambem ja incorporou a primeira onda de guardrails pos-release com `F23 -> F27`: sanitizacao de superficies publicas, boundary de workspace/artifacts, AST guard para artifacts Python, provenance minima por run e limite local de concorrencia no adapter layer. -- A `F15-public-run-submission` foi concluida e mergeada em `main`: a CLI agora expõe `aignt runs submit ` com `--mode auto|sync|async` e `--stop-at`, reaproveitando o `RunDispatchService` interno sem alterar schema nem abrir nova service layer. -- A `F17-artifact-preview` ja foi mergeada em `main`, adicionando preview textual controlado de `RUN_REPORT.md` e `clean_output` por step em `aignt runs show --preview `. -- A `F22-release-readiness` ja foi mergeada em `main`, fechando a etapa 2 com `CHANGELOG.md`, release notes versionada e README alinhado ao boundary entre quickstart `sync-first` e artifact preview. -- `main` atual tambem ja incorpora `F23-security-sanitization-foundation`, `F24-workspace-boundary-hardening`, `F25-generated-artifact-ast-guard`, `F26-run-provenance-integrity` e `F27-adapter-concurrency-guard`, com merges `#56` a `#60`. +- SynapseOS é o meta-orquestrador CLI-first; o Synapse-Flow é a engine própria de pipeline do projeto. +- A baseline operacional combina `DOCKER_PREFLIGHT` leve por padrão, fluxo container-first para o Codex, Branch Sync Gate e separação entre memória durável (`memory.md`) e log operacional (`PENDING_LOG.md` e `ERROR_LOG.md`). +- O MVP chega até `DOCUMENT`: `RUN_REPORT.md` por run, `CodexCLIAdapter` como primeiro adapter real, CLI enriquecida com Rich, observabilidade CLI de runs e TUI dashboard com explorer, filtros, log viewer e cancelamento local. +- A etapa 2 está completa em `main` (F15–F22); a primeira onda de guardrails também está completa (F23–F27). +- O baseline incorpora F28–F36 (circuit breaker, RBAC foundation, auth registry CLI, principal binding, ownership filter/worker, skip observability) e F40–F47 (cancelamento local, dashboard TUI, robustez de runtime, auth abstraction, TUI perf, RBAC por role). +- `F48-spec-validation-gate` foi mergeada em `main` via PR #91: o Synapse-Flow agora bloqueia execução de pipeline quando a SPEC não passa na validação antes de `PLAN`. +- O rename cosmético `AIgnt OS → SynapseOS` foi concluído no commit `bc9ceab` na branch `claude/rename-to-synapseos-RxaIg`: pacote Python (`synapse_os`), env prefix (`SYNAPSE_OS_`), Docker (`synapse-os`), pipeline engine (`Synapse-Flow`), runtime dirs (`.synapse-os/`), 254 arquivos atualizados. ## Local snapshot -- `main` local permanece sincronizada com `origin/main`, sem diff aberto no baseline usado para o handoff atual. -- A limpeza operacional pos-`F37` confirmou que o problema imediato nao era gap de MVP nem de baseline em `main`, mas drift local numa branch antiga de `F39` reutilizada para drafts pos-MVP. -- O estado misto foi preservado em `origin/archive/2026-03-13-f39-drift-snapshot`. -- As merges de `F41-dashboard-artifacts-explorer`, `F43-runtime-robustness`, `F44-auth-backend-abstraction`, `F45-tui-performance-optimization` e `F47-advanced-rbac` ja estao absorvidas em `main`. -- `main` atual tambem ja incorpora `F42-tui-filters` pela PR `#86` e `F40-local-cancellation` pela PR `#87`, consolidando filtros no dashboard TUI e cancelamento local/gracioso de runs. -- O recorte ainda transversal restante fora da fila ativa fica concentrado em `F46`, testes de lifecycle e docs especulativos de roadmap longo; `F40` e `F42` deixaram de ser backlog pendente. -- O baseline atual ja incorpora `F15-public-run-submission`, `F16-run-detail-expansion`, `F21-cli-error-model-and-exit-codes`, `F18-canonical-happy-path`, `F19-environment-doctor`, `F20-public-onboarding`, `F17-artifact-preview`, `F22-release-readiness` e a sequencia `F23 -> F27`. -- O baseline atual tambem ja incorpora `F28-adapter-circuit-breaker`, `F29-auth-rbac-foundation` e `F30-auth-registry-cli`, com `aignt auth init|issue|disable` e o alinhamento de `docs/IDEAS.md`/README ao estado pos-F30. -- A release tecnica da etapa 2 e a primeira trilha de guardrails ja estao refletidas no codigo e na superficie publica da CLI; a baseline tambem foi reestabilizada apos a PR `#66`, com `repo-checks` novamente verde. -- O baseline atual agora tambem incorpora `F31-g11-remote-auth-decomposition`, `F32-runtime-resident-principal-binding`, `F34-async-submit-runtime-ownership`, `F35-worker-runtime-ownership-filter` e `F36-worker-owner-skip-observability`. -- Com isso, o baseline fecha o recorte local de `resident_transport_auth`: binding do principal do runtime, gate de ownership no submit assincrono, filtro de ownership no worker e observabilidade local de skips incompatíveis. -- O baseline atual tambem incorpora `F41`, `F43`, `F44`, `F45` e `F47`: dashboard TUI com explorer de artifacts, robustez de timeout/retry, abstracao local de `AuthProvider`, buffering de logs na TUI e RBAC local por role. +- Branch atual: `claude/rename-to-synapseos-RxaIg` — 1 commit à frente de `main` (`bc9ceab rename: AIgnt OS → SynapseOS`), working tree limpa. +- PR do rename ainda não aberta; `gh` CLI indisponível no ambiente atual — abrir via interface web. +- Após merge do rename em `main`, branch pode ser descartada e a próxima frente parte de `main` limpa. # Stable decisions -- `DOCKER_PREFLIGHT` continua obrigatorio antes da execucao pratica de uma feature; o modo padrao permanece leve. -- O Codex opera em fluxo container-first via `./scripts/dev-codex.sh`, separado do servico `aignt-os`, onde o AIgnt-Synapse-Flow roda como engine propria de pipeline do AIgnt OS. -- A Branch Sync Gate usa `./scripts/branch-sync-check.sh` para detectar drift e `./scripts/branch-sync-update.sh` apenas quando a worktree estiver limpa e segura para atualizacao. -- `memory.md` guarda memoria duravel e reaproveitavel; `PENDING_LOG.md` e `ERROR_LOG.md` guardam detalhe operacional da sessao. -- O `memory-curator` pode ser acionado por `$memory-curator encerrar conversa` ou `$memory-curator close session` para atualizar `memory.md` e gerar handoff de encerramento. -- Com `network-access = true`, `git push` e `gh pr create` devem ser tentados primeiro no sandbox; fallback fora do sandbox fica restrito a falha real de rede ou sandbox. -- O `CodexCLIAdapter` permanece o primeiro adapter real integrado; a F12 fixou classificacao operacional explicita para timeout, return code nao zero e bloqueios de launcher/container/autenticacao sem reabrir a pipeline. -- A avaliacao de ADR pos-F12 concluiu que o hardening operacional do Codex e a chore de handoff estendem decisoes ja cobertas por ADR-004, ADR-011 e ADR-012; nao ha ADR nova nem atualizacao pendente por ora. -- Os artefatos operacionais padrao em `.aignt-os/` devem permanecer fora do versionamento. +- `DOCKER_PREFLIGHT` é obrigatório antes de execução prática dependente de Docker; modo padrão permanece leve. +- O Codex opera container-first via `./scripts/dev-codex.sh`, separado do serviço `synapse-os`. +- Branch Sync Gate usa `./scripts/branch-sync-check.sh` para detectar drift; `./scripts/branch-sync-update.sh` apenas com worktree limpa e sem conflito detectável. +- `memory.md` guarda memória durável; `PENDING_LOG.md` e `ERROR_LOG.md` guardam detalhe operacional da sessão. +- `CodexCLIAdapter` é o primeiro adapter real integrado; timeout, return code não zero e bloqueios de autenticação são classificados como bloqueios operacionais externos. +- Os artefatos operacionais padrão em `.synapse-os/` devem permanecer fora do versionamento. +- O smoke autenticado do Codex (`401 Unauthorized`) permanece classificado como bloqueio operacional externo, não requisito de produto. # Active fronts -- Nao ha frente de produto aberta no baseline atual. -- A frente doc-only ativa no momento e `chore-post-f40-f42-baseline-sync`, restrita a consolidar o handoff do baseline atual apos as merges de `F42` e `F40`. -- Nao ha draft coerente ainda pendente de merge entre `F41`, `F43`, `F44`, `F45` e `F47`; essas frentes ja foram absorvidas em `main`. -- Nao ha frente de implementacao de transporte remoto, socket ou auth distribuida em andamento no baseline atual. +- `chore/rename-to-synapseos`: commit concluído, PR pendente de abertura e merge em `main`. +- Nenhuma feature de produto aberta no baseline atual. # Open decisions -- O backlog de guardrails ficou com `G-11` como residual real apenas no bucket `remote_multi_host_auth`. -- O recorte local de auth agora inclui `F29`, `F30`, `F44` e `F47`, enquanto `resident_transport_auth` foi absorvido por `F32`, `F34`, `F35` e `F36`; nao ha decisao de produto pendente nesses buckets sem reabrir transporte novo. -- Decidir em momento futuro se o smoke autenticado do Codex deve virar gate obrigatorio; por ora o `401 Unauthorized` ficou classificado como bloqueio operacional externo e nao como requisito de produto. +- `G-11` permanece como residual real apenas no bucket `remote_multi_host_auth` — explicitamente adiado até demanda concreta. +- Decidir em momento futuro se o smoke autenticado do Codex deve virar gate obrigatório. # Recurrent pitfalls -- `memory.md` perde valor quando mistura decisao estavel com snapshot local ou log de conversa. -- `memory.md` e `PENDING_LOG.md` ficam rapidamente obsoletos quando merges e PRs mudam o estado real do repositório e o handoff nao e consolidado em seguida. +- `memory.md` perde valor quando mistura decisão estável com snapshot local ou log de conversa. +- `memory.md` e `PENDING_LOG.md` ficam rapidamente obsoletos quando merges e PRs mudam o estado real do repositório sem consolidação de handoff. - `uv` pode falhar no sandbox por cache fora da workspace ou indisponibilidade de rede. -- `branch-sync-update` nao e seguro com worktree suja, mesmo quando o drift contra `main` parece pequeno. -- Subir `codex-dev` manualmente em paralelo ao launcher pode causar corrida operacional. -- Smoke real do Codex sem credencial valida falha por autenticacao (`401 Unauthorized`) mesmo com launcher/container saudavel; isso deve ser tratado como bloqueio operacional externo. +- `branch-sync-update` não é seguro com worktree suja, mesmo quando o drift parece pequeno. +- Smoke real do Codex sem credencial válida falha por autenticação mesmo com launcher/container saudável. # Next recommended steps -- Fechar a `chore-post-f40-f42-baseline-sync` e, em seguida, rodar nova `technical-triage` em branch limpa a partir de `main` para escolher uma unica frente ativa. -- Nao reabrir a branch historica de `F39`; usar `draft/*` apenas como estacionamento e extrair dali somente quando houver prioridade aprovada. -- Manter `remote_multi_host_auth` explicitamente adiado e evitar reabrir follow-up local/residente de auth, porque esse recorte ja foi absorvido por `F29`, `F30`, `F44`, `F47`, `F32`, `F34`, `F35` e `F36`. +1. Abrir PR `claude/rename-to-synapseos-RxaIg → main` via interface web e mergear. +2. Executar `technical-triage` em branch limpa a partir de `main` para eleger a próxima feature. +3. Criar SPEC da feature eleita com `spec-editor`. +4. Manter `remote_multi_host_auth` explicitamente adiado; não reabrir F46 sem SPEC própria aprovada. # Last handoff summary -- Read before acting: releia `AGENTS.md`, `CONTEXT.md`, `memory.md`, `PENDING_LOG.md`, `ERROR_LOG.md`, `git status` e `git diff --stat`. -- Current state: `main` ja incorpora `F17`, `F22`, `F23 -> F40`, `F41`, `F42`, `F43`, `F44`, `F45` e `F47`; a baseline operacional segue verde e os recortes pendentes voltam a ser escolhidos por triagem a partir de `main`. -- Open points: concluir esta chore doc-only e depois escolher uma unica proxima frente a partir de `main`. -- Recommended next front: nova `technical-triage` em branch limpa depois do merge da `chore-post-f40-f42-baseline-sync`. +- **Read before acting:** releia `AGENTS.md`, `CONTEXT.md`, `memory.md`, `PENDING_LOG.md`, `git status`. +- **Current state:** `main` incorpora F01–F48 + rename chore pendente de PR. Branch `claude/rename-to-synapseos-RxaIg` tem 1 commit à frente, limpa, pronta para PR. +- **Open points:** abrir e mergear PR do rename; depois escolher única próxima feature via `technical-triage`. +- **Recommended next front:** após PR do rename mergeada → `technical-triage` → `spec-editor` para nova feature. diff --git a/pyproject.toml b/pyproject.toml index 4e268bb..092ad0c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,9 +3,9 @@ requires = ["hatchling>=1.27.0"] build-backend = "hatchling.build" [project] -name = "aignt-os" +name = "synapse-os" version = "0.1.0" -description = "AIgnt OS - meta-orchestrator for AI agents via CLI" +description = "SynapseOS - meta-orchestrator for AI agents via CLI" readme = "README.md" requires-python = ">=3.12" license = { text = "Proprietary" } @@ -38,10 +38,10 @@ dev = [ ] [project.scripts] -aignt = "aignt_os.cli.app:app" +synapse = "synapse_os.cli.app:app" [tool.hatch.build.targets.wheel] -packages = ["src/aignt_os"] +packages = ["src/synapse_os"] [tool.pytest.ini_options] minversion = "8.0" @@ -50,7 +50,7 @@ testpaths = ["tests"] asyncio_mode = "auto" [tool.coverage.run] -source = ["aignt_os"] +source = ["synapse_os"] omit = ["*/tests/*", "*/__pycache__/*"] [tool.coverage.report] @@ -86,7 +86,7 @@ warn_unused_ignores = true disallow_untyped_defs = true no_implicit_optional = true check_untyped_defs = true -packages = ["aignt_os"] +packages = ["synapse_os"] [[tool.mypy.overrides]] module = ["tests", "tests.*"] diff --git a/scripts/dev-codex.sh b/scripts/dev-codex.sh index acfb383..c196b64 100755 --- a/scripts/dev-codex.sh +++ b/scripts/dev-codex.sh @@ -8,10 +8,10 @@ START_RUNTIME=0 BUILD=0 export DOCKER_CONFIG="${DOCKER_CONFIG:-$ROOT_DIR/.cache/docker/config}" -export AIGNT_DEV_UID="${AIGNT_DEV_UID:-$(id -u)}" -export AIGNT_DEV_GID="${AIGNT_DEV_GID:-$(id -g)}" -export AIGNT_OS_UID="${AIGNT_OS_UID:-$(id -u)}" -export AIGNT_OS_GID="${AIGNT_OS_GID:-$(id -g)}" +export SYNAPSE_DEV_UID="${SYNAPSE_DEV_UID:-$(id -u)}" +export SYNAPSE_DEV_GID="${SYNAPSE_DEV_GID:-$(id -g)}" +export SYNAPSE_OS_UID="${SYNAPSE_OS_UID:-$(id -u)}" +export SYNAPSE_OS_GID="${SYNAPSE_OS_GID:-$(id -g)}" mkdir -p "$DOCKER_CONFIG" @@ -66,7 +66,7 @@ if [[ "$BUILD" -eq 1 ]]; then fi if [[ "$START_RUNTIME" -eq 1 ]]; then - up_cmd+=(aignt-os "$SERVICE") + up_cmd+=(synapse-os "$SERVICE") else up_cmd+=("$SERVICE") fi diff --git a/scripts/dev-copilot.sh b/scripts/dev-copilot.sh index 522ddc4..1943f81 100755 --- a/scripts/dev-copilot.sh +++ b/scripts/dev-copilot.sh @@ -8,7 +8,7 @@ # 3. Executa `copilot` interativo dentro do container # # Uso: ./scripts/dev-copilot.sh [--build] [-- ] -# Alias: alias sonnet='cd ~/work/projects/aignt-os && ./scripts/dev-copilot.sh' +# Alias: alias sonnet='cd ~/work/projects/synapse-os && ./scripts/dev-copilot.sh' set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" @@ -18,8 +18,8 @@ COPILOT_BIN="${COPILOT_BIN:-${HOME}/.local/bin/copilot}" COPILOT_CONFIG="${COPILOT_CONFIG:-${HOME}/.copilot/config.json}" export DOCKER_CONFIG="${DOCKER_CONFIG:-${ROOT_DIR}/.cache/docker/config}" -export AIGNT_DEV_UID="${AIGNT_DEV_UID:-$(id -u)}" -export AIGNT_DEV_GID="${AIGNT_DEV_GID:-$(id -g)}" +export SYNAPSE_DEV_UID="${SYNAPSE_DEV_UID:-$(id -u)}" +export SYNAPSE_DEV_GID="${SYNAPSE_DEV_GID:-$(id -g)}" export COPILOT_BIN mkdir -p "${DOCKER_CONFIG}" @@ -35,7 +35,7 @@ Opções: --help Exibe esta mensagem. Alias sugerido (adicionar ao ~/.bashrc ou ~/.zshrc): - alias sonnet='cd ~/work/projects/aignt-os && ./scripts/dev-copilot.sh' + alias sonnet='cd ~/work/projects/synapse-os && ./scripts/dev-copilot.sh' EOF } diff --git a/scripts/docker-build.sh b/scripts/docker-build.sh index 20d4b82..7fbfaff 100755 --- a/scripts/docker-build.sh +++ b/scripts/docker-build.sh @@ -2,16 +2,16 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -TAG="aignt-os:dev" +TAG="synapse-os:dev" USE_COMPOSE=0 NO_CACHE=0 DRY_RUN=0 -APP_UID="${AIGNT_OS_UID:-$(id -u)}" -APP_GID="${AIGNT_OS_GID:-$(id -g)}" +APP_UID="${SYNAPSE_OS_UID:-$(id -u)}" +APP_GID="${SYNAPSE_OS_GID:-$(id -g)}" export DOCKER_CONFIG="${DOCKER_CONFIG:-$ROOT_DIR/.cache/docker/config}" -export AIGNT_OS_UID="$APP_UID" -export AIGNT_OS_GID="$APP_GID" +export SYNAPSE_OS_UID="$APP_UID" +export SYNAPSE_OS_GID="$APP_GID" mkdir -p "$DOCKER_CONFIG" require_docker() { @@ -67,7 +67,7 @@ compose_cmd=(docker compose -f "$ROOT_DIR/compose.yaml" build) if [[ "$NO_CACHE" -eq 1 ]]; then compose_cmd+=(--no-cache) fi -compose_cmd+=(aignt-os) +compose_cmd+=(synapse-os) if [[ "$USE_COMPOSE" -eq 1 ]]; then selected_cmd=("${compose_cmd[@]}") diff --git a/scripts/docker-preflight.sh b/scripts/docker-preflight.sh index cedb513..6f526f1 100755 --- a/scripts/docker-preflight.sh +++ b/scripts/docker-preflight.sh @@ -2,7 +2,7 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -SERVICE="aignt-os" +SERVICE="synapse-os" SKIP_UP=1 DRY_RUN=0 HEALTH_TIMEOUT=30 diff --git a/scripts/docker-rebuild.sh b/scripts/docker-rebuild.sh index d05c897..b619d2a 100755 --- a/scripts/docker-rebuild.sh +++ b/scripts/docker-rebuild.sh @@ -3,7 +3,7 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" STATE_FILE="$ROOT_DIR/.cache/docker/rebuild.sha256" -TAG="aignt-os:dev" +TAG="synapse-os:dev" USE_COMPOSE=0 FORCE=0 DRY_RUN=0 diff --git a/scripts/docker-up.sh b/scripts/docker-up.sh index ab49359..d68f4b6 100755 --- a/scripts/docker-up.sh +++ b/scripts/docker-up.sh @@ -2,16 +2,16 @@ set -euo pipefail ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" -SERVICE="aignt-os" +SERVICE="synapse-os" DETACH=0 BUILD=0 DRY_RUN=0 -APP_UID="${AIGNT_OS_UID:-$(id -u)}" -APP_GID="${AIGNT_OS_GID:-$(id -g)}" +APP_UID="${SYNAPSE_OS_UID:-$(id -u)}" +APP_GID="${SYNAPSE_OS_GID:-$(id -g)}" export DOCKER_CONFIG="${DOCKER_CONFIG:-$ROOT_DIR/.cache/docker/config}" -export AIGNT_OS_UID="$APP_UID" -export AIGNT_OS_GID="$APP_GID" +export SYNAPSE_OS_UID="$APP_UID" +export SYNAPSE_OS_GID="$APP_GID" mkdir -p "$DOCKER_CONFIG" require_docker() { diff --git a/src/aignt_os/runtime/__init__.py b/src/aignt_os/runtime/__init__.py deleted file mode 100644 index 4b141bb..0000000 --- a/src/aignt_os/runtime/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""Minimal persistent runtime for the AIgnt OS MVP.""" diff --git a/src/aignt_os/__init__.py b/src/synapse_os/__init__.py similarity index 100% rename from src/aignt_os/__init__.py rename to src/synapse_os/__init__.py diff --git a/src/aignt_os/adapters.py b/src/synapse_os/adapters.py similarity index 97% rename from src/aignt_os/adapters.py rename to src/synapse_os/adapters.py index 21a84a0..5f71439 100644 --- a/src/aignt_os/adapters.py +++ b/src/synapse_os/adapters.py @@ -4,10 +4,10 @@ import time from abc import ABC, abstractmethod -from aignt_os.config import AppSettings -from aignt_os.contracts import CLIExecutionResult, CodexExecutionAssessment -from aignt_os.runtime.circuit_breaker import AdapterCircuitBreakerStore -from aignt_os.security import sanitize_clean_text +from synapse_os.config import AppSettings +from synapse_os.contracts import CLIExecutionResult, CodexExecutionAssessment +from synapse_os.runtime.circuit_breaker import AdapterCircuitBreakerStore +from synapse_os.security import sanitize_clean_text _LAUNCHER_UNAVAILABLE_PATTERNS = ( "docker: command not found", diff --git a/src/aignt_os/auth.py b/src/synapse_os/auth.py similarity index 98% rename from src/aignt_os/auth.py rename to src/synapse_os/auth.py index 9210172..df0b590 100644 --- a/src/aignt_os/auth.py +++ b/src/synapse_os/auth.py @@ -11,10 +11,10 @@ from pydantic import BaseModel, ConfigDict, Field, ValidationError -from aignt_os.runtime.state import STATE_DIR_MODE, STATE_FILE_MODE +from synapse_os.runtime.state import STATE_DIR_MODE, STATE_FILE_MODE if TYPE_CHECKING: - from aignt_os.config import AppSettings + from synapse_os.config import AppSettings Role = Literal["admin", "operator", "viewer"] diff --git a/src/aignt_os/cli/__init__.py b/src/synapse_os/cli/__init__.py similarity index 100% rename from src/aignt_os/cli/__init__.py rename to src/synapse_os/cli/__init__.py diff --git a/src/aignt_os/cli/app.py b/src/synapse_os/cli/app.py similarity index 93% rename from src/aignt_os/cli/app.py rename to src/synapse_os/cli/app.py index 8571808..5f7dee4 100644 --- a/src/aignt_os/cli/app.py +++ b/src/synapse_os/cli/app.py @@ -8,8 +8,8 @@ import typer from sqlalchemy.exc import NoResultFound -from aignt_os import __version__ -from aignt_os.auth import ( +from synapse_os import __version__ +from synapse_os.auth import ( AuthConfigurationError, AuthRegistryStore, Permission, @@ -17,7 +17,7 @@ get_auth_provider, is_authorized, ) -from aignt_os.cli.errors import ( +from synapse_os.cli.errors import ( CLIError, authentication_error, authorization_error, @@ -28,7 +28,7 @@ usage_error, validation_error, ) -from aignt_os.cli.rendering import ( +from synapse_os.cli.rendering import ( RunArtifactPreview, render_environment_doctor, render_run_detail, @@ -36,20 +36,20 @@ render_runs_list, render_runtime_status, ) -from aignt_os.config import AppSettings -from aignt_os.persistence import ArtifactStore, PersistedPipelineRunner, RunRepository -from aignt_os.pipeline import PIPELINE_STOP_STATES -from aignt_os.runtime.dispatch import ( +from synapse_os.config import AppSettings +from synapse_os.persistence import ArtifactStore, PersistedPipelineRunner, RunRepository +from synapse_os.pipeline import PIPELINE_STOP_STATES +from synapse_os.runtime.dispatch import ( AsyncDispatchOwnershipError, AsyncDispatchRuntimeUnavailableError, RunDispatchService, ) -from aignt_os.runtime.service import RuntimeLifecycleError, RuntimeService -from aignt_os.runtime.worker import build_runtime_worker -from aignt_os.security import resolve_path_within_root -from aignt_os.specs import SpecValidationError +from synapse_os.runtime.service import RuntimeLifecycleError, RuntimeService +from synapse_os.runtime.worker import build_runtime_worker +from synapse_os.security import resolve_path_within_root +from synapse_os.specs import SpecValidationError -app = typer.Typer(help="AIgnt OS CLI") +app = typer.Typer(help="SynapseOS CLI") runtime_app = typer.Typer(help="Manage the minimal persistent runtime.") runs_app = typer.Typer(help="Inspect persisted runs and artifacts.") auth_app = typer.Typer(help="Manage the local auth registry.") @@ -147,9 +147,9 @@ def _persistence_doctor_check( else "Run persistence path can be prepared by the current process." ) next_step = ( - "Inspect persisted outputs with `aignt runs show ` after a successful run." + "Inspect persisted outputs with `synapse runs show ` after a successful run." if expects_directory - else "You can submit a run with `aignt runs submit`." + else "You can submit a run with `synapse runs submit`." ) return _doctor_check( name=name, @@ -463,7 +463,7 @@ def auth_issue( role: Annotated[str | None, typer.Option("--role")] = None, auth_token: Annotated[ str | None, - typer.Option("--auth-token", envvar="AIGNT_OS_AUTH_TOKEN"), + typer.Option("--auth-token", envvar="SYNAPSE_OS_AUTH_TOKEN"), ] = None, ) -> None: try: @@ -492,7 +492,7 @@ def auth_disable( token_id: Annotated[str, typer.Option("--token-id")] = "", auth_token: Annotated[ str | None, - typer.Option("--auth-token", envvar="AIGNT_OS_AUTH_TOKEN"), + typer.Option("--auth-token", envvar="SYNAPSE_OS_AUTH_TOKEN"), ] = None, ) -> None: try: @@ -515,7 +515,7 @@ def auth_disable( def runtime_start( auth_token: Annotated[ str | None, - typer.Option("--auth-token", envvar="AIGNT_OS_AUTH_TOKEN"), + typer.Option("--auth-token", envvar="SYNAPSE_OS_AUTH_TOKEN"), ] = None, ) -> None: try: @@ -549,7 +549,7 @@ def runtime_status() -> None: def runtime_run( auth_token: Annotated[ str | None, - typer.Option("--auth-token", envvar="AIGNT_OS_AUTH_TOKEN"), + typer.Option("--auth-token", envvar="SYNAPSE_OS_AUTH_TOKEN"), ] = None, process_identity: Annotated[ str | None, @@ -564,13 +564,13 @@ def runtime_run( if process_identity is None: exec_env = os.environ.copy() if auth_token is not None: - exec_env["AIGNT_OS_AUTH_TOKEN"] = auth_token + exec_env["SYNAPSE_OS_AUTH_TOKEN"] = auth_token os.execvpe( sys.executable, [ sys.executable, "-c", - "from aignt_os.cli.app import app; app()", + "from synapse_os.cli.app import app; app()", "runtime", "run", "--process-identity", @@ -606,7 +606,7 @@ def runtime_ready() -> None: def runtime_stop( auth_token: Annotated[ str | None, - typer.Option("--auth-token", envvar="AIGNT_OS_AUTH_TOKEN"), + typer.Option("--auth-token", envvar="SYNAPSE_OS_AUTH_TOKEN"), ] = None, ) -> None: try: @@ -638,13 +638,13 @@ def watch( refresh: float = typer.Option(1.0, help="Refresh interval in seconds"), auth_token: Annotated[ str | None, - typer.Option("--auth-token", envvar="AIGNT_OS_AUTH_TOKEN"), + typer.Option("--auth-token", envvar="SYNAPSE_OS_AUTH_TOKEN"), ] = None, ) -> None: """ Monitor a run in real-time using a TUI dashboard. """ - from aignt_os.cli.dashboard import RunDashboard + from synapse_os.cli.dashboard import RunDashboard try: _resolve_principal_id(permission="run:read", auth_token=auth_token) @@ -666,7 +666,7 @@ def watch( def runs_list( auth_token: Annotated[ str | None, - typer.Option("--auth-token", envvar="AIGNT_OS_AUTH_TOKEN"), + typer.Option("--auth-token", envvar="SYNAPSE_OS_AUTH_TOKEN"), ] = None, ) -> None: try: @@ -699,7 +699,7 @@ def runs_submit( stop_at: Annotated[str, typer.Option("--stop-at")] = "SPEC_VALIDATION", auth_token: Annotated[ str | None, - typer.Option("--auth-token", envvar="AIGNT_OS_AUTH_TOKEN"), + typer.Option("--auth-token", envvar="SYNAPSE_OS_AUTH_TOKEN"), ] = None, ) -> None: try: @@ -737,7 +737,7 @@ def runs_cancel( run_id: str, auth_token: Annotated[ str | None, - typer.Option("--auth-token", envvar="AIGNT_OS_AUTH_TOKEN"), + typer.Option("--auth-token", envvar="SYNAPSE_OS_AUTH_TOKEN"), ] = None, ) -> None: """ @@ -775,7 +775,7 @@ def runs_show( preview: Annotated[str | None, typer.Option("--preview")] = None, auth_token: Annotated[ str | None, - typer.Option("--auth-token", envvar="AIGNT_OS_AUTH_TOKEN"), + typer.Option("--auth-token", envvar="SYNAPSE_OS_AUTH_TOKEN"), ] = None, ) -> None: try: diff --git a/src/aignt_os/cli/dashboard.py b/src/synapse_os/cli/dashboard.py similarity index 98% rename from src/aignt_os/cli/dashboard.py rename to src/synapse_os/cli/dashboard.py index 41a0f9a..68c9859 100644 --- a/src/aignt_os/cli/dashboard.py +++ b/src/synapse_os/cli/dashboard.py @@ -19,9 +19,9 @@ TabPane, ) -from aignt_os.cli.rendering import truncate_logs -from aignt_os.config import AppSettings -from aignt_os.persistence import ArtifactStore, RunRecord, RunRepository, RunStepRecord +from synapse_os.cli.rendering import truncate_logs +from synapse_os.config import AppSettings +from synapse_os.persistence import ArtifactStore, RunRecord, RunRepository, RunStepRecord class LogViewer(ModalScreen[None]): @@ -343,7 +343,7 @@ def show_artifact(self, path_str: str) -> None: class RunDashboard(App[None]): - """Dashboard TUI Moderno para AIgnt OS.""" + """Dashboard TUI Moderno para SynapseOS.""" CSS = """ Screen { @@ -578,7 +578,7 @@ def compose(self) -> ComposeResult: yield Footer() def on_mount(self) -> None: - self.title = f"AIgnt OS Watcher - {self.run_id}" + self.title = f"SynapseOS Watcher - {self.run_id}" self.set_interval(self.refresh_interval, self.refresh_data) self.refresh_data() @@ -619,7 +619,7 @@ def refresh_data(self) -> None: filter_text = "" if self.current_filter != "all": filter_text = f" [FILTER: {self.current_filter}]" - self.title = f"AIgnt OS Watcher - {self.run_id}{filter_text}" + self.title = f"SynapseOS Watcher - {self.run_id}{filter_text}" # Simple diff: rebuild list if count changes or status changes # For MVP simplicity, verify if rebuild is needed diff --git a/src/aignt_os/cli/errors.py b/src/synapse_os/cli/errors.py similarity index 100% rename from src/aignt_os/cli/errors.py rename to src/synapse_os/cli/errors.py diff --git a/src/aignt_os/cli/rendering.py b/src/synapse_os/cli/rendering.py similarity index 97% rename from src/aignt_os/cli/rendering.py rename to src/synapse_os/cli/rendering.py index 3d9ec94..0c0138d 100644 --- a/src/aignt_os/cli/rendering.py +++ b/src/synapse_os/cli/rendering.py @@ -8,9 +8,9 @@ from rich.table import Table from rich.text import Text -from aignt_os.persistence import RunEventRecord, RunRecord, RunStepRecord -from aignt_os.runtime.dispatch import RunDispatchResult -from aignt_os.runtime.state import RuntimeState +from synapse_os.persistence import RunEventRecord, RunRecord, RunStepRecord +from synapse_os.runtime.dispatch import RunDispatchResult +from synapse_os.runtime.state import RuntimeState @dataclass(frozen=True, slots=True) @@ -45,7 +45,7 @@ def render_runtime_status( status_style = _status_style(state.status) lines: list[Text] = [ - Text("AIgnt OS Runtime", style="bold cyan"), + Text("SynapseOS Runtime", style="bold cyan"), Text.assemble(("Status: ", "dim"), (state.status, status_style)), ] if state.pid is not None: diff --git a/src/aignt_os/config.py b/src/synapse_os/config.py similarity index 84% rename from src/aignt_os/config.py rename to src/synapse_os/config.py index 773a47a..fc5cc71 100644 --- a/src/aignt_os/config.py +++ b/src/synapse_os/config.py @@ -4,20 +4,20 @@ from pydantic import Field from pydantic_settings import BaseSettings, SettingsConfigDict -from aignt_os.security import DEFAULT_SECRET_MASK_PATTERNS, resolve_path_within_root +from synapse_os.security import DEFAULT_SECRET_MASK_PATTERNS, resolve_path_within_root class AppSettings(BaseSettings): model_config = SettingsConfigDict( - env_prefix="AIGNT_OS_", + env_prefix="SYNAPSE_OS_", extra="ignore", ) - app_name: str = "AIgnt OS" + app_name: str = "SynapseOS" environment: Literal["development", "test", "production"] = "development" - runtime_state_dir: Path = Path(".aignt-os/runtime") - runs_db_path: Path = Path(".aignt-os/runs/runs.sqlite3") - artifacts_dir: Path = Path(".aignt-os/artifacts") + runtime_state_dir: Path = Path(".synapse-os/runtime") + runs_db_path: Path = Path(".synapse-os/runs/runs.sqlite3") + artifacts_dir: Path = Path(".synapse-os/artifacts") workspace_root: Path = Field(default_factory=Path.cwd) runtime_poll_interval_seconds: float = 0.5 run_initiated_by: str = "local_cli" diff --git a/src/aignt_os/contracts.py b/src/synapse_os/contracts.py similarity index 100% rename from src/aignt_os/contracts.py rename to src/synapse_os/contracts.py diff --git a/src/aignt_os/parsing.py b/src/synapse_os/parsing.py similarity index 99% rename from src/aignt_os/parsing.py rename to src/synapse_os/parsing.py index 201ea1a..b14f548 100644 --- a/src/aignt_os/parsing.py +++ b/src/synapse_os/parsing.py @@ -5,7 +5,7 @@ from pydantic import BaseModel, ConfigDict, Field -from aignt_os.security import ( +from synapse_os.security import ( mask_secrets, normalize_unicode, strip_ansi_sequences, diff --git a/src/aignt_os/persistence.py b/src/synapse_os/persistence.py similarity index 98% rename from src/aignt_os/persistence.py rename to src/synapse_os/persistence.py index cd16751..48979e2 100644 --- a/src/aignt_os/persistence.py +++ b/src/synapse_os/persistence.py @@ -23,8 +23,8 @@ from sqlalchemy.engine import RowMapping from sqlalchemy.sql import update -from aignt_os.parsing import ParsingArtifactError, validate_named_artifact_content -from aignt_os.pipeline import ( +from synapse_os.parsing import ParsingArtifactError, validate_named_artifact_content +from synapse_os.pipeline import ( PRIMARY_EXECUTOR_ROUTE, PipelineCancelledError, PipelineContext, @@ -34,8 +34,8 @@ StepExecutionResult, StepExecutor, ) -from aignt_os.security import compute_file_sha256, resolve_path_within_root, sanitize_clean_text -from aignt_os.supervisor import Supervisor, SupervisorDecision +from synapse_os.security import compute_file_sha256, resolve_path_within_root, sanitize_clean_text +from synapse_os.supervisor import Supervisor, SupervisorDecision ARTIFACT_DIR_MODE = 0o700 ARTIFACT_FILE_MODE = 0o600 @@ -621,7 +621,7 @@ def on_run_failed( ) try: - from aignt_os.reporting import RunReportGenerator + from synapse_os.reporting import RunReportGenerator generator = RunReportGenerator( repository=cast(Any, self.repository), @@ -971,7 +971,7 @@ def execute(self, step: PipelineStep, context: PipelineContext) -> StepExecution if context.run_id is None: raise ValueError("Pipeline context is missing run_id for report generation.") - from aignt_os.reporting import RunReportGenerator + from synapse_os.reporting import RunReportGenerator generator = RunReportGenerator( repository=cast(Any, self.repository), diff --git a/src/aignt_os/pipeline.py b/src/synapse_os/pipeline.py similarity index 97% rename from src/aignt_os/pipeline.py rename to src/synapse_os/pipeline.py index f9a386a..fe2575d 100644 --- a/src/aignt_os/pipeline.py +++ b/src/synapse_os/pipeline.py @@ -5,16 +5,16 @@ from pydantic import BaseModel, ConfigDict, Field, StrictStr -from aignt_os.config import AppSettings -from aignt_os.specs import ( +from synapse_os.config import AppSettings +from synapse_os.specs import ( SpecDocument, validate_spec_file, ) -from aignt_os.specs import ( +from synapse_os.specs import ( SpecValidationError as _SpecValidationError, ) -from aignt_os.state_machine import LINEAR_STATE_FLOW, AIgntStateMachine -from aignt_os.supervisor import ( +from synapse_os.state_machine import LINEAR_STATE_FLOW, SynapseStateMachine +from synapse_os.supervisor import ( RetryableStepError, Supervisor, SupervisorDecision, @@ -170,14 +170,14 @@ def __init__( *, settings: AppSettings | None = None, executors: dict[str, StepExecutor | dict[str, StepExecutor]] | None = None, - state_machine: AIgntStateMachine | None = None, + state_machine: SynapseStateMachine | None = None, observer: PipelineObserver | None = None, supervisor: Supervisor | None = None, cancellation_checker: CancellationChecker | None = None, ) -> None: self.settings = settings or AppSettings() self.executors = self._normalize_executors(executors or {}) - self.state_machine = state_machine or AIgntStateMachine() + self.state_machine = state_machine or SynapseStateMachine() self.observer = observer self.cancellation_checker = cancellation_checker diff --git a/src/aignt_os/reporting.py b/src/synapse_os/reporting.py similarity index 100% rename from src/aignt_os/reporting.py rename to src/synapse_os/reporting.py diff --git a/src/synapse_os/runtime/__init__.py b/src/synapse_os/runtime/__init__.py new file mode 100644 index 0000000..8c7203c --- /dev/null +++ b/src/synapse_os/runtime/__init__.py @@ -0,0 +1 @@ +"""Minimal persistent runtime for the SynapseOS MVP.""" diff --git a/src/aignt_os/runtime/circuit_breaker.py b/src/synapse_os/runtime/circuit_breaker.py similarity index 98% rename from src/aignt_os/runtime/circuit_breaker.py rename to src/synapse_os/runtime/circuit_breaker.py index 3c00f07..9a399f3 100644 --- a/src/aignt_os/runtime/circuit_breaker.py +++ b/src/synapse_os/runtime/circuit_breaker.py @@ -6,7 +6,7 @@ from dataclasses import asdict, dataclass from pathlib import Path -from aignt_os.runtime.state import STATE_DIR_MODE, STATE_FILE_MODE +from synapse_os.runtime.state import STATE_DIR_MODE, STATE_FILE_MODE @dataclass(frozen=True, slots=True) diff --git a/src/aignt_os/runtime/dispatch.py b/src/synapse_os/runtime/dispatch.py similarity index 94% rename from src/aignt_os/runtime/dispatch.py rename to src/synapse_os/runtime/dispatch.py index 2375a86..963199a 100644 --- a/src/aignt_os/runtime/dispatch.py +++ b/src/synapse_os/runtime/dispatch.py @@ -5,10 +5,10 @@ from pathlib import Path from typing import Literal -from aignt_os.persistence import PersistedPipelineRunner, RunRepository -from aignt_os.runtime.state import RuntimeState -from aignt_os.security import compute_file_sha256, resolve_path_within_root -from aignt_os.specs import validate_spec_file +from synapse_os.persistence import PersistedPipelineRunner, RunRepository +from synapse_os.runtime.state import RuntimeState +from synapse_os.security import compute_file_sha256, resolve_path_within_root +from synapse_os.specs import validate_spec_file DispatchMode = Literal["sync", "async", "auto"] ResolvedDispatchMode = Literal["sync", "async"] diff --git a/src/aignt_os/runtime/service.py b/src/synapse_os/runtime/service.py similarity index 95% rename from src/aignt_os/runtime/service.py rename to src/synapse_os/runtime/service.py index 6075619..2b87974 100644 --- a/src/aignt_os/runtime/service.py +++ b/src/synapse_os/runtime/service.py @@ -9,10 +9,10 @@ import time from pathlib import Path -from aignt_os.runtime.state import RuntimeState, RuntimeStateStore -from aignt_os.runtime.worker import RuntimeWorker +from synapse_os.runtime.state import RuntimeState, RuntimeStateStore +from synapse_os.runtime.worker import RuntimeWorker -PROCESS_MARKER = "--aignt-runtime-process" +PROCESS_MARKER = "--synapse-runtime-process" def _runtime_process_code() -> str: @@ -78,7 +78,7 @@ def handle_shutdown(signum: int, frame: object) -> None: previous_sigterm = signal.signal(signal.SIGTERM, handle_shutdown) previous_sigint = signal.signal(signal.SIGINT, handle_shutdown) - # This is the minimal resident process for the AIgnt-Synapse-Flow runtime. + # This is the minimal resident process for the Synapse-Flow runtime. self.state_store.write_running( os.getpid(), process_identity, diff --git a/src/aignt_os/runtime/state.py b/src/synapse_os/runtime/state.py similarity index 100% rename from src/aignt_os/runtime/state.py rename to src/synapse_os/runtime/state.py diff --git a/src/aignt_os/runtime/worker.py b/src/synapse_os/runtime/worker.py similarity index 96% rename from src/aignt_os/runtime/worker.py rename to src/synapse_os/runtime/worker.py index 7252e9e..75d1d51 100644 --- a/src/aignt_os/runtime/worker.py +++ b/src/synapse_os/runtime/worker.py @@ -3,14 +3,14 @@ import time from collections.abc import Callable -from aignt_os.config import AppSettings -from aignt_os.persistence import ( +from synapse_os.config import AppSettings +from synapse_os.persistence import ( ArtifactStore, PersistedPipelineRunner, RunRecord, RunRepository, ) -from aignt_os.runtime.state import RuntimeState, RuntimeStateStore +from synapse_os.runtime.state import RuntimeState, RuntimeStateStore LEGACY_INITIATED_BY_VALUES = frozenset({"unknown", "system", "local_cli"}) RUNTIME_OWNER_SKIP_EVENT = "runtime_owner_skip" diff --git a/src/aignt_os/security.py b/src/synapse_os/security.py similarity index 100% rename from src/aignt_os/security.py rename to src/synapse_os/security.py diff --git a/src/aignt_os/specs/__init__.py b/src/synapse_os/specs/__init__.py similarity index 100% rename from src/aignt_os/specs/__init__.py rename to src/synapse_os/specs/__init__.py diff --git a/src/aignt_os/specs/validator.py b/src/synapse_os/specs/validator.py similarity index 100% rename from src/aignt_os/specs/validator.py rename to src/synapse_os/specs/validator.py diff --git a/src/aignt_os/state_machine.py b/src/synapse_os/state_machine.py similarity index 98% rename from src/aignt_os/state_machine.py rename to src/synapse_os/state_machine.py index 27afe0f..f3bbdd1 100644 --- a/src/aignt_os/state_machine.py +++ b/src/synapse_os/state_machine.py @@ -26,7 +26,7 @@ class InvalidStateTransition(ValueError): @dataclass -class AIgntStateMachine: +class SynapseStateMachine: current_state: str = "REQUEST" _allowed_transitions: dict[str, set[str]] = field(init=False, repr=False) diff --git a/src/aignt_os/supervisor.py b/src/synapse_os/supervisor.py similarity index 100% rename from src/aignt_os/supervisor.py rename to src/synapse_os/supervisor.py diff --git a/tests/fixtures/cli_outputs/codex_tests.txt b/tests/fixtures/cli_outputs/codex_tests.txt index 3018c1f..8ffa2d3 100644 --- a/tests/fixtures/cli_outputs/codex_tests.txt +++ b/tests/fixtures/cli_outputs/codex_tests.txt @@ -2,7 +2,7 @@ Generating test suite based on SPEC acceptance criteria... ```python import pytest -from aignt_os.persistence import RunRepository, ArtifactStore +from synapse_os.persistence import RunRepository, ArtifactStore def test_run_repository_persists_run_after_creation(tmp_path): diff --git a/tests/fixtures/docker/invalid_compose_config.txt b/tests/fixtures/docker/invalid_compose_config.txt index 5d97e34..8d50472 100644 --- a/tests/fixtures/docker/invalid_compose_config.txt +++ b/tests/fixtures/docker/invalid_compose_config.txt @@ -1,6 +1,6 @@ -name: aignt-os +name: synapse-os services: - aignt-os: + synapse-os: image: nonexistent-image:missing environment: - INVALID_FORMAT_WITHOUT_VALUE diff --git a/tests/fixtures/docker/valid_compose_config.txt b/tests/fixtures/docker/valid_compose_config.txt index ec6eed1..40fa320 100644 --- a/tests/fixtures/docker/valid_compose_config.txt +++ b/tests/fixtures/docker/valid_compose_config.txt @@ -1,11 +1,11 @@ -name: aignt-os +name: synapse-os services: - aignt-os: + synapse-os: build: context: . dockerfile: Dockerfile environment: - AIGNT_OS_ENVIRONMENT: development + SYNAPSE_OS_ENVIRONMENT: development volumes: - ./artifacts:/app/artifacts restart: unless-stopped diff --git a/tests/fixtures/reports/expected_run_report.md b/tests/fixtures/reports/expected_run_report.md index 52fa19d..bb8f2f1 100644 --- a/tests/fixtures/reports/expected_run_report.md +++ b/tests/fixtures/reports/expected_run_report.md @@ -7,7 +7,7 @@ - **Initiated By**: local_cli - **Spec Hash**: abc123 - **SPEC ID**: F06-pipeline-engine-linear -- **SPEC Summary**: Implementar a primeira engine linear do AIgnt-Synapse-Flow +- **SPEC Summary**: Implementar a primeira engine linear do Synapse-Flow ## Estados percorridos diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index 252d179..de91694 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -22,16 +22,16 @@ def cli_runner() -> CliRunner: @pytest.fixture() def cli_app(): """Return the main Typer app.""" - return import_module("aignt_os.cli.app").app + return import_module("synapse_os.cli.app").app @pytest.fixture() def runtime_env(tmp_path: Path) -> dict[str, str]: """Return environment variables pointing the runtime to a temporary directory.""" return { - "AIGNT_OS_ENVIRONMENT": "test", - "AIGNT_OS_RUNTIME_STATE_DIR": str(tmp_path), - "AIGNT_OS_WORKSPACE_ROOT": str(tmp_path), + "SYNAPSE_OS_ENVIRONMENT": "test", + "SYNAPSE_OS_RUNTIME_STATE_DIR": str(tmp_path), + "SYNAPSE_OS_WORKSPACE_ROOT": str(tmp_path), } @@ -42,9 +42,9 @@ def subprocess_env(tmp_path: Path) -> dict[str, str]: python_path = str(REPO_ROOT / "src") existing = env.get("PYTHONPATH") env["PYTHONPATH"] = f"{python_path}{os.pathsep}{existing}" if existing else python_path - env["AIGNT_OS_ENVIRONMENT"] = "test" - env["AIGNT_OS_RUNTIME_STATE_DIR"] = str(tmp_path) - env["AIGNT_OS_WORKSPACE_ROOT"] = str(tmp_path) + env["SYNAPSE_OS_ENVIRONMENT"] = "test" + env["SYNAPSE_OS_RUNTIME_STATE_DIR"] = str(tmp_path) + env["SYNAPSE_OS_WORKSPACE_ROOT"] = str(tmp_path) return env diff --git a/tests/integration/test_adapter_concurrency_flow.py b/tests/integration/test_adapter_concurrency_flow.py index c3772f2..3c45451 100644 --- a/tests/integration/test_adapter_concurrency_flow.py +++ b/tests/integration/test_adapter_concurrency_flow.py @@ -24,9 +24,9 @@ def kill(self) -> None: def test_adapter_concurrency_flow_uses_env_limit_to_serialize_subprocess_spawns( monkeypatch: pytest.MonkeyPatch, ) -> None: - adapters = import_module("aignt_os.adapters") + adapters = import_module("synapse_os.adapters") adapters._ADAPTER_EXECUTION_GUARDS.clear() - monkeypatch.setenv("AIGNT_OS_MAX_CONCURRENT_ADAPTERS", "1") + monkeypatch.setenv("SYNAPSE_OS_MAX_CONCURRENT_ADAPTERS", "1") class FakeAdapter(adapters.BaseCLIAdapter): def build_command(self, prompt: str) -> list[str]: diff --git a/tests/integration/test_adapter_parser_flow.py b/tests/integration/test_adapter_parser_flow.py index 2f1165a..e4a3743 100644 --- a/tests/integration/test_adapter_parser_flow.py +++ b/tests/integration/test_adapter_parser_flow.py @@ -10,7 +10,7 @@ import pytest -from aignt_os import parsing +from synapse_os import parsing FIXTURES_DIR = Path(__file__).parent.parent / "fixtures" / "cli_outputs" diff --git a/tests/integration/test_cli_auth_rbac.py b/tests/integration/test_cli_auth_rbac.py index c8b168f..afdd6d6 100644 --- a/tests/integration/test_cli_auth_rbac.py +++ b/tests/integration/test_cli_auth_rbac.py @@ -35,12 +35,12 @@ def _write_valid_spec(path: Path) -> None: def _auth_env(tmp_path: Path) -> dict[str, str]: env = { - "AIGNT_OS_ENVIRONMENT": "test", - "AIGNT_OS_RUNTIME_STATE_DIR": str(tmp_path / "runtime"), - "AIGNT_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), - "AIGNT_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), - "AIGNT_OS_WORKSPACE_ROOT": str(tmp_path), - "AIGNT_OS_AUTH_ENABLED": "true", + "SYNAPSE_OS_ENVIRONMENT": "test", + "SYNAPSE_OS_RUNTIME_STATE_DIR": str(tmp_path / "runtime"), + "SYNAPSE_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), + "SYNAPSE_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), + "SYNAPSE_OS_WORKSPACE_ROOT": str(tmp_path), + "SYNAPSE_OS_AUTH_ENABLED": "true", } return env @@ -103,12 +103,12 @@ def test_runs_submit_preserves_baseline_when_auth_is_disabled( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) env = _auth_env(tmp_path) - env["AIGNT_OS_AUTH_ENABLED"] = "false" + env["SYNAPSE_OS_AUTH_ENABLED"] = "false" result = cli_runner.invoke( cli_app, @@ -128,7 +128,7 @@ def test_runs_submit_requires_authentication_when_auth_is_enabled( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -155,7 +155,7 @@ def test_runs_submit_fails_closed_when_auth_registry_is_missing( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -191,7 +191,7 @@ def test_runs_submit_rejects_viewer_role_for_mutation( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -228,13 +228,13 @@ def test_runs_submit_accepts_operator_and_persists_authenticated_principal( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) _write_auth_registry(tmp_path) env = _auth_env(tmp_path) - env["AIGNT_OS_AUTH_TOKEN"] = "operator-token" + env["SYNAPSE_OS_AUTH_TOKEN"] = "operator-token" result = cli_runner.invoke( cli_app, @@ -254,13 +254,13 @@ def test_runs_submit_async_requires_running_runtime_when_auth_is_enabled( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) _write_auth_registry(tmp_path) env = _auth_env(tmp_path) - env["AIGNT_OS_AUTH_TOKEN"] = "operator-token" + env["SYNAPSE_OS_AUTH_TOKEN"] = "operator-token" result = cli_runner.invoke( cli_app, @@ -283,7 +283,7 @@ def test_runs_submit_async_rejects_runtime_started_by_another_operator( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -323,7 +323,7 @@ def test_runs_submit_auto_rejects_runtime_started_by_another_operator( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -363,13 +363,13 @@ def test_runs_submit_async_allows_legacy_runtime_binding_without_started_by( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) _write_auth_registry(tmp_path) env = _auth_env(tmp_path) - env["AIGNT_OS_AUTH_TOKEN"] = "operator-token" + env["SYNAPSE_OS_AUTH_TOKEN"] = "operator-token" start_result = cli_runner.invoke(cli_app, ["runtime", "start"], env=env) runtime_state_path = tmp_path / "runtime" / "runtime-state.json" @@ -439,7 +439,7 @@ def test_runtime_start_and_stop_accept_operator_token( ) -> None: _write_auth_registry(tmp_path) env = _auth_env(tmp_path) - env["AIGNT_OS_AUTH_TOKEN"] = "operator-token" + env["SYNAPSE_OS_AUTH_TOKEN"] = "operator-token" start_result = cli_runner.invoke(cli_app, ["runtime", "start"], env=env) stop_result = cli_runner.invoke(cli_app, ["runtime", "stop"], env=env) @@ -457,7 +457,7 @@ def test_runtime_status_shows_started_by_for_authenticated_runtime( ) -> None: _write_auth_registry(tmp_path) env = _auth_env(tmp_path) - env["AIGNT_OS_AUTH_TOKEN"] = "operator-token" + env["SYNAPSE_OS_AUTH_TOKEN"] = "operator-token" start_result = cli_runner.invoke(cli_app, ["runtime", "start"], env=env) status_result = cli_runner.invoke(cli_app, ["runtime", "status"], env=env) @@ -532,7 +532,7 @@ def test_runtime_status_marks_legacy_binding_unavailable_under_auth( ) -> None: _write_auth_registry(tmp_path) env = _auth_env(tmp_path) - env["AIGNT_OS_AUTH_TOKEN"] = "operator-token" + env["SYNAPSE_OS_AUTH_TOKEN"] = "operator-token" start_result = cli_runner.invoke(cli_app, ["runtime", "start"], env=env) runtime_state_path = tmp_path / "runtime" / "runtime-state.json" diff --git a/tests/integration/test_cli_auth_rbac_admin.py b/tests/integration/test_cli_auth_rbac_admin.py index aac4d39..aca6a4a 100644 --- a/tests/integration/test_cli_auth_rbac_admin.py +++ b/tests/integration/test_cli_auth_rbac_admin.py @@ -7,12 +7,12 @@ def _auth_env(tmp_path: Path) -> dict[str, str]: env = { - "AIGNT_OS_ENVIRONMENT": "test", - "AIGNT_OS_RUNTIME_STATE_DIR": str(tmp_path / "runtime"), - "AIGNT_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), - "AIGNT_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), - "AIGNT_OS_WORKSPACE_ROOT": str(tmp_path), - "AIGNT_OS_AUTH_ENABLED": "true", + "SYNAPSE_OS_ENVIRONMENT": "test", + "SYNAPSE_OS_RUNTIME_STATE_DIR": str(tmp_path / "runtime"), + "SYNAPSE_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), + "SYNAPSE_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), + "SYNAPSE_OS_WORKSPACE_ROOT": str(tmp_path), + "SYNAPSE_OS_AUTH_ENABLED": "true", } return env diff --git a/tests/integration/test_cli_auth_registry.py b/tests/integration/test_cli_auth_registry.py index a416001..5e7270c 100644 --- a/tests/integration/test_cli_auth_registry.py +++ b/tests/integration/test_cli_auth_registry.py @@ -6,12 +6,12 @@ def _auth_env(tmp_path: Path) -> dict[str, str]: return { - "AIGNT_OS_ENVIRONMENT": "test", - "AIGNT_OS_RUNTIME_STATE_DIR": str(tmp_path / "runtime"), - "AIGNT_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), - "AIGNT_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), - "AIGNT_OS_WORKSPACE_ROOT": str(tmp_path), - "AIGNT_OS_AUTH_ENABLED": "true", + "SYNAPSE_OS_ENVIRONMENT": "test", + "SYNAPSE_OS_RUNTIME_STATE_DIR": str(tmp_path / "runtime"), + "SYNAPSE_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), + "SYNAPSE_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), + "SYNAPSE_OS_WORKSPACE_ROOT": str(tmp_path), + "SYNAPSE_OS_AUTH_ENABLED": "true", } @@ -55,7 +55,7 @@ def test_auth_init_creates_registry_and_prints_token_once( cli_runner, cli_app, ) -> None: - auth_module = import_module("aignt_os.auth") + auth_module = import_module("synapse_os.auth") result = cli_runner.invoke( cli_app, @@ -104,7 +104,7 @@ def test_auth_issue_creates_new_viewer_principal_when_role_is_provided( cli_runner, cli_app, ) -> None: - auth_module = import_module("aignt_os.auth") + auth_module = import_module("synapse_os.auth") init_result = cli_runner.invoke( cli_app, @@ -114,7 +114,7 @@ def test_auth_issue_creates_new_viewer_principal_when_role_is_provided( admin_token = _extract_value(init_result.stdout, "Auth Token") env = _auth_env(tmp_path) - env["AIGNT_OS_AUTH_TOKEN"] = admin_token + env["SYNAPSE_OS_AUTH_TOKEN"] = admin_token issue_result = cli_runner.invoke( cli_app, @@ -145,7 +145,7 @@ def test_auth_issue_rejects_role_conflict_for_existing_principal( admin_token = _extract_value(init_result.stdout, "Auth Token") env = _auth_env(tmp_path) - env["AIGNT_OS_AUTH_TOKEN"] = admin_token + env["SYNAPSE_OS_AUTH_TOKEN"] = admin_token cli_runner.invoke( cli_app, @@ -176,7 +176,7 @@ def test_auth_disable_revokes_token_used_by_runs_submit( admin_token = _extract_value(init_result.stdout, "Auth Token") env = _auth_env(tmp_path) - env["AIGNT_OS_AUTH_TOKEN"] = admin_token + env["SYNAPSE_OS_AUTH_TOKEN"] = admin_token issue_result = cli_runner.invoke( cli_app, @@ -195,7 +195,7 @@ def test_auth_disable_revokes_token_used_by_runs_submit( spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) submit_env = _auth_env(tmp_path) - submit_env["AIGNT_OS_AUTH_TOKEN"] = token + submit_env["SYNAPSE_OS_AUTH_TOKEN"] = token submit_result = cli_runner.invoke( cli_app, ["runs", "submit", str(spec_path), "--mode", "sync", "--stop-at", "SPEC_VALIDATION"], @@ -216,8 +216,8 @@ def test_auth_init_rejects_state_dir_outside_workspace_root( cli_app, ) -> None: env = _auth_env(tmp_path) - env["AIGNT_OS_WORKSPACE_ROOT"] = str(tmp_path / "workspace") - env["AIGNT_OS_RUNTIME_STATE_DIR"] = str(tmp_path / "outside-runtime") + env["SYNAPSE_OS_WORKSPACE_ROOT"] = str(tmp_path / "workspace") + env["SYNAPSE_OS_RUNTIME_STATE_DIR"] = str(tmp_path / "outside-runtime") result = cli_runner.invoke( cli_app, diff --git a/tests/integration/test_cli_bootstrap.py b/tests/integration/test_cli_bootstrap.py index 732a97b..86210a8 100644 --- a/tests/integration/test_cli_bootstrap.py +++ b/tests/integration/test_cli_bootstrap.py @@ -6,7 +6,7 @@ def test_cli_help_returns_success() -> None: - cli_module = import_module("aignt_os.cli.app") + cli_module = import_module("synapse_os.cli.app") result = runner.invoke(cli_module.app, ["--help"]) @@ -15,7 +15,7 @@ def test_cli_help_returns_success() -> None: def test_cli_version_returns_success() -> None: - cli_module = import_module("aignt_os.cli.app") + cli_module = import_module("synapse_os.cli.app") result = runner.invoke(cli_module.app, ["version"]) diff --git a/tests/integration/test_cli_cancellation.py b/tests/integration/test_cli_cancellation.py index 630ca3f..5bb39d4 100644 --- a/tests/integration/test_cli_cancellation.py +++ b/tests/integration/test_cli_cancellation.py @@ -1,9 +1,9 @@ import pytest from typer.testing import CliRunner -from aignt_os.cli.app import app -from aignt_os.config import AppSettings -from aignt_os.persistence import RunRepository +from synapse_os.cli.app import app +from synapse_os.config import AppSettings +from synapse_os.persistence import RunRepository runner = CliRunner() @@ -22,8 +22,8 @@ def app_settings(tmp_path): def test_cli_cancel_run_not_found(tmp_path, monkeypatch): - monkeypatch.setenv("AIGNT_OS_WORKSPACE_ROOT", str(tmp_path)) - monkeypatch.setenv("AIGNT_OS_RUNS_DB_PATH", str(tmp_path / "runs.db")) + monkeypatch.setenv("SYNAPSE_OS_WORKSPACE_ROOT", str(tmp_path)) + monkeypatch.setenv("SYNAPSE_OS_RUNS_DB_PATH", str(tmp_path / "runs.db")) result = runner.invoke(app, ["runs", "cancel", "non-existent-id"]) print(f"STDOUT: {result.stdout}") print(f"STDERR: {result.stderr}") @@ -50,8 +50,8 @@ def test_cli_cancel_pending_run(tmp_path, monkeypatch): ) # Run cancel command - monkeypatch.setenv("AIGNT_OS_WORKSPACE_ROOT", str(tmp_path)) - monkeypatch.setenv("AIGNT_OS_RUNS_DB_PATH", str(db_path)) + monkeypatch.setenv("SYNAPSE_OS_WORKSPACE_ROOT", str(tmp_path)) + monkeypatch.setenv("SYNAPSE_OS_RUNS_DB_PATH", str(db_path)) result = runner.invoke(app, ["runs", "cancel", run_id]) print(f"STDOUT: {result.stdout}") @@ -84,8 +84,8 @@ def test_cli_cancel_running_run(tmp_path, monkeypatch): repo.acquire_lock(run_id) # Run cancel command - monkeypatch.setenv("AIGNT_OS_WORKSPACE_ROOT", str(tmp_path)) - monkeypatch.setenv("AIGNT_OS_RUNS_DB_PATH", str(db_path)) + monkeypatch.setenv("SYNAPSE_OS_WORKSPACE_ROOT", str(tmp_path)) + monkeypatch.setenv("SYNAPSE_OS_RUNS_DB_PATH", str(db_path)) result = runner.invoke(app, ["runs", "cancel", run_id]) print(f"STDOUT: {result.stdout}") diff --git a/tests/integration/test_cli_error_model.py b/tests/integration/test_cli_error_model.py index 9968c32..544f655 100644 --- a/tests/integration/test_cli_error_model.py +++ b/tests/integration/test_cli_error_model.py @@ -7,19 +7,19 @@ def _submit_env(tmp_path: Path) -> dict[str, str]: return { - "AIGNT_OS_ENVIRONMENT": "test", - "AIGNT_OS_RUNTIME_STATE_DIR": str(tmp_path / "runtime"), - "AIGNT_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), - "AIGNT_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), - "AIGNT_OS_WORKSPACE_ROOT": str(tmp_path), + "SYNAPSE_OS_ENVIRONMENT": "test", + "SYNAPSE_OS_RUNTIME_STATE_DIR": str(tmp_path / "runtime"), + "SYNAPSE_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), + "SYNAPSE_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), + "SYNAPSE_OS_WORKSPACE_ROOT": str(tmp_path), } def _runtime_env(tmp_path: Path) -> dict[str, str]: return { - "AIGNT_OS_ENVIRONMENT": "test", - "AIGNT_OS_RUNTIME_STATE_DIR": str(tmp_path), - "AIGNT_OS_WORKSPACE_ROOT": str(tmp_path), + "SYNAPSE_OS_ENVIRONMENT": "test", + "SYNAPSE_OS_RUNTIME_STATE_DIR": str(tmp_path), + "SYNAPSE_OS_WORKSPACE_ROOT": str(tmp_path), } @@ -113,7 +113,7 @@ def test_runs_submit_unexpected_dispatch_failure_returns_execution_error_code( cli_runner, monkeypatch, ) -> None: - cli_module = import_module("aignt_os.cli.app") + cli_module = import_module("synapse_os.cli.app") class _BrokenDispatchService: def dispatch(self, *args, **kwargs): # type: ignore[no-untyped-def] diff --git a/tests/integration/test_codex_adapter_operational.py b/tests/integration/test_codex_adapter_operational.py index 1673629..e0acee1 100644 --- a/tests/integration/test_codex_adapter_operational.py +++ b/tests/integration/test_codex_adapter_operational.py @@ -33,7 +33,7 @@ def test_codex_cli_adapter_executes_real_launcher_with_fake_docker( tmp_path: Path, monkeypatch: pytest.MonkeyPatch, ) -> None: - adapters = import_module("aignt_os.adapters") + adapters = import_module("synapse_os.adapters") fake_docker_log = tmp_path / "docker.log" _install_fake_docker( @@ -92,7 +92,7 @@ def test_codex_cli_adapter_classifies_real_launcher_failure_with_fake_docker( tmp_path: Path, monkeypatch: pytest.MonkeyPatch, ) -> None: - adapters = import_module("aignt_os.adapters") + adapters = import_module("synapse_os.adapters") _install_fake_docker( tmp_path, @@ -128,7 +128,7 @@ def test_codex_cli_adapter_persists_breaker_between_instances_with_fake_docker( tmp_path: Path, monkeypatch: pytest.MonkeyPatch, ) -> None: - adapters = import_module("aignt_os.adapters") + adapters = import_module("synapse_os.adapters") fake_docker_log = tmp_path / "docker.log" _install_fake_docker( @@ -154,10 +154,10 @@ def test_codex_cli_adapter_persists_breaker_between_instances_with_fake_docker( monkeypatch.setenv("FAKE_DOCKER_LOG", str(fake_docker_log)) monkeypatch.setenv("PATH", f"{tmp_path}{os.pathsep}{os.environ['PATH']}") - monkeypatch.setenv("AIGNT_OS_RUNTIME_STATE_DIR", str(tmp_path / "runtime")) - monkeypatch.setenv("AIGNT_OS_WORKSPACE_ROOT", str(tmp_path)) - monkeypatch.setenv("AIGNT_OS_ADAPTER_CIRCUIT_BREAKER_FAILURE_THRESHOLD", "2") - monkeypatch.setenv("AIGNT_OS_ADAPTER_CIRCUIT_BREAKER_COOLDOWN_SECONDS", "60") + monkeypatch.setenv("SYNAPSE_OS_RUNTIME_STATE_DIR", str(tmp_path / "runtime")) + monkeypatch.setenv("SYNAPSE_OS_WORKSPACE_ROOT", str(tmp_path)) + monkeypatch.setenv("SYNAPSE_OS_ADAPTER_CIRCUIT_BREAKER_FAILURE_THRESHOLD", "2") + monkeypatch.setenv("SYNAPSE_OS_ADAPTER_CIRCUIT_BREAKER_COOLDOWN_SECONDS", "60") first_result = asyncio.run(adapters.CodexCLIAdapter().execute("Implement the plan.")) second_result = asyncio.run(adapters.CodexCLIAdapter().execute("Implement the plan.")) diff --git a/tests/integration/test_doctor_cli.py b/tests/integration/test_doctor_cli.py index c935309..07a0900 100644 --- a/tests/integration/test_doctor_cli.py +++ b/tests/integration/test_doctor_cli.py @@ -6,11 +6,11 @@ def _doctor_env(tmp_path: Path) -> dict[str, str]: return { - "AIGNT_OS_ENVIRONMENT": "test", - "AIGNT_OS_RUNTIME_STATE_DIR": str(tmp_path / "runtime"), - "AIGNT_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), - "AIGNT_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), - "AIGNT_OS_WORKSPACE_ROOT": str(tmp_path), + "SYNAPSE_OS_ENVIRONMENT": "test", + "SYNAPSE_OS_RUNTIME_STATE_DIR": str(tmp_path / "runtime"), + "SYNAPSE_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), + "SYNAPSE_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), + "SYNAPSE_OS_WORKSPACE_ROOT": str(tmp_path), } @@ -65,10 +65,10 @@ def test_doctor_returns_environment_error_when_runs_db_parent_is_not_writable( blocked_parent.write_text("not a directory", encoding="utf-8") env = { - "AIGNT_OS_ENVIRONMENT": "test", - "AIGNT_OS_RUNTIME_STATE_DIR": str(tmp_path / "runtime"), - "AIGNT_OS_RUNS_DB_PATH": str(blocked_parent / "runs.sqlite3"), - "AIGNT_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), + "SYNAPSE_OS_ENVIRONMENT": "test", + "SYNAPSE_OS_RUNTIME_STATE_DIR": str(tmp_path / "runtime"), + "SYNAPSE_OS_RUNS_DB_PATH": str(blocked_parent / "runs.sqlite3"), + "SYNAPSE_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), } result = cli_runner.invoke(cli_app, ["doctor"], env=env) @@ -87,8 +87,8 @@ def test_doctor_returns_environment_error_when_persistence_paths_escape_workspac cli_app, ) -> None: env = _doctor_env(tmp_path) - env["AIGNT_OS_RUNS_DB_PATH"] = str((tmp_path / ".." / "outside" / "runs.sqlite3").resolve()) - env["AIGNT_OS_ARTIFACTS_DIR"] = str((tmp_path / ".." / "outside-artifacts").resolve()) + env["SYNAPSE_OS_RUNS_DB_PATH"] = str((tmp_path / ".." / "outside" / "runs.sqlite3").resolve()) + env["SYNAPSE_OS_ARTIFACTS_DIR"] = str((tmp_path / ".." / "outside-artifacts").resolve()) result = cli_runner.invoke(cli_app, ["doctor"], env=env) diff --git a/tests/integration/test_pipeline_persistence.py b/tests/integration/test_pipeline_persistence.py index 7861ac1..5abcc46 100644 --- a/tests/integration/test_pipeline_persistence.py +++ b/tests/integration/test_pipeline_persistence.py @@ -40,7 +40,7 @@ def _write_invalid_spec(path: Path) -> None: class _PlanExecutor: def execute(self, step, context): # type: ignore[no-untyped-def] del step, context - pipeline = import_module("aignt_os.pipeline") + pipeline = import_module("synapse_os.pipeline") return pipeline.StepExecutionResult( artifacts={"plan_md": "# Generated Plan\n"}, raw_output="RAW PLAN\n", @@ -55,7 +55,7 @@ def execute(self, step, context): # type: ignore[no-untyped-def] def test_persisted_pipeline_records_steps_events_and_artifacts_until_plan( tmp_path: Path, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -94,8 +94,8 @@ def test_persisted_pipeline_records_steps_events_and_artifacts_until_plan( def test_persisted_pipeline_marks_failed_run_when_spec_validation_blocks_plan( tmp_path: Path, ) -> None: - persistence = import_module("aignt_os.persistence") - pipeline = import_module("aignt_os.pipeline") + persistence = import_module("synapse_os.persistence") + pipeline = import_module("synapse_os.pipeline") spec_path = tmp_path / "SPEC.md" _write_invalid_spec(spec_path) @@ -127,9 +127,9 @@ def test_persisted_pipeline_marks_failed_run_when_spec_validation_blocks_plan( def test_persisted_pipeline_records_supervisor_decision_events(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - pipeline = import_module("aignt_os.pipeline") - supervisor = import_module("aignt_os.supervisor") + persistence = import_module("synapse_os.persistence") + pipeline = import_module("synapse_os.pipeline") + supervisor = import_module("synapse_os.supervisor") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -194,7 +194,7 @@ def execute(self, step, context): # type: ignore[no-untyped-def] def test_persisted_pipeline_generates_run_report_until_document(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -215,7 +215,7 @@ def __init__( def execute(self, step, context): # type: ignore[no-untyped-def] del step, context - pipeline = import_module("aignt_os.pipeline") + pipeline = import_module("synapse_os.pipeline") return pipeline.StepExecutionResult( artifacts={self.artifact_name: self.content}, raw_output=self.content, @@ -254,9 +254,9 @@ def execute(self, step, context): # type: ignore[no-untyped-def] def test_persisted_pipeline_blocks_unsafe_python_artifact_promotion(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - parsing = import_module("aignt_os.parsing") - pipeline = import_module("aignt_os.pipeline") + persistence = import_module("synapse_os.persistence") + parsing = import_module("synapse_os.parsing") + pipeline = import_module("synapse_os.pipeline") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -304,8 +304,8 @@ def execute(self, step, context): # type: ignore[no-untyped-def] def test_persisted_pipeline_promotes_safe_python_artifact(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - pipeline = import_module("aignt_os.pipeline") + persistence = import_module("synapse_os.persistence") + pipeline = import_module("synapse_os.pipeline") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) diff --git a/tests/integration/test_public_onboarding_flow.py b/tests/integration/test_public_onboarding_flow.py index b083bdb..d491b53 100644 --- a/tests/integration/test_public_onboarding_flow.py +++ b/tests/integration/test_public_onboarding_flow.py @@ -6,11 +6,11 @@ def _onboarding_env(tmp_path: Path) -> dict[str, str]: return { - "AIGNT_OS_ENVIRONMENT": "test", - "AIGNT_OS_RUNTIME_STATE_DIR": str(tmp_path / "runtime"), - "AIGNT_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), - "AIGNT_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), - "AIGNT_OS_WORKSPACE_ROOT": str(tmp_path), + "SYNAPSE_OS_ENVIRONMENT": "test", + "SYNAPSE_OS_RUNTIME_STATE_DIR": str(tmp_path / "runtime"), + "SYNAPSE_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), + "SYNAPSE_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), + "SYNAPSE_OS_WORKSPACE_ROOT": str(tmp_path), } diff --git a/tests/integration/test_release_readiness_flow.py b/tests/integration/test_release_readiness_flow.py index b2c4e41..f1d30f7 100644 --- a/tests/integration/test_release_readiness_flow.py +++ b/tests/integration/test_release_readiness_flow.py @@ -7,11 +7,11 @@ def _release_env(tmp_path: Path) -> dict[str, str]: return { - "AIGNT_OS_ENVIRONMENT": "test", - "AIGNT_OS_RUNTIME_STATE_DIR": str(tmp_path / "runtime"), - "AIGNT_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), - "AIGNT_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), - "AIGNT_OS_WORKSPACE_ROOT": str(tmp_path), + "SYNAPSE_OS_ENVIRONMENT": "test", + "SYNAPSE_OS_RUNTIME_STATE_DIR": str(tmp_path / "runtime"), + "SYNAPSE_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), + "SYNAPSE_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), + "SYNAPSE_OS_WORKSPACE_ROOT": str(tmp_path), } @@ -81,13 +81,13 @@ def test_phase_2_release_readiness_previews_real_persisted_run_report_via_public cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) env = _release_env(tmp_path) - repository = persistence.RunRepository(Path(env["AIGNT_OS_RUNS_DB_PATH"])) - artifact_store = persistence.ArtifactStore(Path(env["AIGNT_OS_ARTIFACTS_DIR"])) + repository = persistence.RunRepository(Path(env["SYNAPSE_OS_RUNS_DB_PATH"])) + artifact_store = persistence.ArtifactStore(Path(env["SYNAPSE_OS_ARTIFACTS_DIR"])) class _FixedExecutor: def __init__( @@ -103,7 +103,7 @@ def __init__( def execute(self, step, context): # type: ignore[no-untyped-def] del step, context - pipeline = import_module("aignt_os.pipeline") + pipeline = import_module("synapse_os.pipeline") return pipeline.StepExecutionResult( artifacts={self.artifact_name: self.content}, raw_output=self.content, diff --git a/tests/integration/test_runs_cli.py b/tests/integration/test_runs_cli.py index b489882..6aa30b4 100644 --- a/tests/integration/test_runs_cli.py +++ b/tests/integration/test_runs_cli.py @@ -6,15 +6,15 @@ def _runs_env(tmp_path: Path) -> dict[str, str]: return { - "AIGNT_OS_ENVIRONMENT": "test", - "AIGNT_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), - "AIGNT_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), - "AIGNT_OS_WORKSPACE_ROOT": str(tmp_path), + "SYNAPSE_OS_ENVIRONMENT": "test", + "SYNAPSE_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), + "SYNAPSE_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), + "SYNAPSE_OS_WORKSPACE_ROOT": str(tmp_path), } def _seed_run(tmp_path: Path, *, status: str, current_state: str) -> str: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") spec_path = tmp_path / f"{status}-{current_state}.md" spec_path.write_text("# Fixture\n", encoding="utf-8") @@ -70,11 +70,11 @@ def test_runs_show_reports_run_metadata_steps_events_and_artifacts( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") env = _runs_env(tmp_path) - repository = persistence.RunRepository(Path(env["AIGNT_OS_RUNS_DB_PATH"])) - artifact_store = persistence.ArtifactStore(Path(env["AIGNT_OS_ARTIFACTS_DIR"])) + repository = persistence.RunRepository(Path(env["SYNAPSE_OS_RUNS_DB_PATH"])) + artifact_store = persistence.ArtifactStore(Path(env["SYNAPSE_OS_ARTIFACTS_DIR"])) spec_path = tmp_path / "SPEC.md" spec_path.write_text("# Fixture\n", encoding="utf-8") @@ -149,10 +149,10 @@ def test_runs_show_reports_failure_diagnostic_summary( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") env = _runs_env(tmp_path) - repository = persistence.RunRepository(Path(env["AIGNT_OS_RUNS_DB_PATH"])) + repository = persistence.RunRepository(Path(env["SYNAPSE_OS_RUNS_DB_PATH"])) spec_path = tmp_path / "SPEC.md" spec_path.write_text("# Fixture\n", encoding="utf-8") @@ -206,7 +206,7 @@ def test_runs_list_fails_with_environment_error_when_runs_db_path_escapes_worksp cli_app, ) -> None: env = _runs_env(tmp_path) - env["AIGNT_OS_RUNS_DB_PATH"] = str((tmp_path / ".." / "outside" / "runs.sqlite3").resolve()) + env["SYNAPSE_OS_RUNS_DB_PATH"] = str((tmp_path / ".." / "outside" / "runs.sqlite3").resolve()) result = cli_runner.invoke(cli_app, ["runs", "list"], env=env) @@ -223,7 +223,7 @@ def test_runs_show_fails_with_environment_error_when_artifacts_dir_escapes_works cli_app, ) -> None: env = _runs_env(tmp_path) - env["AIGNT_OS_ARTIFACTS_DIR"] = str((tmp_path / ".." / "outside-artifacts").resolve()) + env["SYNAPSE_OS_ARTIFACTS_DIR"] = str((tmp_path / ".." / "outside-artifacts").resolve()) result = cli_runner.invoke(cli_app, ["runs", "show", "missing-run"], env=env) @@ -239,11 +239,11 @@ def test_runs_show_preview_report_renders_truncated_content_and_source_path( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") env = _runs_env(tmp_path) - repository = persistence.RunRepository(Path(env["AIGNT_OS_RUNS_DB_PATH"])) - artifact_store = persistence.ArtifactStore(Path(env["AIGNT_OS_ARTIFACTS_DIR"])) + repository = persistence.RunRepository(Path(env["SYNAPSE_OS_RUNS_DB_PATH"])) + artifact_store = persistence.ArtifactStore(Path(env["SYNAPSE_OS_ARTIFACTS_DIR"])) spec_path = tmp_path / "SPEC.md" spec_path.write_text("# Fixture\n", encoding="utf-8") @@ -279,11 +279,11 @@ def test_runs_show_preview_clean_output_uses_requested_step_without_raw_content( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") env = _runs_env(tmp_path) - repository = persistence.RunRepository(Path(env["AIGNT_OS_RUNS_DB_PATH"])) - artifact_store = persistence.ArtifactStore(Path(env["AIGNT_OS_ARTIFACTS_DIR"])) + repository = persistence.RunRepository(Path(env["SYNAPSE_OS_RUNS_DB_PATH"])) + artifact_store = persistence.ArtifactStore(Path(env["SYNAPSE_OS_ARTIFACTS_DIR"])) spec_path = tmp_path / "SPEC.md" spec_path.write_text("# Fixture\n", encoding="utf-8") @@ -335,10 +335,10 @@ def test_runs_show_preview_rejects_invalid_target_with_usage_error( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") env = _runs_env(tmp_path) - repository = persistence.RunRepository(Path(env["AIGNT_OS_RUNS_DB_PATH"])) + repository = persistence.RunRepository(Path(env["SYNAPSE_OS_RUNS_DB_PATH"])) spec_path = tmp_path / "SPEC.md" spec_path.write_text("# Fixture\n", encoding="utf-8") @@ -363,10 +363,10 @@ def test_runs_show_preview_returns_not_found_when_requested_artifact_is_missing( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") env = _runs_env(tmp_path) - repository = persistence.RunRepository(Path(env["AIGNT_OS_RUNS_DB_PATH"])) + repository = persistence.RunRepository(Path(env["SYNAPSE_OS_RUNS_DB_PATH"])) spec_path = tmp_path / "SPEC.md" spec_path.write_text("# Fixture\n", encoding="utf-8") @@ -390,11 +390,11 @@ def test_runs_show_preview_report_rejects_symlink_outside_artifacts_root( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") env = _runs_env(tmp_path) - repository = persistence.RunRepository(Path(env["AIGNT_OS_RUNS_DB_PATH"])) - artifact_store = persistence.ArtifactStore(Path(env["AIGNT_OS_ARTIFACTS_DIR"])) + repository = persistence.RunRepository(Path(env["SYNAPSE_OS_RUNS_DB_PATH"])) + artifact_store = persistence.ArtifactStore(Path(env["SYNAPSE_OS_ARTIFACTS_DIR"])) spec_path = tmp_path / "SPEC.md" spec_path.write_text("# Fixture\n", encoding="utf-8") external_path = tmp_path / "outside-report.md" @@ -423,11 +423,11 @@ def test_runs_show_preview_returns_execution_error_for_non_utf8_artifact( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") env = _runs_env(tmp_path) - repository = persistence.RunRepository(Path(env["AIGNT_OS_RUNS_DB_PATH"])) - artifact_store = persistence.ArtifactStore(Path(env["AIGNT_OS_ARTIFACTS_DIR"])) + repository = persistence.RunRepository(Path(env["SYNAPSE_OS_RUNS_DB_PATH"])) + artifact_store = persistence.ArtifactStore(Path(env["SYNAPSE_OS_ARTIFACTS_DIR"])) spec_path = tmp_path / "SPEC.md" spec_path.write_text("# Fixture\n", encoding="utf-8") @@ -467,11 +467,11 @@ def test_runs_show_hides_artifact_listing_entries_that_escape_artifacts_root( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") env = _runs_env(tmp_path) - repository = persistence.RunRepository(Path(env["AIGNT_OS_RUNS_DB_PATH"])) - artifact_store = persistence.ArtifactStore(Path(env["AIGNT_OS_ARTIFACTS_DIR"])) + repository = persistence.RunRepository(Path(env["SYNAPSE_OS_RUNS_DB_PATH"])) + artifact_store = persistence.ArtifactStore(Path(env["SYNAPSE_OS_ARTIFACTS_DIR"])) spec_path = tmp_path / "SPEC.md" spec_path.write_text("# Fixture\n", encoding="utf-8") external_path = tmp_path / "outside-plan.txt" @@ -500,10 +500,10 @@ def test_runs_show_preview_clean_rejects_db_path_outside_artifacts_root( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") env = _runs_env(tmp_path) - repository = persistence.RunRepository(Path(env["AIGNT_OS_RUNS_DB_PATH"])) + repository = persistence.RunRepository(Path(env["SYNAPSE_OS_RUNS_DB_PATH"])) spec_path = tmp_path / "SPEC.md" spec_path.write_text("# Fixture\n", encoding="utf-8") external_path = tmp_path / "outside-clean.txt" diff --git a/tests/integration/test_runs_submit_cli.py b/tests/integration/test_runs_submit_cli.py index 4dc7c20..9a906e5 100644 --- a/tests/integration/test_runs_submit_cli.py +++ b/tests/integration/test_runs_submit_cli.py @@ -45,12 +45,12 @@ def _submit_env(tmp_path: Path, *, workspace_root: Path | None = None) -> dict[s python_path = str(REPO_ROOT / "src") existing = env.get("PYTHONPATH") env["PYTHONPATH"] = f"{python_path}{os.pathsep}{existing}" if existing else python_path - env["AIGNT_OS_ENVIRONMENT"] = "test" - env["AIGNT_OS_RUNTIME_STATE_DIR"] = str(trusted_workspace_root / ".aignt-os" / "runtime") - env["AIGNT_OS_RUNS_DB_PATH"] = str(trusted_workspace_root / "runs" / "runs.sqlite3") - env["AIGNT_OS_ARTIFACTS_DIR"] = str(trusted_workspace_root / "artifacts") - env["AIGNT_OS_WORKSPACE_ROOT"] = str(trusted_workspace_root) - env["AIGNT_OS_RUNTIME_POLL_INTERVAL_SECONDS"] = "0.05" + env["SYNAPSE_OS_ENVIRONMENT"] = "test" + env["SYNAPSE_OS_RUNTIME_STATE_DIR"] = str(trusted_workspace_root / ".synapse-os" / "runtime") + env["SYNAPSE_OS_RUNS_DB_PATH"] = str(trusted_workspace_root / "runs" / "runs.sqlite3") + env["SYNAPSE_OS_ARTIFACTS_DIR"] = str(trusted_workspace_root / "artifacts") + env["SYNAPSE_OS_WORKSPACE_ROOT"] = str(trusted_workspace_root) + env["SYNAPSE_OS_RUNTIME_POLL_INTERVAL_SECONDS"] = "0.05" return env @@ -66,7 +66,7 @@ def _spawn_runtime_foreground(tmp_path: Path) -> subprocess.Popen[str]: [ sys.executable, "-c", - "from aignt_os.cli.app import app; app()", + "from synapse_os.cli.app import app; app()", "runtime", "run", ], @@ -80,7 +80,7 @@ def _spawn_runtime_foreground(tmp_path: Path) -> subprocess.Popen[str]: def _wait_for_runtime_ready(tmp_path: Path, process: subprocess.Popen[str]) -> None: - cli_module = import_module("aignt_os.cli.app") + cli_module = import_module("synapse_os.cli.app") runner = import_module("typer.testing").CliRunner() deadline = time.monotonic() + 5.0 env = _submit_env(tmp_path) @@ -117,7 +117,7 @@ def test_runs_submit_sync_executes_inline_and_reports_contract( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -186,14 +186,14 @@ def test_runs_submit_auto_queues_when_runtime_is_ready( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") - runtime_service_module = import_module("aignt_os.runtime.service") + persistence = import_module("synapse_os.persistence") + runtime_service_module = import_module("synapse_os.runtime.service") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) runtime_service = runtime_service_module.RuntimeService( - tmp_path / ".aignt-os" / "runtime" / "runtime-state.json" + tmp_path / ".synapse-os" / "runtime" / "runtime-state.json" ) try: runtime_service.start() @@ -231,7 +231,7 @@ def test_runs_submit_fails_predictably_when_spec_is_missing( env=_submit_env(tmp_path), ) - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") repository = persistence.RunRepository(tmp_path / "runs" / "runs.sqlite3") assert result.exit_code == 3 @@ -253,7 +253,7 @@ def test_runs_submit_fails_predictably_when_spec_is_invalid( env=_submit_env(tmp_path), ) - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") repository = persistence.RunRepository(tmp_path / "runs" / "runs.sqlite3") assert result.exit_code == 4 @@ -273,7 +273,7 @@ def test_runs_submit_fails_with_environment_error_when_runs_db_path_escapes_work spec_path = trusted_workspace_root / "SPEC.md" _write_valid_spec(spec_path) env = _submit_env(tmp_path, workspace_root=trusted_workspace_root) - env["AIGNT_OS_RUNS_DB_PATH"] = str(tmp_path / "outside" / "runs.sqlite3") + env["SYNAPSE_OS_RUNS_DB_PATH"] = str(tmp_path / "outside" / "runs.sqlite3") result = cli_runner.invoke( cli_app, @@ -307,7 +307,7 @@ def test_runs_submit_rejects_spec_outside_workspace_root( env=env, ) - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") repository = persistence.RunRepository(tmp_path / "runs" / "runs.sqlite3") assert result.exit_code == 3 @@ -336,7 +336,7 @@ def test_runs_submit_rejects_symlinked_spec_that_resolves_outside_workspace_root env=env, ) - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") repository = persistence.RunRepository(tmp_path / "runs" / "runs.sqlite3") assert result.exit_code == 3 diff --git a/tests/integration/test_runtime_cancellation.py b/tests/integration/test_runtime_cancellation.py index d69fd6e..9edd012 100644 --- a/tests/integration/test_runtime_cancellation.py +++ b/tests/integration/test_runtime_cancellation.py @@ -1,8 +1,8 @@ from dataclasses import replace from unittest.mock import MagicMock -from aignt_os.persistence import ArtifactStore, PersistedPipelineRunner, RunRepository -from aignt_os.pipeline import PipelineCancelledError +from synapse_os.persistence import ArtifactStore, PersistedPipelineRunner, RunRepository +from synapse_os.pipeline import PipelineCancelledError def test_runtime_stops_on_cancellation(tmp_path): diff --git a/tests/integration/test_runtime_cli.py b/tests/integration/test_runtime_cli.py index d04e6c9..980a59c 100644 --- a/tests/integration/test_runtime_cli.py +++ b/tests/integration/test_runtime_cli.py @@ -15,13 +15,13 @@ def invoke_runtime_command(tmp_path: Path, *args: str): - cli_module = import_module("aignt_os.cli.app") + cli_module = import_module("synapse_os.cli.app") env = { - "AIGNT_OS_ENVIRONMENT": "test", - "AIGNT_OS_RUNTIME_STATE_DIR": str(tmp_path), - "AIGNT_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), - "AIGNT_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), - "AIGNT_OS_WORKSPACE_ROOT": str(tmp_path), + "SYNAPSE_OS_ENVIRONMENT": "test", + "SYNAPSE_OS_RUNTIME_STATE_DIR": str(tmp_path), + "SYNAPSE_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), + "SYNAPSE_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), + "SYNAPSE_OS_WORKSPACE_ROOT": str(tmp_path), } return runner.invoke(cli_module.app, ["runtime", *args], env=env) @@ -33,17 +33,17 @@ def spawn_runtime_foreground(tmp_path: Path) -> subprocess.Popen[str]: env["PYTHONPATH"] = ( f"{python_path}{os.pathsep}{existing_python_path}" if existing_python_path else python_path ) - env["AIGNT_OS_ENVIRONMENT"] = "test" - env["AIGNT_OS_RUNTIME_STATE_DIR"] = str(tmp_path) - env["AIGNT_OS_RUNS_DB_PATH"] = str(tmp_path / "runs" / "runs.sqlite3") - env["AIGNT_OS_ARTIFACTS_DIR"] = str(tmp_path / "artifacts") - env["AIGNT_OS_WORKSPACE_ROOT"] = str(tmp_path) + env["SYNAPSE_OS_ENVIRONMENT"] = "test" + env["SYNAPSE_OS_RUNTIME_STATE_DIR"] = str(tmp_path) + env["SYNAPSE_OS_RUNS_DB_PATH"] = str(tmp_path / "runs" / "runs.sqlite3") + env["SYNAPSE_OS_ARTIFACTS_DIR"] = str(tmp_path / "artifacts") + env["SYNAPSE_OS_WORKSPACE_ROOT"] = str(tmp_path) return subprocess.Popen( [ sys.executable, "-c", - "from aignt_os.cli.app import app; app()", + "from synapse_os.cli.app import app; app()", "runtime", "run", ], @@ -119,7 +119,7 @@ def test_runtime_status_reports_running_for_active_runtime(tmp_path: Path) -> No status_result = invoke_runtime_command(tmp_path, "status") assert status_result.exit_code == 0 - assert "aignt os runtime" in status_result.stdout.lower() + assert "synapseos runtime" in status_result.stdout.lower() assert "status" in status_result.stdout.lower() assert "running" in status_result.stdout.lower() assert "pid" in status_result.stdout.lower() @@ -223,13 +223,13 @@ def test_runtime_stop_refuses_to_signal_process_when_persisted_identity_mismatch def test_runtime_start_rejects_untrusted_state_directory(tmp_path: Path) -> None: - cli_module = import_module("aignt_os.cli.app") + cli_module = import_module("synapse_os.cli.app") workspace_root = tmp_path / "workspace" workspace_root.mkdir() env = { - "AIGNT_OS_ENVIRONMENT": "test", - "AIGNT_OS_WORKSPACE_ROOT": str(workspace_root), - "AIGNT_OS_RUNTIME_STATE_DIR": str(tmp_path / "outside-runtime-state"), + "SYNAPSE_OS_ENVIRONMENT": "test", + "SYNAPSE_OS_WORKSPACE_ROOT": str(workspace_root), + "SYNAPSE_OS_RUNTIME_STATE_DIR": str(tmp_path / "outside-runtime-state"), } result = runner.invoke(cli_module.app, ["runtime", "start"], env=env) @@ -245,7 +245,7 @@ def test_runtime_start_rejects_untrusted_state_directory(tmp_path: Path) -> None def test_runtime_start_rejects_symlinked_state_directory_outside_workspace_root( tmp_path: Path, ) -> None: - cli_module = import_module("aignt_os.cli.app") + cli_module = import_module("synapse_os.cli.app") workspace_root = tmp_path / "workspace" outside_root = tmp_path / "outside-runtime-state" runtime_link = workspace_root / "runtime-link" @@ -253,9 +253,9 @@ def test_runtime_start_rejects_symlinked_state_directory_outside_workspace_root( outside_root.mkdir() runtime_link.symlink_to(outside_root, target_is_directory=True) env = { - "AIGNT_OS_ENVIRONMENT": "test", - "AIGNT_OS_WORKSPACE_ROOT": str(workspace_root), - "AIGNT_OS_RUNTIME_STATE_DIR": str(runtime_link), + "SYNAPSE_OS_ENVIRONMENT": "test", + "SYNAPSE_OS_WORKSPACE_ROOT": str(workspace_root), + "SYNAPSE_OS_RUNTIME_STATE_DIR": str(runtime_link), } result = runner.invoke(cli_module.app, ["runtime", "start"], env=env) diff --git a/tests/integration/test_spec_validation_gate.py b/tests/integration/test_spec_validation_gate.py index 147bd00..3a0f319 100644 --- a/tests/integration/test_spec_validation_gate.py +++ b/tests/integration/test_spec_validation_gate.py @@ -1,7 +1,8 @@ -from aignt_os.persistence import ArtifactStore, PersistedPipelineRunner, RunRepository -from aignt_os.specs import SpecValidationError + import pytest -from pathlib import Path + +from synapse_os.persistence import ArtifactStore, PersistedPipelineRunner, RunRepository +from synapse_os.specs import SpecValidationError def test_run_fails_with_invalid_spec_and_generates_report(tmp_path): @@ -53,8 +54,7 @@ def test_run_fails_with_invalid_spec_and_generates_report(tmp_path): # Verify status record = repo.get_run(run_id) assert record.status == "failed" - # failure_message might be None if mark_run_failed wasn't called correctly or didn't save message? - # Actually mark_run_failed updates status and failure_message. + # failure_message is set by mark_run_failed. assert record.failure_message is not None assert "SPEC" in record.failure_message diff --git a/tests/integration/test_worker_runtime_flow.py b/tests/integration/test_worker_runtime_flow.py index 6a77e29..a9cb13a 100644 --- a/tests/integration/test_worker_runtime_flow.py +++ b/tests/integration/test_worker_runtime_flow.py @@ -46,12 +46,12 @@ def _runtime_env(tmp_path: Path) -> dict[str, str]: python_path = str(REPO_ROOT / "src") existing = env.get("PYTHONPATH") env["PYTHONPATH"] = f"{python_path}{os.pathsep}{existing}" if existing else python_path - env["AIGNT_OS_ENVIRONMENT"] = "test" - env["AIGNT_OS_RUNTIME_STATE_DIR"] = str(tmp_path / "runtime") - env["AIGNT_OS_RUNS_DB_PATH"] = str(tmp_path / "runs" / "runs.sqlite3") - env["AIGNT_OS_ARTIFACTS_DIR"] = str(tmp_path / "artifacts") - env["AIGNT_OS_WORKSPACE_ROOT"] = str(tmp_path) - env["AIGNT_OS_RUNTIME_POLL_INTERVAL_SECONDS"] = "0.05" + env["SYNAPSE_OS_ENVIRONMENT"] = "test" + env["SYNAPSE_OS_RUNTIME_STATE_DIR"] = str(tmp_path / "runtime") + env["SYNAPSE_OS_RUNS_DB_PATH"] = str(tmp_path / "runs" / "runs.sqlite3") + env["SYNAPSE_OS_ARTIFACTS_DIR"] = str(tmp_path / "artifacts") + env["SYNAPSE_OS_WORKSPACE_ROOT"] = str(tmp_path) + env["SYNAPSE_OS_RUNTIME_POLL_INTERVAL_SECONDS"] = "0.05" return env @@ -89,14 +89,14 @@ def _spawn_runtime_foreground( ) -> subprocess.Popen[str]: env = _runtime_env(tmp_path) if auth_enabled: - env["AIGNT_OS_AUTH_ENABLED"] = "true" + env["SYNAPSE_OS_AUTH_ENABLED"] = "true" if auth_token is not None: - env["AIGNT_OS_AUTH_TOKEN"] = auth_token + env["SYNAPSE_OS_AUTH_TOKEN"] = auth_token return subprocess.Popen( [ sys.executable, "-c", - "from aignt_os.cli.app import app; app()", + "from synapse_os.cli.app import app; app()", "runtime", "run", ], @@ -110,7 +110,7 @@ def _spawn_runtime_foreground( def _wait_for_runtime_ready(tmp_path: Path, process: subprocess.Popen[str]) -> None: - cli_module = import_module("aignt_os.cli.app") + cli_module = import_module("synapse_os.cli.app") runner = CliRunner() deadline = time.monotonic() + 5.0 env = _runtime_env(tmp_path) @@ -152,7 +152,7 @@ def _terminate_process(process: subprocess.Popen[str]) -> None: def test_runtime_foreground_worker_consumes_pending_run(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -185,9 +185,9 @@ def test_runtime_foreground_worker_consumes_pending_run(tmp_path: Path) -> None: def test_run_dispatch_service_auto_queues_when_runtime_process_is_ready( tmp_path: Path, ) -> None: - persistence = import_module("aignt_os.persistence") - dispatch_module = import_module("aignt_os.runtime.dispatch") - runtime_service_module = import_module("aignt_os.runtime.service") + persistence = import_module("synapse_os.persistence") + dispatch_module = import_module("synapse_os.runtime.dispatch") + runtime_service_module = import_module("synapse_os.runtime.service") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -222,7 +222,7 @@ def test_run_dispatch_service_auto_queues_when_runtime_process_is_ready( def test_authenticated_runtime_foreground_worker_skips_incompatible_run_and_processes_next_one( tmp_path: Path, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") _write_auth_registry(tmp_path) repository = persistence.RunRepository(tmp_path / "runs" / "runs.sqlite3") @@ -271,7 +271,7 @@ def test_authenticated_runtime_foreground_worker_skips_incompatible_run_and_proc def test_authenticated_runtime_foreground_worker_processes_legacy_run( tmp_path: Path, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") _write_auth_registry(tmp_path) repository = persistence.RunRepository(tmp_path / "runs" / "runs.sqlite3") @@ -304,7 +304,7 @@ def test_authenticated_runtime_foreground_worker_processes_legacy_run( def test_authenticated_runtime_foreground_worker_deduplicates_owner_skip_on_repeated_polls( tmp_path: Path, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") _write_auth_registry(tmp_path) repository = persistence.RunRepository(tmp_path / "runs" / "runs.sqlite3") @@ -337,13 +337,13 @@ def test_runs_show_surfaces_runtime_owner_skip_for_pending_run( cli_runner, cli_app, ) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") env = { - "AIGNT_OS_ENVIRONMENT": "test", - "AIGNT_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), - "AIGNT_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), - "AIGNT_OS_WORKSPACE_ROOT": str(tmp_path), + "SYNAPSE_OS_ENVIRONMENT": "test", + "SYNAPSE_OS_RUNS_DB_PATH": str(tmp_path / "runs" / "runs.sqlite3"), + "SYNAPSE_OS_ARTIFACTS_DIR": str(tmp_path / "artifacts"), + "SYNAPSE_OS_WORKSPACE_ROOT": str(tmp_path), } _write_auth_registry(tmp_path) repository = persistence.RunRepository(tmp_path / "runs" / "runs.sqlite3") diff --git a/tests/pipeline/test_failure_recovery.py b/tests/pipeline/test_failure_recovery.py index 261a869..ddf7d06 100644 --- a/tests/pipeline/test_failure_recovery.py +++ b/tests/pipeline/test_failure_recovery.py @@ -1,6 +1,6 @@ """Pipeline failure recovery tests. -Tests cover failure handling in the AIgnt-Synapse-Flow pipeline engine: +Tests cover failure handling in the Synapse-Flow pipeline engine: - observer notification on failure - exception propagation with context preservation - SPEC validation errors vs execution errors @@ -50,7 +50,7 @@ def _make_spec(tmp_path: Path, content: str) -> Path: def _pipeline_module(): from importlib import import_module - return import_module("aignt_os.pipeline") + return import_module("synapse_os.pipeline") class _FakeExecutor: diff --git a/tests/pipeline/test_happy_path.py b/tests/pipeline/test_happy_path.py index 481060c..6dc1dc1 100644 --- a/tests/pipeline/test_happy_path.py +++ b/tests/pipeline/test_happy_path.py @@ -1,7 +1,7 @@ """End-to-end pipeline tests using fake executors. -These tests exercise the full AIgnt-Synapse-Flow pipeline — the engine própria -de pipeline do AIgnt OS — from SPEC validation through to TEST_RED, using +These tests exercise the full Synapse-Flow pipeline — the engine própria +de pipeline do SynapseOS — from SPEC validation through to TEST_RED, using in-memory fake executors and temporary SPEC files. No real subprocesses or external tools are invoked. """ @@ -32,7 +32,7 @@ # Contexto -Fixture para testes end-to-end da pipeline AIgnt-Synapse-Flow. +Fixture para testes end-to-end da pipeline Synapse-Flow. # Objetivo @@ -52,7 +52,7 @@ def _make_spec(tmp_path: Path, content: str) -> Path: def _pipeline_module(): from importlib import import_module - return import_module("aignt_os.pipeline") + return import_module("synapse_os.pipeline") class _FakeExecutor: diff --git a/tests/pipeline/test_review_rework.py b/tests/pipeline/test_review_rework.py index bfcbf14..370d553 100644 --- a/tests/pipeline/test_review_rework.py +++ b/tests/pipeline/test_review_rework.py @@ -1,7 +1,7 @@ """Pipeline rework and review state tests. Tests cover the state machine's support for REVIEW and backward transition -patterns in the AIgnt-Synapse-Flow, validating that: +patterns in the Synapse-Flow, validating that: - REVIEW is a valid state in the linear flow - transitions from CODE_GREEN to REVIEW are valid - REVIEW can transition to SECURITY (forward path) @@ -16,12 +16,12 @@ import pytest -from aignt_os.state_machine import AIgntStateMachine, InvalidStateTransition +from synapse_os.state_machine import InvalidStateTransition, SynapseStateMachine -def _make_sm_at(state: str) -> AIgntStateMachine: +def _make_sm_at(state: str) -> SynapseStateMachine: """Create a fresh state machine positioned at the given state by advancing through the flow.""" - sm = AIgntStateMachine() + sm = SynapseStateMachine() flow = [ "SPEC_DISCOVERY", "SPEC_NORMALIZATION", @@ -114,7 +114,7 @@ def test_review_rework_full_path_code_green_through_security_to_complete() -> No def test_review_rework_review_state_is_present_in_linear_flow() -> None: - from aignt_os.state_machine import LINEAR_STATE_FLOW + from synapse_os.state_machine import LINEAR_STATE_FLOW assert "REVIEW" in LINEAR_STATE_FLOW assert "CODE_GREEN" in LINEAR_STATE_FLOW @@ -124,7 +124,7 @@ def test_review_rework_review_state_is_present_in_linear_flow() -> None: def test_review_rework_security_follows_review_in_linear_flow() -> None: - from aignt_os.state_machine import LINEAR_STATE_FLOW + from synapse_os.state_machine import LINEAR_STATE_FLOW review_idx = LINEAR_STATE_FLOW.index("REVIEW") security_idx = LINEAR_STATE_FLOW.index("SECURITY") diff --git a/tests/unit/test_adapter_circuit_breaker.py b/tests/unit/test_adapter_circuit_breaker.py index d78ecbd..5496018 100644 --- a/tests/unit/test_adapter_circuit_breaker.py +++ b/tests/unit/test_adapter_circuit_breaker.py @@ -7,7 +7,7 @@ def test_circuit_breaker_store_reports_closed_when_file_is_missing(tmp_path: Path) -> None: - module = import_module("aignt_os.runtime.circuit_breaker") + module = import_module("synapse_os.runtime.circuit_breaker") store = module.AdapterCircuitBreakerStore(tmp_path / "adapter-circuit-breakers.json") @@ -18,7 +18,7 @@ def test_circuit_breaker_store_reports_closed_when_file_is_missing(tmp_path: Pat def test_circuit_breaker_store_persists_atomically_with_restricted_permissions( tmp_path: Path, monkeypatch ) -> None: # type: ignore[no-untyped-def] - module = import_module("aignt_os.runtime.circuit_breaker") + module = import_module("synapse_os.runtime.circuit_breaker") state_file = tmp_path / "adapter-circuit-breakers.json" store = module.AdapterCircuitBreakerStore(state_file) @@ -51,7 +51,7 @@ def track_replace(source: Path, destination: Path) -> None: def test_circuit_breaker_store_opens_after_threshold_and_resets_on_success(tmp_path: Path) -> None: - module = import_module("aignt_os.runtime.circuit_breaker") + module = import_module("synapse_os.runtime.circuit_breaker") store = module.AdapterCircuitBreakerStore(tmp_path / "adapter-circuit-breakers.json") @@ -79,7 +79,7 @@ def test_circuit_breaker_store_opens_after_threshold_and_resets_on_success(tmp_p def test_circuit_breaker_store_treats_expired_cooldown_as_closed(tmp_path: Path) -> None: - module = import_module("aignt_os.runtime.circuit_breaker") + module = import_module("synapse_os.runtime.circuit_breaker") state_file = tmp_path / "adapter-circuit-breakers.json" state_file.parent.mkdir(parents=True, exist_ok=True) diff --git a/tests/unit/test_auth.py b/tests/unit/test_auth.py index 4df67ba..f2fa7ce 100644 --- a/tests/unit/test_auth.py +++ b/tests/unit/test_auth.py @@ -9,7 +9,7 @@ def test_auth_registry_store_persists_atomically_with_restricted_permissions( tmp_path: Path, monkeypatch ) -> None: # type: ignore[no-untyped-def] - auth_module = import_module("aignt_os.auth") + auth_module = import_module("synapse_os.auth") registry_path = tmp_path / "auth-registry.json" store = auth_module.AuthRegistryStore(registry_path) @@ -50,7 +50,7 @@ def track_replace(source: Path, destination: Path) -> None: def test_auth_registry_store_authenticates_known_token(tmp_path: Path) -> None: - auth_module = import_module("aignt_os.auth") + auth_module = import_module("synapse_os.auth") registry_path = tmp_path / "auth-registry.json" store = auth_module.AuthRegistryStore(registry_path) @@ -81,7 +81,7 @@ def test_auth_registry_store_authenticates_known_token(tmp_path: Path) -> None: def test_auth_registry_store_init_creates_initial_operator_token(tmp_path: Path) -> None: - auth_module = import_module("aignt_os.auth") + auth_module = import_module("synapse_os.auth") registry_path = tmp_path / "auth-registry.json" store = auth_module.AuthRegistryStore(registry_path) @@ -103,7 +103,7 @@ def test_auth_registry_store_init_creates_initial_operator_token(tmp_path: Path) def test_auth_registry_store_issue_token_creates_new_principal_when_role_is_provided( tmp_path: Path, ) -> None: - auth_module = import_module("aignt_os.auth") + auth_module = import_module("synapse_os.auth") registry_path = tmp_path / "auth-registry.json" store = auth_module.AuthRegistryStore(registry_path) @@ -119,7 +119,7 @@ def test_auth_registry_store_issue_token_creates_new_principal_when_role_is_prov def test_auth_registry_store_issue_token_rejects_role_conflict(tmp_path: Path) -> None: - auth_module = import_module("aignt_os.auth") + auth_module = import_module("synapse_os.auth") registry_path = tmp_path / "auth-registry.json" store = auth_module.AuthRegistryStore(registry_path) @@ -139,7 +139,7 @@ def test_auth_registry_store_issue_token_rejects_role_conflict(tmp_path: Path) - def test_auth_registry_store_disable_token_revokes_authentication(tmp_path: Path) -> None: - auth_module = import_module("aignt_os.auth") + auth_module = import_module("synapse_os.auth") registry_path = tmp_path / "auth-registry.json" store = auth_module.AuthRegistryStore(registry_path) @@ -155,7 +155,7 @@ def test_auth_registry_store_disable_token_revokes_authentication(tmp_path: Path def test_auth_registry_store_rejects_unknown_token(tmp_path: Path) -> None: - auth_module = import_module("aignt_os.auth") + auth_module = import_module("synapse_os.auth") registry_path = tmp_path / "auth-registry.json" store = auth_module.AuthRegistryStore(registry_path) @@ -175,7 +175,7 @@ def test_auth_registry_store_rejects_unknown_token(tmp_path: Path) -> None: def test_auth_registry_store_raises_for_missing_registry(tmp_path: Path) -> None: - auth_module = import_module("aignt_os.auth") + auth_module = import_module("synapse_os.auth") store = auth_module.AuthRegistryStore(tmp_path / "auth-registry.json") @@ -188,7 +188,7 @@ def test_auth_registry_store_raises_for_missing_registry(tmp_path: Path) -> None def test_authorize_requires_operator_for_mutating_permissions() -> None: - auth_module = import_module("aignt_os.auth") + auth_module = import_module("synapse_os.auth") viewer = auth_module.AuthenticatedPrincipal( principal_id="viewer", roles=("viewer",), permissions=frozenset(["run:read"]) diff --git a/tests/unit/test_auth_abstraction.py b/tests/unit/test_auth_abstraction.py index 4059d07..a06755e 100644 --- a/tests/unit/test_auth_abstraction.py +++ b/tests/unit/test_auth_abstraction.py @@ -1,7 +1,7 @@ import pytest -from aignt_os.auth import AuthProvider, AuthRegistryStore, get_auth_provider -from aignt_os.config import AppSettings +from synapse_os.auth import AuthProvider, AuthRegistryStore, get_auth_provider +from synapse_os.config import AppSettings def test_auth_provider_protocol(): @@ -14,7 +14,7 @@ def test_get_auth_provider_file(tmp_path): settings = AppSettings( auth_provider="file", workspace_root=tmp_path, - runtime_state_dir=tmp_path / ".aignt-os/runtime", + runtime_state_dir=tmp_path / ".synapse-os/runtime", ) provider = get_auth_provider(settings) assert isinstance(provider, AuthRegistryStore) @@ -39,7 +39,7 @@ def test_auth_provider_authenticate(tmp_path): settings = AppSettings( auth_provider="file", workspace_root=tmp_path, - runtime_state_dir=tmp_path / ".aignt-os/runtime", + runtime_state_dir=tmp_path / ".synapse-os/runtime", ) provider = get_auth_provider(settings) diff --git a/tests/unit/test_auth_registry_docs.py b/tests/unit/test_auth_registry_docs.py index 73f213a..416e380 100644 --- a/tests/unit/test_auth_registry_docs.py +++ b/tests/unit/test_auth_registry_docs.py @@ -10,10 +10,10 @@ def test_readme_documents_local_auth_registry_cli_boundary() -> None: readme = README_PATH.read_text(encoding="utf-8") assert "## Auth Registry Local" in readme - assert "`aignt auth init --principal-id local-admin --role admin`" in readme - assert "`aignt auth issue --principal-id local-viewer --role viewer`" in readme - assert "`aignt auth issue --principal-id local-operator --role operator`" in readme - assert "`aignt auth disable --token-id `" in readme + assert "`synapse auth init --principal-id local-admin --role admin`" in readme + assert "`synapse auth issue --principal-id local-viewer --role viewer`" in readme + assert "`synapse auth issue --principal-id local-operator --role operator`" in readme + assert "`synapse auth disable --token-id `" in readme assert "`viewer`" in readme assert "`operator`" in readme assert "`admin`" in readme diff --git a/tests/unit/test_cli_adapter.py b/tests/unit/test_cli_adapter.py index 7baa6d2..d8a2cde 100644 --- a/tests/unit/test_cli_adapter.py +++ b/tests/unit/test_cli_adapter.py @@ -7,7 +7,7 @@ def _adapters_module(): - return import_module("aignt_os.adapters") + return import_module("synapse_os.adapters") class _FakeAdapterMixin: @@ -459,7 +459,7 @@ def test_classify_codex_execution_result( expected_blocked: bool, ) -> None: adapters = _adapters_module() - contracts = import_module("aignt_os.contracts") + contracts = import_module("synapse_os.contracts") result = contracts.CLIExecutionResult( tool_name="codex", @@ -481,12 +481,12 @@ def test_codex_cli_adapter_opens_circuit_breaker_after_two_operational_failures( tmp_path, monkeypatch ) -> None: # type: ignore[no-untyped-def] adapters = _adapters_module() - circuit_breaker_module = import_module("aignt_os.runtime.circuit_breaker") + circuit_breaker_module = import_module("synapse_os.runtime.circuit_breaker") - monkeypatch.setenv("AIGNT_OS_RUNTIME_STATE_DIR", str(tmp_path / "runtime")) - monkeypatch.setenv("AIGNT_OS_WORKSPACE_ROOT", str(tmp_path)) - monkeypatch.setenv("AIGNT_OS_ADAPTER_CIRCUIT_BREAKER_FAILURE_THRESHOLD", "2") - monkeypatch.setenv("AIGNT_OS_ADAPTER_CIRCUIT_BREAKER_COOLDOWN_SECONDS", "60") + monkeypatch.setenv("SYNAPSE_OS_RUNTIME_STATE_DIR", str(tmp_path / "runtime")) + monkeypatch.setenv("SYNAPSE_OS_WORKSPACE_ROOT", str(tmp_path)) + monkeypatch.setenv("SYNAPSE_OS_ADAPTER_CIRCUIT_BREAKER_FAILURE_THRESHOLD", "2") + monkeypatch.setenv("SYNAPSE_OS_ADAPTER_CIRCUIT_BREAKER_COOLDOWN_SECONDS", "60") fake_process = _FakeProcess( stdout=b"", @@ -517,12 +517,12 @@ async def fake_create_subprocess_exec(*command: str, **kwargs: object) -> _FakeP def test_codex_cli_adapter_blocks_without_spawn_when_circuit_is_open(tmp_path, monkeypatch) -> None: # type: ignore[no-untyped-def] adapters = _adapters_module() - circuit_breaker_module = import_module("aignt_os.runtime.circuit_breaker") + circuit_breaker_module = import_module("synapse_os.runtime.circuit_breaker") - monkeypatch.setenv("AIGNT_OS_RUNTIME_STATE_DIR", str(tmp_path / "runtime")) - monkeypatch.setenv("AIGNT_OS_WORKSPACE_ROOT", str(tmp_path)) - monkeypatch.setenv("AIGNT_OS_ADAPTER_CIRCUIT_BREAKER_FAILURE_THRESHOLD", "2") - monkeypatch.setenv("AIGNT_OS_ADAPTER_CIRCUIT_BREAKER_COOLDOWN_SECONDS", "60") + monkeypatch.setenv("SYNAPSE_OS_RUNTIME_STATE_DIR", str(tmp_path / "runtime")) + monkeypatch.setenv("SYNAPSE_OS_WORKSPACE_ROOT", str(tmp_path)) + monkeypatch.setenv("SYNAPSE_OS_ADAPTER_CIRCUIT_BREAKER_FAILURE_THRESHOLD", "2") + monkeypatch.setenv("SYNAPSE_OS_ADAPTER_CIRCUIT_BREAKER_COOLDOWN_SECONDS", "60") store = circuit_breaker_module.AdapterCircuitBreakerStore( tmp_path / "runtime" / "adapter-circuit-breakers.json" @@ -549,12 +549,12 @@ def test_codex_cli_adapter_resets_breaker_after_non_operational_probe( tmp_path, monkeypatch ) -> None: # type: ignore[no-untyped-def] adapters = _adapters_module() - circuit_breaker_module = import_module("aignt_os.runtime.circuit_breaker") + circuit_breaker_module = import_module("synapse_os.runtime.circuit_breaker") - monkeypatch.setenv("AIGNT_OS_RUNTIME_STATE_DIR", str(tmp_path / "runtime")) - monkeypatch.setenv("AIGNT_OS_WORKSPACE_ROOT", str(tmp_path)) - monkeypatch.setenv("AIGNT_OS_ADAPTER_CIRCUIT_BREAKER_FAILURE_THRESHOLD", "2") - monkeypatch.setenv("AIGNT_OS_ADAPTER_CIRCUIT_BREAKER_COOLDOWN_SECONDS", "60") + monkeypatch.setenv("SYNAPSE_OS_RUNTIME_STATE_DIR", str(tmp_path / "runtime")) + monkeypatch.setenv("SYNAPSE_OS_WORKSPACE_ROOT", str(tmp_path)) + monkeypatch.setenv("SYNAPSE_OS_ADAPTER_CIRCUIT_BREAKER_FAILURE_THRESHOLD", "2") + monkeypatch.setenv("SYNAPSE_OS_ADAPTER_CIRCUIT_BREAKER_COOLDOWN_SECONDS", "60") store = circuit_breaker_module.AdapterCircuitBreakerStore( tmp_path / "runtime" / "adapter-circuit-breakers.json" diff --git a/tests/unit/test_cli_doctor_rendering.py b/tests/unit/test_cli_doctor_rendering.py index 27dbfd9..b89b9a0 100644 --- a/tests/unit/test_cli_doctor_rendering.py +++ b/tests/unit/test_cli_doctor_rendering.py @@ -6,7 +6,7 @@ def test_render_environment_doctor_is_legible_without_tty() -> None: - cli_rendering = __import__("aignt_os.cli.rendering", fromlist=["render_environment_doctor"]) + cli_rendering = __import__("synapse_os.cli.rendering", fromlist=["render_environment_doctor"]) output = StringIO() console = Console(file=output, force_terminal=False, color_system=None, width=120) @@ -16,23 +16,23 @@ def test_render_environment_doctor_is_legible_without_tty() -> None: { "name": "runtime_state", "status": "warn", - "target": ".aignt-os/runtime/runtime-state.json", + "target": ".synapse-os/runtime/runtime-state.json", "message": "Runtime is stopped but the sync happy path remains available.", "next_step": "Start the runtime only if you need async dispatch.", }, { "name": "runs_db", "status": "pass", - "target": ".aignt-os/runs/runs.sqlite3", + "target": ".synapse-os/runs/runs.sqlite3", "message": "Run persistence path is writable.", - "next_step": "You can submit a run with `aignt runs submit`.", + "next_step": "You can submit a run with `synapse runs submit`.", }, { "name": "artifacts_dir", "status": "pass", - "target": ".aignt-os/artifacts", + "target": ".synapse-os/artifacts", "message": "Artifacts directory is writable.", - "next_step": "Inspect persisted outputs with `aignt runs show `.", + "next_step": "Inspect persisted outputs with `synapse runs show `.", }, ], console=console, @@ -47,11 +47,11 @@ def test_render_environment_doctor_is_legible_without_tty() -> None: assert "artifacts_dir" in rendered assert "warn" in rendered.lower() assert "Start the runtime only if you need async dispatch." in rendered - assert "You can submit a run with `aignt runs submit`." in rendered + assert "You can submit a run with `synapse runs submit`." in rendered def test_render_environment_doctor_surfaces_blocking_failures() -> None: - cli_rendering = __import__("aignt_os.cli.rendering", fromlist=["render_environment_doctor"]) + cli_rendering = __import__("synapse_os.cli.rendering", fromlist=["render_environment_doctor"]) output = StringIO() console = Console(file=output, force_terminal=False, color_system=None, width=120) diff --git a/tests/unit/test_cli_errors.py b/tests/unit/test_cli_errors.py index 281acd4..8edeb5f 100644 --- a/tests/unit/test_cli_errors.py +++ b/tests/unit/test_cli_errors.py @@ -1,6 +1,6 @@ from __future__ import annotations -from aignt_os.cli.errors import ( +from synapse_os.cli.errors import ( CLIExitCode, format_cli_error, ) diff --git a/tests/unit/test_cli_rich_output.py b/tests/unit/test_cli_rich_output.py index 71e13d5..0dc8775 100644 --- a/tests/unit/test_cli_rich_output.py +++ b/tests/unit/test_cli_rich_output.py @@ -4,11 +4,11 @@ from rich.console import Console -from aignt_os.runtime.state import RuntimeState +from synapse_os.runtime.state import RuntimeState def test_render_runtime_status_is_legible_without_tty() -> None: - cli_rendering = __import__("aignt_os.cli.rendering", fromlist=["render_runtime_status"]) + cli_rendering = __import__("synapse_os.cli.rendering", fromlist=["render_runtime_status"]) output = StringIO() console = Console(file=output, force_terminal=False, color_system=None, width=80) @@ -18,7 +18,7 @@ def test_render_runtime_status_is_legible_without_tty() -> None: ) rendered = output.getvalue() - assert "AIgnt OS Runtime" in rendered + assert "SynapseOS Runtime" in rendered assert "Status" in rendered assert "running" in rendered.lower() assert "PID" in rendered @@ -26,7 +26,7 @@ def test_render_runtime_status_is_legible_without_tty() -> None: def test_render_runtime_status_shows_started_by_when_requested() -> None: - cli_rendering = __import__("aignt_os.cli.rendering", fromlist=["render_runtime_status"]) + cli_rendering = __import__("synapse_os.cli.rendering", fromlist=["render_runtime_status"]) output = StringIO() console = Console(file=output, force_terminal=False, color_system=None, width=80) @@ -42,7 +42,7 @@ def test_render_runtime_status_shows_started_by_when_requested() -> None: def test_render_runtime_status_marks_legacy_binding_unavailable_when_requested() -> None: - cli_rendering = __import__("aignt_os.cli.rendering", fromlist=["render_runtime_status"]) + cli_rendering = __import__("synapse_os.cli.rendering", fromlist=["render_runtime_status"]) output = StringIO() console = Console(file=output, force_terminal=False, color_system=None, width=80) diff --git a/tests/unit/test_cli_runs_rendering.py b/tests/unit/test_cli_runs_rendering.py index 6ca0888..818eabc 100644 --- a/tests/unit/test_cli_runs_rendering.py +++ b/tests/unit/test_cli_runs_rendering.py @@ -4,12 +4,12 @@ from rich.console import Console -from aignt_os.cli.rendering import RunArtifactPreview -from aignt_os.persistence import RunEventRecord, RunRecord, RunStepRecord +from synapse_os.cli.rendering import RunArtifactPreview +from synapse_os.persistence import RunEventRecord, RunRecord, RunStepRecord def test_render_run_detail_is_legible_without_tty() -> None: - cli_rendering = __import__("aignt_os.cli.rendering", fromlist=["render_run_detail"]) + cli_rendering = __import__("synapse_os.cli.rendering", fromlist=["render_run_detail"]) output = StringIO() console = Console(file=output, force_terminal=False, color_system=None, width=160) @@ -79,7 +79,7 @@ def test_render_run_detail_is_legible_without_tty() -> None: def test_render_run_detail_completed_at_spec_validation_guides_canonical_happy_path() -> None: - cli_rendering = __import__("aignt_os.cli.rendering", fromlist=["render_run_detail"]) + cli_rendering = __import__("synapse_os.cli.rendering", fromlist=["render_run_detail"]) output = StringIO() console = Console(file=output, force_terminal=False, color_system=None, width=160) @@ -111,7 +111,7 @@ def test_render_run_detail_completed_at_spec_validation_guides_canonical_happy_p def test_render_run_detail_surfaces_artifact_preview_panel() -> None: - cli_rendering = __import__("aignt_os.cli.rendering", fromlist=["render_run_detail"]) + cli_rendering = __import__("synapse_os.cli.rendering", fromlist=["render_run_detail"]) output = StringIO() console = Console(file=output, force_terminal=False, color_system=None, width=160) diff --git a/tests/unit/test_cli_watch.py b/tests/unit/test_cli_watch.py index 98075be..f89aa46 100644 --- a/tests/unit/test_cli_watch.py +++ b/tests/unit/test_cli_watch.py @@ -4,7 +4,7 @@ import pytest from typer.testing import CliRunner -from aignt_os.cli.app import app +from synapse_os.cli.app import app @pytest.fixture @@ -29,18 +29,18 @@ def test_runs_watch_requires_run_id(runner: CliRunner) -> None: assert "Missing argument" in result.stdout or "Missing argument" in result.stderr -@patch.dict("sys.modules", {"aignt_os.cli.dashboard": MagicMock()}) +@patch.dict("sys.modules", {"synapse_os.cli.dashboard": MagicMock()}) def test_runs_watch_invokes_tui(runner: CliRunner) -> None: """O comando deve instanciar e rodar o Dashboard TUI.""" # Recupera o módulo mockado - mock_dashboard_module = sys.modules["aignt_os.cli.dashboard"] + mock_dashboard_module = sys.modules["synapse_os.cli.dashboard"] mock_dashboard_cls = mock_dashboard_module.RunDashboard mock_app_instance = MagicMock() mock_dashboard_cls.return_value = mock_app_instance # Precisamos mockar _run_repository que é chamado dentro de watch # Como _run_repository está no mesmo módulo (app), mockamos ele lá. - with patch("aignt_os.cli.app._run_repository") as mock_repo_factory: + with patch("synapse_os.cli.app._run_repository") as mock_repo_factory: mock_repo = MagicMock() mock_repo_factory.return_value = mock_repo # Simula run existente (retorna algo truthy) @@ -66,7 +66,7 @@ def test_runs_watch_handles_missing_run(runner: CliRunner) -> None: # Mas o erro de run not found acontece depois do import. # Vamos mockar o repository para lançar NoResultFound - with patch("aignt_os.cli.app._run_repository") as mock_repo_factory: + with patch("synapse_os.cli.app._run_repository") as mock_repo_factory: mock_repo = MagicMock() mock_repo_factory.return_value = mock_repo @@ -76,7 +76,7 @@ def test_runs_watch_handles_missing_run(runner: CliRunner) -> None: mock_repo.get_run.side_effect = NoResultFound() # Mock dashboard para evitar erro de import/instanciação se o código chegar lá (não deveria) - with patch.dict("sys.modules", {"aignt_os.cli.dashboard": MagicMock()}): + with patch.dict("sys.modules", {"synapse_os.cli.dashboard": MagicMock()}): result = runner.invoke(app, ["runs", "watch", "non-existent-id"]) assert result.exit_code != 0 diff --git a/tests/unit/test_config.py b/tests/unit/test_config.py index 5f7dd79..6fa7d9a 100644 --- a/tests/unit/test_config.py +++ b/tests/unit/test_config.py @@ -6,7 +6,7 @@ def test_settings_exposes_default_values() -> None: - config_module = import_module("aignt_os.config") + config_module = import_module("synapse_os.config") settings = config_module.AppSettings() @@ -15,7 +15,7 @@ def test_settings_exposes_default_values() -> None: def test_settings_exposes_all_expected_default_paths() -> None: - config_module = import_module("aignt_os.config") + config_module = import_module("synapse_os.config") settings = config_module.AppSettings() @@ -26,35 +26,35 @@ def test_settings_exposes_all_expected_default_paths() -> None: assert settings.secret_mask_patterns -def test_settings_default_runs_db_path_is_sqlite_under_aignt_dir() -> None: - config_module = import_module("aignt_os.config") +def test_settings_default_runs_db_path_is_sqlite_under_synapse_dir() -> None: + config_module = import_module("synapse_os.config") settings = config_module.AppSettings() assert settings.runs_db_path.suffix == ".sqlite3" - assert ".aignt-os" in str(settings.runs_db_path) + assert ".synapse-os" in str(settings.runs_db_path) -def test_settings_default_artifacts_dir_is_under_aignt_dir() -> None: - config_module = import_module("aignt_os.config") +def test_settings_default_artifacts_dir_is_under_synapse_dir() -> None: + config_module = import_module("synapse_os.config") settings = config_module.AppSettings() - assert ".aignt-os" in str(settings.artifacts_dir) + assert ".synapse-os" in str(settings.artifacts_dir) def test_settings_accepts_environment_override(monkeypatch: pytest.MonkeyPatch) -> None: - config_module = import_module("aignt_os.config") - monkeypatch.setenv("AIGNT_OS_APP_NAME", "AIgnt OS Test") + config_module = import_module("synapse_os.config") + monkeypatch.setenv("SYNAPSE_OS_APP_NAME", "SynapseOS Test") settings = config_module.AppSettings() - assert settings.app_name == "AIgnt OS Test" + assert settings.app_name == "SynapseOS Test" def test_settings_exposes_runtime_state_file(monkeypatch: pytest.MonkeyPatch) -> None: - config_module = import_module("aignt_os.config") - monkeypatch.setenv("AIGNT_OS_RUNTIME_STATE_DIR", ".runtime-state") + config_module = import_module("synapse_os.config") + monkeypatch.setenv("SYNAPSE_OS_RUNTIME_STATE_DIR", ".runtime-state") settings = config_module.AppSettings() @@ -63,9 +63,9 @@ def test_settings_exposes_runtime_state_file(monkeypatch: pytest.MonkeyPatch) -> def test_settings_exposes_run_persistence_paths(monkeypatch: pytest.MonkeyPatch) -> None: - config_module = import_module("aignt_os.config") - monkeypatch.setenv("AIGNT_OS_RUNS_DB_PATH", ".runtime/runs.sqlite3") - monkeypatch.setenv("AIGNT_OS_ARTIFACTS_DIR", ".runtime/artifacts") + config_module = import_module("synapse_os.config") + monkeypatch.setenv("SYNAPSE_OS_RUNS_DB_PATH", ".runtime/runs.sqlite3") + monkeypatch.setenv("SYNAPSE_OS_ARTIFACTS_DIR", ".runtime/artifacts") settings = config_module.AppSettings() @@ -76,10 +76,10 @@ def test_settings_exposes_run_persistence_paths(monkeypatch: pytest.MonkeyPatch) def test_settings_resolves_run_persistence_paths_within_workspace_root( monkeypatch: pytest.MonkeyPatch, tmp_path: Path ) -> None: - config_module = import_module("aignt_os.config") - monkeypatch.setenv("AIGNT_OS_WORKSPACE_ROOT", str(tmp_path)) - monkeypatch.setenv("AIGNT_OS_RUNS_DB_PATH", str(tmp_path / "runs" / "runs.sqlite3")) - monkeypatch.setenv("AIGNT_OS_ARTIFACTS_DIR", str(tmp_path / "artifacts")) + config_module = import_module("synapse_os.config") + monkeypatch.setenv("SYNAPSE_OS_WORKSPACE_ROOT", str(tmp_path)) + monkeypatch.setenv("SYNAPSE_OS_RUNS_DB_PATH", str(tmp_path / "runs" / "runs.sqlite3")) + monkeypatch.setenv("SYNAPSE_OS_ARTIFACTS_DIR", str(tmp_path / "artifacts")) settings = config_module.AppSettings() @@ -88,7 +88,7 @@ def test_settings_resolves_run_persistence_paths_within_workspace_root( def test_settings_runtime_state_file_is_child_of_state_dir() -> None: - config_module = import_module("aignt_os.config") + config_module = import_module("synapse_os.config") settings = config_module.AppSettings() @@ -96,7 +96,7 @@ def test_settings_runtime_state_file_is_child_of_state_dir() -> None: def test_settings_workspace_root_defaults_to_current_working_directory() -> None: - config_module = import_module("aignt_os.config") + config_module = import_module("synapse_os.config") settings = config_module.AppSettings() @@ -104,8 +104,8 @@ def test_settings_workspace_root_defaults_to_current_working_directory() -> None def test_settings_accepts_workspace_root_override(monkeypatch: pytest.MonkeyPatch) -> None: - config_module = import_module("aignt_os.config") - monkeypatch.setenv("AIGNT_OS_WORKSPACE_ROOT", ".workspace-root") + config_module = import_module("synapse_os.config") + monkeypatch.setenv("SYNAPSE_OS_WORKSPACE_ROOT", ".workspace-root") settings = config_module.AppSettings() @@ -115,7 +115,7 @@ def test_settings_accepts_workspace_root_override(monkeypatch: pytest.MonkeyPatc def test_settings_workspace_root_uses_current_working_directory_at_instantiation( monkeypatch: pytest.MonkeyPatch, tmp_path: Path ) -> None: - config_module = import_module("aignt_os.config") + config_module = import_module("synapse_os.config") monkeypatch.chdir(tmp_path) settings = config_module.AppSettings() @@ -124,7 +124,7 @@ def test_settings_workspace_root_uses_current_working_directory_at_instantiation def test_settings_exposes_default_secret_mask_patterns() -> None: - config_module = import_module("aignt_os.config") + config_module = import_module("synapse_os.config") settings = config_module.AppSettings() @@ -134,7 +134,7 @@ def test_settings_exposes_default_secret_mask_patterns() -> None: def test_settings_exposes_default_run_initiated_by() -> None: - config_module = import_module("aignt_os.config") + config_module = import_module("synapse_os.config") settings = config_module.AppSettings() @@ -142,7 +142,7 @@ def test_settings_exposes_default_run_initiated_by() -> None: def test_settings_exposes_default_max_concurrent_adapters() -> None: - config_module = import_module("aignt_os.config") + config_module = import_module("synapse_os.config") settings = config_module.AppSettings() @@ -150,7 +150,7 @@ def test_settings_exposes_default_max_concurrent_adapters() -> None: def test_settings_exposes_default_adapter_circuit_breaker_controls() -> None: - config_module = import_module("aignt_os.config") + config_module = import_module("synapse_os.config") settings = config_module.AppSettings() @@ -161,7 +161,7 @@ def test_settings_exposes_default_adapter_circuit_breaker_controls() -> None: def test_settings_exposes_default_auth_controls() -> None: - config_module = import_module("aignt_os.config") + config_module = import_module("synapse_os.config") settings = config_module.AppSettings() @@ -173,9 +173,9 @@ def test_settings_exposes_default_auth_controls() -> None: def test_settings_resolves_runtime_state_dir_within_workspace_root( monkeypatch: pytest.MonkeyPatch, tmp_path: Path ) -> None: - config_module = import_module("aignt_os.config") - monkeypatch.setenv("AIGNT_OS_WORKSPACE_ROOT", str(tmp_path)) - monkeypatch.setenv("AIGNT_OS_RUNTIME_STATE_DIR", str(tmp_path / "runtime")) + config_module = import_module("synapse_os.config") + monkeypatch.setenv("SYNAPSE_OS_WORKSPACE_ROOT", str(tmp_path)) + monkeypatch.setenv("SYNAPSE_OS_RUNTIME_STATE_DIR", str(tmp_path / "runtime")) settings = config_module.AppSettings() @@ -186,11 +186,11 @@ def test_settings_resolves_runtime_state_dir_within_workspace_root( def test_settings_rejects_runtime_state_dir_outside_workspace_root( monkeypatch: pytest.MonkeyPatch, tmp_path: Path ) -> None: - config_module = import_module("aignt_os.config") + config_module = import_module("synapse_os.config") workspace_root = tmp_path / "workspace" workspace_root.mkdir() - monkeypatch.setenv("AIGNT_OS_WORKSPACE_ROOT", str(workspace_root)) - monkeypatch.setenv("AIGNT_OS_RUNTIME_STATE_DIR", str(tmp_path / "outside-runtime")) + monkeypatch.setenv("SYNAPSE_OS_WORKSPACE_ROOT", str(workspace_root)) + monkeypatch.setenv("SYNAPSE_OS_RUNTIME_STATE_DIR", str(tmp_path / "outside-runtime")) settings = config_module.AppSettings() @@ -204,11 +204,11 @@ def test_settings_rejects_runtime_state_dir_outside_workspace_root( def test_settings_rejects_runs_db_path_outside_workspace_root( monkeypatch: pytest.MonkeyPatch, tmp_path: Path ) -> None: - config_module = import_module("aignt_os.config") + config_module = import_module("synapse_os.config") workspace_root = tmp_path / "workspace" workspace_root.mkdir() - monkeypatch.setenv("AIGNT_OS_WORKSPACE_ROOT", str(workspace_root)) - monkeypatch.setenv("AIGNT_OS_RUNS_DB_PATH", str(tmp_path / "outside" / "runs.sqlite3")) + monkeypatch.setenv("SYNAPSE_OS_WORKSPACE_ROOT", str(workspace_root)) + monkeypatch.setenv("SYNAPSE_OS_RUNS_DB_PATH", str(tmp_path / "outside" / "runs.sqlite3")) settings = config_module.AppSettings() @@ -219,15 +219,15 @@ def test_settings_rejects_runs_db_path_outside_workspace_root( def test_settings_rejects_symlinked_artifacts_dir_that_resolves_outside_workspace_root( monkeypatch: pytest.MonkeyPatch, tmp_path: Path ) -> None: - config_module = import_module("aignt_os.config") + config_module = import_module("synapse_os.config") workspace_root = tmp_path / "workspace" outside_root = tmp_path / "outside-artifacts" artifacts_link = workspace_root / "artifacts-link" workspace_root.mkdir() outside_root.mkdir() artifacts_link.symlink_to(outside_root, target_is_directory=True) - monkeypatch.setenv("AIGNT_OS_WORKSPACE_ROOT", str(workspace_root)) - monkeypatch.setenv("AIGNT_OS_ARTIFACTS_DIR", str(artifacts_link)) + monkeypatch.setenv("SYNAPSE_OS_WORKSPACE_ROOT", str(workspace_root)) + monkeypatch.setenv("SYNAPSE_OS_ARTIFACTS_DIR", str(artifacts_link)) settings = config_module.AppSettings() @@ -238,15 +238,15 @@ def test_settings_rejects_symlinked_artifacts_dir_that_resolves_outside_workspac def test_settings_rejects_symlinked_runtime_state_dir_that_resolves_outside_workspace_root( monkeypatch: pytest.MonkeyPatch, tmp_path: Path ) -> None: - config_module = import_module("aignt_os.config") + config_module = import_module("synapse_os.config") workspace_root = tmp_path / "workspace" outside_root = tmp_path / "outside-runtime" runtime_link = workspace_root / "runtime-link" workspace_root.mkdir() outside_root.mkdir() runtime_link.symlink_to(outside_root, target_is_directory=True) - monkeypatch.setenv("AIGNT_OS_WORKSPACE_ROOT", str(workspace_root)) - monkeypatch.setenv("AIGNT_OS_RUNTIME_STATE_DIR", str(runtime_link)) + monkeypatch.setenv("SYNAPSE_OS_WORKSPACE_ROOT", str(workspace_root)) + monkeypatch.setenv("SYNAPSE_OS_RUNTIME_STATE_DIR", str(runtime_link)) settings = config_module.AppSettings() @@ -255,28 +255,28 @@ def test_settings_rejects_symlinked_runtime_state_dir_that_resolves_outside_work def test_settings_rejects_invalid_environment_value() -> None: - config_module = import_module("aignt_os.config") + config_module = import_module("synapse_os.config") with pytest.raises(ValidationError): config_module.AppSettings(environment="invalid") def test_settings_rejects_non_positive_max_concurrent_adapters() -> None: - config_module = import_module("aignt_os.config") + config_module = import_module("synapse_os.config") with pytest.raises(ValidationError): config_module.AppSettings(max_concurrent_adapters=0) def test_settings_rejects_non_positive_adapter_circuit_breaker_threshold() -> None: - config_module = import_module("aignt_os.config") + config_module = import_module("synapse_os.config") with pytest.raises(ValidationError): config_module.AppSettings(adapter_circuit_breaker_failure_threshold=0) def test_settings_rejects_non_positive_adapter_circuit_breaker_cooldown() -> None: - config_module = import_module("aignt_os.config") + config_module = import_module("synapse_os.config") with pytest.raises(ValidationError): config_module.AppSettings(adapter_circuit_breaker_cooldown_seconds=0) @@ -289,8 +289,8 @@ def test_settings_rejects_non_positive_adapter_circuit_breaker_cooldown() -> Non def test_settings_accepts_all_valid_environment_values( monkeypatch: pytest.MonkeyPatch, env_value: str ) -> None: - config_module = import_module("aignt_os.config") - monkeypatch.setenv("AIGNT_OS_ENVIRONMENT", env_value) + config_module = import_module("synapse_os.config") + monkeypatch.setenv("SYNAPSE_OS_ENVIRONMENT", env_value) settings = config_module.AppSettings() diff --git a/tests/unit/test_contracts.py b/tests/unit/test_contracts.py index 223fecb..319cd2c 100644 --- a/tests/unit/test_contracts.py +++ b/tests/unit/test_contracts.py @@ -5,14 +5,14 @@ def test_run_request_requires_non_empty_prompt() -> None: - contracts_module = import_module("aignt_os.contracts") + contracts_module = import_module("synapse_os.contracts") with pytest.raises(ValidationError): contracts_module.RunRequest(prompt="") def test_run_request_serializes_to_plain_data() -> None: - contracts_module = import_module("aignt_os.contracts") + contracts_module = import_module("synapse_os.contracts") request = contracts_module.RunRequest(prompt="bootstrap project") @@ -31,7 +31,7 @@ def test_run_request_serializes_to_plain_data() -> None: ids=["single_char", "normal", "very_long", "unicode", "whitespace"], ) def test_run_request_accepts_any_non_empty_prompt(prompt: str) -> None: - contracts_module = import_module("aignt_os.contracts") + contracts_module = import_module("synapse_os.contracts") request = contracts_module.RunRequest(prompt=prompt) @@ -39,15 +39,15 @@ def test_run_request_accepts_any_non_empty_prompt(prompt: str) -> None: def test_cli_execution_result_keeps_raw_and_clean_outputs_separate() -> None: - contracts_module = import_module("aignt_os.contracts") + contracts_module = import_module("synapse_os.contracts") result = contracts_module.CLIExecutionResult( - tool_name="aignt", - command=["aignt", "version"], + tool_name="synapse", + command=["synapse", "version"], return_code=0, - stdout_raw="AIgnt OS 0.1.0\n", + stdout_raw="SynapseOS 0.1.0\n", stderr_raw="\u001b[31mwarn\u001b[0m\n", - stdout_clean="AIgnt OS 0.1.0", + stdout_clean="SynapseOS 0.1.0", stderr_clean="warn", duration_ms=12, timed_out=False, @@ -55,24 +55,24 @@ def test_cli_execution_result_keeps_raw_and_clean_outputs_separate() -> None: ) assert result.stdout_raw.endswith("\n") - assert result.stdout_clean == "AIgnt OS 0.1.0" + assert result.stdout_clean == "SynapseOS 0.1.0" assert result.stderr_raw.startswith("\u001b[31m") assert result.stderr_clean == "warn" assert result.duration_ms == 12 - assert result.model_dump()["command"] == ["aignt", "version"] + assert result.model_dump()["command"] == ["synapse", "version"] def test_cli_execution_result_rejects_invalid_return_code_type() -> None: - contracts_module = import_module("aignt_os.contracts") + contracts_module = import_module("synapse_os.contracts") with pytest.raises(ValidationError): contracts_module.CLIExecutionResult( - tool_name="aignt", - command=["aignt", "version"], + tool_name="synapse", + command=["synapse", "version"], return_code="0", - stdout_raw="AIgnt OS 0.1.0\n", + stdout_raw="SynapseOS 0.1.0\n", stderr_raw="warn\n", - stdout_clean="AIgnt OS 0.1.0", + stdout_clean="SynapseOS 0.1.0", stderr_clean="warn", duration_ms=12, timed_out=False, @@ -88,7 +88,7 @@ def test_cli_execution_result_rejects_invalid_return_code_type() -> None: ({"duration_ms": 1.5}, "duration_ms"), ({"timed_out": "yes"}, "timed_out"), ({"success": 1}, "success"), - ({"command": "aignt version"}, "command"), + ({"command": "synapse version"}, "command"), ], ids=[ "return_code_as_string", @@ -102,11 +102,11 @@ def test_cli_execution_result_rejects_invalid_return_code_type() -> None: def test_cli_execution_result_rejects_invalid_field_types( field_override: dict, field_name: str ) -> None: - contracts_module = import_module("aignt_os.contracts") + contracts_module = import_module("synapse_os.contracts") base = { - "tool_name": "aignt", - "command": ["aignt", "version"], + "tool_name": "synapse", + "command": ["synapse", "version"], "return_code": 0, "stdout_raw": "", "stderr_raw": "", @@ -123,11 +123,11 @@ def test_cli_execution_result_rejects_invalid_field_types( def test_cli_execution_result_allows_timed_out_with_nonzero_return_code() -> None: - contracts_module = import_module("aignt_os.contracts") + contracts_module = import_module("synapse_os.contracts") result = contracts_module.CLIExecutionResult( - tool_name="aignt", - command=["aignt", "runtime", "run"], + tool_name="synapse", + command=["synapse", "runtime", "run"], return_code=124, stdout_raw="", stderr_raw="timed out\n", @@ -144,11 +144,11 @@ def test_cli_execution_result_allows_timed_out_with_nonzero_return_code() -> Non def test_cli_execution_result_allows_zero_duration() -> None: - contracts_module = import_module("aignt_os.contracts") + contracts_module = import_module("synapse_os.contracts") result = contracts_module.CLIExecutionResult( - tool_name="aignt", - command=["aignt", "version"], + tool_name="synapse", + command=["synapse", "version"], return_code=0, stdout_raw="", stderr_raw="", diff --git a/tests/unit/test_dashboard_artifacts.py b/tests/unit/test_dashboard_artifacts.py index 1bb34f5..183fc2e 100644 --- a/tests/unit/test_dashboard_artifacts.py +++ b/tests/unit/test_dashboard_artifacts.py @@ -4,8 +4,8 @@ import pytest from textual.widgets import ListView, Static -from aignt_os.cli.dashboard import ArtifactExplorer -from aignt_os.persistence import ArtifactStore +from synapse_os.cli.dashboard import ArtifactExplorer +from synapse_os.persistence import ArtifactStore class TestArtifactExplorer: diff --git a/tests/unit/test_dashboard_filters.py b/tests/unit/test_dashboard_filters.py index 98e1841..583ce04 100644 --- a/tests/unit/test_dashboard_filters.py +++ b/tests/unit/test_dashboard_filters.py @@ -1,7 +1,7 @@ from unittest.mock import MagicMock -from aignt_os.cli.dashboard import RunDashboard -from aignt_os.persistence import RunStepRecord +from synapse_os.cli.dashboard import RunDashboard +from synapse_os.persistence import RunStepRecord # Helper to create mock steps diff --git a/tests/unit/test_dashboard_log_viewer.py b/tests/unit/test_dashboard_log_viewer.py index 2f52c57..eb8aa17 100644 --- a/tests/unit/test_dashboard_log_viewer.py +++ b/tests/unit/test_dashboard_log_viewer.py @@ -1,12 +1,12 @@ from unittest.mock import MagicMock -from aignt_os.cli.dashboard import LogViewer +from synapse_os.cli.dashboard import LogViewer def test_log_viewer_refreshes_file_when_size_changes(tmp_path, monkeypatch): log_file = tmp_path / "viewer.log" log_file.write_text("line1\nline2\nline3\n", encoding="utf-8") - monkeypatch.setenv("AIGNT_OS_TUI_LOG_BUFFER_LINES", "2") + monkeypatch.setenv("SYNAPSE_OS_TUI_LOG_BUFFER_LINES", "2") viewer = LogViewer("Test Log", "Initial", path=str(log_file)) log_widget = MagicMock() diff --git a/tests/unit/test_dashboard_logic.py b/tests/unit/test_dashboard_logic.py index d7768ae..5d978a1 100644 --- a/tests/unit/test_dashboard_logic.py +++ b/tests/unit/test_dashboard_logic.py @@ -1,7 +1,7 @@ from unittest.mock import MagicMock, patch -from aignt_os.cli.dashboard import LogViewer, RunDashboard -from aignt_os.persistence import RunStepRecord +from synapse_os.cli.dashboard import LogViewer, RunDashboard +from synapse_os.persistence import RunStepRecord MOCK_STEP = RunStepRecord( step_id=1, diff --git a/tests/unit/test_parsing_engine.py b/tests/unit/test_parsing_engine.py index 4e73bb6..fcfea8c 100644 --- a/tests/unit/test_parsing_engine.py +++ b/tests/unit/test_parsing_engine.py @@ -7,7 +7,7 @@ def _parsing_module(): - return import_module("aignt_os.parsing") + return import_module("synapse_os.parsing") def _read_fixture(name: str, *, unicode_escape: bool = False) -> str: diff --git a/tests/unit/test_persistence.py b/tests/unit/test_persistence.py index c035bd1..4d9f46d 100644 --- a/tests/unit/test_persistence.py +++ b/tests/unit/test_persistence.py @@ -8,7 +8,7 @@ def test_run_repository_persists_run_lifecycle(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") repository = persistence.RunRepository(tmp_path / "runs.sqlite3") run_id = repository.create_run( @@ -36,7 +36,7 @@ def test_run_repository_persists_run_lifecycle(tmp_path: Path) -> None: def test_run_repository_prevents_double_lock_for_same_run(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") repository = persistence.RunRepository(tmp_path / "runs.sqlite3") run_id = repository.create_run( @@ -52,7 +52,7 @@ def test_run_repository_prevents_double_lock_for_same_run(tmp_path: Path) -> Non def test_artifact_store_saves_raw_clean_and_named_artifacts(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") store = persistence.ArtifactStore(tmp_path / "artifacts") @@ -92,7 +92,7 @@ def test_artifact_store_saves_raw_clean_and_named_artifacts(tmp_path: Path) -> N def test_run_repository_records_step_execution_metadata(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") repository = persistence.RunRepository(tmp_path / "runs.sqlite3") run_id = repository.create_run( @@ -123,7 +123,7 @@ def test_run_repository_records_step_execution_metadata(tmp_path: Path) -> None: def test_run_repository_upgrades_legacy_schema_with_provenance_columns(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") database_path = tmp_path / "runs.sqlite3" connection = sqlite3.connect(database_path) @@ -191,8 +191,8 @@ def test_run_repository_upgrades_legacy_schema_with_provenance_columns(tmp_path: def test_artifact_store_blocks_unsafe_python_named_artifact(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - parsing = import_module("aignt_os.parsing") + persistence = import_module("synapse_os.persistence") + parsing = import_module("synapse_os.parsing") store = persistence.ArtifactStore(tmp_path / "artifacts") diff --git a/tests/unit/test_persistence_cancellation.py b/tests/unit/test_persistence_cancellation.py index 6167ca1..ad3d8c6 100644 --- a/tests/unit/test_persistence_cancellation.py +++ b/tests/unit/test_persistence_cancellation.py @@ -7,7 +7,7 @@ def test_run_repository_handles_cancellation(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") repository = persistence.RunRepository(tmp_path / "runs.sqlite3") run_id = repository.create_run( @@ -42,7 +42,7 @@ def test_run_repository_handles_cancellation(tmp_path: Path) -> None: def test_run_repository_cannot_cancel_finished_run(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") + persistence = import_module("synapse_os.persistence") repository = persistence.RunRepository(tmp_path / "runs.sqlite3") run_id = repository.create_run( diff --git a/tests/unit/test_pipeline_cancellation.py b/tests/unit/test_pipeline_cancellation.py index c38ed93..42642c5 100644 --- a/tests/unit/test_pipeline_cancellation.py +++ b/tests/unit/test_pipeline_cancellation.py @@ -2,7 +2,7 @@ import pytest -from aignt_os.pipeline import PipelineCancelledError, PipelineContext, PipelineEngine +from synapse_os.pipeline import PipelineCancelledError, PipelineContext, PipelineEngine class MockCancellationChecker: diff --git a/tests/unit/test_pipeline_engine.py b/tests/unit/test_pipeline_engine.py index f1817f2..81acf8c 100644 --- a/tests/unit/test_pipeline_engine.py +++ b/tests/unit/test_pipeline_engine.py @@ -7,7 +7,7 @@ def _pipeline_module(): - return import_module("aignt_os.pipeline") + return import_module("synapse_os.pipeline") def _write_valid_spec(path: Path) -> None: @@ -68,7 +68,7 @@ def __init__(self, *, fail_times: int, artifact_key: str, artifact_value: str) - def execute(self, step, context): # type: ignore[no-untyped-def] self.calls += 1 if self.calls <= self.fail_times: - supervisor = import_module("aignt_os.supervisor") + supervisor = import_module("synapse_os.supervisor") raise supervisor.RetryableStepError(f"temporary failure at {step.state}") pipeline = _pipeline_module() return pipeline.StepExecutionResult( @@ -194,7 +194,7 @@ def test_pipeline_engine_can_retry_code_green_and_continue_to_security(tmp_path: artifact_key="security_md", artifact_value="security", ) - supervisor = import_module("aignt_os.supervisor") + supervisor = import_module("synapse_os.supervisor") engine = pipeline.PipelineEngine( executors={ @@ -285,7 +285,7 @@ def test_pipeline_engine_can_return_from_review_to_code_green(tmp_path: Path) -> artifact_key="security_md", artifact_value="security", ) - supervisor = import_module("aignt_os.supervisor") + supervisor = import_module("synapse_os.supervisor") class _RejectingReviewExecutor: def __init__(self) -> None: diff --git a/tests/unit/test_public_onboarding_docs.py b/tests/unit/test_public_onboarding_docs.py index c435f6e..10df41d 100644 --- a/tests/unit/test_public_onboarding_docs.py +++ b/tests/unit/test_public_onboarding_docs.py @@ -13,9 +13,9 @@ def test_readme_includes_public_first_run_quickstart_and_boundary() -> None: readme = _readme_text() assert "## Primeira Run Publica" in readme - assert "`aignt doctor`" in readme - assert "`aignt runs submit --mode sync --stop-at SPEC_VALIDATION`" in readme - assert "`aignt runs show `" in readme + assert "`synapse doctor`" in readme + assert "`synapse runs submit --mode sync --stop-at SPEC_VALIDATION`" in readme + assert "`synapse runs show `" in readme assert "`repo-preflight`" in readme assert "nao substitui" in readme.lower() diff --git a/tests/unit/test_readme_current_baseline_docs.py b/tests/unit/test_readme_current_baseline_docs.py index 3e07d6e..64f801a 100644 --- a/tests/unit/test_readme_current_baseline_docs.py +++ b/tests/unit/test_readme_current_baseline_docs.py @@ -25,9 +25,9 @@ def test_readme_lists_current_public_cli_surface_and_boundaries() -> None: readme = README_PATH.read_text(encoding="utf-8") assert "### Superfície pública atual da CLI" in readme - assert "`aignt runs watch `" in readme - assert "`aignt runs cancel `" in readme - assert "`aignt auth init|issue|disable`" in readme - assert "`aignt runtime start|status|run|ready|stop`" in readme + assert "`synapse runs watch `" in readme + assert "`synapse runs cancel `" in readme + assert "`synapse auth init|issue|disable`" in readme + assert "`synapse runtime start|status|run|ready|stop`" in readme assert "nao existe web UI nem operacao distribuida" in readme assert "auth e RBAC continuam locais com provider `file`" in readme diff --git a/tests/unit/test_release_readiness_docs.py b/tests/unit/test_release_readiness_docs.py index db1698b..de79fe5 100644 --- a/tests/unit/test_release_readiness_docs.py +++ b/tests/unit/test_release_readiness_docs.py @@ -13,8 +13,8 @@ def test_release_readiness_docs_cover_public_surface_and_preview_boundary() -> N readme = README_PATH.read_text(encoding="utf-8") assert "## Artifact Preview" in readme - assert "`aignt runs show --preview report`" in readme - assert "`aignt runs show --preview PLAN.clean`" in readme + assert "`synapse runs show --preview report`" in readme + assert "`synapse runs show --preview PLAN.clean`" in readme assert "`raw_output`" in readme assert "sync-first" in readme @@ -25,12 +25,12 @@ def test_changelog_and_release_notes_capture_phase_2_technical_release() -> None assert "# Changelog" in changelog assert "## 0.1.0" in changelog - assert "`aignt doctor`" in changelog - assert "`aignt runs submit `" in changelog - assert "`aignt runs show --preview report`" in changelog + assert "`synapse doctor`" in changelog + assert "`synapse runs submit `" in changelog + assert "`synapse runs show --preview report`" in changelog assert "# Phase 2 Technical Release" in release_notes - assert "AIgnt-Synapse-Flow" in release_notes - assert "`aignt doctor`" in release_notes - assert "`aignt runs show --preview report`" in release_notes + assert "Synapse-Flow" in release_notes + assert "`synapse doctor`" in release_notes + assert "`synapse runs show --preview report`" in release_notes assert "sync-first" in release_notes diff --git a/tests/unit/test_repo_automation.py b/tests/unit/test_repo_automation.py index ce0af9f..c19717f 100644 --- a/tests/unit/test_repo_automation.py +++ b/tests/unit/test_repo_automation.py @@ -112,7 +112,7 @@ def test_operational_ci_uses_real_pull_request_head_checkout() -> None: workflow_text = (REPO_ROOT / ".github/workflows/operational-ci.yml").read_text(encoding="utf-8") assert "ref: ${{ github.event.pull_request.head.sha }}" in workflow_text - assert 'branch_name="$AIGNT_HEAD_REF"' in workflow_text + assert 'branch_name="$SYNAPSE_HEAD_REF"' in workflow_text def test_operational_ci_repo_checks_use_sync_dev_commit_flow() -> None: @@ -178,11 +178,11 @@ def test_validate_commit_message_rejects_invalid_pattern(tmp_path: Path) -> None def test_docker_build_supports_dry_run() -> None: - result = run_script("scripts/docker-build.sh", "--dry-run", "--tag", "aignt-os:test") + result = run_script("scripts/docker-build.sh", "--dry-run", "--tag", "synapse-os:test") assert result.returncode == 0 assert "docker build" in result.stdout - assert "aignt-os:test" in result.stdout + assert "synapse-os:test" in result.stdout assert str(REPO_ROOT / ".cache/docker/config") in result.stdout or result.stderr == "" @@ -304,7 +304,7 @@ def test_docker_rebuild_lists_relevant_inputs() -> None: assert result.returncode == 0 assert "pyproject.toml" in result.stdout - assert "src/aignt_os/cli/app.py" in result.stdout + assert "src/synapse_os/cli/app.py" in result.stdout assert "uv.lock" in result.stdout @@ -497,4 +497,4 @@ def test_compose_declares_runtime_healthcheck() -> None: assert 'command: ["runtime", "run"]' in compose_text assert "healthcheck:" in compose_text - assert 'test: ["CMD", "aignt", "runtime", "ready"]' in compose_text + assert 'test: ["CMD", "synapse", "runtime", "ready"]' in compose_text diff --git a/tests/unit/test_report_generator.py b/tests/unit/test_report_generator.py index 8c1a62b..524b287 100644 --- a/tests/unit/test_report_generator.py +++ b/tests/unit/test_report_generator.py @@ -5,8 +5,8 @@ def test_run_report_generator_matches_expected_fixture(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - reporting = import_module("aignt_os.reporting") + persistence = import_module("synapse_os.persistence") + reporting = import_module("synapse_os.reporting") repository = persistence.RunRepository(tmp_path / "runs.sqlite3") artifact_store = persistence.ArtifactStore(tmp_path / "artifacts") @@ -32,7 +32,7 @@ def test_run_report_generator_matches_expected_fixture(tmp_path: Path) -> None: run_id=run_id, step_state="SPEC_VALIDATION", artifact_name="spec_summary", - content="Implementar a primeira engine linear do AIgnt-Synapse-Flow", + content="Implementar a primeira engine linear do Synapse-Flow", ) repository.record_step(run_id, state="SPEC_VALIDATION", status="completed") repository.record_step( diff --git a/tests/unit/test_runtime_dispatch.py b/tests/unit/test_runtime_dispatch.py index 3a6cb39..b29bcf9 100644 --- a/tests/unit/test_runtime_dispatch.py +++ b/tests/unit/test_runtime_dispatch.py @@ -35,8 +35,8 @@ def _write_valid_spec(path: Path) -> None: def test_run_dispatch_service_executes_inline_when_mode_is_sync(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - dispatch_module = import_module("aignt_os.runtime.dispatch") + persistence = import_module("synapse_os.persistence") + dispatch_module = import_module("synapse_os.runtime.dispatch") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -65,8 +65,8 @@ def test_run_dispatch_service_executes_inline_when_mode_is_sync(tmp_path: Path) def test_run_dispatch_service_auto_queues_when_runtime_is_ready(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - dispatch_module = import_module("aignt_os.runtime.dispatch") + persistence = import_module("synapse_os.persistence") + dispatch_module = import_module("synapse_os.runtime.dispatch") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -96,8 +96,8 @@ def test_run_dispatch_service_auto_queues_when_runtime_is_ready(tmp_path: Path) def test_run_dispatch_service_explicit_async_queues_pending_run(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - dispatch_module = import_module("aignt_os.runtime.dispatch") + persistence = import_module("synapse_os.persistence") + dispatch_module = import_module("synapse_os.runtime.dispatch") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -128,9 +128,9 @@ def test_run_dispatch_service_explicit_async_queues_pending_run(tmp_path: Path) def test_run_dispatch_service_requires_running_runtime_for_authenticated_async( tmp_path: Path, ) -> None: - persistence = import_module("aignt_os.persistence") - dispatch_module = import_module("aignt_os.runtime.dispatch") - runtime_state_module = import_module("aignt_os.runtime.state") + persistence = import_module("synapse_os.persistence") + dispatch_module = import_module("synapse_os.runtime.dispatch") + runtime_state_module = import_module("synapse_os.runtime.state") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -162,9 +162,9 @@ def test_run_dispatch_service_requires_running_runtime_for_authenticated_async( def test_run_dispatch_service_rejects_authenticated_async_for_other_runtime_owner( tmp_path: Path, ) -> None: - persistence = import_module("aignt_os.persistence") - dispatch_module = import_module("aignt_os.runtime.dispatch") - runtime_state_module = import_module("aignt_os.runtime.state") + persistence = import_module("synapse_os.persistence") + dispatch_module = import_module("synapse_os.runtime.dispatch") + runtime_state_module = import_module("synapse_os.runtime.state") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -201,9 +201,9 @@ def test_run_dispatch_service_rejects_authenticated_async_for_other_runtime_owne def test_run_dispatch_service_allows_authenticated_async_for_legacy_runtime_binding( tmp_path: Path, ) -> None: - persistence = import_module("aignt_os.persistence") - dispatch_module = import_module("aignt_os.runtime.dispatch") - runtime_state_module = import_module("aignt_os.runtime.state") + persistence = import_module("synapse_os.persistence") + dispatch_module = import_module("synapse_os.runtime.dispatch") + runtime_state_module = import_module("synapse_os.runtime.state") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -238,8 +238,8 @@ def test_run_dispatch_service_allows_authenticated_async_for_legacy_runtime_bind def test_run_dispatch_service_rejects_missing_spec_path(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - dispatch_module = import_module("aignt_os.runtime.dispatch") + persistence = import_module("synapse_os.persistence") + dispatch_module = import_module("synapse_os.runtime.dispatch") repository = persistence.RunRepository(tmp_path / "runs.sqlite3") artifact_store = persistence.ArtifactStore(tmp_path / "artifacts") @@ -261,9 +261,9 @@ def test_run_dispatch_service_rejects_missing_spec_path(tmp_path: Path) -> None: def test_run_dispatch_service_rejects_invalid_spec_before_persisting_run(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - dispatch_module = import_module("aignt_os.runtime.dispatch") - specs_module = import_module("aignt_os.specs") + persistence = import_module("synapse_os.persistence") + dispatch_module = import_module("synapse_os.runtime.dispatch") + specs_module = import_module("synapse_os.specs") spec_path = tmp_path / "SPEC.md" spec_path.write_text("# Contexto\n\nSem front matter.\n", encoding="utf-8") @@ -287,8 +287,8 @@ def test_run_dispatch_service_rejects_invalid_spec_before_persisting_run(tmp_pat def test_run_dispatch_service_rejects_invalid_mode(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - dispatch_module = import_module("aignt_os.runtime.dispatch") + persistence = import_module("synapse_os.persistence") + dispatch_module = import_module("synapse_os.runtime.dispatch") spec_path = tmp_path / "SPEC.md" _write_valid_spec(spec_path) @@ -310,8 +310,8 @@ def test_run_dispatch_service_rejects_invalid_mode(tmp_path: Path) -> None: def test_run_dispatch_service_rejects_spec_outside_workspace_root(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - dispatch_module = import_module("aignt_os.runtime.dispatch") + persistence = import_module("synapse_os.persistence") + dispatch_module = import_module("synapse_os.runtime.dispatch") workspace_root = tmp_path / "workspace" workspace_root.mkdir() @@ -338,8 +338,8 @@ def test_run_dispatch_service_rejects_spec_outside_workspace_root(tmp_path: Path def test_run_dispatch_service_rejects_directory_outside_workspace_root(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - dispatch_module = import_module("aignt_os.runtime.dispatch") + persistence = import_module("synapse_os.persistence") + dispatch_module = import_module("synapse_os.runtime.dispatch") workspace_root = tmp_path / "workspace" workspace_root.mkdir() @@ -365,8 +365,8 @@ def test_run_dispatch_service_rejects_directory_outside_workspace_root(tmp_path: def test_run_dispatch_service_persists_canonical_spec_path_for_valid_run(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - dispatch_module = import_module("aignt_os.runtime.dispatch") + persistence = import_module("synapse_os.persistence") + dispatch_module = import_module("synapse_os.runtime.dispatch") workspace_root = tmp_path / "workspace" workspace_root.mkdir() diff --git a/tests/unit/test_runtime_robustness.py b/tests/unit/test_runtime_robustness.py index c1bb802..dc4019e 100644 --- a/tests/unit/test_runtime_robustness.py +++ b/tests/unit/test_runtime_robustness.py @@ -3,14 +3,14 @@ import pytest -from aignt_os.config import AppSettings -from aignt_os.pipeline import ( +from synapse_os.config import AppSettings +from synapse_os.pipeline import ( PipelineContext, PipelineEngine, PipelineStep, StepExecutionResult, ) -from aignt_os.supervisor import RetryableStepError +from synapse_os.supervisor import RetryableStepError @pytest.fixture diff --git a/tests/unit/test_runtime_service_security.py b/tests/unit/test_runtime_service_security.py index 64a64e6..b2f87ac 100644 --- a/tests/unit/test_runtime_service_security.py +++ b/tests/unit/test_runtime_service_security.py @@ -7,8 +7,8 @@ def test_runtime_service_treats_identity_mismatch_as_inconsistent(tmp_path: Path) -> None: - service_module = import_module("aignt_os.runtime.service") - state_module = import_module("aignt_os.runtime.state") + service_module = import_module("synapse_os.runtime.service") + state_module = import_module("synapse_os.runtime.state") service = service_module.RuntimeService(tmp_path / "runtime-state.json") service.state_store._write( # noqa: SLF001 @@ -27,8 +27,8 @@ def test_runtime_service_treats_identity_mismatch_as_inconsistent(tmp_path: Path def test_runtime_service_stop_does_not_signal_when_identity_validation_fails( tmp_path: Path, monkeypatch: pytest.MonkeyPatch ) -> None: - service_module = import_module("aignt_os.runtime.service") - state_module = import_module("aignt_os.runtime.state") + service_module = import_module("synapse_os.runtime.service") + state_module = import_module("synapse_os.runtime.state") service = service_module.RuntimeService(tmp_path / "runtime-state.json") service.state_store._write( # noqa: SLF001 diff --git a/tests/unit/test_runtime_state.py b/tests/unit/test_runtime_state.py index 08c53ec..0aae169 100644 --- a/tests/unit/test_runtime_state.py +++ b/tests/unit/test_runtime_state.py @@ -8,7 +8,7 @@ def test_runtime_state_store_persists_minimum_runtime_metadata(tmp_path: Path) -> None: - state_module = import_module("aignt_os.runtime.state") + state_module = import_module("synapse_os.runtime.state") store = state_module.RuntimeStateStore(tmp_path / "runtime-state.json") store.write_running(pid=12345) @@ -22,7 +22,7 @@ def test_runtime_state_store_persists_minimum_runtime_metadata(tmp_path: Path) - def test_runtime_state_store_persists_started_by_when_provided(tmp_path: Path) -> None: - state_module = import_module("aignt_os.runtime.state") + state_module = import_module("synapse_os.runtime.state") store = state_module.RuntimeStateStore(tmp_path / "runtime-state.json") store.write_running(pid=12345, started_by="operator-user") @@ -36,7 +36,7 @@ def test_runtime_state_store_persists_started_by_when_provided(tmp_path: Path) - def test_runtime_state_store_accepts_legacy_running_state_without_started_by( tmp_path: Path, ) -> None: - state_module = import_module("aignt_os.runtime.state") + state_module = import_module("synapse_os.runtime.state") state_file = tmp_path / "runtime-state.json" state_file.write_text( @@ -56,7 +56,7 @@ def test_runtime_state_store_accepts_legacy_running_state_without_started_by( def test_runtime_state_store_reports_stopped_when_state_file_is_missing(tmp_path: Path) -> None: - state_module = import_module("aignt_os.runtime.state") + state_module = import_module("synapse_os.runtime.state") store = state_module.RuntimeStateStore(tmp_path / "runtime-state.json") @@ -69,7 +69,7 @@ def test_runtime_state_store_reports_stopped_when_state_file_is_missing(tmp_path def test_runtime_state_store_reports_inconsistent_for_corrupted_state_file( tmp_path: Path, ) -> None: - state_module = import_module("aignt_os.runtime.state") + state_module = import_module("synapse_os.runtime.state") state_file = tmp_path / "runtime-state.json" state_file.write_text("{invalid json", encoding="utf-8") @@ -82,7 +82,7 @@ def test_runtime_state_store_reports_inconsistent_for_corrupted_state_file( def test_runtime_state_store_reports_inconsistent_for_nonexistent_pid(tmp_path: Path) -> None: - state_module = import_module("aignt_os.runtime.state") + state_module = import_module("synapse_os.runtime.state") store = state_module.RuntimeStateStore(tmp_path / "runtime-state.json") store.write_running(pid=999_999_999) @@ -95,7 +95,7 @@ def test_runtime_state_store_reports_inconsistent_for_nonexistent_pid(tmp_path: def test_runtime_state_store_writes_state_file_with_restricted_permissions( tmp_path: Path, ) -> None: - state_module = import_module("aignt_os.runtime.state") + state_module = import_module("synapse_os.runtime.state") state_file = tmp_path / "runtime-state.json" store = state_module.RuntimeStateStore(state_file) @@ -108,7 +108,7 @@ def test_runtime_state_store_writes_state_file_with_restricted_permissions( def test_runtime_state_store_persists_atomically( tmp_path: Path, monkeypatch: pytest.MonkeyPatch ) -> None: - state_module = import_module("aignt_os.runtime.state") + state_module = import_module("synapse_os.runtime.state") state_file = tmp_path / "runtime-state.json" store = state_module.RuntimeStateStore(state_file) @@ -128,7 +128,7 @@ def track_replace(source: Path, destination: Path) -> None: def test_runtime_state_store_rejects_untrusted_state_directory(tmp_path: Path) -> None: - state_module = import_module("aignt_os.runtime.state") + state_module = import_module("synapse_os.runtime.state") untrusted_dir = tmp_path / ".." / "outside-runtime" diff --git a/tests/unit/test_runtime_worker_config.py b/tests/unit/test_runtime_worker_config.py index e72ebf7..04ae250 100644 --- a/tests/unit/test_runtime_worker_config.py +++ b/tests/unit/test_runtime_worker_config.py @@ -2,8 +2,8 @@ def test_settings_exposes_runtime_poll_interval(monkeypatch) -> None: # type: ignore[no-untyped-def] - config_module = import_module("aignt_os.config") - monkeypatch.setenv("AIGNT_OS_RUNTIME_POLL_INTERVAL_SECONDS", "0.25") + config_module = import_module("synapse_os.config") + monkeypatch.setenv("SYNAPSE_OS_RUNTIME_POLL_INTERVAL_SECONDS", "0.25") settings = config_module.AppSettings() diff --git a/tests/unit/test_security.py b/tests/unit/test_security.py index 53782fb..29c7703 100644 --- a/tests/unit/test_security.py +++ b/tests/unit/test_security.py @@ -5,7 +5,7 @@ def _security_module(): - return import_module("aignt_os.security") + return import_module("synapse_os.security") def test_strip_bidi_controls_removes_direction_override_characters() -> None: diff --git a/tests/unit/test_spec_validator.py b/tests/unit/test_spec_validator.py index 1a780a4..31dc4f8 100644 --- a/tests/unit/test_spec_validator.py +++ b/tests/unit/test_spec_validator.py @@ -7,7 +7,7 @@ def _validator_module(): - return import_module("aignt_os.specs.validator") + return import_module("synapse_os.specs.validator") def test_valid_spec_file_returns_structured_document() -> None: diff --git a/tests/unit/test_state_machine.py b/tests/unit/test_state_machine.py index e512e9e..880131e 100644 --- a/tests/unit/test_state_machine.py +++ b/tests/unit/test_state_machine.py @@ -4,7 +4,7 @@ def _state_machine_module(): - return import_module("aignt_os.state_machine") + return import_module("synapse_os.state_machine") # --------------------------------------------------------------------------- @@ -15,7 +15,7 @@ def _state_machine_module(): def test_state_machine_follows_minimal_happy_path_to_complete() -> None: state_machine_module = _state_machine_module() - machine = state_machine_module.AIgntStateMachine() + machine = state_machine_module.SynapseStateMachine() assert machine.current_state == "REQUEST" @@ -37,7 +37,7 @@ def test_state_machine_follows_minimal_happy_path_to_complete() -> None: def test_state_machine_starts_at_request() -> None: state_machine_module = _state_machine_module() - machine = state_machine_module.AIgntStateMachine() + machine = state_machine_module.SynapseStateMachine() assert machine.current_state == "REQUEST" @@ -50,7 +50,7 @@ def test_state_machine_starts_at_request() -> None: def test_state_machine_blocks_plan_before_spec_validation() -> None: state_machine_module = _state_machine_module() - machine = state_machine_module.AIgntStateMachine() + machine = state_machine_module.SynapseStateMachine() machine.advance_to("SPEC_DISCOVERY") machine.advance_to("SPEC_NORMALIZATION") @@ -61,7 +61,7 @@ def test_state_machine_blocks_plan_before_spec_validation() -> None: def test_state_machine_rejects_invalid_transition_that_skips_flow_order() -> None: state_machine_module = _state_machine_module() - machine = state_machine_module.AIgntStateMachine() + machine = state_machine_module.SynapseStateMachine() with pytest.raises(state_machine_module.InvalidStateTransition, match="TEST_RED"): machine.advance_to("TEST_RED") @@ -70,7 +70,7 @@ def test_state_machine_rejects_invalid_transition_that_skips_flow_order() -> Non def test_state_machine_allows_review_to_return_to_code_green() -> None: state_machine_module = _state_machine_module() - machine = state_machine_module.AIgntStateMachine() + machine = state_machine_module.SynapseStateMachine() for state in ( "SPEC_DISCOVERY", "SPEC_NORMALIZATION", @@ -140,7 +140,7 @@ def test_state_machine_rejects_out_of_order_transition( ) -> None: state_machine_module = _state_machine_module() - machine = state_machine_module.AIgntStateMachine() + machine = state_machine_module.SynapseStateMachine() for state in advance_before: machine.advance_to(state) @@ -183,7 +183,7 @@ def test_state_machine_can_transition_to_failed_from_active_state( ) -> None: state_machine_module = _state_machine_module() - machine = state_machine_module.AIgntStateMachine() + machine = state_machine_module.SynapseStateMachine() for state in advance_before: machine.advance_to(state) @@ -200,9 +200,9 @@ def test_state_machine_can_transition_to_failed_from_active_state( def test_state_machine_rejects_transition_after_terminal_complete() -> None: state_machine_module = _state_machine_module() - machine = state_machine_module.AIgntStateMachine() + machine = state_machine_module.SynapseStateMachine() - machine = state_machine_module.AIgntStateMachine() + machine = state_machine_module.SynapseStateMachine() for state in ( "SPEC_DISCOVERY", "SPEC_NORMALIZATION", @@ -225,7 +225,7 @@ def test_state_machine_rejects_transition_after_terminal_complete() -> None: def test_state_machine_rejects_any_transition_after_terminal_failed() -> None: state_machine_module = _state_machine_module() - machine = state_machine_module.AIgntStateMachine() + machine = state_machine_module.SynapseStateMachine() machine.fail() assert machine.current_state == "FAILED" @@ -248,7 +248,7 @@ def test_state_machine_rejects_any_transition_after_terminal_failed() -> None: def test_state_machine_rejects_all_transitions_after_complete(next_state: str) -> None: state_machine_module = _state_machine_module() - machine = state_machine_module.AIgntStateMachine() + machine = state_machine_module.SynapseStateMachine() for state in ( "SPEC_DISCOVERY", "SPEC_NORMALIZATION", @@ -288,7 +288,7 @@ def test_state_machine_includes_quality_gate_in_linear_flow() -> None: def test_state_machine_transitions_from_code_green_to_quality_gate() -> None: state_machine_module = _state_machine_module() - machine = state_machine_module.AIgntStateMachine() + machine = state_machine_module.SynapseStateMachine() for state in ( "SPEC_DISCOVERY", "SPEC_NORMALIZATION", @@ -307,7 +307,7 @@ def test_state_machine_transitions_from_code_green_to_quality_gate() -> None: def test_state_machine_transitions_from_quality_gate_to_review() -> None: state_machine_module = _state_machine_module() - machine = state_machine_module.AIgntStateMachine() + machine = state_machine_module.SynapseStateMachine() for state in ( "SPEC_DISCOVERY", "SPEC_NORMALIZATION", @@ -328,7 +328,7 @@ def test_state_machine_cannot_skip_quality_gate_from_code_green_to_review() -> N """After CODE_GREEN the machine must go through QUALITY_GATE before REVIEW.""" state_machine_module = _state_machine_module() - machine = state_machine_module.AIgntStateMachine() + machine = state_machine_module.SynapseStateMachine() for state in ( "SPEC_DISCOVERY", "SPEC_NORMALIZATION", @@ -347,7 +347,7 @@ def test_state_machine_cannot_skip_quality_gate_from_code_green_to_security() -> """After CODE_GREEN jumping directly to SECURITY must be rejected.""" state_machine_module = _state_machine_module() - machine = state_machine_module.AIgntStateMachine() + machine = state_machine_module.SynapseStateMachine() for state in ( "SPEC_DISCOVERY", "SPEC_NORMALIZATION", @@ -365,7 +365,7 @@ def test_state_machine_cannot_skip_quality_gate_from_code_green_to_security() -> def test_state_machine_can_fail_from_quality_gate() -> None: state_machine_module = _state_machine_module() - machine = state_machine_module.AIgntStateMachine() + machine = state_machine_module.SynapseStateMachine() for state in ( "SPEC_DISCOVERY", "SPEC_NORMALIZATION", diff --git a/tests/unit/test_supervisor.py b/tests/unit/test_supervisor.py index 201e89b..124280d 100644 --- a/tests/unit/test_supervisor.py +++ b/tests/unit/test_supervisor.py @@ -4,7 +4,7 @@ def _supervisor_module(): - return import_module("aignt_os.supervisor") + return import_module("synapse_os.supervisor") def test_supervisor_requests_retry_after_recoverable_step_failure() -> None: diff --git a/tests/unit/test_tui_rendering.py b/tests/unit/test_tui_rendering.py index 38ac271..5dc591e 100644 --- a/tests/unit/test_tui_rendering.py +++ b/tests/unit/test_tui_rendering.py @@ -1,4 +1,4 @@ -from aignt_os.cli.rendering import truncate_logs +from synapse_os.cli.rendering import truncate_logs def test_truncate_logs_empty(): diff --git a/tests/unit/test_watch_and_cancellation_docs.py b/tests/unit/test_watch_and_cancellation_docs.py index 8da9d3c..bcbb06c 100644 --- a/tests/unit/test_watch_and_cancellation_docs.py +++ b/tests/unit/test_watch_and_cancellation_docs.py @@ -11,8 +11,8 @@ def test_readme_documents_watch_cancel_and_actual_dashboard_shortcuts() -> None: readme = README_PATH.read_text(encoding="utf-8") assert "## TUI Watch e Cancelamento Local" in readme - assert "`aignt runs watch `" in readme - assert "`aignt runs cancel `" in readme + assert "`synapse runs watch `" in readme + assert "`synapse runs cancel `" in readme assert "`Enter`" in readme assert "`a`" in readme assert "`f`" in readme @@ -42,6 +42,6 @@ def test_changelog_mentions_filters_and_local_cancellation() -> None: "restauracao da lista completa (`x`)" in changelog ) assert ( - "`aignt runs cancel ` e atalho `k` no dashboard para " + "`synapse runs cancel ` e atalho `k` no dashboard para " "cancelamento local e gracioso de runs" in changelog ) diff --git a/tests/unit/test_worker_runtime.py b/tests/unit/test_worker_runtime.py index eaa7f83..5f24ffd 100644 --- a/tests/unit/test_worker_runtime.py +++ b/tests/unit/test_worker_runtime.py @@ -32,8 +32,8 @@ def _write_valid_spec(path: Path, feature_id: str) -> None: def test_runtime_worker_processes_oldest_pending_run(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - worker_module = import_module("aignt_os.runtime.worker") + persistence = import_module("synapse_os.persistence") + worker_module = import_module("synapse_os.runtime.worker") repository = persistence.RunRepository(tmp_path / "runs.sqlite3") artifact_store = persistence.ArtifactStore(tmp_path / "artifacts") @@ -67,8 +67,8 @@ def test_runtime_worker_processes_oldest_pending_run(tmp_path: Path) -> None: def test_runtime_worker_ignores_locked_or_finalized_runs(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - worker_module = import_module("aignt_os.runtime.worker") + persistence = import_module("synapse_os.persistence") + worker_module = import_module("synapse_os.runtime.worker") repository = persistence.RunRepository(tmp_path / "runs.sqlite3") artifact_store = persistence.ArtifactStore(tmp_path / "artifacts") @@ -104,8 +104,8 @@ def test_runtime_worker_ignores_locked_or_finalized_runs(tmp_path: Path) -> None def test_runtime_worker_fails_pending_run_when_spec_hash_changes(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - worker_module = import_module("aignt_os.runtime.worker") + persistence = import_module("synapse_os.persistence") + worker_module = import_module("synapse_os.runtime.worker") repository = persistence.RunRepository(tmp_path / "runs.sqlite3") artifact_store = persistence.ArtifactStore(tmp_path / "artifacts") @@ -137,9 +137,9 @@ def test_runtime_worker_fails_pending_run_when_spec_hash_changes(tmp_path: Path) def test_runtime_worker_skips_incompatible_owner_and_processes_next_compatible( tmp_path: Path, ) -> None: - persistence = import_module("aignt_os.persistence") - worker_module = import_module("aignt_os.runtime.worker") - runtime_state_module = import_module("aignt_os.runtime.state") + persistence = import_module("synapse_os.persistence") + worker_module = import_module("synapse_os.runtime.worker") + runtime_state_module = import_module("synapse_os.runtime.state") repository = persistence.RunRepository(tmp_path / "runs.sqlite3") artifact_store = persistence.ArtifactStore(tmp_path / "artifacts") @@ -190,9 +190,9 @@ def test_runtime_worker_skips_incompatible_owner_and_processes_next_compatible( def test_runtime_worker_accepts_legacy_run_for_authenticated_runtime(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - worker_module = import_module("aignt_os.runtime.worker") - runtime_state_module = import_module("aignt_os.runtime.state") + persistence = import_module("synapse_os.persistence") + worker_module = import_module("synapse_os.runtime.worker") + runtime_state_module = import_module("synapse_os.runtime.state") repository = persistence.RunRepository(tmp_path / "runs.sqlite3") artifact_store = persistence.ArtifactStore(tmp_path / "artifacts") @@ -230,9 +230,9 @@ def test_runtime_worker_accepts_legacy_run_for_authenticated_runtime(tmp_path: P def test_runtime_worker_deduplicates_same_owner_skip_message(tmp_path: Path) -> None: - persistence = import_module("aignt_os.persistence") - worker_module = import_module("aignt_os.runtime.worker") - runtime_state_module = import_module("aignt_os.runtime.state") + persistence = import_module("synapse_os.persistence") + worker_module = import_module("synapse_os.runtime.worker") + runtime_state_module = import_module("synapse_os.runtime.state") repository = persistence.RunRepository(tmp_path / "runs.sqlite3") artifact_store = persistence.ArtifactStore(tmp_path / "artifacts") diff --git a/uv.lock b/uv.lock index 8236855..12cd806 100644 --- a/uv.lock +++ b/uv.lock @@ -2,58 +2,6 @@ version = 1 revision = 3 requires-python = ">=3.12" -[[package]] -name = "aignt-os" -version = "0.1.0" -source = { editable = "." } -dependencies = [ - { name = "alembic" }, - { name = "jsonschema" }, - { name = "pydantic" }, - { name = "pydantic-settings" }, - { name = "python-statemachine" }, - { name = "pyyaml" }, - { name = "rich" }, - { name = "sqlalchemy" }, - { name = "structlog" }, - { name = "textual" }, - { name = "typer" }, -] - -[package.optional-dependencies] -dev = [ - { name = "hypothesis" }, - { name = "mypy" }, - { name = "pytest" }, - { name = "pytest-asyncio" }, - { name = "pytest-cov" }, - { name = "pytest-mock" }, - { name = "ruff" }, -] - -[package.metadata] -requires-dist = [ - { name = "alembic", specifier = ">=1.14.0" }, - { name = "hypothesis", marker = "extra == 'dev'", specifier = ">=6.118.8" }, - { name = "jsonschema", specifier = ">=4.23.0" }, - { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.13.0" }, - { name = "pydantic", specifier = ">=2.9.2" }, - { name = "pydantic-settings", specifier = ">=2.6.1" }, - { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.3.3" }, - { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.24.0" }, - { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=5.0.0" }, - { name = "pytest-mock", marker = "extra == 'dev'", specifier = ">=3.14.0" }, - { name = "python-statemachine", specifier = ">=2.5.0" }, - { name = "pyyaml", specifier = ">=6.0.2" }, - { name = "rich", specifier = ">=13.9.4" }, - { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.7.3" }, - { name = "sqlalchemy", specifier = ">=2.0.36" }, - { name = "structlog", specifier = ">=24.4.0" }, - { name = "textual", specifier = ">=8.1.1" }, - { name = "typer", specifier = ">=0.12.5" }, -] -provides-extras = ["dev"] - [[package]] name = "alembic" version = "1.18.4" @@ -209,6 +157,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ea/ab/1608e5a7578e62113506740b88066bf09888322a311cff602105e619bd87/greenlet-3.3.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:ac8d61d4343b799d1e526db579833d72f23759c71e07181c2d2944e429eb09cd", size = 280358, upload-time = "2026-02-20T20:17:43.971Z" }, { url = "https://files.pythonhosted.org/packages/a5/23/0eae412a4ade4e6623ff7626e38998cb9b11e9ff1ebacaa021e4e108ec15/greenlet-3.3.2-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ceec72030dae6ac0c8ed7591b96b70410a8be370b6a477b1dbc072856ad02bd", size = 601217, upload-time = "2026-02-20T20:47:31.462Z" }, { url = "https://files.pythonhosted.org/packages/f8/16/5b1678a9c07098ecb9ab2dd159fafaf12e963293e61ee8d10ecb55273e5e/greenlet-3.3.2-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a2a5be83a45ce6188c045bcc44b0ee037d6a518978de9a5d97438548b953a1ac", size = 611792, upload-time = "2026-02-20T20:55:58.423Z" }, + { url = "https://files.pythonhosted.org/packages/5c/c5/cc09412a29e43406eba18d61c70baa936e299bc27e074e2be3806ed29098/greenlet-3.3.2-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ae9e21c84035c490506c17002f5c8ab25f980205c3e61ddb3a2a2a2e6c411fcb", size = 626250, upload-time = "2026-02-20T21:02:46.596Z" }, { url = "https://files.pythonhosted.org/packages/50/1f/5155f55bd71cabd03765a4aac9ac446be129895271f73872c36ebd4b04b6/greenlet-3.3.2-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43e99d1749147ac21dde49b99c9abffcbc1e2d55c67501465ef0930d6e78e070", size = 613875, upload-time = "2026-02-20T20:21:01.102Z" }, { url = "https://files.pythonhosted.org/packages/fc/dd/845f249c3fcd69e32df80cdab059b4be8b766ef5830a3d0aa9d6cad55beb/greenlet-3.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4c956a19350e2c37f2c48b336a3afb4bff120b36076d9d7fb68cb44e05d95b79", size = 1571467, upload-time = "2026-02-20T20:49:33.495Z" }, { url = "https://files.pythonhosted.org/packages/2a/50/2649fe21fcc2b56659a452868e695634722a6655ba245d9f77f5656010bf/greenlet-3.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6c6f8ba97d17a1e7d664151284cb3315fc5f8353e75221ed4324f84eb162b395", size = 1640001, upload-time = "2026-02-20T20:21:09.154Z" }, @@ -217,6 +166,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ac/48/f8b875fa7dea7dd9b33245e37f065af59df6a25af2f9561efa8d822fde51/greenlet-3.3.2-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:aa6ac98bdfd716a749b84d4034486863fd81c3abde9aa3cf8eff9127981a4ae4", size = 279120, upload-time = "2026-02-20T20:19:01.9Z" }, { url = "https://files.pythonhosted.org/packages/49/8d/9771d03e7a8b1ee456511961e1b97a6d77ae1dea4a34a5b98eee706689d3/greenlet-3.3.2-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab0c7e7901a00bc0a7284907273dc165b32e0d109a6713babd04471327ff7986", size = 603238, upload-time = "2026-02-20T20:47:32.873Z" }, { url = "https://files.pythonhosted.org/packages/59/0e/4223c2bbb63cd5c97f28ffb2a8aee71bdfb30b323c35d409450f51b91e3e/greenlet-3.3.2-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d248d8c23c67d2291ffd47af766e2a3aa9fa1c6703155c099feb11f526c63a92", size = 614219, upload-time = "2026-02-20T20:55:59.817Z" }, + { url = "https://files.pythonhosted.org/packages/94/2b/4d012a69759ac9d77210b8bfb128bc621125f5b20fc398bce3940d036b1c/greenlet-3.3.2-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ccd21bb86944ca9be6d967cf7691e658e43417782bce90b5d2faeda0ff78a7dd", size = 628268, upload-time = "2026-02-20T21:02:48.024Z" }, { url = "https://files.pythonhosted.org/packages/7a/34/259b28ea7a2a0c904b11cd36c79b8cef8019b26ee5dbe24e73b469dea347/greenlet-3.3.2-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b6997d360a4e6a4e936c0f9625b1c20416b8a0ea18a8e19cabbefc712e7397ab", size = 616774, upload-time = "2026-02-20T20:21:02.454Z" }, { url = "https://files.pythonhosted.org/packages/0a/03/996c2d1689d486a6e199cb0f1cf9e4aa940c500e01bdf201299d7d61fa69/greenlet-3.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:64970c33a50551c7c50491671265d8954046cb6e8e2999aacdd60e439b70418a", size = 1571277, upload-time = "2026-02-20T20:49:34.795Z" }, { url = "https://files.pythonhosted.org/packages/d9/c4/2570fc07f34a39f2caf0bf9f24b0a1a0a47bc2e8e465b2c2424821389dfc/greenlet-3.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1a9172f5bf6bd88e6ba5a84e0a68afeac9dc7b6b412b245dd64f52d83c81e55b", size = 1640455, upload-time = "2026-02-20T20:21:10.261Z" }, @@ -225,6 +175,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3f/ae/8bffcbd373b57a5992cd077cbe8858fff39110480a9d50697091faea6f39/greenlet-3.3.2-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:8d1658d7291f9859beed69a776c10822a0a799bc4bfe1bd4272bb60e62507dab", size = 279650, upload-time = "2026-02-20T20:18:00.783Z" }, { url = "https://files.pythonhosted.org/packages/d1/c0/45f93f348fa49abf32ac8439938726c480bd96b2a3c6f4d949ec0124b69f/greenlet-3.3.2-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:18cb1b7337bca281915b3c5d5ae19f4e76d35e1df80f4ad3c1a7be91fadf1082", size = 650295, upload-time = "2026-02-20T20:47:34.036Z" }, { url = "https://files.pythonhosted.org/packages/b3/de/dd7589b3f2b8372069ab3e4763ea5329940fc7ad9dcd3e272a37516d7c9b/greenlet-3.3.2-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c2e47408e8ce1c6f1ceea0dffcdf6ebb85cc09e55c7af407c99f1112016e45e9", size = 662163, upload-time = "2026-02-20T20:56:01.295Z" }, + { url = "https://files.pythonhosted.org/packages/cd/ac/85804f74f1ccea31ba518dcc8ee6f14c79f73fe36fa1beba38930806df09/greenlet-3.3.2-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e3cb43ce200f59483eb82949bf1835a99cf43d7571e900d7c8d5c62cdf25d2f9", size = 675371, upload-time = "2026-02-20T21:02:49.664Z" }, { url = "https://files.pythonhosted.org/packages/d2/d8/09bfa816572a4d83bccd6750df1926f79158b1c36c5f73786e26dbe4ee38/greenlet-3.3.2-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63d10328839d1973e5ba35e98cccbca71b232b14051fd957b6f8b6e8e80d0506", size = 664160, upload-time = "2026-02-20T20:21:04.015Z" }, { url = "https://files.pythonhosted.org/packages/48/cf/56832f0c8255d27f6c35d41b5ec91168d74ec721d85f01a12131eec6b93c/greenlet-3.3.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8e4ab3cfb02993c8cc248ea73d7dae6cec0253e9afa311c9b37e603ca9fad2ce", size = 1619181, upload-time = "2026-02-20T20:49:36.052Z" }, { url = "https://files.pythonhosted.org/packages/0a/23/b90b60a4aabb4cec0796e55f25ffbfb579a907c3898cd2905c8918acaa16/greenlet-3.3.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94ad81f0fd3c0c0681a018a976e5c2bd2ca2d9d94895f23e7bb1af4e8af4e2d5", size = 1687713, upload-time = "2026-02-20T20:21:11.684Z" }, @@ -233,6 +184,7 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/98/6d/8f2ef704e614bcf58ed43cfb8d87afa1c285e98194ab2cfad351bf04f81e/greenlet-3.3.2-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:e26e72bec7ab387ac80caa7496e0f908ff954f31065b0ffc1f8ecb1338b11b54", size = 286617, upload-time = "2026-02-20T20:19:29.856Z" }, { url = "https://files.pythonhosted.org/packages/5e/0d/93894161d307c6ea237a43988f27eba0947b360b99ac5239ad3fe09f0b47/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b466dff7a4ffda6ca975979bab80bdadde979e29fc947ac3be4451428d8b0e4", size = 655189, upload-time = "2026-02-20T20:47:35.742Z" }, { url = "https://files.pythonhosted.org/packages/f5/2c/d2d506ebd8abcb57386ec4f7ba20f4030cbe56eae541bc6fd6ef399c0b41/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b8bddc5b73c9720bea487b3bffdb1840fe4e3656fba3bd40aa1489e9f37877ff", size = 658225, upload-time = "2026-02-20T20:56:02.527Z" }, + { url = "https://files.pythonhosted.org/packages/d1/67/8197b7e7e602150938049d8e7f30de1660cfb87e4c8ee349b42b67bdb2e1/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:59b3e2c40f6706b05a9cd299c836c6aa2378cabe25d021acd80f13abf81181cf", size = 666581, upload-time = "2026-02-20T21:02:51.526Z" }, { url = "https://files.pythonhosted.org/packages/8e/30/3a09155fbf728673a1dea713572d2d31159f824a37c22da82127056c44e4/greenlet-3.3.2-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b26b0f4428b871a751968285a1ac9648944cea09807177ac639b030bddebcea4", size = 657907, upload-time = "2026-02-20T20:21:05.259Z" }, { url = "https://files.pythonhosted.org/packages/f3/fd/d05a4b7acd0154ed758797f0a43b4c0962a843bedfe980115e842c5b2d08/greenlet-3.3.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1fb39a11ee2e4d94be9a76671482be9398560955c9e568550de0224e41104727", size = 1618857, upload-time = "2026-02-20T20:49:37.309Z" }, { url = "https://files.pythonhosted.org/packages/6f/e1/50ee92a5db521de8f35075b5eff060dd43d39ebd46c2181a2042f7070385/greenlet-3.3.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:20154044d9085151bc309e7689d6f7ba10027f8f5a8c0676ad398b951913d89e", size = 1680010, upload-time = "2026-02-20T20:21:13.427Z" }, @@ -984,6 +936,58 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a8/45/a132b9074aa18e799b891b91ad72133c98d8042c70f6240e4c5f9dabee2f/structlog-25.5.0-py3-none-any.whl", hash = "sha256:a8453e9b9e636ec59bd9e79bbd4a72f025981b3ba0f5837aebf48f02f37a7f9f", size = 72510, upload-time = "2025-10-27T08:28:21.535Z" }, ] +[[package]] +name = "synapse-os" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "alembic" }, + { name = "jsonschema" }, + { name = "pydantic" }, + { name = "pydantic-settings" }, + { name = "python-statemachine" }, + { name = "pyyaml" }, + { name = "rich" }, + { name = "sqlalchemy" }, + { name = "structlog" }, + { name = "textual" }, + { name = "typer" }, +] + +[package.optional-dependencies] +dev = [ + { name = "hypothesis" }, + { name = "mypy" }, + { name = "pytest" }, + { name = "pytest-asyncio" }, + { name = "pytest-cov" }, + { name = "pytest-mock" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "alembic", specifier = ">=1.14.0" }, + { name = "hypothesis", marker = "extra == 'dev'", specifier = ">=6.118.8" }, + { name = "jsonschema", specifier = ">=4.23.0" }, + { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.13.0" }, + { name = "pydantic", specifier = ">=2.9.2" }, + { name = "pydantic-settings", specifier = ">=2.6.1" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.3.3" }, + { name = "pytest-asyncio", marker = "extra == 'dev'", specifier = ">=0.24.0" }, + { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=5.0.0" }, + { name = "pytest-mock", marker = "extra == 'dev'", specifier = ">=3.14.0" }, + { name = "python-statemachine", specifier = ">=2.5.0" }, + { name = "pyyaml", specifier = ">=6.0.2" }, + { name = "rich", specifier = ">=13.9.4" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.7.3" }, + { name = "sqlalchemy", specifier = ">=2.0.36" }, + { name = "structlog", specifier = ">=24.4.0" }, + { name = "textual", specifier = ">=8.1.1" }, + { name = "typer", specifier = ">=0.12.5" }, +] +provides-extras = ["dev"] + [[package]] name = "textual" version = "8.1.1"