Skip to content

ops(0-0-0): post-#101 follow-up v2 LFG forward-sync — Copilot fixes + archives + GH_REPO + fork-naming rename#846

Merged
AceHack merged 6 commits intomainfrom
post-0-0-0-cleanup-followup-v2-lfg-2026-04-29
Apr 29, 2026
Merged

ops(0-0-0): post-#101 follow-up v2 LFG forward-sync — Copilot fixes + archives + GH_REPO + fork-naming rename#846
AceHack merged 6 commits intomainfrom
post-0-0-0-cleanup-followup-v2-lfg-2026-04-29

Conversation

@AceHack
Copy link
Copy Markdown
Member

@AceHack AceHack commented Apr 29, 2026

Summary

LFG forward-sync of AceHack #103 (just merged 14:41:11Z). Step 2 of the canonical double-hop. After this lands → Aaron EXECUTE for AceHack absorption of LFG squash-SHA → 0/0/0 fully closed.

Lineage

This is the v2 of the post-#101 follow-up cycle (v1 closed as DIRTY due to stale base). v2:

What this PR does

  1. Post-auto-loop-10 tick-history row — unblock tick-history PR chain via Copilot review address + PR #99 redundancy-close #101 Copilot fixes + full PR archives (commit c789ef1, cherry-pick of 6d53733):

  2. GH_REPO env var support (commit 3cd01d2, cherry-pick of 18c807f): tools/pr-preservation/archive-pr.sh now respects GH_REPO=<owner>/<name> for cross-fork archives. Per Aaron 2026-04-29 ask. (Fuller archive-pr.sh patch — frontmatter repo: field, auto-route to forks//, --out-dir, etc. — tracked as task backlog: P3 research+map claude --agent <name> harness flag (Otto-120) #314.)

  3. Memory file rename (commit 96bd246, cherry-pick of 5ba30cc): per Aaron 2026-04-29 fork-naming rule ("we should not use a forks name in the main repo except for the special section for forks data that is unique to them"). Renamed memory/feedback_acehack_zeta_*memory/feedback_* + updated cross-references.

Tasks filed

Sequence

  1. AceHack auto-loop-12 tick-history row — PR #46 refresh + Copilot thread resolution + persistent-fork-list correction #103 ✅ merged 14:41:11Z (squash → <TBD>)
  2. LFG forward-sync (this) → merge → LFG main advances
  3. After this merges, Aaron EXECUTE for AceHack absorption of LFG squash-SHA
  4. 0/0/0 fully closed; recovery-lane classification + backlog: pre-landing sanitizer for ferry lint (Aaron Otto-119) #313 + backlog: P3 research+map claude --agent <name> harness flag (Otto-120) #314 + core: Veridicality.canonicalKey + groupByCanonical — 7th graduation (semantic canonicalization) #315 can start

Test plan

🤖 Generated with Claude Code

AceHack added 3 commits April 29, 2026 10:41
…rchives + correct cross-fork drain-log

Addresses 4 Copilot threads from AceHack #101 (filed 14:24:11Z, AFTER auto-merge fired at 14:19:41Z) + 4 Copilot threads from LFG #844 (already addressed in #845 but Copilot also reviewed AceHack #101 and re-flagged 2 of them since the AceHack-side hadn't received the carry-forward yet) + Amara post-#845 substantive correction on PR-preservation tool usage.

## Copilot thread fixes (memory file)

1. **P1 broken xref** to `memory/feedback_aaron_visibility_constraint_no_changes_he_cant_see_2026_04_28.md` (the file lives in user-scope memory only, not in-repo; cross-reference was therefore broken). Fixed: replaced with prose pointer to the underlying principle + note flagging the same issue exists in MEMORY.md index.

2. **P1 internal consistency on legacy DELETE response** — same finding as LFG #844 Thread 3, addressed by carry-forward in LFG #845. Now reflected on AceHack via this commit.

3. **P2 wording "the only rulesets ruleset"** — same finding as LFG #844 Thread 5, addressed by carry-forward in LFG #845. Now reflected on AceHack via this commit.

4. **P2 MEMORY.md index entry too long** — trimmed from a 4-line dense paragraph to a single concise line per `memory/README.md` discipline. Detail stays in the linked memory file.

## PR archives (Amara post-#845 directive: use existing `tools/pr-preservation/archive-pr.sh`)

Three full-archive files added under `docs/pr-discussions/`:

- `PR-0844-...md` — closed LFG #844 (5 threads, 2 reviews, 2 issue comments)
- `PR-0845-...md` — merged LFG #845 (0 threads, 1 review, 0 comments — clean forward-sync)
- `PR-acehack-0101-...md` — merged AceHack #101 (4 threads, 1 review, 0 comments). **Fork-prefixed filename** to disambiguate from LFG #101 (which is a different unrelated PR from 2026-04-22 about auto-loop-10 tick-history). The existing tool's `gh repo view --json owner,name` call resolves to current-clone origin; for cross-fork archives, set `gh repo set-default <fork>/<repo>` first then run, then reset default. Captured as a tool-improvement candidate (the script could accept a `--repo` arg to make cross-fork archives one-shot).

## Drain-log correction for AceHack #101

The earlier drain-log claimed 0 threads (because I queried before Copilot's review landed at 14:24:11Z, ~5 min after auto-merge). Updated to reflect the actual 4 unresolved threads + their carry-forward resolution paths.

## Lesson captured (drain-log, lessons section)

**AceHack auto-merge races Copilot review.** Without required-conversation-resolution + required-status-checks on AceHack, auto-merge fires before reviewers land threads. Threads still apply to merged content; just need a follow-up cycle to land fixes. This is exactly what this PR is — the follow-up.

**The double-hop captures BOTH waves of review.** When AceHack auto-merges fast, the LFG forward-sync PR re-runs review and catches the same findings. Double-hop is also a *redundancy mechanism* against fast-merge-on-AceHack.

## Lane discipline

This PR opens AceHack-first per canonical double-hop. After merge → forward-sync to LFG. After both merge → AceHack absorbs LFG squash-SHA (gates on Aaron's EXECUTE). Then the post-cleanup-cleanup-cleanup is FINALLY done, and we can pivot to recovery-lane classification.

Per Amara: "Double-hop close is the active lane. Do not start branch/worktree recovery until: PR full archives are committed, LFG #845 artifacts are preserved, AceHack absorption completes, 0/0/0 is re-verified."
…or cross-fork archives (Aaron 2026-04-29)

Per Aaron 2026-04-29: "respect GH_REPO we should fix"

The script previously hard-resolved the target repo via `gh repo view --json nameWithOwner`, which always returns the current-clone's repo (typically `Lucent-Financial-Group/Zeta`). For cross-fork archives — e.g., archiving an AceHack PR from a clone tracking LFG — this returned the wrong repo and the script either:
- Archived the WRONG PR (a same-numbered PR in the default repo), or
- Failed silently / produced misleading filename slugs.

Workaround: `gh repo set-default <fork>/<repo>` before running, then reset after. Awkward and error-prone.

Fix: the script now respects a `GH_REPO=<owner>/<name>` env var before falling back to `gh repo view`. Resolution order:

1. `GH_REPO` env var → use as `<owner>/<name>` (cross-fork archives)
2. `gh repo view --json nameWithOwner` → fall back to default-repo resolution

Also added an `<owner>/<name>` shape validator so a malformed GH_REPO value (no slash) hard-fails early instead of generating bogus output.

Verification: re-ran `GH_REPO=AceHack/Zeta tools/pr-preservation/archive-pr.sh 101` — script now correctly resolves to AceHack#101 and writes the archive with the right title/slug, instead of grabbing LFG/Zeta#101 (an unrelated 2026-04-22 PR with completely different content).

Cross-fork filename-collision discipline (separate convention, applied manually for now): when archiving cross-fork PRs that may have number collisions with the default repo, use a fork-prefixed filename like `PR-acehack-<NNNN>-<slug>.md`. This isn't yet in the tool — future enhancement candidate would auto-prefix when GH_REPO ≠ default-repo.
Aaron 2026-04-29: "AceHack/Zeta we should not use a forks name in the main repo except for the special section for forks data that is unique to them like pr reviews, budgets, settings, maybe more."

Memory directory is general substrate, NOT a fork-specific section like docs/pr-discussions/ or docs/pr-preservation/. The fork-prefix in `feedback_acehack_zeta_*` filename was therefore misplaced — the file's content describes AceHack/Zeta-specific config but the filename shouldn't repeat that.

Renamed:
  memory/feedback_acehack_zeta_protection_config_dual_layer_legacy_deleted_rulesets_canonical_2026_04_29.md
→ memory/feedback_protection_config_dual_layer_legacy_deleted_rulesets_canonical_2026_04_29.md

Updated cross-references:
- memory/MEMORY.md (index pointer)
- docs/pr-discussions/PR-acehack-0101-...md (archive)
- docs/pr-discussions/PR-0844-...md (archive)
- docs/pr-discussions/PR-0845-...md (archive)
- docs/pr-preservation/lfg-844-drain-log.md
- docs/pr-preservation/acehack-101-drain-log.md

Fork-prefix discipline going forward (per Aaron):
- USE fork-prefix in: docs/pr-discussions/, docs/pr-preservation/, settings dirs, budget dirs (any fork-specific section)
- DO NOT USE fork-prefix in: memory/, src/, docs/ general areas, tools/, anywhere not explicitly fork-scoped

The file's CONTENT still references AceHack/Zeta as the specific repo it documents — that's substantive and correct. Just the filename doesn't repeat the fork name.
Copilot AI review requested due to automatic review settings April 29, 2026 14:43
@AceHack AceHack enabled auto-merge (squash) April 29, 2026 14:43
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 96bd24671b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. 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".

Comment thread tools/pr-preservation/archive-pr.sh Outdated
…HOST/]OWNER/REPO

Codex P2 (14:46Z): the GH_REPO override path I just added validates "contains a slash" but parses as if always `OWNER/REPO`. Per gh CLI docs GH_REPO accepts `[HOST/]OWNER/REPO` (host prefix optional, used by GitHub Enterprise). With a host-qualified value the previous parsing produced wrong owner+name.

Fix: case-statement parses both forms — 3-segment `HOST/OWNER/REPO` (take last two segments) and 2-segment `OWNER/REPO` (existing behavior). Added local sanity test confirming both parse correctly.

Edge cases now handled:
- `GH_REPO=AceHack/Zeta` → owner=AceHack, name=Zeta
- `GH_REPO=github.com/AceHack/Zeta` → owner=AceHack, name=Zeta (host stripped)
- `GH_REPO=enterprise.example.com/AceHack/Zeta` → owner=AceHack, name=Zeta (host stripped)
- `GH_REPO=Zeta` (no slash) → empty owner+name → fail loud with helpful error

This is a tiny CI/review correction per Amara's "don't expand #846 unless CI/review explicitly requires a tiny correction" guidance — Codex's catch is a real edge case, fix is small + isolated.
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Forward-sync follow-up after the post-#101 cycle: updates PR-preservation tooling and archives, and reconciles memory/xref naming after the fork-prefix rename.

Changes:

  • Add GH_REPO=<owner>/<repo> override support to tools/pr-preservation/archive-pr.sh for cross-fork PR archiving.
  • Rename/update memory references and trim the top-level memory/MEMORY.md index entry.
  • Add/refresh PR archive artifacts under docs/pr-discussions/ and update drain logs under docs/pr-preservation/.

Reviewed changes

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

Show a summary per file
File Description
tools/pr-preservation/archive-pr.sh Adds GH_REPO-based repo resolution before falling back to gh repo view.
memory/feedback_protection_config_dual_layer_legacy_deleted_rulesets_canonical_2026_04_29.md Updates “composes with” section to remove a broken in-repo xref and replace with principle text.
memory/MEMORY.md Updates the index entry to point at the renamed memory filename and shortens the summary.
docs/pr-preservation/lfg-844-drain-log.md Updates referenced memory path after the rename.
docs/pr-preservation/acehack-101-drain-log.md Expands the drain log with thread details and lessons learned.
docs/pr-discussions/PR-0844-ops-0-0-0-post-reset-cleanup-stale-prose-fixes-protection-co.md Adds archived PR discussion content for PR #844.
docs/pr-discussions/PR-0845-ops-0-0-0-lfg-forward-sync-post-reset-cleanup-copilot-fixes.md Adds archived PR discussion content for PR #845.
docs/pr-discussions/PR-acehack-0101-ops-0-0-0-post-reset-cleanup-stale-prose-fixes-protection-co.md Adds archived PR discussion content for AceHack PR #101 with fork-prefixed filename.
Comments suppressed due to low confidence (1)

memory/feedback_protection_config_dual_layer_legacy_deleted_rulesets_canonical_2026_04_29.md:104

  • P1: This bullet says memory/MEMORY.md currently has an index pointer to the non-in-repo visibility-constraint memory file, but a repo search shows no such pointer in memory/MEMORY.md. Either drop this claim or update it to reference the actual in-repo files that still link to memory/feedback_aaron_visibility_constraint_no_changes_he_cant_see_2026_04_28.md (e.g., backlog rows / other memories).

Comment thread tools/pr-preservation/archive-pr.sh Outdated
Comment thread docs/pr-preservation/acehack-101-drain-log.md Outdated
Comment thread docs/pr-preservation/acehack-101-drain-log.md Outdated
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2902edad19

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. 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".

Comment thread tools/pr-preservation/archive-pr.sh
…gation + drain-log corrections

Addresses 4 unresolved review threads on PR #846 that landed
2026-04-29T14:50:51Z..14:52:00Z, after auto-merge was armed.

tools/pr-preservation/archive-pr.sh:
- (Codex P2) Propagate parsed REPO_HOST to `gh api --hostname`.
  Previous parser captured the host segment from
  `GH_REPO=HOST/OWNER/REPO` then discarded it, so cross-fork
  archive runs against GitHub Enterprise repos silently
  targeted github.com. Now both `gh api graphql` calls in the
  Python child receive `--hostname HOST` when REPO_HOST is set.
- (Copilot P1) Strict GH_REPO validation. Previous parser
  accepted malformed values like `/repo`, `owner/`, and
  `owner/repo/extra` (the last would be parsed as
  host=owner / owner=repo / repo=extra). New rules:
  4+ segments rejected outright; 3-segment HOST/OWNER/REPO
  requires HOST to look like a hostname (contain a dot);
  embedded slashes inside owner/repo rejected as defence in
  depth against path-injection into docs/pr-discussions/.
  Verified locally against 10 edge cases (3 valid + 7 invalid).

docs/pr-preservation/acehack-101-drain-log.md:
- (Copilot P1) Thread 1 resolution: corrected the false
  claim that in-repo `memory/MEMORY.md` has a matching
  broken pointer. The user-scope MEMORY.md has the index
  entry; in-repo MEMORY.md does not. Backfill tracked
  under task #291.
- (Copilot P1) Lesson 3: rewritten as "pre-fix behavior"
  documenting how operators worked around the lack of
  GH_REPO support before this PR, with the post-fix
  command shape (`GH_REPO=fork/repo archive-pr.sh N`)
  and a forward pointer to task #314 for the fuller
  fork-routing patch.

memory/feedback_protection_config_dual_layer_legacy_deleted_rulesets_canonical_2026_04_29.md:
- Same false-pointer correction as the drain-log: the
  visibility-constraint memory exists in user-scope only;
  in-repo MEMORY.md does not index it. Pointer corrected
  to the user-scope path with task #291 forward link.

Test:
- `bash -n tools/pr-preservation/archive-pr.sh` passes.
- 10-case parser test (3 valid: owner/repo, github.com/owner/repo,
  github.example.com/owner/repo; 7 invalid: /repo, owner/,
  owner/repo/extra, host.com/owner/repo/extra, empty,
  owner-only, host.com//repo) all return expected rc + output.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@chatgpt-codex-connector
Copy link
Copy Markdown

💡 Codex Review

*.*) : ;; # ok, contains a dot
*)
echo "error: GH_REPO 3-segment form must be HOST/OWNER/REPO where HOST is a hostname containing a dot (e.g. github.example.com/owner/repo). Got: '${REPO_NWO}'" >&2
exit 1

P2 Badge Accept valid GH_REPO hosts without dots

The new host validation rejects any 3-segment GH_REPO whose host does not contain a dot, but gh documents repository selectors as [HOST/]OWNER/REPO and does not require dotted hostnames. In environments that use single-label GHES host aliases (for example ghe/owner/repo or localhost/owner/repo), this now hard-fails before any API call, so cross-fork archiving regresses for those valid configurations.

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. 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".

…auth-service 401 at 15:00:42Z

The dynamic Code Scanning check (`Code Quality: PR #846`) failed
its SARIF upload step at 2026-04-29T15:00:42Z with:

  ##[warning]Requires authentication - https://docs.github.com/rest
  ##[error]Please check that your token is valid and has the
  required permissions: contents: read, security-events: write

Same window saw `gh api graphql` 401s on the maintainer laptop;
both cleared a few minutes later (gh works again with -X POST
flag). The Code Quality run is the dynamic-event variety that
cannot be retried via `gh run rerun --failed`. Empty commit is
the only way to retrigger.

Required-checks rollup is 7/7 SUCCESS; the Code Quality check is
a non-required gate that auto-merge waits on regardless. Diagnostic
runbook for this failure mode lives at memory/reference_gh_cli_*
(target home: docs/ops/runbooks/gh-cli-auth-401.md per Amara, follow-up).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@AceHack AceHack merged commit 17a2637 into main Apr 29, 2026
27 checks passed
@AceHack AceHack deleted the post-0-0-0-cleanup-followup-v2-lfg-2026-04-29 branch April 29, 2026 15:12
AceHack added a commit to AceHack/Zeta that referenced this pull request Apr 29, 2026
…-Financial-Groupgh-401 runbook (interim memory home) (#104)

The post-double-hop close artifacts:

- docs/active-trajectory.md: priority section RE-CLOSED (rescinds the
  "blocking all other work" framing now that 0/0/0 holds again at
  17a2637). New "Post-double-hop
  sequencing" block lists the next-lane order per Amara: Lucent-Financial-Group#315
  (hourly budget), Lucent-Financial-Group#319 (bounded-retry CodeQL), Lucent-Financial-Group#318 (docs/ops
  taxonomy), Lucent-Financial-Group#317 (tick-fast-path), Lucent-Financial-Group#316 (absorbed into Lucent-Financial-Group#318),
  Lucent-Financial-Group#313/Lucent-Financial-Group#314, then branch/worktree recovery.

- docs/hygiene-history/ticks/2026/04/29/1452Z.md: tick shard for the
  PR Lucent-Financial-Group#846 review wave (4 unresolved threads — 3× Copilot P1 +
  1× Codex P2). Codex caught the structurally-deepest bug (host
  segment parsed but discarded silently before gh api graphql);
  Copilot caught the surface P1s. Review-ensemble complementarity.

