Skip to content

fix(history): recover logan/obsidian ancestry (LAF-79) - #980

Closed
loganfinney27 wants to merge 3007 commits into
mainfrom
logan/obsidian
Closed

loganfinney27 wants to merge 3007 commits into
mainfrom
logan/obsidian

Conversation

@loganfinney27

@loganfinney27 loganfinney27 commented Aug 16, 2026 •

Copy link
Copy Markdown
Member

Issue

Tracks LAF-79 — Recover, scrub, and integrate logan/obsidian history.

Description

The standing logan/obsidian branch had been rebuilt on history unrelated to main, preventing ordinary pulls and a normal GitHub comparison. Recovery had to preserve large dirty worktrees on Windows and Mac while repairing ancestry, aligning both machines before the final scrub, and removing known secret-bearing runtime history.

This pull request is intentionally a draft and must remain dynamically last in the repository's merge order.

Root Cause

Earlier secret-history rewrites occurred before the Windows and Mac histories were brought onto one shared raw lineage. Separately rebuilt roots then appeared unrelated even where visible content overlapped. Repeated abandoned temporary candidates compounded the ambiguity without producing one verified branch shared by both computers and GitHub.

Fix

  • Reconciled the raw Windows and Mac work into one named candidate without creating another repository.
  • Restored a real merge base with main at 0bce7237111c86eb511d3e3d13c4c92dc0871c7f.
  • Aligned Windows, Mac, and GitHub on the repaired history before the final scrub.
  • Removed the inventoried secret/runtime paths and repaired two overlong Markdown paths while preserving their original blobs.
  • Added scanner-vetted Vault media and active tool/plugin assets through Git LFS in add-only commit 310ce38c56.
  • In db22ae8286, restricted the root Docker build context to the application inputs actually copied by the Dockerfiles, declared the existing site script as ES6 for Hound, and stopped tracking CODEX_PHONE_LINK_WATCHER_DEBUG_20260709.log while preserving its unchanged local worktree copy.

Preservation Guarantees

  • No dirty worktree content was discarded during the recovery.
  • The debug log removed from Git in db22ae8286 remains present locally with the exact blob hash previously stored at HEAD.
  • Machine-local, generated, cache, session, database, and deliberately scrubbed material remains outside the PR.
  • Do not use reset --hard, clean, or equivalent checkout operations to align either dirty worktree.

Testing

  • Verified history connectivity, the shared merge base, and cross-platform path portability.
  • Passed the native Vault secret-pattern guard and Gitleaks commit hook.
  • Passed targeted TruffleHog scans with zero verified or unverified findings.
  • Passed staged large-file and portability gates.
  • Verified all required LFS pointers and objects; 66 LFS objects were uploaded with the artifact commit.
  • Passed all 28 hatch-pet tests.
  • Passed node --check for !/!/_loganfinney.com/config.js.
  • Confirmed Hound succeeds after the ES6 declaration.
  • Confirmed the native CodeQL JavaScript/TypeScript and Actions analyses succeed on db22ae8286.
  • Confirmed GitHub's QWED code-scanning integration reports zero new alerts. The separate QWED vendor verdict has zero blocked findings and zero warnings, but remains UNVERIFIABLE because the recovery-sized diff contains seven informational historical/documentation findings.
  • All review threads are currently resolved.

Current State — remote facts observed 2026-09-02

  • PR fix(history): recover logan/obsidian ancestry (LAF-79) #980: OPEN / DRAFT, not currently mergeable.
  • GitHub no longer exposes the declared logan/obsidian head as a normal branch. The public pull-request ref remains at 306b8ad468e287311b074cf8b346ae533e078b7f; no merge ref exists.
  • Current remote main: 827811e3d63b93ec9148c61365be7a728a9f3526.
  • PR head versus current main: diverged — 3,007 commits on the PR side and 1,043 on the main side, with merge base c2d070e816c3474ac9004959d1d5088b8d9ce827.
  • Earlier validation results remain historical evidence and have not been rerun against this current relationship.

Merge Order — Dynamically Last

This PR must remain draft until every blocker below has merged. A blocker clears only by merge; closing one without merging does not satisfy the gate. Every later PR also becomes a blocker and must be added before this PR can move to ready-for-review.

Prior blocker audit, now verified merged

Open blockers observed 2026-09-02

There are 33 other open PRs in the repository in this snapshot. This is a dated observation, not permanent state.

Do not promote this PR automatically. After all blockers merge: integrate the resulting main without discarding either machine's uncommitted files, rerun the full validation suite, move the PR to ready for review, address required feedback, and carry it through the merge queue.

claude and others added 30 commits August 2, 2026 22:25
Codacy's gate is "<= 0 issues of at least minor severity", so the three
BestPractice minors block the merge as surely as the security error did:

  MD025 PREFIX-FREE-ROUTING-2026-07-19.md:18
  MD025 REVIEW-MERGE-ENGINE-STATUS-2026-07-25.md:25
  MD001 PREFIX-FREE-ROUTING-2026-07-19.md:85

