docs(b3): add git commit and merge policy design #1

Merged
pappi merged 6 commits from codex/post-cutover-cleanup into main 2026-05-09 02:06:49 +00:00
Owner

What

Bundles four commits whose history sat staged on this branch from
prior sessions; opening the PR captures all of them honestly:

  1. B3 git policy design doc (commit 1363d08)
    New file: docs/wip/B3-git-policy.md — ~3300 words specifying
    machine-enforceable git policy across all 6 hanuman repos:
    protected main, prefixed branches (agent|human|hotfix|ci),
    conventional commits, validated PR bodies, required CI,
    required_approvals=0 with growth path to 1+. Encodes 13
    decisions (D1-D13). Covers enforcement layers (Forgejo branch
    protection + Forgejo Actions workflow) and operator workflows
    (agent / human / hotfix paths).

  2. B2 D18 amendment (commit 21052d2)
    Adds D18 (ntfy.sh push notifications for the IP-updater cron) to
    the master B2 design doc at
    docs/wip/workspace-reorg/B2-forgejo-on-lightsail.md. Mirrors
    the D18 in-tree copy already landed in automation/.

  3. B2 D17 amendment (commit b5fb9d1)
    Adds D17 (SSH allow-list managed by cron-driven auto-update on
    the operator workstation) to the same B2 master doc. Mirrors the
    D17 in-tree copy already landed in automation/.

  4. Workspace .gitignore firm-up (commit c078a72)
    Extends the workspace-root .gitignore to cover Go bin/build/
    dist/out, Terraform state, Node, Python, and .env artifacts
    that drift in across the repos.

Why

B3 establishes the branching contract every change to the 6 repos
flows through going forward. Its master spec lives in this repo
(platform/docs/wip/). The materialization PR in
hanuman/automation (codex/d17-and-gitignore) implements the
contract; this PR lands the spec it implements.

The B2 D17 / D18 amendments to the master B2 doc bring it back in
sync with the in-tree decisions log on automation/ (which already
has D17 and D18 landed). The .gitignore firm-up is hygiene that
sat staged on the same branch.

Refs: A1 workspace structure (predecessor design),
docs/wip/workspace-reorg/B2-forgejo-on-lightsail.md (Forgejo
hosting that B3 depends on).

How verified

  • B3 doc reviewed inline during draft (Pappi ↔ Code conversation).
  • Self-consistency check on B3: rules, regexes, and operator
    workflows cross-reference cleanly.
  • B2 D17 / D18 amendments mirror text already merged in
    automation/forgejo/docs/decisions.md.
  • .gitignore patterns confirmed not to mask any tracked file
    (git ls-files | git check-ignore --stdin returns empty).
  • No code changes; this PR is documentation + ignore patterns only.

Refs: B3, A1, B2, D17, D18

## What Bundles four commits whose history sat staged on this branch from prior sessions; opening the PR captures all of them honestly: 1. **B3 git policy design doc** (commit `1363d08`) New file: `docs/wip/B3-git-policy.md` — ~3300 words specifying machine-enforceable git policy across all 6 hanuman repos: protected `main`, prefixed branches (`agent|human|hotfix|ci`), conventional commits, validated PR bodies, required CI, `required_approvals=0` with growth path to 1+. Encodes 13 decisions (D1-D13). Covers enforcement layers (Forgejo branch protection + Forgejo Actions workflow) and operator workflows (agent / human / hotfix paths). 2. **B2 D18 amendment** (commit `21052d2`) Adds D18 (ntfy.sh push notifications for the IP-updater cron) to the master B2 design doc at `docs/wip/workspace-reorg/B2-forgejo-on-lightsail.md`. Mirrors the D18 in-tree copy already landed in `automation/`. 3. **B2 D17 amendment** (commit `b5fb9d1`) Adds D17 (SSH allow-list managed by cron-driven auto-update on the operator workstation) to the same B2 master doc. Mirrors the D17 in-tree copy already landed in `automation/`. 4. **Workspace `.gitignore` firm-up** (commit `c078a72`) Extends the workspace-root `.gitignore` to cover Go `bin`/`build`/ `dist`/`out`, Terraform state, Node, Python, and `.env` artifacts that drift in across the repos. ## Why B3 establishes the branching contract every change to the 6 repos flows through going forward. Its master spec lives in this repo (`platform/docs/wip/`). The materialization PR in `hanuman/automation` (`codex/d17-and-gitignore`) implements the contract; this PR lands the spec it implements. The B2 D17 / D18 amendments to the master B2 doc bring it back in sync with the in-tree decisions log on `automation/` (which already has D17 and D18 landed). The `.gitignore` firm-up is hygiene that sat staged on the same branch. Refs: A1 workspace structure (predecessor design), `docs/wip/workspace-reorg/B2-forgejo-on-lightsail.md` (Forgejo hosting that B3 depends on). ## How verified - B3 doc reviewed inline during draft (Pappi ↔ Code conversation). - Self-consistency check on B3: rules, regexes, and operator workflows cross-reference cleanly. - B2 D17 / D18 amendments mirror text already merged in `automation/forgejo/docs/decisions.md`. - `.gitignore` patterns confirmed not to mask any tracked file (`git ls-files | git check-ignore --stdin` returns empty). - No code changes; this PR is documentation + ignore patterns only. --- Refs: B3, A1, B2, D17, D18
The pre-cutover platform/.gitignore covered only Python pycaches, OS
cruft, and workspace-control runtime logs. Post-cutover the platform
monorepo holds 15 Go modules with multiple bin/dist/out conventions,
plus Terraform deployment shapes that produce .tfstate / .terraform/
clutter on first apply.

Pulls go.work AND go.work.sum BOTH into version control (Pappi's call
for reproducibility against the workspace replace directives).

Pulls common Node/Angular dirs in defensively for the case where
frontend-factory or capabilities/strategies grows a JS/TS surface.
D15 set ssh_allowed_cidrs default-open with the expectation that
narrowing happens manually pre-production. In practice that's fragile
against home/laptop ISP WAN IP rotation. D17 yields ongoing port-22
management to a cron job on the operator workstation, with Terraform
ignoring port_info changes after creation.

Implementation lives in automation/forgejo/ (script + ansible role +
install playbook). Spec doc captures the rationale, trade-off vs SSM
hybrid activation, and the offline-workstation failure mode.
Mirrors the in-tree decisions.md update at
automation/forgejo/docs/decisions.md. The platform B2 spec is the
authoritative design doc; this keeps it in sync with the materialized
implementation.

D18 supplies out-of-band visibility for the D17 cron via ntfy.sh
push notifications on IP-change events and persistent (3+) failures,
with quiet runs staying genuinely silent. Notification path is fully
optional and configured via ansible-vault. Self-host swap supported
through the script's NTFY_BASE_URL env-var override (vault key
documents the knob; not auto-piped through cron — narrow scope by
intent).
pappi scheduled this pull request to auto merge when all checks succeed 2026-05-09 01:35:54 +00:00
pappi scheduled this pull request to auto merge when all checks succeed 2026-05-09 01:36:44 +00:00
pappi canceled auto merging this pull request when all checks succeed 2026-05-09 01:40:23 +00:00
Merge branch 'main' into codex/post-cutover-cleanup
Some checks failed
Branch policy / branch-policy (pull_request) Failing after 1s
f3a1ccfb13
pappi merged commit ca3f3f7793 into main 2026-05-09 02:06:49 +00:00
pappi deleted branch codex/post-cutover-cleanup 2026-05-09 02:06:49 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
hanuman/platform!1
No description provided.