- docs/hygiene-history/ticks/2026/04/29/1517Z.md: tick shard for the
  0/0/0 re-close ceremony at 15:17:09Z. Force-with-lease + ruleset
  toggle/restore + verify. Aaron's "why are you waiting on me"
  flagged as future-self lesson on standing-authority cadence
  (Otto-359 candidate).

- memory/reference_gh_cli_graphql_401_diagnostic_runbook_2026_04_29.md:
  diagnostic runbook for the gh CLI auth glitch where `gh api
  graphql` 401s while `gh api -X POST graphql` works. Amara
  framing: diagnostic note, not doctrine yet. INTERIM HOME: the
  runbook lives in memory/ for this round; long-term home is
  docs/ops/runbooks/gh-cli-auth-401.md per task Lucent-Financial-Group#318
  (docs/ops taxonomy — runbooks/patterns/incidents/ tree).

- memory/MEMORY.md: paired index entry for the runbook above
  (per memory-index-integrity rule).

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 29, 2026
…GitHub PR/issue numbers

Copilot caught that committed substrate references like `#319` auto-link
to GitHub PR/issue 319 (a closed Graph operator-algebra PR), not to the
session-local TaskList task 319 (bounded-retry CodeQL flakes) I intended.
This is a generalized substrate-discipline issue: my TaskList tool's IDs
share the `#NNN` namespace with GitHub PR/issue numbers and silently mis-link.

