Skip to content

feat(meta-orchestrator): §1.7 PR-body authoring mandate in kickoff template - #216

Merged
artyhoo merged 1 commit into
stagingfrom
feat/meta-orchestrator-s17-worker-mandate
May 25, 2026
Merged

feat(meta-orchestrator): §1.7 PR-body authoring mandate in kickoff template#216
artyhoo merged 1 commit into
stagingfrom
feat/meta-orchestrator-s17-worker-mandate

Conversation

@artyhoo

@artyhoo artyhoo commented May 25, 2026

Copy link
Copy Markdown
Owner

Summary

Test plan

  • Pre-push hook cleared — verified: skill-drift OK after rewriting code-fence examples to backticks (no broken-ref false-positives); markdownlint 0 errors
  • Template file changed: +61 / -0 LOC, single file
  • Generated meta-kickoffs from this template will now carry §4b; no SKILL.md change needed (block is static prose)

§1.7 Forward-check applied

This PR adds a discipline-bearing mandate to a template under .claude/skills/** (matches the path list this very mandate introduces — recursive self-application).

  • .claude/rules/doc-authority-hierarchy.md — template addition does NOT change doc-authority; template inherits SKILL.md's Authoritative-for scope. file:line evidence: .claude/skills/meta-orchestrator/SKILL.md:6
  • .claude/rules/phase-research-coverage.md §1.12 — verdict applied: BUILD (path-scoped Worker-prompt mandate). Evidence base: 6× recurrence per memory feedback_pr_s17_authoring_checklist. Falsifier: wrong if §4b text proves ignorable inside Worker prompts; revisit at 8× recurrence. file:line evidence: .claude/skills/meta-orchestrator/templates/meta-kickoff.template.md:90
  • .claude/rules/ai-laziness-traps.md §2 — mandate is the operational counter to T19 (own cold-QA pre-handoff) and the deeper T-system gap that memory-only enforcement leaves open. file:line evidence: .claude/skills/meta-orchestrator/templates/meta-kickoff.template.md:99
  • .claude/rules/no-paid-llm-in-ci.md — template change is prose-only; no LLM API calls; pre-flight grep is deterministic bash. file:line evidence: .claude/skills/meta-orchestrator/templates/meta-kickoff.template.md:84-90
  • .claude/rules/build-first-reuse-default.md — no new dep, no new file ≥50 LOC in new packages/core/ subdir, no new ≥80 LOC file under packages/ — rule-prose addition, not capability commit. Voluntary evidence trail in commit body (escape-hatch syntax).

§1.7 Backward-check applied

Scope-additive change to the meta-orchestrator template. No existing artefact silently superseded; the mandate is a NEW layer between «kickoff §4 dispatch instructions» and «§4a Worker worktree setup».

  • .claude/skills/meta-orchestrator/templates/meta-kickoff.template.md — pre-existing §4 / §4a sections unchanged; §4b inserted between them. file:line evidence: .claude/skills/meta-orchestrator/templates/meta-kickoff.template.md:65
  • Sibling kickoffs at .claude/orchestrator-prompts/*/kickoff.md — pre-mandate kickoffs are forward-going (next dispatch picks up §4b), not retroactively rewritten — parallel to .claude/rules/dual-implementation-discipline.md §9 «forward-going annotation» pattern. file:line evidence: .claude/rules/dual-implementation-discipline.md:1
  • Memory feedback_pr_s17_authoring_checklist — already records the 4× recurrence at incident-count level; this PR makes the workflow-level fix the memory was unable to enforce by itself. file:line evidence: memory entry (user-scope, outside repo).
  • No existing template-side mechanism overlaps — grep -rn "§1.7" .claude/skills/ returns only the new §4b block in this commit; no duplicate enforcement layer.

Origin

…mplate

Adds §4b to templates/meta-kickoff.template.md — a path-triggered,
always-present mandate that any Worker whose target file matches a
discipline-bearing path (.claude/rules/, packages/core/principles/,
EXECUTION-PLAN, prior-art-evaluations, CLAUDE.md, packages/core/templates/,
.claude/skills/, agents/) MUST include §1.7 Forward/Backward-check sections
in the PR body with the exact H3 + "applied" shape + ≥40 chars + ≥1
file:line citation per section.

