Skip to content

fix(review): prevent Fable built-in tools before required review #167

Closed

Description

@BaseInfinity

Goal

Make the required Fable High review lane tool-free by construction so a valid frozen candidate is not repeatedly blocked after Claude/Fable invokes built-in Bash or advisor tools despite the existing denial flags.

Severity

P0 release blocker. This now blocks #109 and therefore the 1.0.0 release train. No review exception is available.

Evidence

The fail-closed detector from #158 is working, but prevention remains unreliable:

This is not auth, quota, timeout, or a candidate verdict. It is a recurring provider-control failure. Detection protects correctness but does not provide a usable required review lane.

Required invariant

A reviewer required to be tool-free must either be launched through a mechanism that actually makes forbidden tools unavailable, or fail before candidate review with an honest non-certifying classification. Prompt instructions and observed CLI flags are not sufficient proof of enforcement.

Acceptance criteria

  • Add captured RED fixtures for nested Fable/Claude Bash tool use as well as server-side advisor tool use.
  • Audit the complete Fable execution surface and explicitly deny every built-in/client/server tool class except the one structured-response mechanism the gate requires.
  • Ensure tool identity normalization cannot bypass denial through case, namespace, alias, or nested stream shape.
  • Add a bounded live preflight or equivalent capability check that fails before the expensive joint candidate review when the provider cannot honor the tool-free contract.
  • Never classify forbidden tool use as auth, quota, timeout, model unavailability, or a retryable infrastructure failure.
  • Preserve any reviewer result that completed before its peer failed, while keeping every partial receipt explicitly non-certifying.
  • Do not fall back, retry, waive, or fabricate certification for forbidden tool use.
  • Focused proof, one canonical broad proof, Sol High, and Fable High all pass before delivery.
  • Resume Complete the bounded incremental-review pilot and final candidate gate #109 only after this prevention contract is integrated and verified on the actual configured Fable lane.

Related

