Skip to content

I2691 — start, check, finish and the commit and push hooks refuse a change from a session that has not joined

Make the derived state of I2690 binding: a non-trivial change from a session that is announced nowhere, or is behind the trunk by more than the policy's bound, is refused with the command that repairs it, and a read never is.

BLOCKED wave 1 · p0 · implementation profile · runs alone

Part of development-runtime — The runtime has a development surface.

Blocked. This issue cannot start until I2690 is done. The status is derived from that, not declared.

Objective

Make the derived state of I2690 binding: a non-trivial change from a session that is announced nowhere, or is behind the trunk by more than the policy's bound, is refused with the command that repairs it, and a read never is.

Why

The owner, 2026-10-13, after a session worked three hours stale and unannounced in a cluster of nineteen workers: this must never happen again; it must be formalized, derived, inferred, enforced, in .ai, announced, a hard requirement, on GitHub Pages, tested, documented and on the landing page. See ADR 0226.

Current state

Measured on master f0696ec535 on 2026-10-13: nothing refuses a stale or unannounced session; on the owner's Mac the git hooks were not installed at all (core.hooksPath unset), and doctor said so only as six wiring failures nobody read.

Desired state

start, check and finish carry the join doctrine; the pre-commit and pre-push hooks run it; doctor reports a machine whose hooks are not wired as one finding with the single command that wires them; an unreachable remote, a closed mesh and a mesh with no server never refuse.

Scope

  • apps/majordomus-cli/src/doctrine/
  • apps/majordomus-cli/src/capability/builtin/
  • lib/doctor.sh
  • .githooks/
  • .ai/repo/rules/project/a-session-joins-the-cluster-before-it-works.v2.md

Out of scope

  • Deriving the facts: that is I2690
  • A refusal of reads, of context, of mesh or of doctor

Dependencies

Acceptance criteria

  • An unannounced session's commit is refused naming the announcing command, and the same session's context and mesh peers are not
  • A session behind the bound is refused at push and told to merge the trunk
  • An offline machine is told the check is unverified and proceeds
  • The rule is raised to blocking as version 2 with test 3004 as its decision and reviewed_because removed

Validation

  • bin/majordomus plan validate
  • majordomus rules list
  • MJ_TEST_JOBS=2 bash test/run.sh 3010_a_session_joins_the_cluster

Evidence required

  • join_refusal_case_3004
  • rule_v2_blocking

Evidence

None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.

Timeline

started
—
verified
—
completed
—

Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.

Canonical record: .ai/repo/project/issues/I2691.yaml. Read it back with majordomus plan show I2691.

Searches the titles and descriptions of every page this site publishes.