Before changing anything I went looking for how this vault has already
resolved MD025, and found it ruled on. 6cdfbdf0c (#864) added a root
.markdownlint.json disabling MD025's front_matter_title counting, on the
premise that frontmatter title + body H1 is the vault convention. f00d15b1b
then removed it -- "an agent convenience choice, not legitimate vault
governance -- removed per Logan's ruling this session" -- deleting the file
so markdownlint and Codacy run at pure defaults. There is no markdownlint
config in this repo today. So re-adding the override is not available to me:
it would reverse Logan's ruling, and the ruling is the reason these findings
exist at all. The fix belongs in the notes.

Both notes are new in this PR, so shaping them costs nothing already written.
Neither is in validate_content.py's ROOT_GOVERNED_FILES, so frontmatter
`title` is not mandatory for them -- but metadata_survey.py (wired into
metadata-survey.yml) does survey for it, so `title` stays and the duplicate
body H1 goes. In PREFIX-FREE-ROUTING the H1 was character-identical to the
frontmatter title; in REVIEW-MERGE-ENGINE-STATUS the H1 carried only the date,
which is already in the filename and in `created`/`updated`. Nothing is lost.

MD001: the footer sigil was `###### [["The world is quiet here."]]` after an
`##` section. It is now italic rather than a heading -- the same visible text,
minus a spurious entry in the document outline, which is what it always was.
This changes only the note I am adding. I did NOT touch the 270 `######`
spellings already in the vault (400 sigil headings, 352 of which trip MD001
under the same defaults); that is a vault-wide typographic call and Logan's,
not something to settle by editing one new file. Flagging it for him.

Verified with markdownlint 0.49.1 locally: all three findings clear, and
nothing new in MD025/MD001. Full suite 309 tests, 5 pre-existing
pydantic-import errors unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fipj4vEJ5ADPuunn9ed5Hd
Codacy's Prospector check reported a warning in changed code that its PR
summary never itemized, so I installed prospector 1.19.1 and ran it over every
.py file this PR touches rather than guess which one it meant. Three findings,
all real, all fixed:

- tests/test_review_feedback_loop.py:391 — pyflakes F841: `as edit_label` bound
  a mock the test never inspects. The sibling patch on the same `with` already
  omits `as`; this one just needed to match.
- temp_test_runner.py:95,97 — pylint f-string-without-interpolation: `f"✓ PASS"`
  and `f"✗ FAIL"` have no fields. Plain strings.
- syntax_validator.py:103 — pycodestyle E305: one blank line before the
  `__main__` guard, not two.

Prospector now reports clean across all 13 changed Python files. Full suite
309 tests, 5 pre-existing pydantic-import errors unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fipj4vEJ5ADPuunn9ed5Hd
Both from Copilot's review of the split, both right.

1. flatten-label-migration-preview.yml granted pull-requests/issues write and
   inherited secrets, though the dry-run path only lists open PRs and reads
   their changed files. That is the separation the split claimed to create,
   asserted but not actually built. Now built:

   - The reusable workflow takes MERGE_QUEUE_TOKEN as a declared optional
     workflow_call secret instead of reaching for it through `secrets: inherit`,
     so PREVIEW can decline the PAT and APPLY passes it explicitly.
   - PREVIEW grants `contents: read` + `pull-requests: read` and passes no
     secrets. A dry run now has no capability to create, edit, or delete a
     label even if a step tried.

   Checked GitHub's rule before shaping the permissions rather than assuming
   it: a called workflow's GITHUB_TOKEN permissions can only be DOWNGRADED from
   the caller's, and requesting more fails validation before the run. So the
   reusable workflow declares the read-only FLOOR both entry points can satisfy
   — not the union of what its steps want, which would have broken PREVIEW
   outright. Dropping the key entirely was the first thing I tried and it trips
   Checkov CKV2_GHA_1 (absent top-level permissions read as write-all), so that
   would have traded one error for another.

   Consequence: label writes are never GITHUB_TOKEN's to perform, only the
   PAT's. A new guard makes that dependency loud — on the destructive path
   only, it fails before any re-stamping if MERGE_QUEUE_TOKEN is absent, rather
   than dying part-way through with half the open PRs converted.

   test_flatten_label_migration_is_dispatch_only_and_least_privilege now pins
   the asymmetry per file (each one's own permission set, who carries the PAT,
   `secrets: inherit` banned outright) and pins the guard's existence and its
   dry_run==false condition.

2. review_feedback_loop.py:398 still described eligibility as "risk/low + grace
   + no blocking threads" — the pre-flatten predicate. Under the flat schema it
   is an affirmative `—/—` verdict past grace, OR a fired non-`nope` flag whose
   review lane has completed, also past grace. Corrected, and pointed at
   evaluate_review_state as the authority instead of restating it.

Verified: checkov 3.3.9 clean on all three workflow files, 9/9 invariants pass,
prospector clean across all changed Python, check_action_pins.py OK, full suite
309 tests with the 5 pre-existing pydantic-import errors unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fipj4vEJ5ADPuunn9ed5Hd
Widening test_flatten_label_migration_is_dispatch_only_and_least_privilege to
cover the preview/apply permission asymmetry pushed it to 80 NLOC against
Lizard's 50 ceiling — Codacy's one new finding on 29006957 (1 medium,
Complexity). Self-inflicted, so: split by the property being asserted rather
than shortened by dropping assertions.

  test_flatten_label_migration_logic_file_is_callable_only
  test_flatten_label_migration_apply_path_refuses_to_start_without_the_pat
  test_flatten_label_migration_entry_points_are_parameterless_and_mode_pinned
  test_flatten_label_migration_write_capability_lives_on_the_apply_path

The fixture table (MIGRATION_LOGIC / MIGRATION_READ_ONLY / MIGRATION_WRITE /
MIGRATION_ENTRY_POINTS) and the `_workflow` parser move to module level, where
the narrative comment about why the migration is split three ways now lives
once instead of once per test. No assertion was dropped; each of the four
carries the same failure messages it had inside the single method.

Every function in the file is now under 40 NLOC (max 12.0 average, no lizard
warnings). Suite 312 tests, 5 pre-existing pydantic-import errors unchanged.
Prospector clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fipj4vEJ5ADPuunn9ed5Hd
I called Codacy's surviving Prospector alert stale. It wasn't — the count went
5 -> 1 -> 1 and stopped decaying, and the annotation names it exactly:
classify_paths.py:1, D213 "Multi-line docstring summary should start at the
second line".

My local sweep missed it because pydocstyle is NOT in prospector's default tool
set; Codacy enables it. Running prospector at every strictness with dodgy,
mccabe, and vulture added still reported clean, so no amount of turning that
dial would have found it. Selecting D212/D213 explicitly through pydocstyle
does.

Prospector enables both D212 and D213, which are mutually exclusive, so the
only shape that triggers neither is a single-line docstring — collapse the
summary and carry the prose in a `#` block, the same transformation that took
this PR from 52 Codacy findings to 5.

Three of the fourteen D212/D213 hits across the changed Python sit on lines
this PR touches; Codacy currently flags one. Collapsed all three so the other
two cannot surface on a later push:

  classify_paths.py:1                      (module docstring)
  review_feedback_loop.py:189              (_auto_merge_state)
  review_feedback_loop.py:909              (_classify_pr_pair)

The remaining seven are on lines this PR does not touch — pre-existing, outside
the changed-code window, and not mine to reshape here.

Verified: pydocstyle --select=D212,D213 clean on both files; prospector clean;
classify_paths.py still emits its JSON contract unchanged (spot-checked a
mixed changeset: filetype=med, depth=high); 312 tests, 100 in the engine
module, 20 in the scripts suite, 5 pre-existing pydantic-import errors.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fipj4vEJ5ADPuunn9ed5Hd
ci(routing) + labeler: retire author-gated lanes; flatten risk vocab to risk/{low,med,high,nope}
Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.2 to 7.0.1.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@v6.0.2...3d3c42e)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
…/checkout-7.0.1

