aax
無料Optional AAX support for Pulp, including developer-supplied Avid SDK setup, CMake enablement, DigiShell/AAX Validator workflows, and local AAX builds on macOS or Windows.
日本語の概要は準備中です。原文の説明を表示しています。
Turn a moment of friction — a conflicting PR, a wedged runner, a mysterious red check, a repeated manual chore — into a durable, actionable report. Sizes up the scenario, captures the evidence, separates one-off from SYSTEMIC, proposes a fix, and routes it (fix now, or hand off). Reports are LIVING documents that the fixing agent updates with the outcome. Invoke whenever something feels like it shouldn't have been this hard, or when the same annoyance shows up twice.
インストールする前に、エージェントに与えられる指示の中身を確認できます。
The point: most friction is paid twice — once when it happens, and again every time it happens to someone else. This skill pays it once by writing it down in a form the next agent can act on.
The trap this exists to avoid: an agent fixes a conflicting PR, feels productive, and never asks why the PR conflicted. The rebase takes ten minutes and the root cause survives to bite thirty more PRs. A fix without a report is a rerun waiting to happen.
Do NOT invoke for a genuine one-off (a typo, a flaky network call). The bar is: would this bite someone else?
This step exists because the skill failed without it. Its first real use produced a confident, well-evidenced, actively dangerous proposal — it identified a gate as a bug and recommended removing it. But the repo documented why that gate existed: it was added after a release silently failed to ship, and removing it would have reintroduced exactly that failure. The evidence was solid; the proposal was still wrong, because it never asked what the gate was protecting.
Most "obviously wrong" designs are scar tissue. Find the scar before you cut.
Do every check below. Write the answers into the report. A proposal without these sections is invalid.
Do not hardcode. Daniel uses Shipyard and tartci often, but not everywhere, and other repos differ. Detect:
ls .shipyard/config.toml # Shipyard? which gates/targets?
ls .tartci* tools/tartci* # tartci? self-hosted runners?
ls .github/workflows/ # plain GitHub Actions? which are REQUIRED?
ghapp api repos/{owner}/{repo}/branches/main/protection -q '.required_status_checks.contexts'
ghapp api repos/{owner}/{repo} -q '.allow_squash_merge, .allow_merge_commit, .allow_rebase_merge'
git log --oneline -5 origin/main # squash? merge commits? who pushes to main?
A fix that is correct for a plain-GHA repo can be wrong for a Shipyard repo, and vice versa. Say in the report which toolchain you actually found.
This is the step that was skipped. Search, in this order:
rg -i "why|rationale|deliberate|on purpose|do not|never" docs/guides/ CLAUDE.md
git log -S"<the mechanism>" --oneline # the commit that introduced it
git log --format='%B' -1 <that commit> # and WHY, in its message
git -C planning fetch -q origin main # NEVER read the pinned checkout
git -C planning log origin/main --oneline -- friction/ # has this been decided before?
git -C planning show origin/main:friction/<file>.md # read a report at origin/main
Read the corpus at origin/main, never at the submodule pin. Pulp's main
pins planning at a commit that runs weeks behind: measured 2026-09-19, the pin
was 1,672 planning commits and 373 friction-file changes stale. A fresh
worktree follows git submodule update --init planning and therefore reads a
three-week-old corpus by construction, in which reports closed days ago still say
OPEN. Every check below is worthless against that ref.
If a comment says "DO NOT FIX IT" or a doc explains a design, that is the answer — not an obstacle to route around.
Gates, guards, and awkward conventions almost always exist because something broke.
Ask: what did this prevent? If the answer is "I don't know," you are not ready to propose removing it. Search for the issue/PR number in the docs, the code comments, and the git history.
State it explicitly, in the report:
Current design prevents: <the failure> (evidence: <incident>)
My proposal preserves that guarantee by: <how>
...or it does NOT, and here is the trade: <what you'd be giving up>
If you cannot answer this, you have a hypothesis, not a proposal.
This step exists because a report failed without it. A git-state report proposed a pre-push hook to catch a silent no-op push — but a no-op push pushes nothing, so the hook never fires. The fix was proposed for a failure its own mechanism was structurally blind to. It read as confident and specific and it was wrong, and it was only caught because a human pushed back.
Before you write a fix down, prove its mechanism can detect the failure it targets. A check cannot catch what does not run. A pre-push hook cannot see a commit-time problem. A level-triggered alarm cannot see a transition. Assume nothing about what a mechanism can observe — test it.
Map each failure to the ONE mechanism that actually catches it, and say why the others do not:
| failure | mechanism that WORKS | why not the alternatives |
|---------|----------------------|--------------------------|
| ... | ... | ... |
If a fix bundles several failures under one mechanism ("a preflight will catch all of these"), that is the smell. Split it. Usually the failures need different mechanisms — a wrapper for one, a hook for another, a habit for a third — and some may have no clean mechanism at all, which you must say plainly rather than paper over.
(This is the same discipline as the personal confirm-the-failure skill, applied to the
FIX rather than to a measurement: prove the instrument can report the thing before you trust
it. If that skill is available in your environment, use it here.)
Shipyard, tartci, hosted CI, wrappers, and agent hooks can provide valuable defense-in-depth. They are not part of the public Pulp or Forge runtime. Every reliability report that involves one of those orchestrators must therefore classify whether the same failure can reach a developer or user who runs Pulp/Forge directly.
Add the exact ## Orchestrator independence block from the report template below and
choose one classification:
EXPOSED: the failure can occur through public source, CLI, SDK, app, plugin, or
standalone use without the orchestrator. The fix is incomplete until the public
Pulp/Forge layer owns a source-level mechanism and a focused proof. An
orchestrator-side repair may remain as optional defense-in-depth.NOT EXPOSED: the failure exists only in orchestrator state, queueing, fleet
custody, or another non-public layer. Cite concrete evidence. The public mechanism
and public proof fields must each say N/A — <reason>; bare N/A is not evidence.Do not classify from component names. A failure discovered by Shipyard can still be a public Pulp lifecycle bug, and a failure seen while building Pulp can still be purely a Shipyard queue bug. Trace the failure to the lowest layer that can independently reproduce it.
Before publishing the report, run the cheap static check (no build, network, or Shipyard required):
python3 tools/scripts/friction_report_exposure_check.py planning/friction/<report>.md
This check validates that the classification and evidence are present. It deliberately
does not claim the named source fix works; the report's focused proof remains the
authority for that. An EXPOSED report cannot move to FIXED/RESOLVED until that
public mechanism and proof have landed; an orchestrator-only receipt cannot substitute.
Every proposal ends with an honest line:
Confidence: HIGH | MEDIUM | LOW
Why: <what I verified>
What would raise it: <the check I did not run>
"I verified the diagnosis but not the fix" is a legitimate and useful thing to publish. Overstating confidence is how a report becomes worse than no report.
1. What is stuck, exactly?
Not "CI is red" — which check, on which commit, failing how. Get the evidence before
the theory. Use ghapp, never plain gh.
2. Is this a ONE-OFF or is it SYSTEMIC? This is the whole value of the skill, and it is the question people skip.
Ask: could this have happened to any other PR this week? If yes, it is systemic, and the fix is not "rebase this branch."
Signals of systemic:
3. What is the smallest change that makes this class impossible? Not "be more careful." Not "remember to rebase." A mechanism.
Write to planning/friction/YYYY-MM-DD-<slug>.md (private submodule). Use this shape:
# <one-line title: what got stuck>
**Status:** OPEN | IN PROGRESS | FIXED | WONTFIX | SUPERSEDED
**Filed:** <date> by <agent>@<host>
**Owner:** <unassigned | agent | Daniel>
**Class:** one-off | SYSTEMIC
**Recurrence:** first time | seen N times (link prior reports)
## What happened
Plain language. What was being attempted, what blocked it, how long it cost.
## Evidence
The commands and their output. Not a narrative — the receipts.
## Root cause
Why it ACTUALLY happened. If the answer is "someone forgot," dig again:
a mechanism that depends on remembering is the root cause.
## Why it will recur
The specific reason this is not a one-off. Name the other PRs/agents/days it would hit.
## The fix now (unblock)
The tactical thing that gets this specific instance moving. Usually boring.
## The fix forever (prevent)
The mechanism that makes this class impossible. Ranked if there are options,
with the cost of each. Say plainly if the good fix is blocked on something else.
## Orchestrator independence
**Public exposure:** EXPOSED | NOT EXPOSED
**Evidence:** <lowest independently reproducing layer and exact evidence>
**Public mechanism:** <Pulp/Forge source path or N/A — reason>
**Public proof:** <focused public-path test/receipt or N/A — reason>
**Orchestrator role:** <optional defense-in-depth, primary orchestrator-only fix, or N/A — reason>
## Routing
- [ ] Fix now, by me
- [ ] Hand off — needs <what>: <why I am not doing it>
<!-- Filing a "Fix now" you will land later? Put the PR number here NOW.
The merge lands after your session ends and nobody will be present
to fill Resolution. -->
## Resolution ← the fixing agent MUST fill this in
**Outcome:** <what was actually done>
**Landed in:** <PR / commit>
**Did it work?:** <verified how>
**Still open:** <what was NOT fixed, and why>
A report's Status: is the filer's claim at filing time, not a fact about now.
Verify it against code on origin/main before routing it to Daniel or starting
work on it. Measured 2026-09-19: ~20% of the corpus read OPEN while the fix was
already on main, and two such reports were put in front of Daniel as live
decisions that no longer existed.
This costs one grep per report and only fires where staleness is expensive — the ~23 reports that are OPEN or IN PROGRESS and routed to a human. It is cheap precisely because it is not run over the whole corpus.
The failure is not that filers are careless. A fix is often authored within
minutes of its report by an agent holding that report — but it lands
asynchronously through the merge queue after that session has ended, and Status
is only honestly flippable once it lands. Nobody is present at that moment. So the
check belongs where someone IS present: at the point of use.
Do not reach for a heuristic screen instead. Three have been tested against this corpus (unfilled Resolution, names-a-merged-PR, Fix-now-checked) and none beat the base rate; one caught 0 of 4 known-stale reports.
Fix now when the fix is bounded, reversible, and you have the context loaded.
Hand off when any of these are true — and say which one:
Handing off is not failure. A precise report that another agent can execute is worth more than a rushed fix that misses the root cause.
Any agent that picks up a friction report MUST update its Resolution section — even
if the answer is "tried, did not work, here is why."
An unresolved report with an honest Resolution is useful. A silently abandoned report is worse than no report: it looks like the problem was fixed.
Absence of a resolution is never evidence of resolution.
Before filing a new report, grep planning/friction/ for the same symptom. If it exists,
bump its Recurrence and add to it rather than filing a duplicate. Three recurrences on one
report is a promotion signal — that class needs a real fix, now.
| Don't | Do |
|---|---|
| "Rebased and re-pushed. Fixed!" | Ask why it conflicted, then write it down. |
| A report with no evidence | Paste the commands and their output. |
| "We should be more careful" | Name a mechanism. Carefulness does not scale to 35 PRs/day. |
| Filing a duplicate | Grep first; bump Recurrence. |
| Fixing it and closing without a Resolution | The Resolution is the point. |
| Blaming an agent | Blame the mechanism that let it happen. |
Today the skill files a report to planning/friction/ (private, synced to every machine).
That is Level 0, and it is deliberately the whole product for now. Reports pile up; a
human reads them at their own pace. The value is passive: after a handful you can see whether
the reports are accurate and root-cause-real, or noise.
Graduate only when the current level has earned it. Each level is a trust milestone, not a calendar date.
| Level | Behaviour | Graduate when… | Never |
|---|---|---|---|
| 0 — now | Files to planning/friction/. Human reads. | ~5–10 reports are accurate, name real root causes, and pass Step Zero (no dangerous proposals). | — |
| 1 — triage | Human triages each report: fix-now / hand-off / wontfix. Report is the spec. | Level-0 reports consistently earn "yes, act on this." | — |
| 2 — assisted act | An agent executes a report the human greenlit, then fills in Resolution. | Hand-offs land correctly without the human re-explaining. | Act on anything a human did not greenlit. |
| 3 — bounded autonomy | Agent auto-acts on pre-approved low-risk classes only (e.g. rebase-a-stale-PR), logs to #activity, escalates the rest. | Level-2 has a track record on that specific class. | Destructive or irreversible actions — always stop at a human. |
planning/friction/ (the private submodule). A
public GitHub issue, if ever wanted, is a sanitized pointer ("CI friction filed — see
internal tracker"), never the raw report. Reports routinely contain host names, account
emails, internal incident numbers, and command output. Nothing sensitive goes public.Resolution. Without it, an autonomous fix is indistinguishable from an autonomous
mistake. This is the invariant the higher levels rest on — build it into every actuator,
not as an afterthought.confirm-the-failure discipline.This never becomes a bot that files noise or auto-closes things to look productive. The metric is not reports filed or issues closed. It is classes of friction that stopped recurring because a report led to a real fix. A folder full of OPEN reports that no one acted on is a failure of triage, not a success of filing.
まだレビューはありません。使ってみた感想をお寄せください。
概要と使いどころ
Optional AAX support for Pulp, including developer-supplied Avid SDK setup, CMake enablement, DigiShell/AAX Validator workflows, and local AAX builds on macOS or Windows.
日本語の概要は準備中です。原文の説明を表示しています。
Configure, implement, and test Pulp's optional desktop Ableton Link tempo-sync adapter while preserving the developer-supplied SDK, licensing, realtime, latency-compensation, and no-install boundaries.
日本語の概要は準備中です。原文の説明を表示しています。
Maintain Pulp's installed design-time agent capability manifest and public-surface ledger. Use when adding, removing, renaming, or materially changing public audio, MIDI, signal, timebase, or sequence APIs; registering a new algorithm for generators; changing capability support or deprecation state; or repairing agent-capabilities freshness, schema, fingerprint, tombstone, or installed-SDK tests.
日本語の概要は準備中です。原文の説明を表示しています。
Android platform development for Pulp — NDK cross-compilation, Oboe audio, Dawn/Skia GPU rendering, JNI bridge, touch interaction, emulator workflows, and end-to-end smoke validation. Covers build, deploy, debug, and the gotchas discovered during bringup.
日本語の概要は準備中です。原文の説明を表示しています。
Optional ARA support for Pulp, including developer-supplied ARA SDK setup, CMake enablement, adapter companion APIs, validation, and ARA-aware plugin implementation guidance.
日本語の概要は準備中です。原文の説明を表示しています。
The measurement surface for ALL Pulp DSP and audio-pipeline work — read it BEFORE writing or gating DSP, not only when something already sounds wrong. Covers the C++ harness (signal generators, metrics, assertions, RenderScenario, contracts), the offline Audio Doctor (magnitude/frequency response, THD/THD+N, phase/group delay), and their Python sibling the Audio Quality Lab (tools/audio/quality-lab — null residual + alignment, LTAS log-spectral distance, spectral flux/centroid, HNR, Theil-Sen drift slope, Kaiser-sinc resampling, license-guarded corpus, regression-net ratchet). TRIGGER on AUTHORING work — "build/design an oscillator/filter/synth/effect", "add a DSP module", "what should the acceptance gate be", "how do I measure aliasing / anti-aliasing / alias floor", "null against a reference", "is this DSP correct", "choose a tolerance", "golden/regression corpus for audio", "measure drift or jitter", "A/B two renders" — AND on DEBUGGING work — "is there sound / no audio / I hear nothing", "does this filter/compressor/synth/delay produce the right signal", "prove the DSP / prove the contract", "measure the frequency response", "what's the THD / is it distorting", "what's the group delay / phase response / measured latency", "magnitude response curve", "render a test tone and assert", "audio regression", "64-frame works but 128 is silent", "sample-rate change pitch-shifted it", "describe what's in this buffer", "audio doctor", "compare before/after a DSP refactor". Reach for this BEFORE hand-rolling any FFT, null test, alias measurement, pitch tracker, or golden-render script — most of it already exists in one of the two lanes. Test/tool layer over HeadlessHost — deterministic, no audio device, no speakers. Off the realtime thread entirely.
日本語の概要は準備中です。原文の説明を表示しています。