Commit Graph

719 Commits

Author SHA1 Message Date
ede5ec9473 Merge pull request 'feat(replication): ORCH-101 — расхардкод хоста + секреты нового хоста + smoke (фундамент тиража 10-common)' (#122) from feature/ORCH-101-orch-10-common-smoke into main
Some checks failed
CI / test (push) Has been cancelled
2026-06-10 21:09:38 +03:00
deploy-finalizer
c1e3c46f98 deploy(ORCH-036): finalize SUCCESS for ORCH-101
All checks were successful
CI / test (push) Successful in 56s
CI / test (pull_request) Successful in 58s
2026-06-10 21:09:37 +03:00
cb1f27e9c0 docs(ORCH-101): staging gate log — staging_status SUCCESS (8/10, C9a/C9b infra-waived)
All checks were successful
CI / test (push) Successful in 1m2s
CI / test (pull_request) Successful in 1m3s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 21:02:45 +03:00
c55f956d78 tester(ET): auto-commit from tester run_id=606
All checks were successful
CI / test (push) Successful in 56s
CI / test (pull_request) Successful in 55s
2026-06-10 21:00:13 +03:00
26fe4cdd5e reviewer(ET): auto-commit from reviewer run_id=605
All checks were successful
CI / test (push) Successful in 1m1s
CI / test (pull_request) Successful in 59s
2026-06-10 20:57:20 +03:00
f1635ddb39 feat(replication): расхардкод хоста + секреты нового хоста + smoke-runbook
All checks were successful
CI / test (push) Successful in 57s
CI / test (pull_request) Successful in 55s
Фундамент тиража 10-common (эпик ORCH-10): платформа разворачивается на
новой инфре без правки кода — только env/конфиг. Каждый дефолт = боевому
значению (пустой .env => поведение 1:1, kill-switch-природа, NFR-2);
STAGE_TRANSITIONS/QG_CHECKS/check_*/machine-verdict/схема БД не тронуты.

- config: agent_home_dir / agent_git_name / git_email_domain / staging_port
  (ADR-001 D2/D4); код-блокеры A1-A4 закрыты: plane_sync ссылки из
  gitea_public_url+gitea_owner, launcher - единый agent_git_env() (x2 места),
  self_deploy/post_deploy - HOME+домен из Settings (имена системных акторов -
  платформенные литералы)
- image_freshness: staging_port из конфига + fail-closed guard
  staging_port == прод-порт -> отказ ДО ssh/build (инвариант ORCH-058 AC-9
  стал исполняемым); REPO= передаётся хуку явно обоими инвокерами (D7)
- SELF_HOSTING_REPO - нормативная платформенная константа (D3, пин-тест)
- compose: полная ${VAR:-default}-интерполяция (реестр B, карта D6); группа
  ORCH-040 uid/gid/HOME/маунты двигается согласованно (build.args APP_*);
  group_add "МИНА 1" сохранён x3; оба app-сервиса с явным command:
- Dockerfile: ARG APP_UID/APP_GID/APP_USER/APP_HOME (CMD exec-form 8500
  сознательно не тронут - D5); deploy-hook: REPO="${REPO:-...}" (D1 реестра)
- секреты: stdlib scripts/gen_secrets.py (token_hex(32); печать по умолчанию;
  --write никогда не перезаписывает существующий .env молча, exit=2;
  перезапись только --force); .env.example дополнен до полноты ключей старта
- доки: новый docs/operations/REPLICATION.md (карта env, чек-лист секретов,
  smoke-процедура с PASS/FAIL, границы 10-common/Lite/Bundled), INFRA.md,
  README, CLAUDE.md, CHANGELOG
- анти-регресс: tests/test_no_host_hardcodes.py (tokenize-сканер запрещённых
  литералов, config-модули - структурное исключение, allowlist пуст,
  негативная самопроверка) + test_host_config_keys / test_infra_parametrization
  / test_secrets_gen / test_replication_smoke; согласованные структурные
  правки test_orch040_compose (судит резолв дефолтов) и
  test_deploy_hook_rollback_sim (REPO через env-override = контракт D7)

Полный регресс: 1764 passed.

Refs: ORCH-101

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 20:50:43 +03:00
26bdd783d6 architect(ET): auto-commit from architect run_id=603
All checks were successful
CI / test (push) Successful in 59s
2026-06-10 20:23:50 +03:00
69aa6eacde analyst(ET): auto-commit from analyst run_id=602
All checks were successful
CI / test (push) Successful in 1m9s
2026-06-10 20:02:14 +03:00
9d0f2e40b7 docs: init ORCH-101 business request
All checks were successful
CI / test (push) Successful in 59s
2026-06-10 19:50:40 +03:00
4c232112d4 Merge pull request 'feat(onboarding): turnkey project onboarding — kit + CLI + runbook (ORCH-009)' (#120) from feature/ORCH-009-turnkey-plane into main
Some checks failed
CI / test (push) Has been cancelled
2026-06-10 19:50:38 +03:00
deploy-finalizer
2fb6dc32f6 deploy(ORCH-036): finalize SUCCESS for ORCH-009
All checks were successful
CI / test (push) Successful in 58s
2026-06-10 19:50:37 +03:00
e5c3774bc5 tester(ET): auto-commit from tester run_id=600
All checks were successful
CI / test (push) Successful in 58s
CI / test (pull_request) Successful in 57s
2026-06-10 19:40:51 +03:00
b97ffae7a1 reviewer(ET): auto-commit from reviewer run_id=593
All checks were successful
CI / test (push) Successful in 56s
CI / test (pull_request) Successful in 1m3s
2026-06-10 17:26:44 +03:00
b26a391fa3 developer(ET): auto-commit from developer run_id=592
All checks were successful
CI / test (push) Successful in 55s
CI / test (pull_request) Successful in 55s
2026-06-10 16:18:27 +03:00
e9038182a1 fix(tests): hermetic ORCH-41 model/effort tests vs host env (unblock merge-gate)
Some checks failed
CI / test (push) Has been cancelled
CI / test (pull_request) Successful in 55s
Merge-gate re-test runs under the orchestrator's prod env, where the
operator legitimately set ORCH_AGENT_FALLBACK_MODEL and changed
ORCH_AGENT_MODEL_DEFAULT / ORCH_AGENT_EFFORT_*. Two ORCH-41-era tests
asserted SHIPPED defaults through the env-backed settings singleton and
failed 3/3 there, while Gitea CI (clean env) stayed green. Branch
ORCH-009 touches neither src/ nor these tests - latent non-hermetic
landmine on main, detonated by the prod env change.

- test_resolve_agent_effort.py: autouse fixture now mirrors the sibling
  model-file baseline (pins shipped model/fallback fields) so the
  flag-assembly tests are env-independent.
- test_resolve_agent_model.py: fixture also resets agent_fallback_model;
  test_fallback_model_disabled_by_default now asserts the CLASS field
  default (the actual ORCH-074 ADR-001 G4 invariant: shipped default
  is ""), never-break is_valid_model asserts unchanged byte-for-byte.

Clean-env behaviour is byte-equivalent (fixtures pin exactly what an
empty env yields). Full suite: 1713 passed (was 2 failed / 1711).

Refs: ORCH-009

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 16:17:54 +03:00
dd09e3da89 tester(ET): auto-commit from tester run_id=590
All checks were successful
CI / test (push) Successful in 54s
CI / test (pull_request) Successful in 53s
2026-06-10 16:08:43 +03:00
cc3ed42041 reviewer(ET): auto-commit from reviewer run_id=589 2026-06-10 16:08:43 +03:00
dc1cb87818 feat(onboarding): turnkey project onboarding — kit + CLI + runbook (ORCH-009)
Operator capability to bring a NEW project online in one pass, fully
outside the runtime and the pipeline (src/** byte-exact, no kill-switch
needed — activation is an explicit human CLI run). Reference = the
orchestrator repo itself (ORCH-52b/c/d/e canons).

* onboarding/repo-skeleton/ — parametrized kit of a new repo: 6 agent
  prompt templates per canon 52d/92 (5 ru + deployer en with the
  shared-host guardrail frame), reviewer doc-gate (REQUEST_CHANGES),
  CLAUDE.md passport, AGENTS.md, CONTRIBUTING.md, docs/ skeleton with
  mandatory operations/INFRA.md, .env.example; {{NAME}} placeholders +
  stdlib render, dictionary onboarding/placeholders.json (bijection
  held by tests). Canon is NOT forked: docs/_templates + docs/_standards
  are live-copied from the checkout at materialization time (BR-2/D3).
* scripts/onboard_project.py — plan (default, GET-only, zero mutations)
  / apply (idempotent ensure, no delete ops at all) / verify (registry
  round-trip via the actual projects._parse_projects_json, all 22 state
  names incl. fail-closed Confirm Deploy/STOP, labels, webhook, kit
  completeness, unresolved-placeholder scan). Closed read-only src
  import list (ADR D4); state groups fixed per ADR D5 (STOP→cancelled,
  terminal groups only Done/Cancelled/STOP); Gitea webhook reuses the
  single global ORCH_GITEA_WEBHOOK_SECRET (TR-6); initial push ONLY
  into a freshly created empty repo (INV-4 untouched); never restarts
  prod / never edits .env / deletes nothing (NFR-2); secrets masked
  (NFR-3); Plane CE API gaps degrade to manual-step (fail-safe).
* docs/operations/ONBOARDING.md runbook + SETUP_WEBHOOKS.md generalized
  per-repo; CLAUDE.md / docs/architecture/README.md / CHANGELOG.md
  updated in the same PR (golden source).
* Anti-drift tests: test_onboarding_kit.py / test_onboarding_script.py
  (mocked, no network) / test_onboarding_invariants.py (snapshots of
  STAGE_TRANSITIONS/QG_CHECKS, closed CLI import list, reference
  .openclaw/agents/ prompts untouched). Full regression: 1713 passed.

Refs: ORCH-009

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 16:08:43 +03:00
13e9618bd2 developer(ET): auto-commit from developer run_id=587 2026-06-10 16:08:43 +03:00
d141280390 architect(ET): auto-commit from architect run_id=586 2026-06-10 16:08:43 +03:00
ed04f71fd1 architect(ET): auto-commit from architect run_id=585 2026-06-10 16:08:43 +03:00
11551572e9 analyst(ET): auto-commit from analyst run_id=584 2026-06-10 16:08:43 +03:00
1289d728a8 docs: init ORCH-009 business request 2026-06-10 16:08:43 +03:00
2c801d8759 docs(ORCH-009): staging gate log — SUCCESS (8/10, C9a/C9b infra-waived) 2026-06-10 16:08:02 +03:00
af949afc58 Merge pull request 'feat(lessons): машинный журнал уроков — аддитивная таблица + observer-leaf (ORCH-098)' (#118) from feature/ORCH-098-fnd into main
Some checks failed
CI / test (push) Has been cancelled
2026-06-10 11:02:23 +03:00
deploy-finalizer
4203d93978 deploy(ORCH-036): finalize SUCCESS for ORCH-098
All checks were successful
CI / test (push) Successful in 55s
2026-06-10 11:02:22 +03:00
66700123ac docs(ORCH-098): staging gate SUCCESS — 15-staging-log.md
All checks were successful
CI / test (push) Successful in 57s
CI / test (pull_request) Successful in 1m2s
Staging suite (docker exec orchestrator-staging, port 8501) exit 0.
All REAL checks green; C9a/C9b INFRA-WAIVED (ORCH-061).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 10:55:51 +03:00
917acf3e1e tester(ET): auto-commit from tester run_id=582
All checks were successful
CI / test (push) Successful in 57s
CI / test (pull_request) Successful in 56s
2026-06-10 10:52:53 +03:00
de009822c0 reviewer(ET): auto-commit from reviewer run_id=581
All checks were successful
CI / test (push) Successful in 59s
CI / test (pull_request) Successful in 59s
2026-06-10 10:49:49 +03:00
21a47e85d3 fix(lessons): resolve land-race with ORCH-100 — renumber ADR 0033→0034
All checks were successful
CI / test (push) Successful in 56s
CI / test (pull_request) Successful in 55s
Merge-gate auto_rebase_onto_main bounced this branch back: ORCH-100 landed
in main first and claimed global ADR number adr-0033 (adr-0033-sidecar-watchdog),
while this branch had created adr-0033-lessons-journal. Resolved the genuine
land race:

- rebased feature/ORCH-098-fnd onto current origin/main (linear history)
- resolved docs/architecture/README.md component-list conflict — both the
  Lessons-journal and Sidecar-watchdog bullets now coexist
- renamed docs/architecture/adr/adr-0033-lessons-journal.md →
  adr-0034-lessons-journal.md (next free global ADR number) + fixed the
  in-file header
- updated all cross-references (CLAUDE.md, README.md, work-item ADR-001,
  12-review.md) 0033→0034 for the lessons journal; ORCH-100's adr-0033
  (sidecar) left intact
- recovered the ORCH-098 CHANGELOG entry silently dropped by the rebase
  auto-merge (now above ORCH-100, ADR ref corrected to 0034)

No code semantics changed; src/** auto-merged cleanly (ORCH-100 did not
touch src/**). ruff: n/a locally (CI). pytest tests/ -q: 1630 passed.

Refs: ORCH-098
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 10:44:34 +03:00
c01c42e532 tester(ET): auto-commit from tester run_id=578 2026-06-10 10:40:17 +03:00
eea70551e6 reviewer(ET): auto-commit from reviewer run_id=577 2026-06-10 10:40:17 +03:00
7d21625d84 feat(lessons): machine lessons-journal — additive table + observer leaf (ORCH-098)
Step 1 ("Foundation", F2) of the self-improvement epic: formalise free-text
"lessons" from memory/ into a machine-readable `lessons` table — the foundation
for the future retrospective agent (E2), the RICE prioritiser (E3) and Стрим.

- src/lessons.py: pure never-raise observer leaf (record/get/update/snapshot),
  kill-switch only, NO repo scope (observer-only; records about any repo incl.
  enduro; repo cut on the read side). Slug-convention constants.
- src/db.py: additive idempotent `lessons` table in init_db() (+3 indexes);
  nullable attribution columns from the start (NFR-6, _ensure_column forward-safe);
  helpers record_lesson/get_lessons/update_lesson/lessons_snapshot/
  lessons_recent_dup_exists (auto-dedup window).
- 4 auto-detectors (best-effort, source="auto", deduped): gate_failure
  (_handle_qg_failure_rollbacks), merge_hold (_handle_merge_verify HOLD),
  transient_retry (launcher._finalize_transient budget-exhaustion), deploy_degraded
  (post-deploy DEGRADED -> set_repo_freeze).
- src/main.py: GET /lessons, POST /lessons, POST /lessons/{id} + read-only
  `lessons` block in GET /queue; off-switch -> {"enabled": false}.
- src/config.py: lessons_enabled / lessons_query_limit_default / lessons_dedup_window_s.
- tests/test_lessons.py: TC-01..TC-12 (unit + integration), all green.
- Docs: CLAUDE.md, docs/architecture/README.md (component + schema + API), CHANGELOG.

Invariant: the journal is an OBSERVER, not a Quality Gate — STAGE_TRANSITIONS /
QG_CHECKS / check_* / machine-verdict / existing table schemas are byte-for-byte
untouched; enduro not affected. never-raise on every public fn + injection.

Refs: ORCH-098
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 10:40:17 +03:00
9f62df02eb architect(ET): auto-commit from architect run_id=574 2026-06-10 10:39:17 +03:00
1dc067a00c analyst(ET): auto-commit from analyst run_id=573 2026-06-10 10:37:51 +03:00
0677ea3a7e docs: init ORCH-098 business request 2026-06-10 10:37:51 +03:00
b915503b37 Merge pull request 'docs(ORCH-098): staging gate log — SUCCESS (8/10, C9a/C9b infra-waived)' (#119) from docs/ORCH-098-staging-log into main 2026-06-10 10:33:44 +03:00
b1a7239e20 docs(ORCH-098): staging gate log — SUCCESS (8/10, C9a/C9b infra-waived)
All checks were successful
CI / test (pull_request) Successful in 53s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 10:33:25 +03:00
db78c9eb7a Merge pull request 'feat(watchdog): sidecar-watchdog F1b — monitoring brain in a separate container (ORCH-100)' (#116) from feature/ORCH-100-fnd-f1b-sidecar-watchdog into main 2026-06-10 09:57:12 +03:00
deploy-finalizer
e7dad0f644 deploy(ORCH-036): finalize SUCCESS for ORCH-100
All checks were successful
CI / test (push) Successful in 52s
2026-06-10 09:57:11 +03:00
0ef1cf6698 tester(ET): auto-commit from tester run_id=571
All checks were successful
CI / test (push) Successful in 1m1s
CI / test (pull_request) Successful in 58s
2026-06-10 09:36:02 +03:00
9f62e05d01 reviewer(ET): auto-commit from reviewer run_id=570 2026-06-10 09:36:02 +03:00
318bae7472 fix(test): isolate settings.runs_dir in conftest to stop ambient prod-log pollution (ORCH-100)
test_queue.py::TestRetry::test_finalize_job_requeue_then_fail failed in the
self-hosting environment because launcher._finalize_job classifies a non-zero
exit by reading the tail of <settings.runs_dir>/<run_id>.log. settings.runs_dir
defaults to the live prod dir /app/data/runs, which on the host holds REAL
accumulated agent logs; a real 2.log containing "429" flips the expected
'permanent' classification to 'transient', requeueing the job instead of
marking it 'failed'. This is ambient prod pollution, not a code fault.

Add an autouse _isolate_runs_dir fixture (mirroring _no_telegram /
_disable_merge_verify) that redirects settings.runs_dir to a per-test tmp dir
so _run_log_path() resolves to a non-existent file and classify_log_file()
returns the documented 'permanent' default. Full suite: 1617 passed. src/**
untouched.

Refs: ORCH-100

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 09:36:02 +03:00
d61b583dad tester(ET): auto-commit from tester run_id=568 2026-06-10 09:36:02 +03:00
93cf2732a2 reviewer(ET): auto-commit from reviewer run_id=567 2026-06-10 09:36:02 +03:00
259b507906 feat(watchdog): sidecar-watchdog F1b — monitoring brain in a separate container (ORCH-100)
Add the `watchdog/` package (thin Python-3.12 stdlib-only daemon) and the
`orchestrator-watchdog` compose service — the brain half of the domain-0
observability pair. F1a (ORCH-099) exposes GET /metrics raw signal; F1b reads it,
augments with host / container / dependency probes, runs each signal through a
generalised pure decision function (decide(signal_active, prev, now, cooldown),
a strict superset of disk_watchdog.decide_action) with per-signal in-memory
dedup/throttle/recovery, and alerts over its OWN independent Telegram channel.

Key properties (ADR-001):
- Observer separated from observed: separate container; /metrics not answering is
  itself the master `orch_down` alarm (debounced K ticks — no flap on a hiccup).
- Strictly read-only: docker.sock GET-only + mounted :ro (double guard), host
  paths :ro, no DB/disk writes, no process control — self-hosting-safe.
- never-raise on three levels (per-source/per-tick/per-send) + WATCHDOG_ENABLED
  kill-switch (disabled -> inert idle-loop, not exit).
- Disk anti-duplicate (D6): disk_watchdog (ORCH-063) stays sole owner of the 85%
  alert; sidecar carries orch_down + an opt-in 97% ceiling (default off).
- NO import from src/** (C-1); src/**, STAGE_TRANSITIONS, QG_CHECKS, check_*, DB
  schema — untouched. env_file optional so a missing .env.watchdog never breaks
  `docker compose up` for the prod orchestrator.

Tests: tests/watchdog/ (TC-01…TC-13) + full tests/ regression green (TC-14).
Docs: CHANGELOG, .env.example canon (WATCHDOG_*); architecture README + adr-0033
authored at the architecture stage.

Refs: ORCH-100

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-10 09:36:02 +03:00
1c08b3f62a architect(ET): auto-commit from architect run_id=565 2026-06-10 09:36:02 +03:00
36102f253f analyst(ET): auto-commit from analyst run_id=564 2026-06-10 09:36:02 +03:00
874cc29ff7 docs: init ORCH-100 business request 2026-06-10 09:36:02 +03:00
26d6936eed Merge pull request 'docs(ORCH-100): staging gate log — SUCCESS (8/10, C9a/C9b infra-waived)' (#117) from docs/ORCH-100-staging-log into main
Some checks failed
CI / test (push) Has been cancelled
2026-06-10 09:35:30 +03:00