state-hub/scripts
tegwick 6cbf2d2c56 feat(consistency): T04 push seal — closed-loop writeback for automated commits
Root cause of the 501-commit pile-up in inter-hub: fix_repo() created
git commits (brief updates, T03 writebacks) but never pushed them, so
the 15-minute timer accumulated local commits indefinitely. Once real
development landed on remote the repos diverged with no self-healing path.

Changes
-------
repo_sync.py (new module)
  Extracts all git lifecycle primitives: pull_ff, push_ff,
  count_remote_ahead (C-16 input), count_local_ahead (C-17/T04 input).
  Module docstring documents the push-seal invariant and stable state.

consistency_check.py
  - Imports primitives from repo_sync; thin _detect_behind_remote wrapper
    preserves backward compat for existing callers and tests.
  - C-17 backlog guard: if local has unpushed commits from a prior failed
    push, retry before making more; skip all writes if push still fails.
  - T04 push seal: unconditional push_ff() at end of every fix_repo() run.
  - _report_needs_action: ahead_of_remote param so repos with unpushed
    backlogs are not silently skipped as "clean" by fix_all_remote().
  - Domain-slug fallback: brief no longer degrades to "(unknown)" when all
    workplans are completed — falls back to any workstream for domain context.
  - Service switched from --all --fix to --remote --all (pulls before
    fixing, skips already-clean repos).

push-seal.md (new)
  Capability documentation: the problem, the invariant, all three checks
  (C-16/C-17/T04), stable-state description, API reference, and test map.

test_repo_sync.py (new, 32 tests)
  Full coverage of all four primitives via real git repos (tmp_path).
  Includes C-17 scenario, push-seal invariant, and four end-to-end
  loop-stability tests.

test_consistency_check.py
  Four new _report_needs_action cases for the ahead_of_remote parameter.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-21 01:43:40 +02:00
..
project_rules feat(brief): generate .custodian-brief.md per repo for offline worker orientation 2026-03-26 17:48:36 +01:00
capture_sbom_tools.py feat(sbom): CUST-WP-0013 — expand SBOM infra to terraform, ansible, and tool manifests 2026-03-12 04:40:26 +01:00
check_doi.py feat(doi): Repository DoI automated gate and dashboard integration (CUST-WP-0024) 2026-03-20 01:08:18 +01:00
cleanup_stale_tasks.py feat(maintenance): add stale-task cleanup scheme 2026-03-02 00:32:35 +01:00
consistency_check.py feat(consistency): T04 push seal — closed-loop writeback for automated commits 2026-04-21 01:43:40 +02:00
gitea_inventory.py feat(CUST-WP-0014): repo sync automation & Gitea inventory 2026-03-16 01:41:16 +01:00
ingest_capabilities.py feat(capability-requests): add cross-domain capability catalog and request routing 2026-03-19 21:07:50 +01:00
ingest_sbom.py feat(sbom): add go.sum parser to ingest_sbom.py 2026-03-19 01:04:34 +01:00
ingest_tpsc.py feat(tpsc): Third-Party Services Catalog (CUST-WP-0023) 2026-03-20 00:15:26 +01:00
install_hooks.sh feat(CUST-WP-0014): repo sync automation & Gitea inventory 2026-03-16 01:41:16 +01:00
patch_mcp_cwd.py Implement registration UX wishlist W1–W6 (260224) 2026-02-24 22:22:53 +01:00
project_claude_md.template feat(register): modular @-import CLAUDE.md structure (ops-bridge pattern) 2026-03-16 18:35:02 +01:00
pull_image.py Add state-hub v0.1 — local-first state service for the Custodian 2026-02-24 17:47:49 +01:00
push-seal.md feat(consistency): T04 push seal — closed-loop writeback for automated commits 2026-04-21 01:43:40 +02:00
register_project.sh feat(CUST-WP-0017): scope-analyst agent + SCOPE.md template + coverage 2026-03-17 23:10:30 +01:00
repo_sync.py feat(consistency): T04 push seal — closed-loop writeback for automated commits 2026-04-21 01:43:40 +02:00
seed.py feat(api): CUST-WP-0018 — API hardening & code quality 2026-03-18 02:17:04 +01:00
task_token_hook.py feat(token-events): auto-capture real token counts via PostToolUse hook 2026-04-01 22:38:45 +02:00
validate_repo_adr.py feat(custodian): add ADR-001 compliance validator 2026-02-28 12:00:09 +01:00