Verified the collision against LFG/Zeta:
  task 313 → GH PR/issue 313: backlog: pre-landing sanitizer for ferry lint  [closed]
  task 314 → GH PR/issue 314: backlog: claude --agent harness flag           [closed]
  task 315 → GH PR/issue 315: core: Veridicality.canonicalKey                [closed]
  task 316 → GH PR/issue 316: adr: Graph substrate ZSet-backed retraction    [closed]
  task 317 → GH PR/issue 317: core: Graph substrate skeleton                  [closed]
  task 318 → GH PR/issue 318: backlog: P3 KSK naming definition doc           [closed]
  task 319 → GH PR/issue 319: core: Graph operator-algebra composition        [closed]
  task 320 → GH PR/issue 320: backlog: Schema-as-Graph first-class entities  [closed]
  task 321 → GH PR/issue 321: core: Graph.largestEigenvalue power iteration  [closed]

ALL 9 session-task IDs from this session collide.

Sweep: replaced `#NNN` → `task NNN` (no hash) in committed substrate where
the reference is to a session-local task. Real GitHub PR/commit refs
(#846, #847, #101, #103, #845, etc.) keep their `#` prefix.

Files swept (22 total replacements):
- docs/active-trajectory.md (8)
- docs/hygiene-history/ticks/2026/04/29/1517Z.md (9)
- memory/reference_gh_cli_graphql_401_diagnostic_runbook_2026_04_29.md (3)
- memory/MEMORY.md (2)

Lesson for future-self: TaskCreate/TaskList IDs are session-local and
share namespace with GitHub PR/issue numbers. When writing committed
substrate that references them, use `task NNN` (no hash) format. The
hash-prefix is reserved for real GitHub references that should auto-link.
This composes with the Drain-Log Claim Verification Discipline + the
index-vs-body single-source-of-truth discipline — claims about other
artifacts must reference the right artifact.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
AceHack added a commit that referenced this pull request Apr 29, 2026
* ops(0-0-0): post-double-hop close — trajectory + tick shards + gh-401 runbook (interim memory home)

The post-double-hop close artifacts:

- docs/active-trajectory.md: priority section RE-CLOSED (rescinds the
  "blocking all other work" framing now that 0/0/0 holds again at
  17a2637). New "Post-double-hop
  sequencing" block lists the next-lane order per Amara: #315
  (hourly budget), #319 (bounded-retry CodeQL), #318 (docs/ops
  taxonomy), #317 (tick-fast-path), #316 (absorbed into #318),
  #313/#314, then branch/worktree recovery.