chore(deps): bump actions/checkout from 6.0.2 to 7.0.1
One canonical note per numbered rule (First through Tenth), each with its
exact text and source book. The Eleventh Rule is deliberately excluded --
per the series itself, it has no quotable text, so there is nothing to
transcribe as a standalone note. Cross-linked to each other only (an
explicit, self-declared numbered set from the same source); WIZARDS_FIFTH
also links to Grace (Sword of Truth).md since both come from the same
book (Soul of the Fire) -- a factual, non-speculative connection, not a
new one being asserted.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfreowpdMionR3SiGEjRBw
Added a related: frontmatter field pointing to WIZARDS_FIRST through
WIZARDS_TENTH.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfreowpdMionR3SiGEjRBw
Logan's ruling (2026-08-02): the footer sigil is
`The world is quiet here.Esto Perpetua!` — U+FF0E FULLWIDTH FULL STOP,
confirmed intentional, no wikilink, no heading, plain text.

It had drifted into 12 spellings across the vault:

    268  ###### [["The world is quiet here."]]
     93  ###### "The world is quiet here."
     44  *The world is quiet here.*
     28  The world is quiet here.
     15  ###### The world is quiet here
     15  "The world is quiet here."
     12  *"The world is quiet here."*
      8  > *"The world is quiet here."*
      8  > "The world is quiet here."
      4  THE WORLD IS QUIET HERE.
      4  [["The world is quiet here."]]
      3  > *The world is quiet here.*
      4  ###### "The world is quiet here. Esto Perpetua!"   (long form)

521 lines across 501 files, all rewritten to the identical canonical string
(verified: 521 canonical added lines, 0 other).

What was deliberately NOT touched, and why:

- 449 lines inside YAML frontmatter. `- The world is quiet here` is a
  `related:` list entry, not a footer. A first pass would have rewritten them
  to a bare scalar and corrupted the frontmatter of 400+ notes; the sweep now
  skips the frontmatter block outright. Verified after the fact: zero
  list-item lines removed anywhere in the diff.
- 179 path-like lines. `Esto Perpetua!` and `! The world is quiet here` are
  real Nest DIRECTORY names (`!/!/__!__/!/! The world is quiet here/Esto
  Perpetua!/`), so any line carrying `/` or a code span is left alone.
- 195 prose mentions — notes that discuss the sigil rather than close with it.
- Code fences.
- **CONSTITUTION.md:205**, which still reads
  `###### "The world is quiet here. Esto Perpetua!"`. It is MIND-1 of the
  Touchstone Tree. `PROTECTED_LIVE_FILES` guards only deletion, so nothing
  mechanically stopped the edit — but a footer-cleanup mandate does not reach
  the vault's governance canon. Held for Logan to rule on separately.

Side effect, measured across the changed files: MD001 heading-increment
violations **337 -> 18**, because 384 of these were `######` headings on what
was always a footer refrain rather than a section. The remaining 18 are
unrelated motifs (`###### [ Maiden : Mother : Crone ]`, `##### FLAG:`).

Dropping the wikilink does remove backlinks from the 194 notes that carried
`[[...]]`. Logan ruled "no Wikilink" with that flagged.

Verified: frontmatter parses in all 424 changed files that have it — the 8
PyYAML failures are pre-existing on `main` (PyYAML reads the `!` Nest prefix
as a YAML tag) and fail identically there. Character conformity, dotfolder
anchors, portable paths, and action pins all pass. Suite 312 tests, 5
pre-existing pydantic-import errors.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fipj4vEJ5ADPuunn9ed5Hd
…itiving

`paired` (check-notebooks-paired.yml) failed on this PR, but not because of it.
Verified before touching anything:

- Neither `LLM-Router.md` nor `.serena/news.json` appears in this PR's diff —
  all 501 changed files are `.md`.
- `paired` failed first on `claude/poka-yoke-player-qzt7le` at 00:45, 27
  minutes before this branch ran, and passed on this branch eight times
  earlier today.

The mechanism: `.gitattributes:90` declares `*.json text eol=lf`, but the
committed blob for `.serena/news.json` contains CRLF (last written in
`b222fde7e`, the history purge). Git therefore normalizes it the moment
anything touches the tree — the run log carries the warning verbatim — and the
check's dirty-tree test at check-notebooks-paired.yml:49 is `git diff --quiet`,
which flags ANY dirty file and then reports it as "A notebook twin is out of
sync." The `git diff --stat` in that same log names only `.serena/news.json`;
`LLM-Router.md` was jupytext's stdout, not a desync.

So the file contradicted its own declared line-ending rule and the check
mislabelled the result. Fixing the file is the smaller and more correct of the
two repairs. Scoped first: exactly ONE tracked `.json` blob repo-wide violates
`*.json text eol=lf`, and this is it.

Content is byte-identical apart from line endings (`git diff
--ignore-cr-at-eol` is empty) and the JSON parses before and after.

Carried here rather than split out because it blocks this PR and the
poka-yoke one. The remaining defect — that the check reports any dirty file as
a notebook-twin desync — is left alone; that is a policy-workflow change and
belongs in its own PR.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fipj4vEJ5ADPuunn9ed5Hd
Revised form, per Logan 2026-08-03:

    ---

    ```
    The world is quiet here.Esto Perpetua!
    ```

521 sigils across 501 files. 228 already sat under a `---` and reuse it; 293
gained one. The rule always follows a blank line, so it renders as a thematic
break and never as a setext H2 underline — verified: setext-risk `---` lines
are 101 before and 101 after, delta zero, all pre-existing.

MD001 across the changed files: 340 -> 18, unchanged from the previous form.

One risk I could not settle locally, flagged rather than worked around:

