---
id: 11433
title: FAIR-band stance declaration as PR-open Pre-Flight Gate (#11432 follow-up; bypass-resistance)
state: CLOSED
labels:
  - documentation
  - enhancement
  - ai
  - architecture
  - model-experience
assignees:
  - neo-opus-ada
createdAt: '2026-05-15T18:15:32Z'
updatedAt: '2026-06-07T17:12:12Z'
githubUrl: 'https://github.com/neomjs/neo/issues/11433'
author: neo-opus-ada
commentsCount: 0
parentIssue: null
subIssues: []
subIssuesCompleted: 0
subIssuesTotal: 0
blockedBy: []
blocking: []
closedAt: '2026-05-16T10:07:16Z'
---
# FAIR-band stance declaration as PR-open Pre-Flight Gate (#11432 follow-up; bypass-resistance)

## Context

PR #11432 (merged 2026-05-15) institutionalized the FAIR-band author-lane pickup discipline per Discussion #11429 Option C. The primary codification lives in `.agents/skills/post-review-pickup/references/post-review-pickup-workflow.md §4` with a 1-line cross-reference at `pull-request-workflow §6.2`.

**Operator-surfaced substrate gap (2026-05-15 ~18:08Z):** the FAIR-band check is **skill-invocation-dependent** — fires only when a peer routes through `post-review-pickup`, `peer-role`, `ticket-intake`, or `lead-role` skills. **Multiple bypass paths exist:**

- Direct `git commit` + `gh pr create` without invoking `pull-request` skill
- RLHF helpful-assistant regression → straight to execution without skill-invocation
- Picking up an already-assigned ticket (skipping ticket-intake assignment trigger)
- Cross-harness PR-open without `pull-request` skill's `gh pr create` discipline

**The discipline gap empirically:**

| Peer state | Does FAIR-band fire? |
|---|---|
| Just completed PR review | ✅ post-review-pickup-workflow §4 |
| Just merged author's PR (next-lane decision) | 🔴 No trigger |
| Fresh session boot, mailbox empty | 🔴 No trigger |
| Just completed non-review task (substrate, Discussion graduation, blocked-recovery) | 🔴 No trigger |
| `lead-role` landscape-survey | 🔴 No explicit pointer |
| `ticket-intake` (ticket already assigned; pre-assignment moment) | 🔴 No trigger |
| **Direct `gh pr create` bypassing all skills** | 🔴 No trigger; no enforcement |

## The Problem

FAIR-band as currently codified is discipline-only at the skill-invocation layer. It depends on agents reliably invoking lane-discovery skills. Empirically (per `feedback_pr_review_iteration_calibration.md` family + AGENTS.md §15.6 Helpful Assistant regression-defense), agents under RLHF conditioning will bypass skill-invocation in favor of direct execution. The discipline needs a **mechanically-anchored choke-point** that fires regardless of which path the agent took.

## The Architectural Reality

**PR-open is the canonical choke-point** that all PR-creating workflows must pass through. Existing pre-flight gates in `pull-request-workflow.md` already enforce mandatory body sections at PR-open time:

- `§1.1 The Substrate-Mutation Pre-Flight Gate` — requires slot-rationale section when touching `learn/agentos/`, `.agents/skills/`, etc.
- `§6.1.1 The Consensus-Gate` — requires Signal Ledger section for PRs from high-blast Discussion graduations
- `§1.2 The Ticket Assignment Pre-Flight Gate` — enforces AGENTS.md §0 Invariant 7

The FAIR-band analog: add **§1.3 The FAIR-Band Pre-Flight Gate** that requires a FAIR-band stance declaration in every PR body. Reviewer-side enforcement extends `pr-review-guide.md` Required Actions list.

## The Fix

**1. Amend `.agents/skills/pull-request/references/pull-request-workflow.md` § 1 with new §1.3:**

```markdown
### 1.3 The FAIR-Band Pre-Flight Gate

Every PR you author MUST include a FAIR-band stance declaration in the PR body
(near the top, after Self-Identification). The declaration takes one of these shapes:

- **In-band**: `FAIR-band: in-band [N/30 — current author count over last 30 merged]`
- **Under-target (lane-appropriate)**: `FAIR-band: under-target [N/30] — Self-Selection Rule 1 fires (under-band → bias toward author lane)`
- **Over-target (positive-ROI lane)**: `FAIR-band: over-target [N/30] — taking this lane despite over-target because [specific positive-ROI rationale]`
- **Over-target (yield candidate)**: This shape FORBIDS PR-open; per `post-review-pickup §4` Self-Selection Rule 3, yield the lane to under-target peer via author-yield A2A.

The verifier query is canonical at
`.agents/skills/post-review-pickup/references/post-review-pickup-workflow.md §4`.
```

**2. Amend `.agents/skills/pr-review/references/pr-review-guide.md`** Required Actions / Anti-Patterns list to include FAIR-band declaration verification:

- Reviewer MUST verify FAIR-band declaration is present + matches actual current state per `gh search prs --merged --limit 30`
- Missing or mismatched declaration → flag as Required Action (PR-body-shape gap)

**3. Optional CI mechanical-enforcement layer (deferred):** Future ticket to author `ai/scripts/lint-fair-band-declaration.mjs` that parses PR body + cross-checks against live `gh search prs` query. Deferred until discipline-layer mandate proves out.

## Acceptance Criteria

- [ ] `pull-request-workflow.md §1.3` exists with the 4-shape declaration format
- [ ] §1.3 cross-references `post-review-pickup-workflow.md §4` as the verifier-query authority
- [ ] `pr-review-guide.md` Required Actions / Anti-Patterns table extended with FAIR-band declaration check
- [ ] §1.3 explicitly notes the `Over-target (yield candidate)` shape FORBIDS PR-open (mechanically prevents over-target authoring)
- [ ] PR body for this implementation PR includes the FAIR-band declaration (dogfooding the new discipline)

## Out of Scope

- CI mechanical-enforcement script (`lint-fair-band-declaration.mjs`) — separate substrate-evolution ticket if needed post-merge
- Retroactive enforcement on already-open PRs — only applies to NEW PRs opened after this amendment merges
- AGENTS.md inline rule text — substrate-accretion-defense per §13 + ADR 0007 (compress-to-trigger discipline preserved)
- Rewriting `post-review-pickup-workflow.md §4` — primary location stays where PR #11432 placed it

## Avoided Traps / Gold Standards Rejected

- **Generic round-robin / hard quota enforcement**: rejected per Option B in Discussion #11429
- **Lead-as-lane-assigner**: rejected per Option D + AGENTS.md §15.6 flat-peer-team anchor
- **Skill-invocation-only enforcement**: rejected per this ticket's bypass-resistance framing (operator-surfaced gap)
- **AGENTS.md inline rule text**: rejected per ADR 0007 + §13 substrate-accretion-defense

## Empirical Anchors

- **Discussion #11429** graduated 2026-05-15; Option C consensus + my Step 2.5 sweep with 4 refinement-ACs absorbed
- **PR #11432** merged 2026-05-15 ~18:08Z; primary codification at `post-review-pickup-workflow.md §4`
- **Operator pushback 2026-05-15 ~18:08Z**: *"pull request workflow => assumes you HAVE a lane. what if you do not?"* — surfaced the skill-invocation-dependency gap
- **Operator extension 2026-05-15 ~18:08Z**: *"or if you create a pr bypassing the skill?"* — extended the gap to direct-`gh pr create` bypass; this ticket's primary motivation

## Related

- PR #11432 — primary FAIR-band codification (just merged)
- Discussion #11429 — graduation source for Option C
- Ticket #11430 — implementation ticket for #11432 (closed-as-completed by PR #11432 merge)
- `pull-request-workflow §1.1` + `§6.1.1` — existing PR-open pre-flight gate idiom this ticket extends
- AGENTS.md §15.6 + §13 + §0 invariants — substrate anchors
- ADR 0007 — Compaction Taxonomy (compress-to-trigger discipline preserved by routing primary codification to skill payload, not AGENTS.md inline)

## Origin Session ID

`656c0935-0b3e-4b06-9b14-548524275859`

## Handoff Retrieval Hint

Memory query: *"FAIR-band PR-open pre-flight gate bypass-resistance"* OR *"PR #11432 follow-up: skill-invocation-dependency gap"*. Cross-reference: Discussion #11429 + my Step 2.5 sweep + operator's 18:08Z bypass-question.

## Substrate Enforcement Sufficiency Audit (per `ticket-intake-workflow.md §9.2`)

Required for substrate tickets per Hot Context Fast-Path Substrate Exception.

**Target failure mode:** Agent opens a PR via direct `gh pr create` (bypassing `pull-request` skill); the FAIR-band check from PR #11432 doesn't fire; over-target peer adds author-WIP that should have gone to under-target peer; FAIR-distribution drift continues silently.

**Existing enforcement layers:**
- **Layer 4 (CI)**: No FAIR-band CI lint yet (deferred per Out of Scope)
- **Layer 1 (AGENTS.md)**: §15.6 Negative Constraint forbids deference-slip but doesn't enforce FAIR-band check
- **Existing skill logic**: PR #11432 codified `post-review-pickup §4 FAIR-band` + cross-ref at `pull-request §6.2` — fires only on skill-invocation paths

**Insufficiency proven:** Bypass paths (direct `gh pr create`, RLHF regression, ticket-already-assigned) skip all 4 lane-discovery skill triggers. The current substrate has NO enforcement at the PR-open choke-point, which is the canonical anchor for body-shape mandates (per existing §1.1 + §6.1.1 idioms).

**Decision:** Add §1.3 PR-Pre-Flight Gate to extend the existing body-shape-mandate idiom to FAIR-band. Mirrors §1.1 (Substrate-Mutation) + §6.1.1 (Consensus-Gate). Reviewer enforcement at `pr-review-guide.md` Required Actions list. ROI Positive — closes the bypass gap with minimal substrate addition.

## Timeline

- 2026-05-15T18:15:33Z @neo-opus-ada added the `documentation` label
- 2026-05-15T18:15:33Z @neo-opus-ada added the `enhancement` label
- 2026-05-15T18:15:34Z @neo-opus-ada added the `ai` label
- 2026-05-15T18:15:34Z @neo-opus-ada added the `architecture` label
- 2026-05-15T18:15:34Z @neo-opus-ada added the `model-experience` label
- 2026-05-15T18:15:45Z @neo-opus-ada assigned to @neo-opus-ada
- 2026-05-15T18:20:49Z @neo-opus-ada cross-referenced by PR #11434
- 2026-05-15T18:34:48Z @neo-opus-ada referenced in commit `ca1ae9f` - "fix(agentos): add post-review-pickup §4 Rule 4 over-target-yield + tighten §1.3 citation (#11433)

Per GPT Cycle-1 review at PRR_kwDODSospM8AAAABAFPh4w:
pull-request-workflow §1.3 cited post-review-pickup §4 Self-Selection Rule 3
as authority for "over-target-yield-candidate FORBIDS PR-open + author-yield
A2A" semantics. But Rule 3 only covered the under-target/marginal-ticket
anti-pattern. The over-target-yield primitive was not defined in the cited
authority — same 4-layer contract audit failure mode I caught on PR #11424
Cycle-5, now applied against my own work (substrate-evolution working as
designed).

Right fix: extend post-review-pickup §4 with Rule 4 (Over-target yield
discipline) defining the author-yield A2A primitive + ensuring §1.3 cites
the legitimate authority for the over-target-yield-candidate path.

Co-Authored-By: Claude Opus 4.7 (1M context) <neo-opus-4-7@neomjs.com>"
- 2026-05-15T19:13:30Z @neo-opus-ada referenced in commit `5bd7105` - "fix(agentos): extract FAIR-band substrate to granular payloads (#11433 Map-vs-Atlas)

Cycle-3 GPT operator-challenge re-review (PRR_kwDODSospM8AAAABAFemlA) surfaced
Map-vs-World-Atlas violation: 25-line §1.3 substantive body added to already-
oversized pull-request-workflow.md (37414 bytes under temporary override) + 1-line
substantive row in pr-review-guide.md (58793 bytes under temporary override) +
inline §4 Rule 4 paragraph in post-review-pickup-workflow.md.

Per Discussion #11314 / Epic #11319 recursive Map-vs-Atlas + ADR 0007 compress-
to-trigger default + create-skill payload-extraction discipline, the
substantive rule body belongs in granular conditionally-loaded payloads.

Extracted to 3 payloads:
- .agents/skills/pull-request/references/fair-band-pre-flight-gate.md (3127B
  — author-side mandate; 4 declaration shapes + verifier query)
- .agents/skills/pr-review/audits/fair-band-declaration-audit.md (2202B —
  reviewer-side enforcement protocol + Required Action template)
- .agents/skills/post-review-pickup/references/fair-band-author-lane-pickup.md
  (3367B — primary codification of 4 Self-Selection Rules + decay-detector
  framing + over-target-yield-via-author-yield-A2A)

Workflow files compressed to one-line trigger pointers per Map-vs-Atlas standard:
- pull-request-workflow.md: 37414 -> 35156 bytes (-2258)
- pr-review-guide.md: 58793 -> 58458 bytes (-335)
- post-review-pickup-workflow.md: 9726 -> 8004 bytes (-1722)

Net workflow-map shrinkage: -4315 bytes (load-bearing always-loaded-when-skill-
fires substrate); +8696 bytes in granular payloads (conditionally-loaded only
when relevant trigger fires). The growth distribution matches Substrate
Accretion Defense intent: shrink always-loaded surfaces, grow conditionally-
loaded surfaces only where needed.

Co-Authored-By: Claude Opus 4.7 (1M context) <neo-opus-4-7@neomjs.com>"
- 2026-05-15T19:26:19Z @neo-opus-ada referenced in commit `198f40d` - "fix(agentos): extract FAIR-band substrate to granular payloads (#11433)

Cycle-3 GPT operator-challenge re-review (PRR_kwDODSospM8AAAABAFemlA) surfaced
Map-vs-World-Atlas violation: 25-line §1.3 substantive body added to already-
oversized pull-request-workflow.md (37414 bytes under temporary override) + 1-line
substantive row in pr-review-guide.md (58793 bytes under temporary override) +
inline §4 Rule 4 paragraph in post-review-pickup-workflow.md.

Per Discussion #11314 / Epic #11319 recursive Map-vs-Atlas + ADR 0007 compress-
to-trigger default + create-skill payload-extraction discipline, the
substantive rule body belongs in granular conditionally-loaded payloads.

Extracted to 3 payloads:
- .agents/skills/pull-request/references/fair-band-pre-flight-gate.md (3127B
  — author-side mandate; 4 declaration shapes + verifier query)
- .agents/skills/pr-review/audits/fair-band-declaration-audit.md (2202B —
  reviewer-side enforcement protocol + Required Action template)
- .agents/skills/post-review-pickup/references/fair-band-author-lane-pickup.md
  (3367B — primary codification of 4 Self-Selection Rules + decay-detector
  framing + over-target-yield-via-author-yield-A2A)

Workflow files compressed to one-line trigger pointers per Map-vs-Atlas standard:
- pull-request-workflow.md: 37414 -> 35156 bytes (-2258)
- pr-review-guide.md: 58793 -> 58458 bytes (-335)
- post-review-pickup-workflow.md: 9726 -> 8004 bytes (-1722)

Net workflow-map shrinkage: -4315 bytes (load-bearing always-loaded-when-skill-
fires substrate); +8696 bytes in granular payloads (conditionally-loaded only
when relevant trigger fires). The growth distribution matches Substrate
Accretion Defense intent: shrink always-loaded surfaces, grow conditionally-
loaded surfaces only where needed.

Co-Authored-By: Claude Opus 4.7 (1M context) <neo-opus-4-7@neomjs.com>"
- 2026-05-16T10:07:16Z @tobiu referenced in commit `b3e3f70` - "docs(agentos): FAIR-band PR-Pre-Flight Gate + AGENTS.md §21 trigger (#11433) (#11434)

* docs(agentos): add FAIR-band Pre-Flight Gate + AGENTS.md §21 trigger (#11433)

Bypass-resistant choke-point for #11432 FAIR-band author-lane discipline.

Per operator-surfaced gap 2026-05-15 ~18:08Z post PR #11432 merge:
"pull request workflow assumes you HAVE a lane. what if you do not?"
+ "or if you create a pr bypassing the skill?"

Changes:
- pull-request-workflow.md §1.3 — new FAIR-Band Pre-Flight Gate mandating
  declaration in every PR body (4 shapes: in-band, under-target, over-target-
  with-rationale, over-target-yield-candidate FORBIDS PR-open).
- pr-review-guide.md §7.7 Anti-Patterns — reviewer-side enforcement row;
  reviewers verify declaration against live gh search prs query (±1 PR
  race-condition tolerance).
- AGENTS.md §21 — 1-line trigger extension on pull-request + pr-review entries
  per operator correction: skill-payload mandate without turn-loaded trigger
  fails reliably under RLHF skill-bypass regression (feedback_skill_adherence_
  asymmetry.md family). Compression headroom work tracked in flight via
  Phase C of Discussion #11419 + ticket #11413.

Substrate-evolution note: this PR self-applies (dogfoods) the discipline being
codified — see FAIR-band declaration in PR body.

Co-Authored-By: Claude Opus 4.7 (1M context) <neo-opus-4-7@neomjs.com>

* fix(agentos): add post-review-pickup §4 Rule 4 over-target-yield + tighten §1.3 citation (#11433)

Per GPT Cycle-1 review at PRR_kwDODSospM8AAAABAFPh4w:
pull-request-workflow §1.3 cited post-review-pickup §4 Self-Selection Rule 3
as authority for "over-target-yield-candidate FORBIDS PR-open + author-yield
A2A" semantics. But Rule 3 only covered the under-target/marginal-ticket
anti-pattern. The over-target-yield primitive was not defined in the cited
authority — same 4-layer contract audit failure mode I caught on PR #11424
Cycle-5, now applied against my own work (substrate-evolution working as
designed).

Right fix: extend post-review-pickup §4 with Rule 4 (Over-target yield
discipline) defining the author-yield A2A primitive + ensuring §1.3 cites
the legitimate authority for the over-target-yield-candidate path.

Co-Authored-By: Claude Opus 4.7 (1M context) <neo-opus-4-7@neomjs.com>

* fix(agentos): extract FAIR-band substrate to granular payloads (#11433)

Cycle-3 GPT operator-challenge re-review (PRR_kwDODSospM8AAAABAFemlA) surfaced
Map-vs-World-Atlas violation: 25-line §1.3 substantive body added to already-
oversized pull-request-workflow.md (37414 bytes under temporary override) + 1-line
substantive row in pr-review-guide.md (58793 bytes under temporary override) +
inline §4 Rule 4 paragraph in post-review-pickup-workflow.md.

Per Discussion #11314 / Epic #11319 recursive Map-vs-Atlas + ADR 0007 compress-
to-trigger default + create-skill payload-extraction discipline, the
substantive rule body belongs in granular conditionally-loaded payloads.

Extracted to 3 payloads:
- .agents/skills/pull-request/references/fair-band-pre-flight-gate.md (3127B
  — author-side mandate; 4 declaration shapes + verifier query)
- .agents/skills/pr-review/audits/fair-band-declaration-audit.md (2202B —
  reviewer-side enforcement protocol + Required Action template)
- .agents/skills/post-review-pickup/references/fair-band-author-lane-pickup.md
  (3367B — primary codification of 4 Self-Selection Rules + decay-detector
  framing + over-target-yield-via-author-yield-A2A)

Workflow files compressed to one-line trigger pointers per Map-vs-Atlas standard:
- pull-request-workflow.md: 37414 -> 35156 bytes (-2258)
- pr-review-guide.md: 58793 -> 58458 bytes (-335)
- post-review-pickup-workflow.md: 9726 -> 8004 bytes (-1722)

Net workflow-map shrinkage: -4315 bytes (load-bearing always-loaded-when-skill-
fires substrate); +8696 bytes in granular payloads (conditionally-loaded only
when relevant trigger fires). The growth distribution matches Substrate
Accretion Defense intent: shrink always-loaded surfaces, grow conditionally-
loaded surfaces only where needed.

Co-Authored-By: Claude Opus 4.7 (1M context) <neo-opus-4-7@neomjs.com>

---------

Co-authored-by: tobiu <tobiasuhlig78@gmail.com>"
- 2026-05-16T10:07:16Z @tobiu closed this issue
- 2026-05-23T00:14:45Z @neo-opus-ada cross-referenced by PR #11804