- docs/hygiene-history/ticks/2026/04/29/1452Z.md: tick shard for the
  PR #846 review wave (4 unresolved threads — 3× Copilot P1 +
  1× Codex P2). Codex caught the structurally-deepest bug (host
  segment parsed but discarded silently before gh api graphql);
  Copilot caught the surface P1s. Review-ensemble complementarity.

- docs/hygiene-history/ticks/2026/04/29/1517Z.md: tick shard for the
  0/0/0 re-close ceremony at 15:17:09Z. Force-with-lease + ruleset
  toggle/restore + verify. Aaron's "why are you waiting on me"
  flagged as future-self lesson on standing-authority cadence
  (Otto-359 candidate).

- memory/reference_gh_cli_graphql_401_diagnostic_runbook_2026_04_29.md:
  diagnostic runbook for the gh CLI auth glitch where `gh api
  graphql` 401s while `gh api -X POST graphql` works. Amara
  framing: diagnostic note, not doctrine yet. INTERIM HOME: the
  runbook lives in memory/ for this round; long-term home is
  docs/ops/runbooks/gh-cli-auth-401.md per task #318
  (docs/ops taxonomy — runbooks/patterns/incidents/ tree).

- memory/MEMORY.md: paired index entry for the runbook above
  (per memory-index-integrity rule).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* ops(0-0-0): #847 Codex P2 — correct gh-401 runbook misdiagnosis (X POST is a no-op)