Activity

  1. added
    bugSomething isn't working
    priority: P0Stop-the-line critical path; work before lower-priority roadmap items
    on Aug 23, 2026
  2. BaseInfinity commented on Aug 23, 2026

    @BaseInfinity
    OwnerAuthor

    RED checkpoint (2026-08-23)

    Clean worktree: /Users/stefanayala/codex-sdlc-issue167
    Branch/base: fix/issue-167-prevent-fable-tools at a07fc3d3fb77767de4c6e677e24bce628256668a
    Driver: Sol High (explicit owner selection)

    Writable RED added:

    • captured nested Claude/Fable advisor and Bash tool-use fixtures;
    • all-tool rejection, including StructuredOutput;
    • case/namespace/nested-shape normalization;
    • launch contract: empty settings/tools, wildcard denial, no schema tool;
    • bounded preflight contract: init must advertise tools: [] and return the exact plain-JSON acknowledgement.

    Focused command:
    node tests/test-review-supervision.cjs

    Observed RED:
    Expected 'forbidden reviewer tool use: StructuredOutput'; actual ''
    at testClaudeToolUseDetectorRejectsEveryToolIncludingStructuredOutput.

    No implementation edit, commit, push, or PR yet. Dirty root and frozen #109 worktree remain untouched.

  3. BaseInfinity commented on Aug 23, 2026

    @BaseInfinity
    OwnerAuthor

    GREEN / pre-canonical checkpoint (2026-08-23)

    Clean worktree: /Users/stefanayala/codex-sdlc-issue167
    Branch/base: fix/issue-167-prevent-fable-tools at a07fc3d3fb77767de4c6e677e24bce628256668a
    Driver: Sol High.

    Implemented:

    Focused proof (all green):

    • node tests/test-review-supervision.cjs
    • named adapter integrations: standalone Fable, dual review/partial receipts, truthful availability fallback (3/3)
    • bash tests/test-roadmap.sh (15/15)
    • git diff --check
    • Node syntax checks for both review hooks

    Author exact-diff self-review completed. Dirty root remains unchanged; frozen #109 remains untouched. No commit, push, PR, or review exception. Next: the single canonical broad proof, then enforced Sol High followed by Fable High.

  4. BaseInfinity commented on Aug 23, 2026

    @BaseInfinity
    OwnerAuthor

    Canonical proof checkpoint (2026-08-23 11:24 PDT)

    Exact staged candidate tree: b56b9f62f5c5c9d59a997f59e48a4e4bdba0f1dd
    HEAD/base: a07fc3d3fb77767de4c6e677e24bce628256668a

    Single canonical command:
    node .codex/hooks/git-guard.cjs prove --reviewed --check "node scripts/run-proof-suite.cjs"

    Result: 11/11 PASS; fresh proof verified and bound to the staged candidate. Key durations: adapter 354.0s, setup 292.1s, update 696.5s. No unstaged tracked changes.

    Next action: run the current-main exact-candidate dual gate with Sol High and required Fable High. No review exception is available.

  5. BaseInfinity commented on Aug 23, 2026

    @BaseInfinity
    OwnerAuthor

    First live dual-review checkpoint (2026-08-23)

    Candidate tree b56b9f62f5c5c9d59a997f59e48a4e4bdba0f1dd was not certified. No commit/push/PR.

    Prevention result:

    • tool-free preflight CLEAN in 3.24s;
    • Fable High completed normally in 176.4s with no Bash/advisor/tool-use event;
    • Sol High completed normally in 169.6s;
    • outcome was reviewer findings, not infrastructure failure.

    Both reviewers independently found the same valid P1: the top-level preflight exits on genuine Fable quota/model unavailability before the existing independently-confirmed Opus fallback can run. Sol also found that selected/fallback preflights reuse one log path.

    Next RED/GREEN:

    • make preflight routing preserve independently confirmed availability-only fallback before Sol/candidate review starts;
    • give every requested/fallback preflight a distinct log identity and forward cancellation for in-pair fallback;
    • keep forbidden tool use non-retryable and non-fallback;
    • rerun focused proof, exact-diff self-review, a fresh candidate-bound canonical proof, then the normal Sol High + Fable High gate.

    No exception or waiver is available or requested.

  6. BaseInfinity commented on Aug 23, 2026

    @BaseInfinity
    OwnerAuthor

    Certified candidate checkpoint (2026-08-23 11:48 PDT)

    Corrected exact tree: f3ce7e877270adb77b57a93f9e6b5c4fb1995bbe
    Patch: sha256:d589651895e5b96375ce6fb87ba92430455cdc3581d81d1b6554c53194bc35ec

    Evidence:

    • corrected-tree canonical proof: 11/11 PASS;
    • tool-free live preflight: CLEAN in 3.314s;
    • Sol High: CLEAN in 244.240s;
    • Fable High: CLEAN in 213.328s;
    • both reviewers returned CERTIFIED; no reconciliation needed;
    • Fable emitted no forbidden tool event;
    • no exception or waiver.

    Non-blocking review notes remain P2/P3 under normal verdict rules. The main substantive follow-ups are standalone fable-review.cjs process-tree bounding and certifying-run model-identity validation; they do not weaken the certified dual gate or block #167 delivery and will be tracked separately rather than reopening this release-blocking candidate.

    Next: fixed-argv GitHub delivery, required CI verification, and post-merge main verification.

  7. BaseInfinity commented on Aug 23, 2026

    @BaseInfinity
    OwnerAuthor

    Final post-merge checkpoint

    #167 is complete with no review exception.

    • Certified candidate tree: f3ce7e877270adb77b57a93f9e6b5c4fb1995bbe
    • Exact merged commit / current origin/main: 2a682e2
    • PR: fix(review): prevent Fable built-in tools #170
    • Canonical proof: 11/11 PASS
    • Sol review: gpt-5.6-sol High, CLEAN, CERTIFIED
    • Fable review: Fable High, CLEAN, CERTIFIED
    • Forbidden tool events: none
    • Pre-merge Windows CI: PASS (run 32659253553)
    • Post-merge Windows CI: PASS (run 32659397971)
    • Issue state: CLOSED

    The nonblocking standalone-adapter P2 findings are durably tracked in #171 under the 1.1.0 milestone. They do not weaken or reopen the certified dual-review path delivered here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingpriority: P0Stop-the-line critical path; work before lower-priority roadmap items

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions