skills/batch-filing-gaps/SKILL.md
Batch scan canvases for GAP sections, deduplicate, route to correct repos, draft issue bodies, and file confirmed issues.
npx skillsauth add 0xhoneyjar/construct-observer batch-filing-gapsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Scan all observer canvases for ### GAP-* sections, deduplicate similar gaps across users, route to the correct repo (score-api or midi-interface), draft issue bodies with user quotes as evidence, present for operator confirmation, and file approved issues via gh issue create.
Gaps are user-grounded. Every issue filed must trace back to at least one direct user quote or feedback entry. No speculative issues.
/gap-to-issues # Scan all canvases
/gap-to-issues --canvas <username> # Single canvas only
/gap-to-issues --repo score-api # Filter to score-api issues only
/gap-to-issues --repo midi-interface # Filter to midi-interface issues only
/gap-to-issues --dry-run # Preview without filing
/daily-synthesis run that detected new gapsGlob grimoires/observer/canvas/*.md and grep for ### GAP- sections.
For each GAP found, extract:
GAP-DATA-001)Skip gaps with status FILED or RESOLVED.
Group similar gaps across canvases:
Example: "Data staleness" appearing in 3 canvases → single issue with 3 user citations.
Before routing or filing any gap, classify its evidence to prevent filing inferred features as concrete requests.
4-Category Evidence Taxonomy:
| Category | Criteria | Filing Action |
|----------|----------|---------------|
| (a) User-reported bug | Direct quote describes broken behavior | File as issue |
| (b) User-expressed need | Quote contains explicit request ("I wish...", "Would like to see...") | File as issue |
| (c) Observed behavioral gap | User behavior implies X but no explicit quote requesting it | File with observed-pattern label |
| (d) Inferred feature | Extrapolated from user vision/sentiment — no direct quote supports it | BLOCK — do not file |
Gate Logic:
observed-pattern to labelsApply this gate per-gap before proceeding to Step 3.
| GAP Type | Target Repo |
|----------|-------------|
| ACCURACY | 0xHoneyJar/score-api |
| WEIGHTINGS | 0xHoneyJar/score-api |
| UX | 0xHoneyJar/midi-interface |
| FEATURE | 0xHoneyJar/midi-interface |
For each deduplicated gap, draft a GitHub issue:
## User Feedback Gap
**Gap Type**: {ACCURACY|WEIGHTINGS|UX|FEATURE}
**Severity**: {HIGH|MEDIUM|LOW}
**Users Affected**: {N} ({usernames})
### Evidence
> "{direct user quote}" — @{username} (Rank #{rank}, {crowd_tier})
> "{another quote}" — @{username2} (Rank #{rank}, {crowd_tier})
### Context
{Description of the gap, what users expected vs what happened}
### Score API Position of Reporters
| User | Rank | Tier | Signal Weight |
|------|------|------|---------------|
| {username} | #{rank} | {crowd_tier}/{elite_tier} | HIGH |
---
*Filed from observer gap analysis — grimoires/observer/canvas/{canvas}.md*
*Generated by /gap-to-issues*
Labels: feedback, {gap_type} (e.g., data-accuracy, calibration, ux)
For each deduplicated gap, scan the MER timeline for snapshots of affected wallets:
# For each affected wallet in the gap
for wallet_alias in "${affected_wallets[@]}"; do
mer_files=$(grep -rl "wallet_alias: $wallet_alias" grimoires/observer/timeline/MER-*.md 2>/dev/null || true)
if [[ -n "$mer_files" ]]; then
# Use most recent MER (last in sorted list)
latest_mer=$(echo "$mer_files" | sort | tail -1)
# Extract screenshot_url and score position from frontmatter/Data State
fi
done
If MER(s) found for any affected wallet, append to the issue body (after Evidence, before footer):
### Visual Evidence
| User | MER | Screenshot | Rank | Tier |
|------|-----|------------|------|------|
| {username} | [[timeline/{mer_id}]] |  | #{rank} | {crowd_tier} |
| {username2} | [[timeline/{mer_id2}]] | (data-only) | #{rank2} | {crowd_tier2} |
For wallets with screenshots, embed the image inline. For data-only MERs, show "(data-only)" in the screenshot column. For wallets with no MER at all, omit the row.
If no MERs exist for any affected wallet, skip this section entirely — the issue uses text-only evidence (existing behavior).
Score Position at Capture table (one per wallet with a MER):
### Score Position at Capture
| User | Combined | OG | NFT | Onchain | Crowd Tier | Elite Tier |
|------|----------|----|-----|---------|------------|------------|
| {username} | {combined} | {og} | {nft} | {onchain} | {crowd_tier} | {elite_tier} |
Display all drafted issues to operator for confirmation:
Gap Issues Ready to File:
1. [score-api] Data staleness in NFT holdings (HIGH)
Evidence: 3 users (xabbu, elcapitan, ncs)
→ File? [Y/n]
2. [midi-interface] Badge checklist missing earned indicators (MEDIUM)
Evidence: 1 user (xabbu)
→ File? [Y/n]
3. [score-api] Trust filter threshold unclear (LOW)
Evidence: 1 user (juri23)
→ File? [Y/n]
In --dry-run mode: Show drafts without the confirmation prompt.
For each confirmed issue:
gh issue create --repo 0xHoneyJar/{repo} \
--title "{title}" \
--body "{body}" \
--label "feedback,{type_label}"
Capture the issue URL from output.
For each filed gap, update the canvas:
IDENTIFIED to FILEDIssue: {url}| Error | Resolution |
|-------|------------|
| No canvases found | Report "No canvases to scan" |
| No GAP sections found | Report "No unfiled gaps detected" |
| gh CLI not authenticated | Error with gh auth login instruction |
| Issue creation fails | Log error, continue with remaining issues |
| Canvas write fails | Log warning, issue is still filed |
--dry-run creates no issues/analyze-gap — Single canvas gap analysis/file-gap — Single gap filing (this skill batches across canvases)/daily-synthesis — Detects gaps from UI feedbackdata-ai
Cognition orchestrator — analyze canvases, distill fears via /distill subagent, run gap analysis, optional cross-user synthesis.
development
Golden path /speak — generate RLM-isolated follow-ups with chronicle temporal context injection.
testing
# /snapshot — MiDi Experience Record (MER) Capture Capture a point-in-time MER for a wallet. Produces a 4-layer snapshot: data state, visual screenshot, user perception, and decision context. ## Usage ``` /snapshot <wallet-or-alias> /snapshot xabbu --trigger feedback /snapshot xabbu --data-only /snapshot --cohort /snapshot --cohort --diff MER-2026-001 ``` ## Arguments | Argument | Description | Required | |----------|-------------|----------| | `wallet-or-alias` | Wallet address or alias fr
development
Golden path /shape — consolidate journey patterns across canvases and file gap issues.