A generic fence with no language trips markdownlint MD040
("Fenced code blocks should have a language specified") — 497 new instances if
Codacy enables it. The two alternatives both cost something: an indented
4-space block trips MD046 (`Expected: fenced; Actual: indented`) in the 76 of
these notes that already use a fence, and a language tag (```text) is clean
everywhere but is not the generic block Logan asked for.

Codacy's markdownlint is demonstrably NOT the CLI default set, so the local
number is an upper bound rather than a prediction:
PREFIX-FREE-ROUTING-2026-07-19.md has 33 local MD013 hits and Codacy reported
only MD025 and MD001 on it across the whole of #854 — never MD013. Whether
MD040 is enabled there is unknown, and one push answers it. Shipping the form
as specified; if MD040 fires, the fix is a language tag or a revert, and that
is Logan's call rather than a silent substitution.

Frontmatter verified: no file newly fails to parse. Character conformity,
dotfolder anchors, portable paths, and action pins all pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fipj4vEJ5ADPuunn9ed5Hd
This reverts commit 365ac3a6cb953266d0cc42697cef26895a6f45ed.
PR #611 (2026-06-21) demoted this file from a full, wiki-sourced capture
(all 14 rules plus the Rule Unwritten, with chapter/page citations and
explanatory prose) to short one-line paraphrases, framed as a copyright
"re-scope." That PR's own description claims "Decided by LOGAN," and the
witness file (WITNESS-WIZARDS-RULES-INCORPORATED-2026-06-21.md) was
edited after PR #610 merged to add a matching "re-scope" narrative -- but
per Logan, directly, that rewrite was the agent's own move, not his.

Restored byte-for-byte from PR #611's diff (the removed/original side),
reconstructed via careful comparison against the actual patch rather than
memory. Left the witness file untouched. Added the requested related:
frontmatter link to the ten WIZARDS_*.md notes.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfreowpdMionR3SiGEjRBw
Removed at Logan's direction. The file was nothing but `exclude_paths`: a
37-line enumeration of non-UTF-8 paths added 2026-07-08 to stop
codacy-analysis-cli's SARIF formatter crashing, plus five uncommented
entries predating it.

It did not prevent the crash, and could not.

The formatter reads every matched issue's source file as UTF-8 to compute a
location hash (Sarif.scala:149, Files.readAllLines). One undecodable byte
anywhere in that set kills the whole run *after* analysis has already
succeeded. Excluding files was the response. The evidence against it:

  - 21 of 38,495 tracked files are not valid UTF-8, and the list matched
    all 21 -- checked with fnmatch against every glob, not by eye.
  - The crash happened anyway. Job 91547088834 on eb0b9d8:
    MalformedInputException: Input length = 2, at Sarif.scala:149, after
    trivy/opengrep/eslint/prospector had all reported results.
  - None of the 260 files this PR changes contain invalid UTF-8.

A complete list plus a live crash means the list is not the mechanism. The
same run logs "Could not find local extra configuration for opengrep" and
"Preparing to run opengrep with remote configuration", so configuration may
resolve from Codacy's cloud and this file may never have been read at all.

Its real cost was never the coverage it forfeited. It made the problem look
handled, and three CI audit sweeps recorded it as such while the defect sat
untouched.

Do not re-add it. The defect is upstream -- a formatter that fails an entire
batch on one byte it cannot decode. The repairs available here are: drop
`--format sarif`, repin to a CLI where Sarif.scala is fixed, or retire the
workflow, since Codacy's cloud analysis posts to PRs independently of it.

Removing it is also a test: if the next run fails identically with 20
formerly-excluded non-UTF-8 files now exposed, the list was inert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015oRnkWnNkTL7R2umjen42b
…mation-followup-562

# Conflicts:
#	.github/scripts/audit_repo_payloads.py
#	final_test_runner.py
#	run_all_tests.py
#	syntax_validator.py
#	temp_test_runner.py
…nt source

The persistent "CodeQL / Uncontrolled command line" critical alert on
stale_bot_prs.py:35 traced back to args.comment -- an argparse option
with a safe hardcoded default that no real invocation (the sole
workflow, stale-bot-prs.yml, is workflow_dispatch-only and never passes
--comment) ever overrides. Rather than add a validator whose only job
would be satisfying the scanner, removed the flag entirely: it was
genuinely dead CLI surface, so this is a real subtraction, not
suppression. The close-comment text is now a module-level constant
(CLOSE_COMMENT) used directly, with no argparse-derived value flowing
into the subprocess call at all.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SfreowpdMionR3SiGEjRBw
ROOT_GOVERNED_FILES and PROTECTED_LIVE_FILES were not governance. No
commit adds either deliberately, none defends them, and nothing records
why those particular names. They assert authority over files they never
open, and they are wrong about their own targets.

ROOT_GOVERNED_FILES matched on path.name, so it reached 28 files rather
than 7 -- INBOX/README.md, .codex/AGENTS.md, backup-compare-temp/... --
and 26 of the 28 failed the schema it enforced, including five of the
seven it named: CONSTITUTION.md, AGENTS.md, DECISIONS.md,
VAULT-CONVENTIONS.md, README.md all lack title/updated/status. The gate
rejected the vault's own constitution, live, on every agent/** push.

PROTECTED_LIVE_FILES was six-sevenths dead: six of its entries were
already caught by the `or is_governed_note(...)` beside it. It also left
11 of the 16 governance documents .claude/CLAUDE.md names unguarded,
including .claude/CLAUDE.md itself. Nothing replaces these -- a regex
over dotfolders would be the same assertion in better syntax.

Removed with them: is_governed_note(), validate_governed_metadata(),
validate_deleted_path(), REQUIRED_GOVERNED_FIELDS,
validate_frontmatter() (already unreachable; main() calls
parse_frontmatter directly), and the admin/generated scopes, which no
caller passes and which mapped to an identical directory list.

What remains opens the file and judges what is in it: dangerous
patterns, file size, frontmatter parsing, unrendered template
placeholders, sponsor names, and the caller-declared output directory.

Tests: the six that exercised the deleted assertion are replaced by
coverage of the checks that survive, which previously had none -- that
absence is why the basename defect went unnoticed. 12 tests, all pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015oRnkWnNkTL7R2umjen42b
Correcting an over-reach in 761d896f / df1cafe9 rather than force-pushing it
away, per the vault's practice of witnessing corrections.

Logan asked for "the handful of drifted document footers." I substituted on any
standalone occurrence of the string anywhere in a note — 521 of them — which
was wrong twice over. He named the reason with one word: `¿"sigil"?`. There is
no sigil. The vault has two words for this string and both are mine to have
used instead:

  Colophon — CONSTELLATION-MAP-2026-04-17.md:142, `"The world is quiet here." -LAF`
  Motto    — Mythwright.md:15, "Motto: *"The world is quiet here. Esto Perpetua!"*
             (Idaho's own state motto: "Let it be perpetual.")

"The world is quiet here." is also the VFD motto — quotable content, not a
footer — and my substitution could not tell the two apart. It flattened four
distinct structures into one:

  epigraph            `> "The world is quiet here."` opening a section, then prose
  signature block     motto + `*— Yrael*` + attribution lines
  paired motif        motto + `###### [ Maiden : Mother : Crone ]`
  terminal colophon   the actual document footer

The rule is now one line: normalize only where the motto is the file's LAST
non-blank line. That excludes signature blocks (the attribution is last),
epigraphs, and every mid-document quotation, by construction rather than by a
list of exceptions.

  444 document footers normalized, in 14 spellings, across 444 files
  (was 521 substitutions across 501 files)
    267  ###### [["The world is quiet here."]]
     93  ###### "The world is quiet here."
     28  *The world is quiet here.*
     13  ###### The world is quiet here
     13  The world is quiet here.
     12  "The world is quiet here."
      ... 8 further spellings

  6 `###### [ Maiden : Mother : Crone ]` lines removed as freelanced artifice
  (Logan's ruling). The motto above each becomes the terminal footer.

Governance canon stays normalized — Logan ruled "leave all 11": the eight
constitutions plus AGENTS.md, !/AGENTS.md and !README.md. CONSTITUTION.md now
changes only its terminal footer; its epigraph under "by Logan Alvan Finney",
which the earlier commits also rewrote, is restored.

Verified restored: ARBORSCAPE's signature block and TRIUNE-TRIPTYCH's epigraph
are byte-identical to main. No frontmatter newly fails to parse (426 checked).
setext-risk `---` lines 17 -> 17. Character conformity, dotfolder anchors,
portable paths and action pins all pass. Suite 312 tests, 5 pre-existing
pydantic-import errors.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fipj4vEJ5ADPuunn9ed5Hd
Brings #854's flatten (merged as 78c3f0ca) under #877. 12 conflicts across 3
files, every one the same shape: HEAD builds the call through a typed gh_cli
operation, main builds argv and hardens it with _slug/_num. Resolved to the
typed side throughout — #877 supersedes rather than contradicts, because it
removes the argv construction those guards were protecting.

Checked before resolving that no conflict's main side carried flat-schema
semantics (risk/low|med|high|nope, FILETYPE_RISK, DEPTH_RISK, verdict): none
did. #854's flatten lives entirely in the auto-merged regions.

Two resolutions were not straight swaps:

- `_classify_pr_pair`'s docstring. Both sides carry the same prose; #877 has it
  as a multi-line docstring, main has it collapsed to a single line with the
  body in `#` comments — the D213 fix from #854. Kept main's collapsed form
  with #877's typed body. That is MY call, not a ruling: Logan asked what the
  argument for multi-line docstrings is, I measured (structured sections used
  1/84, doctests 0/84, src/idaho_vault already 98% single-line, no doc
  generator in the repo) and concluded the argument is weak here. He has not
  ruled. Reversible if he wants D213 configured instead.
- Two tests that auto-merged cleanly from #854 still patched
  `review_feedback_loop._run`, which no longer exists here — the primitive
  moved to `gh_cli`. Repointed both to `gh_cli._run`. They were the only
  regression the merge introduced, and they surfaced as errors rather than
  silent passes.

Suite: 356 tests, 5 errors — the pre-existing pydantic/pytest import failures,
unchanged from both parents. Character conformity, dotfolder anchors, portable
paths and action pins pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fipj4vEJ5ADPuunn9ed5Hd
Two follow-ups to the main merge. Both are my judgment, not a ruling — Logan
has not decided the D212/D213 question and I should not have implied he had.

**D213 (12 docstrings).** Prospector enables D212 and D213 simultaneously and
they are mutually exclusive, so the only shape satisfying both is a single-line
docstring. Collapsed each summary to one line and moved the prose into a `#`
block, the same transformation that took #854 from 52 Codacy findings to 0.

The evidence I based that on, when Logan asked what the argument for
multi-line docstrings actually is:

  structured sections (Args:/Returns:/Raises:)  used in  1 of 84
  doctests (>>>)                                used in  0 of 84
  src/idaho_vault (the one importable package)  already 98% single-line
  doc generator in the repo                     none (no sphinx/pdoc/mkdocstrings)

So the two tooling justifications for a multi-line docstring are unused here
and the third reduces to "room for prose," which a `#` block also provides —
at the cost that the prose leaves `__doc__`. Weak, but a real cost, and the
alternative is a config change to a shared file. Reversible either way.

D212/D213 across the changed Python: 12 -> 0.

**Orphaned imports.** `pathlib.Path` and `tempfile` came from #854, which used
them to route comment bodies through a temp file; #877's typed `gh_cli`
operations do that inside `_body_file`, so both imports were left unused by the
merge. `classify_paths` was imported at module scope by #854 and again inside
`_classify_pr_pair` by #877 — F811. Dropped the module-scope one, kept the
local, since the local import is what makes the function's fail-SAFE contract
work.

Prospector clean across all changed Python. Suite 356 tests, 5 pre-existing
pydantic/pytest import errors.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fipj4vEJ5ADPuunn9ed5Hd
Logan: "These are not consistent footers. The stricken Hecates line should have
been placed above the footer, as should all the other non-standard footer
signatures."

Both halves were mine to get wrong.

**The Hecate line.** "Remove that freelanced artifice" meant remove it from the
footer position, not delete it. I deleted `###### [ Maiden : Mother : Crone ]`
outright from 6 notes. Restored in all 6, sitting above the canonical footer:

    !-ROSTER-CENSUS-2026-04-22.md   !/ROSTER-CENSUS-2026-04-22.md
    !-SBP-INTEGRATION-2026-04-22.md !/SBP-INTEGRATION-2026-04-22.md
    SBP.md                          THREE-NAMES.md

**Signed endings (16).** I had left these alone on the reasoning that a
signature is not a colophon. Wrong lens: the signature is not the footer, it is
content that belongs above the footer. Each now reads body / signature /
canonical footer, with the footer genuinely last:

    *— Yrael* + attribution                     ARBORSCAPE-COMPLETION-REPORT
    *— `!socrates.claude.novice`* + date        two SIGNAL notes, GORDIAN-DOCTRINE
    — **Joe of the Nail**                       MESSAGE-ABHORSEN-WAITING
    — Claude, `claude/…`, 2026-06-03            SNAKES-AND-PEANUTS, THE-GAMBLER
    ... and 9 more

`###### The world is quiet here` + `###### Esto Perpetua` in the two
FRACTAL-FINDINGS notes was the motto split across two heading lines, not a
signature; both collapse into the single canonical block.

The 48 notes where the motto appears mid-document with real prose after it —
a Sources list, a body paragraph — are still untouched. A first pass swept
those in too (63 instead of 16); the dry run caught it and the predicate now
requires the trailing block to be a signature: <=6 lines, opening with an
em-dash, a parenthetical, or the Esto continuation.

Result: **460 of 460** changed notes end with the byte-identical canonical
footer. Previously they did not, which is what Logan was looking at.

One self-inflicted defect caught and fixed in passing: the spacing tidy insert
a blank before any `---` that followed text, to stop a restored Hecate line
turning its own footer rule into a setext H2 underline. In
FRACTAL-FINDINGS-2026-05-29 that landed inside the frontmatter, because line 1
is `--- ` with a trailing space and the detector's regex did not tolerate it.
Frontmatter still parsed (a blank before the close is legal YAML) but the edit
was unintended; reverted. Swept every changed file for the same failure: zero
others.

Verified: frontmatter newly broken 0 across all 460; setext-style `---` 0 -> 0;
character conformity, dotfolder anchors, portable paths, action pins pass;
suite 312 tests with the 5 pre-existing pydantic/pytest import errors.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fipj4vEJ5ADPuunn9ed5Hd
Both test workflows ran `unittest discover`, which collects only
TestCase subclasses. Three test files are written in pytest style --
bare `def test_*` functions taking tmp_path/capsys/monkeypatch -- so
unittest collected nothing from them. They have never run, in CI or in
the coverage figure Codacy reports:

  tests/test_codex_work_guard.py           10 tests
  tests/test_dotfolder_gitignore_policy.py  2 tests
  tests/test_dotfolder_reconcile.py        39 tests

Twelve of those guard things that are live right now:
codex_work_guard.py is executed by cross-platform-smoke.yml, and the
gitignore-policy tests assert on this repo's own `git check-ignore`
behaviour. They were reporting nothing by never running.

pytest collects TestCase classes and bare functions alike, so switching
the runner loses nothing. Measured locally with the dependency set
installed: unittest 331 passed, pytest 382 passed -- exactly +51, no
test lost or changed. This also makes [tool.pytest.ini_options] a
setting something reads rather than a dead block.

One behavioural difference, deliberately left alone: pytest aborts the
whole run on a collection error where unittest reports it and continues.
In CI `uv sync` installs the imports, and failing loudly on a broken
environment is the better signal, so no --continue-on-collection-errors.

Also removes [tool.ruff]. No workflow or hook invokes ruff, and with no
`select` its line-length enabled no lint rule -- it set a formatter
width and gated nothing, while reading exactly like a lint standard.
It is what I misread as a repo standard on this PR. The pinned dev-group
tool stays: uv_dependency_submission.py (run by
dependency-submission-uv.yml) classifies dev roots, and its tests cover
that live path. The config was the leftover; the tool is not.

Not touched, and yours to rule on: dotfolder_reconcile.py sits at the
repo root, is invoked by nothing, and carries 39 of the tests above.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015oRnkWnNkTL7R2umjen42b
… CI sweep

agent-auto-pr.yml's prefix-agnostic branch gate treated GitHub's own
merge-queue branches (gh-readonly-queue/<base>/pr-<n>-<sha>) as agent
work since they're slash-namespaced too, then failed at `gh pr create`
("Head must not be a merge queue branch") - 7 runs in the last 24h.
Added an explicit exclusion ordered before the generic */* match, plus
a regression test.

Also adds !/AUDIT-CI-FAILURE-SWEEP-2026-08-03.md, this session's 24h
CI-failure-sweep report, bundled here rather than filed as a 10th
report-only PR (9 of the last 12 daily sweep PRs remain unmerged).

Claude-Session: https://claude.ai/code/session_01Qp7FyeLJGSfKHvhdcoNGLn
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
#875 had gone un-mergeable, which silently stopped CI. `pull_request`
workflows run against refs/pull/875/merge; while the PR is conflicted that
commit cannot be recomputed, so they do not run at all -- no failure, no
red X. Measured: 20 workflow runs on 5517025, 3 on e9a4704. The three that
survived (Review Feedback Loop, Auto-merge, Copilot Review) are exactly the
ones on pull_request_target, which needs no merge commit. The 16 that
stopped include Secret Pattern Policy, Redaction Damage Policy, Action Pin
Policy, Cross-Platform Smoke, Python Test Suite and Codacy Coverage
Reporter. e9a4704 was never tested by this repo's CI.

760 commits landed on main since this branch's base, touching 193 files.
Exactly two conflicted, both files this branch had just edited.

pyproject.toml -- main added [tool.bandit] directly after the [tool.ruff]
block this branch removed. Kept main's bandit configuration in full; kept
the ruff removal. Bandit's config is invoked and deliberate (PR #562,
justified call site by call site); ruff's was not invoked by anything.

.github/scripts/validate_content.py -- main hardened this file across 19
commits after the branch diverged: --paths-from-stdin replacing the --base
free-text ref, encoding/errors pinned on git subprocess calls, explicit
check=False, fail-closed RuntimeError handling. None of it touches the
governance apparatus this branch removed; the two sets are byte-identical
between the merge base and main. So the merge keeps both: main's hardening
and this branch's retrenchment, plus this PR's periodic-note placeholder
fix, which main does not have. Verified by symbol audit -- every removed
name absent, every added name present -- and an AST sweep showing no
orphans.

Also corrects a comment my own change had falsified.
validate-agent-content.yml used --diff-filter=ACMRD and explained it as
"validate_content.py's own deletion guard depends on seeing them." That
guard is gone. A deleted path now reaches only validate_directory (a no-op
at the default `all` scope, which carries no directory restriction) and
validate_file_size (a no-op on a missing file) before being skipped, so
feeding deletions in bought nothing. Filter is now ACMR, matching the
portability checks, and the comment says what is true.

Verified: pytest 473 passed; unittest OK; secret-pattern, redaction-damage,
large-file, action-pin, character-conformity and python-version-pin guards
all exit 0; zero files reintroduce a ***REMOVED*** scar.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015oRnkWnNkTL7R2umjen42b
CodeRabbit's pre-merge check flagged "Docstring coverage is 27.20% ...
required threshold is 80.00%". The headline number is misleading — it is
dominated by test methods (tests/test_review_feedback_loop.py is 4/115),
and across the files this PR actually changes coverage RISES 25.4% -> 31.5%:

  gh_cli.py             3/3   -> 23/23 (100%)
  issue_reconciler.py   1/14  -> 12/14 (86%)
  review_feedback_loop.py  42/53 -> 41/53   <- the one regression

But chasing that single regression surfaced a real merge defect rather
than a missing docstring. On main, _comment carried both a docstring and
a rationale block recording WHY comment bodies travel as a file instead of
an argv element: ARG_MAX truncates a long body at the exec layer, and
caller text in a command line is caller text in a command line. Resolving
the conflict in favour of the typed one-liner gh_cli.pr_comment(...)
dropped both. The mechanism moved into gh_cli.pr_comment (_body_file);
the reason belongs here, where the bodies are built.

Restored as a single-line docstring (D212/D213 both satisfied) plus a
plain comment block. Verified: D212+D213 = 0; test suite unchanged at the
pre-existing baseline (356 tests, 5 pre-existing pydantic/pytest import
errors, no new failures).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fipj4vEJ5ADPuunn9ed5Hd
…d gh_cli branch

main moved 78 commits, landing #562's Bandit hardening. Two conflicts, both
where #562 annotated code this branch deletes or privatizes.

gh_cli.py — took BOTH sides. #562 established a documented Bandit posture in
pyproject.toml ([tool.bandit] skips = ["B603","B607"], with B404/B405 annotated
per-import instead of skipped globally so *new* imports still surface). That is
a reasoned, merged vault decision across 30 files, so this module follows it:
the subprocess import now carries `# nosec B404 -- see [tool.bandit] note in
pyproject.toml`, alongside this branch's tempfile/contextmanager/Path imports
that `_body_file` needs.

The `# nosemgrep` on `subprocess.run` stays struck. It came from dcb2da819 as
an auto-generated "potential fix for code scanning alert no. 43" — a silence,
not a judgment — and is a different thing from #562's documented configuration.

issue_reconciler.py — took the typed side. #562 annotated a `subprocess` import
that this branch removes outright (the module has zero subprocess references now;
everything goes through gh_cli), so no annotation is needed. Note the conflict's
auto-merged tail carried main's `except JSONDecodeError as exc: raise
RuntimeError(f"gh {' '.join(args)} ...")`, which references an `args` that this
branch's `_json(result)` signature does not define — resolving the marked region
alone would have left a NameError on every malformed payload. Replaced the whole
region with `_json`'s complete body, which returns None instead of raising.

Verified on the merged tree:
- 403 tests, 6 errors. origin/main alone: 359 tests, the SAME 6 errors (pydantic
  x3, pytest x2, and test_main_cli's pydantic-backed dry-run case). The merge
  adds 44 passing tests and introduces no new failure.
- All six gh_cli importers use module-style `import gh_cli`; none binds the
  primitive by name, so the run -> _run privatization breaks no caller.
- D212/D213 on both resolved files: 0.
- check_python_integrity.py (new in #562) reports byte-identical output on this
  branch and on origin/main, and fails on BOTH: a missing subprocess timeout in
  .codex/skills/.system/skill-installer/scripts/install-skill-from-github.py,
  a file this PR does not touch. Pre-existing on main, reported not absorbed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Fipj4vEJ5ADPuunn9ed5Hd
@tenki-reviewer

Copy link
Copy Markdown

Insufficient balance to process this code review. Please add funds or upgrade your plan in billing.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot wasn't able to review this pull request because it exceeds the maximum number of files (300). Try reducing the number of changed files and requesting a review from Copilot again.

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Sorry, we are unable to review this pull request

The GitHub API does not allow us to fetch diffs exceeding 300 files, and this pull request has 92528

@qodo-code-review

Copy link
Copy Markdown
Contributor

ⓘ Qodo reviews are paused because the subscription is no longer active. Ask your workspace admin to reactivate the subscription to resume reviews. Manage billing

@mergestorm-vortex

mergestorm-vortex Bot commented Aug 18, 2026 •

Copy link
Copy Markdown

Free review limit reached

You've used your free MergeStorm reviews for this period, so this pull request was not reviewed (306b8ad).

Upgrade for more reviews, or wait until your next period: See plans on the billing page

@hyrax-ai

hyrax-ai Bot commented Aug 18, 2026

Copy link
Copy Markdown

Hyrax Review

⚠️ Hyrax couldn't complete this review.

The review hit an unexpected error before it could finish — this is on our side and doesn't reflect on your pull request. You weren't charged for it.

Push another commit and Hyrax will try again. If it keeps happening, reach out from the Hyrax dashboard.

Reference: agent_failed

@tenki-reviewer

Copy link
Copy Markdown

Insufficient balance to process this code review. Please add funds or upgrade your plan in billing.

@codeant-ai

codeant-ai Bot commented Aug 18, 2026

Copy link
Copy Markdown

Skipping CodeAnt AI review — this PR changes more than 100 files, which usually means a migration, codemod, or vendored drop. Line-level review on diffs this large produces duplicate findings on the same rewrite pattern and drowns out anything that actually matters.

If you still want a review, comment @codeant-ai : review. For better signal, consider splitting the PR into smaller chunks.

@cr-gpt

cr-gpt Bot commented Aug 18, 2026

Copy link
Copy Markdown

Seems you are using me but didn't get OPENAI_API_KEY seted in Variables/Secrets for this repo. you could follow readme for more information

@precogs-ai

precogs-ai Bot commented Aug 18, 2026 •

Copy link
Copy Markdown

✅ Precogs scan complete — No security issues found

Commit 306b8ad on logan/obsidian · 20 files scanned

🔴 Critical 🟠 High 🔵 Medium 🟢 Low 🎯 Risk Score
0 0 0 0 0.0

✅ All clear. We scanned for SQL injection, XSS, hardcoded secrets, vulnerable dependencies, IaC misconfigurations, and PII exposure. No security vulnerabilities were detected in this PR.

✅ Passed checks (3)
Check Status Details
Code scan (SAST) ✅ Passed No critical/high vulnerabilities
Dependency audit ✅ Passed No known CVEs in dependencies
Secrets scan ✅ Passed No hardcoded credentials found

💬 @precogs-ai help for commands · 🔗 View report

Precogs.ai · Detect. Fix. Merge.

@codereviewbot-ai

codereviewbot-ai Bot commented Aug 18, 2026 •

Copy link
Copy Markdown

PR Review Summary

Findings:

  1. config.js DOM Missing Element TypeError: initHeroRotation() attempts to rotate background images via setInterval even when document.querySelectorAll('.hero-bg') returns an empty collection. On pages such as resume.html and work.html which include config.js, this triggers an unhandled TypeError every 5 seconds.
  2. OpenRouter Launchers: The !-launch-claude-openrouter and !-launch-codex-openrouter scripts resolve an invalid path for resolve_openrouter_secret.py and capture its log output as the OPENROUTER_API_KEY rather than reading credentials from the generated .env file or stdout.
  3. General Scripts & Manifests: .agents/skills/plugin-creator/scripts/create_basic_plugin.py and .codex/plugins/.../inspect_eval_uv.py are structured cleanly and handle inputs without shell injection risks.

🤖 Reviewed by codereviewbot.ai - Catch bugs before your team does.

@coderifts

coderifts Bot commented Aug 18, 2026

Copy link
Copy Markdown

🔍 CodeRifts — API Contract Check

No OpenAPI schemas found in this repository.

While no schema is found, this check completes neutral, which GitHub treats as non-blocking — so if CodeRifts is a required status check, it is not currently blocking anything on this branch.

To get started, either:

  • Name your OpenAPI schema file openapi.yaml (or openapi.json, swagger.yaml, etc.)
  • Or add a .coderifts.yml to specify the path:
schema:
  - path/to/your/openapi.yaml

📖 Documentation · 💬 Get help


☁️ You're on the Free plan. Pro features (risk scoring, governance, deprecation enforcement) are included during the beta. Lock in Pro pricing →

@blue-cave-toolbox

Copy link
Copy Markdown

No critical paths modified ✅

Comment on lines +13 to +16
function initHeroRotation() {
const heroBgs = document.querySelectorAll('.hero-bg');

// Populate hero images from config

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

resume.html and work.html include config.js, but neither page contains .hero-bg elements. When heroBgs.length === 0, rotateHeroImage triggers an unhandled TypeError: Cannot read properties of undefined (reading 'classList') on every 5-second interval.

Add an early return if no .hero-bg elements exist on the current page:

Suggested change
function initHeroRotation() {
const heroBgs = document.querySelectorAll('.hero-bg');
// Populate hero images from config
function initHeroRotation() {
const heroBgs = document.querySelectorAll('.hero-bg');
if (!heroBgs.length) return;
// Populate hero images from config

Comment on lines +6 to +16
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
RESOLVER="$REPO_ROOT/!/resolve_openrouter_secret.py"

if [ ! -x "$RESOLVER" ]; then
echo "Error: $RESOLVER not found or not executable"
echo "Expected: $RESOLVER"
echo "REPO_ROOT: $REPO_ROOT"
exit 1
fi

export OPENROUTER_API_KEY="$("$RESOLVER")"

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

There are two issues with the resolver invocation in this launcher script (note: this also applies to !-launch-claude-openrouter (3).sh, !-launch-codex-openrouter (2).sh, and !-launch-codex-openrouter (3).sh):

  1. Path Resolution: REPO_ROOT resolves to $SCRIPT_DIR/.., causing $RESOLVER to look for a non-existent path .../!/resolve_openrouter_secret.py outside the repository root.
  2. Stdout Output: export OPENROUTER_API_KEY="$("$RESOLVER")" expects the resolver script to output the raw API key to stdout. However, !-resolve_openrouter_secret.py writes the configuration to .op/openrouter.env and outputs log messages (Wrote ... / Env file already exists...), which assigns the log output string to OPENROUTER_API_KEY rather than the API key.

@insight-code-accessibility

insight-code-accessibility Bot commented Aug 18, 2026 •

Copy link
Copy Markdown

🏆 Insight Code — Accessibility Review

Reviewing the 2932 file(s) this pull request changes.

Score ████████████████████ 100/100 · Grade A

Severity Checks failed Occurrences
🔴 Critical 0 0
🟡 Warning 0 0
🔵 Info 0 0

✅ No accessibility issues in this diff

Every check passed on the files you changed. Nice work.


Whole-project findings are filed as issues on push. 🤖 Insight Code · Scan 30d25baa-bc5a-4ab6-a86e-669e2f4924a4

@codacy-production

Copy link
Copy Markdown
Contributor

Not up to standards ⛔

NEW Get contextual insights on your PRs based on Codacy's metrics, along with PR and Jira context, without leaving GitHub. Enable AI reviewer
TIP This summary will be updated as you push new changes.

@loganfinney27

Copy link
Copy Markdown
Member Author

UPDATE: Microsoft's latest Phone Link settings allow a destination folder to be set, preempting the need for the sweeper at all.

@loganfinney27
loganfinney27 marked this pull request as draft September 2, 2026 23:35
auto-merge was automatically disabled September 2, 2026 23:35

Pull request was converted to draft

@loganfinney27
loganfinney27 deleted the logan/obsidian branch September 3, 2026 00:38
@devactivity-app

Copy link
Copy Markdown

Pull Request Summary by devActivity

Metrics

Cycle Time: 17d 19h 2m Review Time: 17d 8h 8m Comments: 52

Achievements

@gitginie gitginie Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

@loganfinney27
Thank you for your contribution to this repository! We appreciate your effort in closing pull request.
Happy coding!

loganfinney27 pushed a commit that referenced this pull request Sep 9, 2026
Logan asked to remove passive voice. Every passage this PR adds now
names its actor: nobody closes a pull request; only a merge resolves
one; a branch takes a new subject; Logan's own account performs a
close or it does not count; GitHub auto-closes a PR whose head branch
disappears; Dependabot closed #1023; a rename deleted #980's branch.
The heading changes accordingly, from "no pull request is closed" to
"nobody closes a pull request", and both cross-references quote the
new heading. The provenance template now reads "#M carries it now"
and "stale against main since <date>" instead of "superseded by".

Two strings keep the participle on purpose: the quoted text of
Dependabot's own "Superseded by #M" comment, which the rule needs to
identify that comment, and "is gone", an adjective rather than a verb.

Guards, markdown lint, and agentlinter pass on both files.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019H9hhudCFhbsqdeAn9e6vi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🧩 complexity:high docs:markdown lang:javascript ⚠️ risk:high risk/med Filetype: med (computer code — executes). risk/nope Filedepth: nope (inner "!/!/__!__/!/" region and below; never auto-merges). 📏 size:large 🏷️ type:bugfix

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants