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
33 changes: 33 additions & 0 deletions _kos/findings/finding-021-just-check-pyyaml-env-gap.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# finding-021 — `just check` assumes PyYAML in system python; fails wholesale on clean machines

**Date:** 2026-07-24 · **Run context:** run-17 wrap (manifest v0.5 edit) · **Class:** tooling friction (capture-before-workaround per aae-orc `.claude/rules/tooling-friction.md`)

## Symptom

`just check` exits 1 on mokuzai with `ModuleNotFoundError: No module named 'yaml'`
for **all five** YAML files (pack.yaml, three intent manifests, _kos/kos.yaml) —
including files untouched by the session. The recipe (justfile line 14–15) shells
out to bare `python3 -c "import yaml; ..."` per file; nothing declares or
bootstraps the PyYAML dependency. Any machine whose system python lacks PyYAML
fails validation regardless of manifest correctness. `just lint` degrades
gracefully on the same machine (markdownlint/yamllint probe with `command -v`
and skip); `check` does not.

## Workaround applied (this session)

Ran the same per-file validation through `uvx --with pyyaml python3 -c ...`
(uv-managed ephemeral env, per the global uv/uvx preference) — all five files
pass, including the new v0.5 `maintainer_capacity.pr_channel` block.

## Why this is happening

The recipe was authored on a machine where system python had PyYAML (brew
python site-packages, most likely). The dependency was invisible at authoring
time — classic works-on-my-machine env coupling in a repo whose CI (if/when it
runs `just check`) would install deps explicitly.

## Fix shape (not applied here — one-line recipe change)

Point the recipe at uv: `uvx --with pyyaml python3 -c ...` (or probe like the
lint recipe does and emit an actionable skip). Cheap, bounded; belongs in a
hygiene commit touching only the justfile.
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# finding-022 — GitHub SSH auth fails intermittently per backend endpoint; identical key accepted seconds later

**Date:** 2026-07-24 · **Run context:** run-17 wrap (pushing feat/pr-channel-cap) · **Class:** tooling friction (capture per aae-orc `.claude/rules/tooling-friction.md`)

## Symptom

`git push` / `git ls-remote` / bare `ssh -T git@github.com` all returned
`git@github.com: Permission denied (publickey)` for ~5 minutes, offering the
correct, long-registered key (`~/.ssh/id_ed25519_github`,
SHA256:HkD3evhf2qSlI9OauLLizAtqkOfeumHpTS70g2mBWos, authenticates as
`arcavenai`). The SAME command with the SAME key succeeded immediately before
and after the window. Verbose transcripts isolated the variable: success
authenticated against `140.82.112.3`, rejections came from `140.82.114.4`.
Server host key verified as GitHub's genuine ed25519 both times — no MITM, no
local config change, agent state irrelevant (key is `IdentitiesOnly` from
disk).

## Diagnosis

Endpoint-dependent auth flakiness on GitHub's SSH front-end pool (backend
`18bbdcb`). Nothing on this machine was wrong.

## Workaround / correct response

**Retry.** Each attempt may land on a different backend; a 4×/3s retry loop
succeeded on attempt 1. Fallbacks if a bad backend persists: HTTPS push with
`-c credential.helper='!gh auth git-credential'`, or SSH over
`ssh.github.com:443` (different pool).

## Anti-pattern this finding exists to prevent

`Permission denied (publickey)` reads as a local key/agent/config problem, and
the obvious moves — re-adding agent identities, editing `~/.ssh/config`,
regenerating keys, touching `core.sshCommand` — are all wrong here and leave
config debris. Before rewiring anything, check whether the failure is
endpoint-intermittent: run `ssh -Tv git@github.com` twice and compare the
connected IP and result.
6 changes: 5 additions & 1 deletion skills/beadle-triage/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,11 @@ cadence, and calling rational scarce-attention triage "drift."
not engagement. Do not grow the open measured-issue count while the
acted-share is below the manifest threshold; prefer fix-PRs-attached
(empirically the entire selection function); zero-new-issue pauses while
the maintainer drains are correct behavior, not idleness.
the maintainer drains are correct behavior, not idleness. The same
governance applies per channel: honor any manifest-declared channel cap
(`maintainer_capacity.pr_channel` — e.g. vsdd-factory's maintainer-requested
~10 concurrent open measured PRs); at the cap, queue locally and stagger
rather than opening more.
7. **A4 discharge path is the measured side's.** The alarm stays (data-loss
classes are why beadle exists), but its designed discharge is lowering
activation energy — shipping SDL fix PRs — not asking part-time humans to
Expand Down
16 changes: 14 additions & 2 deletions targets/vsdd-factory.intent.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@
# _kos/ideas/capacity-adjusted-direction-baselines.md and SKILL §6b).
# Direction verdicts, streak denominators, success bands, and prediction
# horizons are conditioned on this block. Operator-ratified 2026-07-22.
schema_version: 0.4
# v0.5: added maintainer_capacity.pr_channel — maintainer-requested soft cap on
# concurrent open measured-side PRs (~10; Zious11 via operator, 2026-07-24:
# the ~25-PR backlog preceding the 2026-07-19/22 drains was too much for
# his analysis tooling). SKILL §6b rule 6 governance, PR-channel analog.
schema_version: 0.5

target:
repo: drbothen/vsdd-factory
Expand Down Expand Up @@ -46,7 +50,7 @@ maintainer_capacity:
context: one of hundreds of projects for these maintainers; primary focus elsewhere
attention_window: action-day # a calendar day with >=1 maintainer action on this target
# Derived from the store's maintainer_actions dates; refresh each run.
observed_windows: ["2026-07-08", "2026-07-15", "2026-07-19", "2026-07-21", "2026-07-22"]
observed_windows: ["2026-07-08", "2026-07-15", "2026-07-19", "2026-07-21", "2026-07-22", "2026-07-23"]
success_bands:
pr_acceptance: # vs human ~68-73% / bot ~37-45% literature bands
green: ">= 0.60"
Expand All @@ -60,6 +64,14 @@ maintainer_capacity:
# All streak metrics (A4 included) report attention-window denominators FIRST;
# runs/calendar as shadow. Pre-registered prediction horizons are denominated
# in windows (default 4-6) and must test single-window actions (SKILL §6b).
# Maintainer-requested PR-channel cap (Zious11 via operator, 2026-07-24):
# keep concurrent open measured-side PRs to ~10. The ~25-PR backlog before
# the 2026-07-19/22 drains overloaded his analysis tooling. Soft cap, same
# governance class as §6b rule 6 (filing-rate), applied to the PR channel:
# at the cap, queue fixes locally and stagger — do not open more.
pr_channel:
max_open_measured_prs: 10
source: "maintainer request, relayed 2026-07-24 (Zious11 — analysis tooling)"

# Composite, weighted intent anchor (no single source is authoritative).
intent_sources:
Expand Down
Loading