Codex P2 on PR #847: my prior runbook claimed `gh api graphql -f query='...'`
defaults to GET and that `-X POST` was the workaround. That's wrong: `gh api`
already sends POST when `-f` or `-F` parameters are present (per `gh api --help`).
The earlier "the X flag fixed it" observation was actually the upstream
auth-service glitch resolving in the few seconds between attempts —
misattributed.

Empirical verification:

  GH_DEBUG=api gh api graphql -f query='query { viewer { login } }' 2>&1 \
    | grep -E '^> POST|^> GET'
  # > POST /graphql HTTP/1.1   ← already POST without -X

Updated runbook to:
- Frame the failure mode correctly: transient upstream auth-service
  hiccup that recovers on its own (~30-90s window). Bounded retry is
  the answer, not flag-magic.
- Add explicit "Common misdiagnosis (corrected)" section so future-
  self doesn't re-derive the wrong fix.
- Keep CodeQL SARIF upload 401 as sibling failure mode (independently
  observed in CodeQL run logs, not the misattributed-flag failure).
- Cross-reference task #319 (bounded-retry CodeQL) for the durable
  fix Aaron specified per DST discipline.

Lesson captured in trigger-memory section: claim-without-verify is
the failure mode the Drain-Log Claim Verification Discipline (task
#316) catches. The rule applies to runbook-authoring in real time,
not just retroactive drain-log audits.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* ops(0-0-0): #847 retrigger — clear stale submit-nuget failure on deleted misnamed branch

Earlier in this PR's history, a push hit a misnamed branch on LFG
(post-0-0-0-reclose-followup-acehack-2026-04-29 instead of the lfg-named
counterpart). I corrected the push and the misnamed branch was later
auto-deleted. However, the submit-nuget workflow had already been
triggered against that branch and is now stuck because a rerun cannot
re-fetch the deleted ref.

The same SHA (65b20ee) has a SUCCESS run on the correct lfg-named
branch (run 25117920779), but the rollup also retains the FAILURE run
from the deleted branch (run 25117911328). Auto-merge BLOCKED on the
stale failure status.

Empty commit retrigger to land a fresh SHA where workflows fire only
on the correct branch context. No content change.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* ops(0-0-0): #847 review wave 2 — Copilot + 2× Codex corrections

Three unresolved review threads on #847 head, all valid:

1. Copilot — tick shard filename mismatch
   `1452Z.md` filename vs `14:58:00Z` row timestamp confused
   chronological sort. Renamed file to `1458Z.md` to match the
   row timestamp (the row had been revised when the round-close
   landed, but I forgot to rename the file).

2. Codex P1 — `gh api rate_limit` is not a reliable auth-health
   signal. Per GitHub REST docs, `GET /rate_limit` succeeds
   anonymously when only public resources are queried, so a
   missing/revoked token can show as healthy on this check.
   Replaced runbook step 3 with `gh api user` (requires auth,
   no anonymous fallback). Also corrected the "still works"
   block to call out the same caveat with explicit Codex P1
   credit + cross-reference to PR #847.

3. Codex P2 — frontmatter description over-asserted "not a
   token problem" while the body documents token-side branches.
   Softened to "FIRST hypothesis is transient upstream...
   always rule out token-side issues before assuming transient."
   Indexes/previews surfacing the description now don't
   short-circuit to "must be transient, retry."

The Codex P1 correction is structurally important: a runbook
that misclassifies "token problem" as "transient" delays the
real remediation path. Caught proactively before any operator
ran the broken triage.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* ops(0-0-0): #847 Codex P2 — fix stale -X POST claim in MEMORY.md index entry

Codex P2 caught that the MEMORY.md index entry I added still
referenced the old misdiagnosis (gh api -X POST works while gh api
graphql doesn't). The runbook itself was corrected, but the index
entry wasn't updated to match — readers seeing the index first
would be sent back toward the already-invalidated method-switch
theory instead of the intended transient-auth/token diagnosis.

Updated MEMORY.md index entry to:
- Remove the -X POST contrast claim
- Frame as "transient upstream auth-service 401s" first-hypothesis
- Cross-reference the Codex P2 correction with explicit credit
- Note token-side cases explicitly ("always rule out token-side
  issues — expired/revoked/SSO — before assuming transient")

Future-self lesson reinforced: when correcting a substrate file,
update ALL surfaces that reference its claims — body text, frontmatter,
INDEX entries, cross-refs in other files. Codex P2 caught what would
have been a silent-state-divergence between the runbook and its index.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

* ops(0-0-0): #847 Copilot wave 4 — disambiguate session-task IDs from GitHub PR/issue numbers

Copilot caught that committed substrate references like `#319` auto-link
to GitHub PR/issue 319 (a closed Graph operator-algebra PR), not to the
session-local TaskList task 319 (bounded-retry CodeQL flakes) I intended.
This is a generalized substrate-discipline issue: my TaskList tool's IDs
share the `#NNN` namespace with GitHub PR/issue numbers and silently mis-link.

Verified the collision against LFG/Zeta:
  task 313 → GH PR/issue 313: backlog: pre-landing sanitizer for ferry lint  [closed]
  task 314 → GH PR/issue 314: backlog: claude --agent harness flag           [closed]
  task 315 → GH PR/issue 315: core: Veridicality.canonicalKey                [closed]
  task 316 → GH PR/issue 316: adr: Graph substrate ZSet-backed retraction    [closed]
  task 317 → GH PR/issue 317: core: Graph substrate skeleton                  [closed]
  task 318 → GH PR/issue 318: backlog: P3 KSK naming definition doc           [closed]
  task 319 → GH PR/issue 319: core: Graph operator-algebra composition        [closed]
  task 320 → GH PR/issue 320: backlog: Schema-as-Graph first-class entities  [closed]
  task 321 → GH PR/issue 321: core: Graph.largestEigenvalue power iteration  [closed]

ALL 9 session-task IDs from this session collide.

Sweep: replaced `#NNN` → `task NNN` (no hash) in committed substrate where
the reference is to a session-local task. Real GitHub PR/commit refs
(#846, #847, #101, #103, #845, etc.) keep their `#` prefix.

Files swept (22 total replacements):
- docs/active-trajectory.md (8)
- docs/hygiene-history/ticks/2026/04/29/1517Z.md (9)
- memory/reference_gh_cli_graphql_401_diagnostic_runbook_2026_04_29.md (3)
- memory/MEMORY.md (2)

Lesson for future-self: TaskCreate/TaskList IDs are session-local and
share namespace with GitHub PR/issue numbers. When writing committed
substrate that references them, use `task NNN` (no hash) format. The
hash-prefix is reserved for real GitHub references that should auto-link.
This composes with the Drain-Log Claim Verification Discipline + the
index-vs-body single-source-of-truth discipline — claims about other
artifacts must reference the right artifact.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.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.

2 participants