Origin: 6th recurrence of the §1.7-missing-from-PR-body CI gate fail in
~2 weeks (#58/#69/#105/#111/#212/#215). Memory feedback_pr_s17_authoring_checklist
says "memory ≠ enough, execute the grep" — but in-line memory does not
reliably activate inside paste-block Worker prompts. The mandate must be
in the prompt itself.

The §4b block:
- Names all 8 path patterns that trigger the mandate
- Documents 5 hard rules (H3 not H2; "applied" required; ≥40 chars; ≥1
  file:line; "Skipped" escape-hatch needs ≥60-char rationale)
- Provides a copy-paste pre-flight grep block Workers can run BEFORE
  gh pr create
- Lists the 6 historical incident PR numbers as evidence

Self-evaluating: Workers whose target file does NOT match the path list
ignore §4b. The mandate is path-scoped, not all-Workers.

No template placeholder added (no SKILL.md change needed) — block is
static prose, always present in every generated meta-kickoff. Workers
read it and self-apply.

Prior-art: skipped — template prose addition; not a capability commit per
CLAUDE.md «What is a capability commit?» (no new dep, no new file ≥50 LOC
in new packages/core subdir, no new ≥80 LOC file under packages/).
Evidence base: memory feedback_pr_s17_authoring_checklist + recurrence
incidents PR #58/#69/#105/#111/#212/#215.
@artyhoo
artyhoo merged commit adfa3e6 into staging May 25, 2026
22 checks passed
@artyhoo
artyhoo deleted the feat/meta-orchestrator-s17-worker-mandate branch May 25, 2026 07:32
artyhoo added a commit that referenced this pull request May 25, 2026
… detection) (#220)

Run `bash .claude/skills/meta-orchestrator/helpers/plan-currency-check.sh`
(L2 Stage 3 detection shipped in #217) → 88 UNTRACKED-N entries surfaced
between the 2026-05-22 reconciliation and origin/staging tip (#217). Map
each to an existing §0 / Track row by adding the PR number to its evidence
cell, or to a new §0 row for two umbrellas that landed in full since the
prior snapshot. Re-run helper → 0 UNTRACKED remaining.

Key changes:

- Snapshot date 2026-05-22 → 2026-05-25 (header + §0).
- N8 row: A-phase 🔲 → 🟡 — C1 SSOT-existence (#170), C2 kickoff
  T-enumeration floor (#174), C3 principle 13 §1.7 substance (#178),
  C4 delivery-channel marker (#177), activation #180. C5 + cost-levers
  remain gated on §5.3 utilisation trigger.
- Track M.1 / M.4 → DONE: M.1 codified T20 via #212 (with NB note —
  recommendation-laziness took the T20 slot, mutation-equivalence
  T-bump 20→21 still pending); M.4 6 paired-negative bash-hook tests
  shipped #195/#196/#197/#198/#199/#200.
- Two new §0 rows: Meta-orchestrator skill (Track P) — BUILD #186 +
  audit rounds #192/#193/#194/#201/#202 + UX refactor #203/#204/#205
  + planner-completeness #213/#214/#217 + §1.7 PR-body mandate #216;
  Recommendation-laziness discipline — R-phase #206/#207, benchmark
  #210, I-phase Sub-waves A/C/D #211/#212/#215.
- N7 row: + dogfood research-patch #135 / §4 demotion #166 / live-trial
  verified #171. N4b row: + design #136 / record #118.
- Infra paragraph: PR refs for I.1 follow-ups (#121/#123/#124/#125/
  #128/#130/#131/#143/#145/#146/#147/#148/#149/#172/#187), I.2
  (#139/#142/#154/#175), I.3 DN-4 (#126/#132/#133/#138/#140/#152/
  #159/#161/#162/#167).
- Track 2.3 (channel-earliness audit) → DONE 2026-05-23 (#181); removed
  from "What actually remains".
- Footer subsection: standalone work (#191 satellite-arch / #189
  guard-liveness / #173 storm-readiness / #176 §10 port / #182 cleanup),
  Wave 10 follow-ups (#110/#112/#113), plan-revision history (#108/
  #109/#153/#155/#157/#160/#164/#165/#168/#179/#185).

Verification:
- `bash .claude/skills/meta-orchestrator/helpers/plan-currency-check.sh
  | grep -c '^UNTRACKED'` → 0 (down from 88).
- `npx markdownlint-cli docs/meta-factory/wave-sequencing-plan.md`
  → no violations.
- `npx vitest run packages/core/skills/plan-currency-check.test.ts`
  → 14/14 passed.

Prior-art: skipped — chore, doc reconciliation only, no new capability
or rule introduced.
artyhoo added a commit that referenced this pull request Jul 12, 2026
…firing proof, fingerprint row (python-delivery-v0) (#996)

* feat(install): getff Python toolchain entry lane + refresh-parity + firing self-check (python-delivery-v0 S2 T1)

`install.sh python` / `./setup python` route to the pure-bash Python delivery
(setup.d/45-python.sh) instead of the npm stack pipeline: an explicit `python`
positional always wins; else pyproject.toml present + no package.json → OFFER
(interactive default No; non-interactive / --dry-run decline to the npm lane). The
lane bypasses the npm package.json precondition + stack pick and early-exits before
the setup.d layer loop, so no npm-assuming step fires. The npm flow stays
byte-identical (all 8 fingerprint baselines green; python logic is gated on
TOOLCHAIN=python which the npm fixtures never trigger).

--refresh re-delivers framework-owned Python artefacts (GETFF_TOOLCHAIN_REFRESH →
refresh_safe overwrite of the rules dir + our-own sgconfig/ruff), auto-detected via
the .getff-python-install.log / .getff/astgrep-rules marker on a bare `--refresh`.
Augment-merged / refused consumer files stay untouched (never clobbered).
refresh-covers-full-delivery.test.sh Check 4 replaces the S1 blanket 45-python.sh
exclusion with real source-token refresh parity (RED before the refresh_safe
branches landed, GREEN after — TDD).

Post-install firing self-check (always-run + graceful degrade, matching the
99-finalize.sh capstone self-verify UX — no separate opt-in flag): plants a
violation in an OS temp dir ONLY (mktemp -d, never under the consumer tree — STOP
line), runs the delivered ast-grep rules + ruff config against it, asserts BOTH fire
RED, then removes the temp dir. An absent tool → loud degrade printing the exact
pinned manual command, never silently green (attention-is-not-a-mechanism.md §1).

Tests: tests/install-sh/python-entry-lane.test.sh (20 arms — detection matrix,
no-package.json bypass, npm-untouched, explicit override, --refresh overwrite +
marker auto-detect, self-check fire + tool-absent degrade), wired into
audit-self.yml. S1 python-delivery (43), refresh-covers (6), byte-identical (8/8),
principles (303) all green.

Prior-art: prior-art-evaluations.md#216 (BUILD the thin bash writer — no headless tool delivers a pre-rendered, multi-tool, augment-first lint bundle into an existing repo; the S2 entry lane + firing self-check realise #216's delivery-mechanism verdict, reusing install.sh copy_safe/refresh_safe + the 99-finalize self-verify UX, zero new deps).

* feat(install): getff Python consumer CI template + fingerprint matrix python row (python-delivery-v0 S2 T2)

Consumer CI template:
- Ship packages/core/templates/python/github-actions-ci.yml — pinned @ast-grep/cli@0.44.1 +
  ruff==0.15.21 installs (ci-tool-pinning.md Rule A; both pins re-verified LATEST 2026-07-12
  via npm registry dist-tags + PyPI JSON, matching the framework CI pins audit-self.yml:232,242),
  failing gates `ast-grep scan` + `ruff check .`. Action SHAs reuse repo-verified pins
  (checkout v4.2.2, setup-node v4.4.0, setup-python v5.5.0).
- Delivered by the python lane (setup.d/45-python.sh _py_deliver_ci) to a getff-NAMESPACED
  .github/workflows/getff-python.yml — never clobbers the consumer's own ci.yml; loud REFUSE on
  a non-getff file at our path; refresh-aware (source-token parity keeps refresh-covers Check 4
  green). Same collision-discipline class as the S1 config cells (STOP-line: no silent clobber).

Fingerprint snapshot matrix python row:
- snapshot.sh: python row with its OWN seeding (pyproject.toml, no package.json) + collision-cell
  brownfield variants (pre-existing ruff.toml → cell iii refuse; pre-existing sgconfig.yml →
  cell ii structural merge), decoupled from the npm {greenfield,brownfield} matrix — NOT a naive
  STACKS append (the npm seeding cannot seed a pyproject / exercise the augment-first cells).
- Exclude the timestamped .getff-python-install.log from the fingerprint (running audit trail,
  not a delivered config artefact — already excluded from the layer's own (v) idempotency
  checksum) so the python row is deterministic; no-op for npm stacks.
- New baselines tests/install-sh/baselines/python/{greenfield,brownfield-ruff,brownfield-sgconfig}
  .fingerprint. Existing npm baselines byte-identical (proven — no npm baseline regen).

Tests: python-delivery.test.sh +8 CI-collision arms (fresh/no-ci.yml-clobber/refuse/refresh) =
50/0; byte-identical.test.sh 11/0 (8 npm + 3 python) + shellcheck 16 clean; determinism proven
(SNAPSHOT_MODE=compare ×2 = 11/0 idempotent); refresh-covers Check 4 6/0; principles 303/303.

Prior-art: prior-art-evaluations.md#216 (getff Python consumer delivery mechanism — the CI
template + its collision-safe delivery lane are part of the same augment-first consumer-install
capability this SSOT row justifies; no upstream analog for pinned multi-tool lint CI delivery).

* fix(python-delivery): EOF-safe OFFER prompt + explicit-arg refresh precedence + drop dead TOOLCHAIN_EXPLICIT

Addresses S2 entry-lane review findings on install.sh (commit 9ad9dd5be):

- Important: the interactive OFFER-lane `read` prompt for a pyproject-only repo
  aborted under `set -euo pipefail` at EOF (non-tty invocation, closed stdin) —
  a bare `read` returns non-zero at EOF, so `set -e` killed the script right
  there with a message-less exit 1, instead of falling through to the
  documented "decline -> npm lane -> clean no-package.json abort" path.
  `read -rp ... || _py_ans=""` makes the read EOF-safe.
- Minor: the `.getff/astgrep-rules` dual-consumer `--refresh` marker branch
  fired before any explicit stack arg was considered, so
  `install.sh ts-server --refresh` on a repo with both package.json and a
  stale/prior python marker silently rerouted to the python-only refresh and
  exited 0, skipping the npm refresh with no error. Gated the marker branch
  on `[ -z "$STACK_EXPLICIT" ]` so an explicit npm stack/toolchain arg always
  wins over the marker auto-route.
- Minor: removed the dead `TOOLCHAIN_EXPLICIT` variable (set, never read —
  "explicit wins" was already achieved via the `[ -z "$TOOLCHAIN" ]` guard on
  the auto-detect block) and fixed the misleading comment describing it.

Extended tests/install-sh/python-entry-lane.test.sh: arm (4) now asserts the
clean "No package.json found" message + exit 1 (RED before the fix: message
absent, script died silently at the read line); new arm (7b) asserts an
explicit `ts-server --refresh` on a repo with a python marker present
refreshes the npm stack, not the python-only path (RED before the fix: wrong
banner + no npm artefact delivered). 26/26 in that file (was 20); the three
sibling suites (python-delivery.test.sh, refresh-covers-full-delivery.test.sh,
byte-identical.test.sh) stay green with no fingerprint drift (11/11: 8 npm +
3 python).

Prior-art: skipped — review-fix round, no new capability

* fix(python-delivery): CI template enforces getff ruff bans via isolated --config gate (ruff-collision cells)

S2-T2 review Important (coordinator-confirmed fix-now): the shipped consumer CI template ran a bare
`ruff check .` with no `--config`. In a ruff-collision cell (consumer has their own ruff.toml or
pyproject [tool.ruff]), the getff TID bans ship as a NON-discovered getff-ruff.toml, so `ruff check .`
discovers the CONSUMER's config and the getff bans are SILENTLY unenforced — a green gate enforcing
nothing (#discipline-theatre, attention-is-not-a-mechanism.md §1, the exact failure this project
exists to prevent).

Probe-proven (pinned ruff 0.15.21, live, not from memory): `ruff check <dir> --config <getff.toml>
--no-cache` enforces ONLY the getff config's rules — `--config` REPLACES config discovery (does not
merge) — is self-contained (no consumer config needed, exit 0 on a clean tree), and fires RED on a
getff violation regardless of any consumer ruff config present.

Fix:
- setup.d/45-python.sh: the ruff lane ALWAYS delivers the getff bans to a stable, cell-independent
  .getff/ruff-bans.toml (fresh dir AND every collision cell) via _py_copy_or_refresh (framework-owned,
  getff-header-marked, refresh-aware). Source token $tpl/ruff.toml already has copy+refresh parity, so
  refresh-covers Check 4 is unchanged. Firing self-check now prefers .getff/ruff-bans.toml (proves the
  exact file CI points at). S1 no-clobber discipline intact — no consumer file touched.
- packages/core/templates/python/github-actions-ci.yml: the bare `ruff check .` becomes two steps —
  discovered-config check (unchanged) + an isolated getff-bans gate
  `ruff check . --config .getff/ruff-bans.toml --no-cache` that fires RED on our bans in EVERY cell.
- _py_deliver_ci REFUSE hint: comment noting its pins intentionally mirror the template + hint kept in
  sync with the two-step gate (S2-T2 Minor).

Tests (TDD, RED->GREEN documented in the report): +8 arms in python-delivery.test.sh (58 pass, was 50),
3 deterministic + 1 tool-gated live-fire proving bare check is BLIND while the getff gate fires RED in
a collision cell. python-entry-lane 26/0, refresh-covers 6/0, byte-identical 2/0 (11/11 + shellcheck
16 clean), test:principles 303/0. Python fingerprint baselines regenerated (python rows only, +1 file
each = .getff/ruff-bans.toml; npm baselines byte-identical, drift = 0).

Prior-art: skipped — review-fix round, no new capability (delivers an existing artifact to a stable path + a CI gate step).

* fix(python-delivery): register hand-authored CI template as non-rendered in S1 drift gate (rebase-integration)

Rebasing S2 onto staging pulled in S1's python byte-drift gate (#991,
backends/python-templates-drift.test.ts), which treats EVERY file under
packages/core/templates/python/ as a byte-identical render of the curated
starter nodes. S2 T2 hand-authored github-actions-ci.yml there (following the
repo-wide convention — ts-server/presets ship their CI workflow inside their
own templates/<stack>/ dir), so the now-present drift gate flagged it as an
orphan. S2 was reviewed against pre-S1 base #990, so this cross-stage
interaction could not surface before the rebase.

Fix: register github-actions-ci.yml in a new NON_RENDERED_TEMPLATE_FILES
allowlist. checkPythonTemplateDrift() no longer orphan-flags it AND now asserts
it EXISTS (a silent deletion still surfaces as `missing` — the exclusion is not
a blind pass, per attention-is-not-a-mechanism). The template's byte-integrity
remains guarded by tests/install-sh/byte-identical.test.sh (delivered
.github/workflows/getff-python.yml hash) + python-delivery.test.sh (cmp
template↔delivered) — no coverage hole. No template bytes changed; byte-identical
stays 11/11.

Prior-art: skipped — rebase-integration fix reconciling S2's hand-authored CI template with the S1 render-drift gate that arrived via rebase; no new capability area.

* fix(python-delivery): arm-9 degrade test uses a research-tool-excluded PATH (CI-robust)

The firing-self-check degrade arm forced PATH=/usr/bin:/bin to simulate 'no
tools', assuming that strips ast-grep/ruff/uvx. That holds on macOS (node +
ast-grep live in homebrew) but NOT on CI runners that ship ast-grep in
/usr/bin — there `command -v ast-grep` still resolved, the ast-grep lane FIRED
instead of degrading, and the arm never exercised the both-tools-absent degrade
summary it exists to prove (S2 CI-only fail 2026-07-12: PASS=24 FAIL=2).

Fix: build a coreutils-only bindir that symlinks everything EXCEPT the research
tools (ast-grep/sg/ruff/uvx/npx/node/pip), point the self-check PATH at it. Now
`command -v` genuinely fails for both lanes on any runner → both degrade →
pinned manual commands + no-green summary assert as intended. Production degrade
code unchanged (it was correct; pins are hardcoded constants). Local: 26/0.

Prior-art: skipped — test-only environment-robustness fix, no new capability

---------

Co-authored-by: t <t@t.co>
artyhoo added a commit that referenced this pull request Jul 31, 2026
…ok rung + lane-parity audit (operator-invited) (#1172)

Operator-invited insertion (2026-07-26): close the python lane's empty git-hook
rung inside this umbrella (S2b) and audit whether sibling lanes hide the same
class of gap (R1, lane x channel-rung parity matrix over npm/python/cargo +
verify-go-absent). Meta-launch amended: launch-table rows, S2->S2b->S3 gates,
S2b||R1 declared parallel (disjoint write-sets incl. the SSOT: one writer, one
reader).

S2b's Task 0 is the missing prior-art verdict this gap traces to: SSOT #216
REJECTed pre-commit as a delivery SCAFFOLDER, and python-delivery-v0's kickoff
conditional consumed that as a verdict on the enforcement CHANNEL — pre-commit
in its actual RUNNER role was never verdicted (T16-shaped conflation, provenance
in the kickoff header). R1 generalizes the lesson: every GAP cell must carry a
provenance classification (DECIDED-AGAINST / MISDECIDED / DEFERRED /
SILENTLY-MISSED), and every EXISTS cell firing evidence, not file existence.

Cold Phase -1 review: REVISE - 1 BLOCKER (R1 silent on the unconditional
fidelity-verdict required-check; pr-body-fidelity.yml has no paths filter and
`skipped` is rejected once a Provenance substrate is declared) + 4 MAJOR (missing
H2-heading requirement in the S2b fidelity trap; an executor-tier claim without a
marker; three unreconciled parallelism contradictions in the meta-launch; an
undercounted S2b write-set in the amendment) + 3 MINOR (excluded-columns
rationale, bare-remote note for a pre-push fixture, accept-time diff check for
the new test arm). All 8 applied; principle 12: 7/7 PASS; host-verify contracts
parse on both kickoffs (S2b fence, R1 explicit opt-out).

NOT dispatched: the operator paused the session on limits. Next session: merge
this PR (staging placement), re-probe in-flight, then dispatch S2b + R1 to aif
in parallel and arm monitors.

Prior-art: skipped — dispatch-input authoring and meta-launch amendment only;
no new capability, no dependency, no code module.

Co-authored-by: Test <test@example.com>
artyhoo added a commit that referenced this pull request Aug 6, 2026
… rung (getff-any-stack-trace) (#1233)

* docs(prior-art): SSOT #237 — pre-commit runner-role verdict (getff-any-stack-trace S2b Task 0)

RUNNER-ROLE verdict on pre-commit (pre-commit.com) for delivering the python lane's
local git-hook rung. Resolves the T16 conflation that created this stage: #216 rejected
pre-commit as a DELIVERY scaffolder (sample-config -> stdout, no merge) — the conditional
at python-delivery-v0/kickoff.md:97-98 consumed that REJECT as a verdict on the
ENFORCEMENT CHANNEL (the runner role), which #216's trigger-to-revisit never covered.

Verdict: BUILD bare core.hooksPath-style delivery as default + integration arm for
existing-hooks consumers. Decided on the binding priority-order criteria (kickoff §2
item 1):
- (a) zero installed prerequisites — pre-commit FAILS: DeepWiki-verified (3 phrasings x
  2 sources) that pre-commit requires Python 3.9+ AND the framework at runtime.
- (b) augment-first, never clobber — pre-commit FAILS: GitHub issue #1198 confirms
  «Cowardly refusing to install hooks with core.hooksPath set».
- (c) Node-free — both pass.

Pre-push chosen over pre-commit: mirrors S2b CI template's identical checks at push
time; fires at the moment a violation would leave the machine; uniformity with npm
lane (setup.d/50-hooks.sh:12).

BFR §3 mechanism: DeepWiki x3 phrasings on pre-commit/pre-commit + WebSearch x3
phrasings on the problem-domain term. Evidence cites #216 explicitly (role separation).

ID note: the worker authored this row as #235 against a base where #235 was free.
Between dispatch (2026-08-01) and egress (2026-08-07), #235 (knowledge-work-plugins)
and #236 (anthropic-plugins-utility) landed on staging. Renumbered to #237 at rebase;
the register's ID-uniqueness invariant (principle 08) is what the collision would have
tripped.

Prior-art: prior-art-evaluations.md#237 (NEW — runner-role verdict; #216 REJECT-as-delivery explicitly out of scope).

* feat(python-lane): S2b — close the python lane's empty local git-hook rung

Delivers a pre-push hook on the python lane (the missing earliest-reachable-channel
rung between agent-session and CI). Verdict = BUILD bare core.hooksPath-style delivery
as default + integration arm for existing-hooks consumers (SSOT #237; pre-commit REJECTED
on the runner-role criteria: Python required at runtime + Cowardly-refusing clobber).

Implementation:
- packages/core/templates/python/hooks/pre-push.sh — hook body mirroring the CI template
  (ast-grep scan + ruff check . --config .getff/ruff-bans.toml); fail OPEN with loud
  warning + pinned install hint when a linter is absent (T-S2B-A counter); runtime
  opt-out via GETFF_SKIP_HOOKS=1.
- packages/core/templates/python/hooks/getff.pre-commit-config.yaml.fragment — local-hook
  entry for the case-2 integration arm (consumer already uses pre-commit).
- setup.d/45-python.sh — _py_deliver_local_hook_rung + 3 _py_integrate_* helpers, called
  from _py_deliver_agent_surface. Three integration cases: (1) core.hooksPath already set
  -> decline with notice; (2) .pre-commit-config.yaml present -> append fragment (idempotent
  via marker grep); (3) .git/hooks/pre-push file -> decline with notice; default = set
  core.hooksPath .getff/hooks. Install-time opt-out via GETFF_SKIP_HOOKS=1. Non-git-repo
  guard prevents fatal on a pre-`git init` consumer tree. --refresh re-delivery via
  _py_copy_or_refresh (refresh_safe honours pre-push.override.md Layer-3 escape hatch).

Tests (tests/install-sh/python-entry-lane.test.sh):
- Arm (14): hook delivered + executable + core.hooksPath activated + header documents
  opt-out + deletion path.
- Arm (14b): install-time opt-out (GETFF_SKIP_HOOKS=1 -> no activation).
- Arm (15): RED/GREEN firing through ACTUAL git push (local bare remote + planted
  os.system violation); SKIP-run via GETFF_SKIP_HOOKS=1. Tool-gated — container SKIPs
  when ast-grep/ruff absent; host-verify exercises the real firing proof (T-S2B-C).
- Arm (16): three integration cases (existing core.hooksPath / .pre-commit-config.yaml /
  legacy .git/hooks/pre-push) — never silently broken, idempotent on re-install.

T21 backward-check sibling surfaces: npm lane (setup.d/50-hooks.sh + .husky) SWEPT-CLEAN,
untouched (anti-scope). Cargo lane (setup.d/46-cargo.sh) GAP-FOUND — same empty rung;
named for the widening getff-any-stack-trace umbrella, NOT fixed here.

Fingerprints regenerated: python/{greenfield,brownfield-ruff,brownfield-sgconfig} — new
.getff/hooks/pre-push shifts the install output (kickoff §3 fingerprint-regen requirement).

Prior-art: prior-art-evaluations.md#237 (BUILD verdict — bare core.hooksPath-style delivery + integration arm; pre-commit REJECTED on runner-role criteria).

* fix(python-lane): S2b egress fixes — pipefail-defeated RED assertion, template registry, SSOT renumber

Three host-side corrections found while landing the container's S2b work. None is a
scope change; all three are defects the container did not surface.

1. Arm (15) RED assertion could never pass (tests/install-sh/python-entry-lane.test.sh).
   The assertion piped `{ cat push_red; git push ...; }` straight into `grep -qi`. Under
   `set -o pipefail` (line 15) the re-push's legitimate non-zero exit — the rung blocking
   the push, which IS the thing being asserted — became the pipeline's status, so the arm
   reported RED-not-fired even when the hook output was present verbatim in the captured
   stderr. Measured on the host: `✗ getff pre-push: ast-grep structural rule(s) fired —
   push blocked` present, arm still failed. Fixed by capturing to a variable first.
   Why the container missed it: arm (15) is tool-gated and SKIPs when ast-grep/ruff are
   absent, which they are in the container — a green container run on a vacuous arm, the
   T14 «clean audit on low coverage» shape the kickoff §5 named. Host: PASS=80 FAIL=0
   with the arm actually exercised.

2. The two new hook templates were not registered in NON_RENDERED_TEMPLATE_FILES
   (packages/core/python-starter/render-python-templates.ts:78). The byte-drift gate
   asserts the committed set under templates/python/ equals plan + allowlist, so
   `backends/python-templates-drift.test.ts:46` went RED on the unregistered pair —
   caught by `.husky/pre-push` §5c on the host push, the same channel that caught the
   registry violation on S2. Registered with the rationale the existing entry carries
   (hand-authored, not a lint-rule render; byte-integrity guarded by the install
   fingerprint gate + arms (14)/(16b); firing guarded by arm (15)).
   packages/core test:backends after the fix: 24 files / 242 tests, 0 failed.

3. SSOT #235#237 across the code comments and the install-time echo
   (setup.d/45-python.sh:675,680,711,738,742,1013; python-entry-lane.test.sh:437).
   The worker authored the register row as #235 against a 2026-08-01 base; #235
   (knowledge-work-plugins) and #236 (anthropic-plugins-utility) landed on staging in the
   six days the branch sat unharvested. The rebase renumbered the row; these are the
   in-code citations that pointed at it.

Host-verify (kickoff §7): 3/3 on Darwin — python-entry-lane 80/80, python-rules-lock
21/21, snapshot compare 15/15 byte-identical.

Prior-art: skipped — test-assertion bugfix, template-registry entry, and citation renumber on an existing capability; no new capability introduced.

---------

Co-authored-by: Test <test@example.com>
artyhoo added a commit that referenced this pull request Aug 7, 2026
…the unreleased round 1) (#1254)

* docs(getff-r1): round-2 lane × channel-rung parity audit — re-derive under §8 map

Round-1 patch was unreachable in the worker clone; round 2 re-derives every
cell against the live tree per kickoff §8 (T-R1-D). Go lane now exists
(PR #1171, 2026-08-06) and gets 7 substantive verdicts replacing round-1's
N/A absence row. §8.2 MAJORs addressed (npm rung 6 firing evidence; analogy
EXISTS cells re-derived; EXISTS* hybrid resolved). §8.3 MINORs addressed
(SSOT #216 quote literal-or-dropped; deceptive-rung findings elevated;
line-count claim replaced with section cite).

Matrix: 4 lanes × 7 rungs = 28 cells (21 EXISTS, 7 GAP, 0 N/A). Per-GAP
provenance: 1 DECIDED-AGAINST / 1 MISDECIDED / 0 DEFERRED / 5 SILENTLY-MISSED.
T7 counter-prompt run 3× (nothing surfaced). T15 self-application in §8.

Prior-art: skipped — research patch only, no new capability, no dependency, no code module

* docs(getff-r1): re-verdict python rung 2 at the egress seam — S2b closed it mid-flight

The accepting session's pre-merge re-verdict, kept as its own commit so the
auditor's round-2 output and the correction stay separable in history.

Between this audit's base (2923ba6) and staging at merge (c3cb7a6), S2b
#1233 a66c0cb landed and closes the exact cell the audit verdicted
GAP/MISDECIDED — _py_deliver_local_hook_rung at setup.d/45-python.sh:702
(header :669-701), delivering .getff/hooks/pre-push and activating it via
core.hooksPath, with a non-clobbering integration arm. Host-verified:
tests/install-sh/python-entry-lane.test.sh cases (14)-(16), PASS=80 FAIL=0.

- python rung 2: GAP -> EXISTS; provenance MISDECIDED -> RESOLVED. The §4.1
  provenance analysis is retained verbatim as the historical record of how the
  decision chain broke — that is the finding the operator asked for — with a
  status block on top.
- Tallies: 22 EXISTS / 6 GAP / 0 N/A (was 21 / 7 / 0); MISDECIDED 1 -> 0.
- Blast radius enumerated, not assumed: git diff --name-only over setup.d/,
  install.sh, packages/core/templates/ and packages/core/hooks/ across the 19
  intervening commits shows S2b's three python files as the only lane-surface
  changes. The other 27 verdicts stand at staging.
- New §6.1 records the instance itself: two rows of this audit aged out in two
  different windows — the go row in the dispatch window, python rung 2 in the
  egress window. That is the base rate for a fast trunk, so §6 gains item 4:
  re-verdict a parity-shaped patch at the egress seam, since the accepting
  session is the last channel that can catch it.

Prior-art: skipped — correction to a research patch under docs/meta-factory/research-patches/, one markdown file, no new capability, no dependency, no code module.

---------

Co-authored-by: Test <test@example.com>
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