Skip to content

Company OS: deterministic next-bet controller v1 (shadow mode, 1.2.7) - #12

Draft
maximalang wants to merge 3 commits into
codex/company-osfrom
wt/t_8f2f6d0d
Draft

maximalang wants to merge 3 commits into
codex/company-osfrom
wt/t_8f2f6d0d

Conversation

@maximalang

@maximalang maximalang commented Sep 2, 2026 •

Copy link
Copy Markdown
Owner

Статус: SHADOW-скелет, не к вливанию в текущем виде

Детерминированный next-bet контроллер Company OS v1 (shadow-only), версия 1.2.7. Аддитивно: src/fleet_policy/controller.py (fleet-policy controller CLI), 19 новых тестов, приёмочная фикстура. CI verify — зелёный на этом head.

Важно (решение компании на карте t_8f2f6d0d от 02.09.2026): семантика этого PR выведена из родительских контрактов v1-эпохи (econ-score/v1, evidence-gate v1.0), которые superseded контрактами v3 (econ-score/v3 из t_a92701e0, demand-metric v3 из t_dbb4235b). Формула v3 — score_rub=(E+A)*conf*freshness−C со свежестью по старейшему evidence-ref, каноническими парами проект/метрика и фикстурой с полностью null-деньгами — в редьюсере этого PR НЕ реализована. До независимого compatibility review на точных v3-артефактах и явной разблокировки компанией PR не вливать: ожидается пере-вывод схемы оценки.

Что сделано

  • Чистый детерминированный редьюсер: состояние доски ACTIONABLE_IDLE при running=0 и ready=0 c revenue-critical triage/todo гейтом; единственный кандидат; execute_bet только при свежих/авторитетных/без-гэпов метрике и финансах и известном effort; иначе максимум одна collect_evidence-рекомендация (execution_eligible=false, missing_fields, owner/squad, freshness target, kill/rollback, evidence refs, без выдуманных RUB); ничьи/пустые/только-blocked доски → no_action с детерминированной причиной.
  • Идемпотентность: decision_id — content-hash; повтор с тем же входом возвращает сохранённое решение и пишет 0 новых записей (append-only в events store рантайма).
  • Live-вход только чтением через официальный hermes kanban list --json; доски ограничены rr-team, seo-site. Shadow: ничего не создаёт/не продвигает/не разблокирует, cron/config не трогает.

Проверки

  • uv run --frozen python -m pytest tests/ -q в CI: 134 passed, 1 skipped (зафиксирован версионный тест на 1.2.7).
  • Локально пакет тестов контроллера: 19 passed. Четыре падения тестов подпроцессов в test_hardening_v121 воспроизводятся и на чистой базовой ревизии ad3cea9 (средовые, не из этого diff).
  • Канонический бандл собирается с этого head: 45 файлов, sha256 архива d7a04135068d845eada9e752c1ad6d3361dd64d900e2edb96b75ca6ef82662c7.

Риски

  • Схема оценки не v3-совместима (см. статус выше) — до review семантику считать черновиком.
  • Live-адаптер зависит от вывода внешнего CLI (формат может меняться) — покрыт отдельным тестом-адаптером.

Pure reducer over board snapshots: ACTIONABLE_IDLE fixed rule, decision_type execute_bet|collect_evidence|no_action, no invented RUB, deterministic content-hashed decisions with append-only idempotent persistence in the events store, read-only live adapter over the official kanban CLI restricted to canonical boards rr-team and seo-site. Shadow mode mutates nothing. Tests: 19 cases incl. determinism, ties, zero-new-record repeat, fail-closed input, CLI end-to-end.
@maximalang
maximalang marked this pull request as draft September 2, 2026 18:35
…, shadow only

Formula score_rub=(E+A)*conf*freshness-C (C undiscounted; freshness by
OLDEST evidence ref, floor 0.125 at 90d, requires_reverification beyond),
candidate classes EXECUTABLE/EVIDENCE_GAP/BLOCKED_BUDGET/REJECTED, full
deterministic tie-break order (score, cost, confidence, oldest age,
source_task_id), budget guardrails 10k/op + 30k/month/project, anti-gaming
(double-count zeroing, avoided-loss cap, mechanism dedupe, score_components
tamper rejection), nonzero kill threshold incl. C=0, execute gate requires
fresh authoritative metric + non-gap economics, machine-readable audit block.

Contracts: ECONOMICS_SCORING_CONTRACT_V3 (t_a92701e0, sha256 ed5b0848...),
DEMAND_METRIC_SOURCE_CONTRACT_V3 (t_dbb4235b, sha256 7922ee61...),
QA contract_review_v3=pass (t_7ee1d606). Supersedes econ-score/v1 semantics.

v1 battery/fixture retained as stubs (no deletions); v3 battery
tests/test_controller_v3.py (29 tests) + fixture controller_shadow_v3.json.
Shadow guarantees unchanged: no mutations, append-only events store,
idempotent decision_id (nbc2-), Telegram-only digest. Version stays 1.2.7.
@maximalang

Copy link
Copy Markdown
Owner Author

Triage t_0278daff (22.09): verdict = KEEP OPEN — not on trunk, head already re-derived from econ-score/v3, but the PR's own merge gate (independent v3 compatibility review + explicit company unblock) is still outstanding.

Evidence: trunk src/fleet_policy has no controller.py and cli.py carries no controller subcommand (grep → 0 matches). Head 6981b7e = "controller: re-derive reducer from exact v3 contracts (econ-score/v3), shadow only" — the supersession warning in the PR body (v1-era formula) is addressed at head. Diff vs trunk 309c72f = 13 files, +1923/−6 (controller.py 1159, test_controller_v3.py 651, CHANGELOG +14, version pins → 1.2.7). GitHub: CONFLICTING/DIRTY (pins/CHANGELOG/uv.lock vs 1.2.28 trunk).

Plan: rebase onto 309c72f; renumber pins 1.2.7 → next unreleased (coordinate with #32/#45); move the CHANGELOG entry under the new version. Merge ONLY after the independent compatibility review on exact v3 artifacts and explicit company unblock, per the PR contract. Shadow mode — no live behavior change on merge until unblocked.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant