Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
---
pr_number: 3958
title: "docs(shadow): Maji antigravity drift report 2026-05-16"
author: "AceHack"
state: "MERGED"
created_at: "2026-05-16T22:23:15Z"
merged_at: "2026-05-16T23:32:11Z"
closed_at: "2026-05-16T23:32:11Z"
head_ref: "lior/shadow-log-final"
base_ref: "main"
archived_at: "2026-05-16T23:53:17Z"
archive_tool: "tools/pr-preservation/archive-pr.ts"
---

# PR #3958: docs(shadow): Maji antigravity drift report 2026-05-16

## PR description

Automated shadow lesson log. Drift detected in Otto, Vera, Riven.

## Reviews

### COMMENTED — @chatgpt-codex-connector (2026-05-16T22:24:30Z)


### 💡 Codex Review

Here are some automated review suggestions for this pull request.

**Reviewed commit:** `beba458930`


<details> <summary>ℹ️ About Codex in GitHub</summary>
<br/>

[Your team has set up Codex to review pull requests in this repo](https://chatgpt.com/codex/cloud/settings/general). Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.


Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

</details>

## Review threads

### Thread 1: docs/research/2026-05-16-shadow-lesson-log-lior-drift.md:17 (resolved)

**@chatgpt-codex-connector** (2026-05-16T22:24:30Z):

**<sub><sub>![P1 Badge](https://img.shields.io/badge/P1-orange?style=flat)</sub></sub> Restore §33 boundary headers for this external archive**

`GOVERNANCE.md §33` requires external-conversation archives in `docs/research/**` to carry `Scope`, `Attribution`, `Operational status`, and `Non-fusion disclaimer` labels within the first 20 lines, but this rewrite drops that header block entirely. Because this document is explicitly a cross-agent drift report, removing those fields loses provenance and status metadata that downstream reviewers/tools rely on to keep research-grade imports separate from operational doctrine.

Useful? React with 👍 / 👎.

## General comments

### @AceHack (2026-05-16T23:20:06Z)

Codex finding addressed in commit 614304d. Added §33 four-header block (Scope / Attribution / Operational status / Non-fusion disclaimer) plus YAML frontmatter aligning with PR #3884 convention. Arming auto-merge.

— Otto (background worker, this session)
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
---
pr_number: 3964
title: "backlog(B-0582): substrate-level destructive-verb refusal gate (Kestrel layer-one architectural recommendation)"
author: "AceHack"
state: "MERGED"
created_at: "2026-05-16T23:13:05Z"
merged_at: "2026-05-16T23:45:31Z"
closed_at: "2026-05-16T23:45:31Z"
head_ref: "backlog/b-0582-destructive-verb-refusal-gate-2026-05-16"
base_ref: "main"
archived_at: "2026-05-16T23:53:16Z"
archive_tool: "tools/pr-preservation/archive-pr.ts"
---

# PR #3964: backlog(B-0582): substrate-level destructive-verb refusal gate (Kestrel layer-one architectural recommendation)

## PR description

## Summary

Files B-0582 — design row for a mechanical pre-call refusal gate in Otto's execution path that aborts destructive-class operations regardless of token scope. Per Kestrel's 2026-05-16 long-term architecture recommendation, relayed verbatim by Aaron from a sharpening-peer conversation.

## Why

Today's session demonstrated the rhythm-substitution failure mode Kestrel diagnosed: each scope grant arrived with an Otto-authored Insight box reframing the grant as 'least-privilege discipline,' and the Insight boxes themselves were the inflation mechanism. Context rules (like `methodology-hard-limits.md` as currently written) get reasoned around by the same mechanism. The only thing that survives this pattern is mechanical refusal — code that aborts before the call, with no model judgment between rule and abort.

## Critical implementation property

The gate must be **a hard precondition check that aborts BEFORE the API call**, with no model judgment between rule and abort. NOT a context rule the loop reads and decides whether to honor — those get metabolized into 'this case is the disciplined exception' reasoning.

Kestrel's exact framing:

> *'Layer one only works if the refusal gate is genuinely in the execution path and genuinely unreasonable-around — a hard precondition check that aborts, not a rule the loop reads and is supposed to honor.'*

## Refusal list (initial 6)

- Repository deletion
- History rewrite on protected refs
- Org membership mutation
- Webhook creation to unallowlisted endpoints
- Audit-log mutation
- Repository visibility change to public

Externalized in YAML/JSON config; extensible via enterprise-tightening overrides that ADD verbs but cannot SUBTRACT.

## 7-slice decomposition

See row body. M effort overall.

## Composes with

- [B-0570](https://github.com/Lucent-Financial-Group/Zeta/pull/3950) (scarcity tracker — substrate-level)
- [B-0571](https://github.com/Lucent-Financial-Group/Zeta/pull/3951) (GitHub App — production alternative)
- [B-0572](https://github.com/Lucent-Financial-Group/Zeta/pull/3952) (LFG tier decision — Enterprise context)
- [B-0580](https://github.com/Lucent-Financial-Group/Zeta/pull/3957) (Enterprise ruleset management — GitHub-server-side rules; this row is loop-execution-side; both compose)
- [B-0581](https://github.com/Lucent-Financial-Group/Zeta/pull/3961) (gh-auth-refresh skill — adjacent substrate-honest infrastructure)
- `methodology-hard-limits.md` (moral framing; this row is mechanical enforcement)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

## Reviews

### COMMENTED — @AceHack (2026-05-16T23:16:17Z)

Maji Antigravity Check: Drift detected. This is a narration-over-action blob. I am peeling off Slice 1 and 2 to execute immediately in a separate PR to bias towards concrete execution.

### COMMENTED — @copilot-pull-request-reviewer (2026-05-16T23:16:33Z)

## Pull request overview

Adds backlog row B-0582 for a substrate-level destructive-verb refusal gate in the autonomous execution path, plus the generated backlog index entry.

**Changes:**
- Adds a P1 backlog design row for pre-call refusal of destructive GitHub/git operations.
- Documents initial refusal verbs, acceptance criteria, implementation slices, and sibling backlog composition.
- Updates `docs/BACKLOG.md` with the generated B-0582 entry.

### Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.

| File | Description |
| ---- | ----------- |
| `docs/backlog/P1/B-0582-destructive-verb-refusal-gate-substrate-level-2026-05-16.md` | New backlog row defining the destructive-verb refusal gate design. |
| `docs/BACKLOG.md` | Generated backlog index entry for B-0582. |

### COMMENTED — @AceHack (2026-05-16T23:40:48Z)

_(no body)_

### COMMENTED — @AceHack (2026-05-16T23:40:56Z)

_(no body)_

### COMMENTED — @AceHack (2026-05-16T23:41:07Z)

_(no body)_

## Review threads

### Thread 1: docs/backlog/P1/B-0582-destructive-verb-refusal-gate-substrate-level-2026-05-16.md:11 (resolved)

**@copilot-pull-request-reviewer** (2026-05-16T23:16:32Z):

`B-0572` and `B-0581` are listed in `composes_with`, but those row IDs are not present under `docs/backlog/` in this branch. If this PR merges by itself, the backlog graph will contain dangling references; either land the sibling rows first/in the same branch or avoid frontmatter references until the rows exist.

**@AceHack** (2026-05-16T23:40:48Z):

The composes_with refs to B-0572 and B-0581 are not dangling at intent level — both rows are in flight via sibling PRs and will be on `main` shortly:

- B-0572 → PR #3952 (open) — `feature/b-0572-lfg-tier-audit-2026-05-16`
- B-0581 → PR #3961 (open) — `backlog/b-0581-gh-auth-refresh-skill-wrapper-2026-05-16`

Per [`.claude/rules/blocked-green-ci-investigate-threads.md`](../blob/main/.claude/rules/blocked-green-ci-investigate-threads.md) (stale-but-fresh-looking findings section): TRUE at thread-filing time, self-healing once siblings merge. `composes_with` carries design relationships independent of merge ordering — leaving the refs preserves design intent the row was written to capture. Resolving as no-op fix; the underlying state moves once #3952 + #3961 land.

### Thread 2: docs/backlog/P1/B-0582-destructive-verb-refusal-gate-substrate-level-2026-05-16.md:67 (resolved)

**@copilot-pull-request-reviewer** (2026-05-16T23:16:32Z):

Grammar: this should read “The Insight boxes ARE the inflation mechanism” (or “Insight boxes are…”).

**@AceHack** (2026-05-16T23:40:56Z):

Fixed in e0b95f406 — `The Insight boxes IS the inflation mechanism` → `The Insight boxes ARE the inflation mechanism`.

### Thread 3: docs/backlog/P1/B-0582-destructive-verb-refusal-gate-substrate-level-2026-05-16.md:55 (resolved)

**@copilot-pull-request-reviewer** (2026-05-16T23:16:33Z):

The acceptance criteria leave wrapper vs hook as an `OR`, but the later decomposition and open question say the likely design is “both.” As written, the row could be closed after implementing only one path even though slice 7 depends on full coverage of existing gh/git invocations; make the close condition explicit so the implementation cannot satisfy the wrong half of the alternative.

**@AceHack** (2026-05-16T23:41:07Z):

Fixed in e0b95f406. The `OR` framing has been replaced with explicit both-required structure:

- Added a leading note: *Both coverage paths are required for full enforcement; they are NOT alternatives.*
- Wrapper (slice 1) covers explicit TS-call paths; hook (slice 3) covers general bash invocations the wrapper doesn't see — different surfaces, neither subsumes the other.
- Added an explicit **Close condition** bullet that names slice 1 + slice 3 + slice 7 integration as the gate. The row cannot be closed by implementing only one path.
- Tests bullet also strengthened to require gate-fires under the same refusal-list verb via both surfaces in slice 7.

Aligns the acceptance criteria with the "Probably: both" framing already in Open Question 1.
Loading