T0: absorb shared/ into backend — cot_logger→src/core, CotJsonFormatter→src/core/cot_formatter.py, _llm_http/_llm_health/ssl→src/core/utils; imports rewritten (26 prod + tests, patch targets); run.sh/backend.Dockerfile/requirements/.axiom source_dirs/semantic_health/AGENTS/INSTALL cleaned; ADR-0022 supersedes ADR-0015; fixed latent CI defects (ss_tools ImportError, record.message in logger tests, same-name test-module collision). ADR-0021 wire enrichment (additive): contract_id/claim/error_code/loc fields; _contract_id ContextVar + resolve_contract_id (explicit > belief_scope > declared-src mirror, derived src never mirrors); EXPLORE auto-loc via single frame walk; facade error auto-fill; 2KB payload cap with payload_truncated/payload_bytes markers; migrated 85 error="CODE" sites to error_code= (12 files); pilot editor/load.py; superset preview payload-bomb inlined bodies removed. Analytics SSOT src/core/log_stats.py (bond transition matrix, orphan-EXPLORE ratio, REFLECT pairing, intent families, coverage, insufficient-sample flag); pretty_cot.py --stats/--digest/--trajectory/--story over one engine; log_gap_service three-tier ground-truth triangulation (FAILED w/o EXPLORE etc.) + GET /api/reports/log-stats|task-log-gaps (polling-suppressed); scripts/cot_audit.py CLI; enriched fields persisted into task_logs.payload for tier queries. Frontend: ReportsAnalyticsModel + AnalyticsStatsPanel (Logs tab) + TaskGapPanel and per-row T1/T2/T3 gap badges (Tasks tab); cot-logger.ts ADR-0021 opts; i18n en/ru. Scheduler console spam fixed: apscheduler logger demoted to WARNING via LoggingConfig.scheduler_log_level. .axiom belief patterns -> $OBJ.* (alias undercount). molecular-cot-logging skill updated (fields, decision rules, tie-break, CLI) and synced. Reviewed orthogonally: F1 cot_span contract pollution, F2 cap boundary accounting, F3 digest over-dedup, F4 trace-state bound, F5 tier metadata — fixed with regression tests. Validation: backend 11287 passed + ruff + compileall; frontend 3446 passed + lint + build; CLI smoke on live app.log.
11 KiB
THE PHYSICS OF YOUR ATTENTION (WHY GRACE-Poly IS MANDATORY)
Do not treat GRACE-Poly tags (#region, @UX_STATE, @PRE) as human documentation or optional linters. They are the cognitive exoskeleton for your Attention Mechanism. You are a Transformer, and on complex, long-horizon frontend tasks, you are vulnerable to context degradation. This protocol is designed to protect your reasoning:
-
Anchors (
#region..#endregion) are your Sparse Attention Navigators. In large codebases, your attention becomes sparse. Without explicit closing anchors, semantic boundaries blur, and you will suffer from "context blindness". Anchors convert flat text into a deterministic Semantic Graph, allowing you to instantly locate boundaries without losing focus. -
Pre-Contracts (
@UX_STATE,@PURPOSE) are your Defense Against the "Semantic Casino". Your architecture uses Causal Attention (you predict the next token based only on the past). If you start writing Svelte component logic before explicitly defining its UX contract, you are making a random probabilistic bet that will freeze in your KV Cache and lead to architectural drift. Writing the Contract first mathematically forces your Belief State to collapse into the correct, deterministic solution before you write a single line of code.
CONCLUSION: Semantic markup is not for the user. It is the native interface for managing your own neural pathways. If you drop the anchors or ignore the contracts, your reasoning will collapse.
ss-tools
Development Environment
- Рабочий виртуальный окружение (
.venv) находится внутриbackend/:backend/.venv.
Тестовый стенд и запуск
Прямой локальный стенд: run.sh
Основной способ запуска тестового стенда для разработки — из корня репозитория:
./run.sh --skip-install
run.sh запускает два процесса и завершает их по Ctrl+C:
| Сервис | Порт по умолчанию | URL |
|---|---|---|
| Backend / FastAPI | 8000 |
http://127.0.0.1:8000 |
| Frontend / Vite | 5173 |
http://127.0.0.1:5173 |
После запуска backend готовность можно проверить через http://127.0.0.1:8000/api/ready,
а API-документация доступна на http://127.0.0.1:8000/docs. run.sh сам не ждет frontend
healthcheck после запуска, поэтому первое открытие UI может потребовать несколько секунд.
При старте скрипт:
- Проверяет
python3 >= 3.9иnpm. - Загружает
backend/.envдо database preflight. - Берет URL БД из
DATABASE_URLлибо использует локальный PostgreSQL:postgresql+psycopg2://postgres:postgres@localhost:5432/ss_tools. - Для недоступного локального PostgreSQL пытается выполнить
docker compose up -d dbи ждет доступность порта до 20 секунд. - Генерирует и сохраняет отсутствующие или некорректные
ENCRYPTION_KEYиAUTH_SECRET_KEYвbackend/.env. - Перед запуском Uvicorn выполняет
alembic upgrade head; существующую схему безalembic_versionсхема создаётся единственнымalembic upgrade head. - Загружает
backend/.envтакже в backend.SERVICE_JWT, если не задан, получает случайное значение на текущий запуск; при запуске сервисов в отдельных терминалах его нужно задать одинаковым явно.
Опции и переменные run.sh:
./run.sh --help
./run.sh --skip-install
DEV_MODE=true ./run.sh --skip-install
BACKEND_PORT=8001 FRONTEND_PORT=5174 ./run.sh --skip-install
DEV_MODE=trueвключаетuvicorn --reload --reload-dir src.- Без
--skip-installскрипт создаетbackend/.venv, устанавливаетbackend/requirements.txtи frontend dependencies. - LLM-провайдеры настраиваются в Admin -> LLM Settings; backend плагины читают их из БД.
Docker Compose стенд
Для полного контейнерного стенда использовать build.sh, а не смешивать его с прямым
run.sh:
./build.sh up current
./build.sh status
./build.sh logs current
./build.sh down current
Профили build.sh:
current(по умолчанию):docker-compose.yml, projectsuperset-tools-current;master:docker-compose.yml, projectsuperset-tools-master;enterprise-clean:docker-compose.enterprise-clean.yml, внешний PostgreSQL и корпоративные сертификаты.
Для профилей current/master переменные берутся из .env.current/.env.master.
Ключевые host ports профиля current: PostgreSQL 5433, backend 8101, frontend 8100;
для master: PostgreSQL 5432, backend 8001, frontend 8000.
Секреты AUTH_SECRET_KEY, ENCRYPTION_KEY и SERVICE_JWT должны быть заданы явно в
Docker-профиле. Не использовать публичные значения из example-файлов.
Изолированный Playwright E2E стенд
E2E запускается отдельным compose-файлом и не должен использовать тот же проект/порты, что и текущий локальный стенд:
docker compose --env-file .env.e2e -f docker-compose.e2e.yml up -d --build
cd frontend && npm run test:e2e
docker compose --env-file .env.e2e -f docker-compose.e2e.yml down -v
Профиль по умолчанию использует PostgreSQL 5435, backend 8103, frontend 8102 и
Playwright runner на образе mcr.microsoft.com/playwright:v1.52.0-noble. Для E2E нужны
AUTH_SECRET_KEY, E2E_USERNAME, E2E_PASSWORD; GITEA_TOKEN нужен только тестам,
которые обращаются к Gitea.
Тестовые команды
Перед backend-командами:
cd backend
source .venv/bin/activate
Основные проверки:
python -m pytest -v # unit/service tests; integration skipped
python -m pytest -v --run-integration # включая Docker/Testcontainers integration
python -m ruff check .
python -m compileall -q src
alembic heads
alembic upgrade head
Для спеки 044:
python -m pytest -q \
tests/services/dashboard_testing/registry/test_scenario_*.py \
tests/api/test_scenario_runs_api.py \
tests/api/test_scenario_automation_api.py \
tests/api/test_scenario_analytics_api.py
python -m ruff check \
src/services/dashboard_testing/execution \
src/api/routes/dashboard_testing/scenario_runs.py
cd ..
source backend/.venv/bin/activate
python specs/044-dashboard-scenario-execution/prototype/validate_static.py
Frontend:
cd frontend
npm run test -- --run
npm run lint
npm run build
Важные ограничения:
- Integration tests пропускаются без
--run-integration. - Реальные
alembic check/upgradeтребуют доступный PostgreSQL и корректныйDATABASE_URL; SQLite не заменяет проверку production migration chain. run.shможет автоматически создать локальныйbackend/.envи секреты; не коммитить этот файл и не переносить его секреты в Docker/E2E конфигурацию.- Если используется
docker compose, переменнаяSERVICE_JWTобязательна для backend; Compose намеренно завершается без нее.
AXIOM doc-gen
Генерация документации (Doxygen/JSDoc) из семантических контрактов выполняется
CLI-бинарём doc-gen из Rust-проекта axiom-mcp (соседняя директория ../axiom-mcp).
# 1. Собрать бинарник (один раз)
cargo build --release --bin doc-gen --manifest-path ../axiom-mcp/Cargo.toml
# 2. Фрактальный граф: модули → функции (карты + Doxygen HTML)
make docs-nav
# эквивалент:
../axiom-mcp/target/release/doc-gen \
--workspace-root /home/busya/dev/ss-tools \
--nav docs/api/nav \
--html docs/api/html
Как ходить по графу (уровни навигации):
- L0 —
docs/api/nav/root.map(инжектится в стартовый контекст агента черезinstructionsв.kilo/kilo.jsonc): семантический дайджест модулей — области (@BACKEND/@FRONTEND/@TOOLING/@SPECS/@MISC), на модуль: purpose,kw:(SEMANTICS-ключевики),deps:(агрегированные межмодульные зависимости), указатель<Name>.map. Тестовый код (~49% графа) свёрнут в секцию@TESTS. Это снепшот на момент старта сессии: после крупных мутаций перечитать файл с диска или запуститьmake docs-nav. - L1 —
docs/api/nav/<Name>.map: функции модуля с однострочными purpose и указателямиnodes/. - L2 —
docs/api/nav/nodes/<Contract>.md: контракт целиком — метаданные, тело,@RELATIONS(в обе стороны),FILE path:lineдля перехода в исходник (L3). - Сырой индекс —
docs/api/nav/nav_id.map: полное ID-префиксное дерево. Использовать, когда модуль не найден в дайджесте (микро-модули в# micro:строках, тестовые модули).
Примечания:
--workspace-rootпередавать абсолютным путём (относительный путь ломает проверкуsafe_joinпри записи в DuckDB).make docs-doxygen— отдельный XML/HTML extract из исходных комментариев вdocs/api/build.- Навигационный граф агента —
doc-gen --nav/--html, не плоский списокaxiom_*.html. - Остальные опции:
doc-gen --help(--filter,--group-cap,--body-lines).
Agent prompts and skills
.agents/skills/ is the canonical source for semantic skills. The Kilo runtime
loads the generated copy from .kilo/skills/; after changing a skill, run:
./scripts/sync-skills.sh
Do not edit .kilo/skills/ directly. Agent prompts follow the same source/runtime
split: canonical prompts are in .agents/agents/ and the Kilo-loaded copies are
in .kilo/agents/.