agentsclimarketplace

Bridge learn

Skill bks-lab/open-bridge/skills/bridge-learn

Review surface for Bridge Learning-Loop proposals — lists pending improvement suggestions from work/_learning/proposals/, groups by severity (P0 → P3), walks the user through each proposal with accept/reject/edit/defer decisions. Accept applies the diff_preview (or asks the user for the patch), moves the proposal file to proposals/accepted/, logs to audit-trail.md, and suggests a commit message. Reject asks for a one-line reason, moves to proposals/rejected/, logs. Optional trends section shows audit-history recurring findings and sleeping skills (Phase 3+4 data). Auto-surfaces in /briefing on Fridays when N+ pending (threshold in bridge-config.yaml.learning.proposals.auto_surface_threshold). Trigger: "/bridge-learn", "bridge learn", "review proposals", "learn review", "what did we learn", "pending proposals", "improvement queue", "review improvements", "check proposals", "review improvements", "what have we learned".From its SKILL.md

Install
npx -y skills add bks-lab/open-bridge --skill bridge-learn

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • 8 stars8 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
  • runs commandsInstructs the agent to run 4 commands, including `git mv work/_learning/proposals/<id>.md work/_learning/proposals/accepted/<id>.md` and 3 more.

SKILL.md

12.8 KB, ~3.1k tokens by cl100k_base, as published. Nobody here has run it

Bridge Learn — Review Surface for Improvement Proposals

/bridge-learn is the Layer-3 edge of the Bridge Learning-Loop architecture (see work/_learning/README.md). It consumes proposals written by task-close-postmortem (Phase 1) or /bridge-audit recurring findings (Phase 3) and walks the user through accept/reject decisions.

Never auto-apply. Every accepted proposal is materialized through a git commit on user/<name>, audit-trail.md records it, git revert is always the rollback path.

When to use

TriggerMode
User says /bridge-learn / "review proposals" / "learn review"Interactive — full walk-through
/briefing skill invokes (Fridays, when pending ≥ threshold)Summary — count + 1-line list, no walk
User says /bridge-learn listList-only — no actions, just an overview
User says /bridge-learn trendsTrends — recurring + sleeping skills, no proposals
User says /bridge-learn <proposal-id>Single — go directly to that proposal

Inputs

  • work/_learning/proposals/*.md — all pending proposals
  • work/_learning/audit-trail.md — lifecycle log (for statistics)
  • work/_learning/audit-history/ — Phase 3, for trends section
  • bridge-config.yaml.learning — thresholds (auto_surface_threshold etc.)
  • (Optional) work/_learning/skill-usage.jsonl — Phase 4, for "sleeping skills"

Interactive walk-through

Header

═══ Bridge Learning Review — 2026-05-13 ═══

📋 Pending Proposals (N)
  P0  <id-1>                 (<source-type>)
  P1  <id-2>                 (<source-type>)
  P2  <id-3>                 (<source-type>)
  ...

📈 Trends (last 30d)              [if audit-history populated]
  Audit findings:  P0=0  P1=12→8  P2=23→27  P3=5
  Skills inactive: <N> of <total>  [if skill-usage populated]
  Task estimate-vs-actual: median 1.4x (vs 1.2x last month)

🔁 Recurring patterns (≥3 occurrences)
  - <pattern-1>  [→ proposal/audit-recurring exists]
  - <pattern-2>  [new — consider Standing-Order]

→ Review proposals one by one? [y/N]
→ Or: trends / list / quit

Sort proposals by:

  1. Severity (P0 first, then P1, P2, P3)
  2. Within severity: oldest created first
  3. Within same date: alphabetical by id

Per-proposal view

╭─ Proposal: <id> ──────────────────────────────────────╮
│                                                       │
│ Severity: <P0-P3>   Status: pending   Scope: <scope>  │
│ Source: <type> (<task-slug or audit-ref>)             │
│ Created: <YYYY-MM-DD>                                 │
│                                                       │
│ Evidence:                                             │
│   <list of source.evidence pointers>                  │
│                                                       │
│ Target: <type>/<action> — <path>                      │
│                                                       │
│ Body (excerpt or full if <50 lines):                  │
│   <markdown body of proposal>                         │
│                                                       │
│ Proposed diff (if diff_preview set):                  │
│   <diff_preview block>                                │
│                                                       │
╰───────────────────────────────────────────────────────╯

[a]ccept  [r]eject  [e]dit  [d]efer  [s]kip  [q]uit

Action: accept

  1. If diff_preview is set AND is a literal diff/patch:
    • Resolve target.path against repo root
    • For action: create: write file from diff body
    • For action: edit: apply diff
    • For action: delete: remove file
    • For action: rename: parse new path from body, git mv
  2. If diff_preview is descriptive prose (not literal diff):
    • Ask user: "Should I write the patch now? [y/n/edit]"
    • If yes: generate patch based on proposal body, show preview, then apply
    • If edit: user can refine the patch interactively
  3. Verify target file is valid (syntax-check YAML if YAML, schema if defined)
  4. git mv work/_learning/proposals/<id>.md work/_learning/proposals/accepted/<id>.md
  5. Append to work/_learning/audit-trail.md:
    | 2026-05-13 14:30 | <id> | pending → accepted | <user-supplied note or ""> | <commit-hash-or-staged> |
    
  6. Suggest a commit message (short, in the proposal's style):
    Suggested commit: <type>(<scope>): <one-line summary from proposal>
                      <2-3 line body>
    
    Commit now? [y/n/edit]
    
  7. If user accepts commit: run git commit -m ... on the staged changes PLUS the moved proposal file. Capture commit hash, update audit-trail.md row to point at the real hash.
  8. Mark status: accepted in proposal's frontmatter (Edit tool). If commit succeeded: transition to implemented and update frontmatter again.
  9. Upstream hint (scope: core only): if the accepted proposal has scope: core, the improvement is by definition generic — offer it to the community:
    💡 This improvement is scope:core — consider contributing it upstream
       via /bridge-promote → contribute (fork-based PR to the OSS upstream,
       content-safety gate runs first). Run now? [y/N]
    
    If yes: hand off to skills/bridge-contribute/references/workflow.md with the just-created commit as the candidate. Never auto-submit — the contribute flow has its own gates (leak scan + DCO + user confirm).

Action: reject

  1. Ask: "One-line reason? (why reject — will be logged in audit-trail)"
  2. git mv work/_learning/proposals/<id>.md work/_learning/proposals/rejected/<id>.md
  3. Update proposal frontmatter: status: rejected + append reject_reason: field
  4. Append to audit-trail.md:
    | <ts> | <id> | pending → rejected | <reason> | — |
    

Action: defer

  1. Ask: "Defer until when? (e.g. 'next-week', '2026-06-01', 'phase-3')"
  2. Update proposal frontmatter: status: deferred + defer_until: <user-input>
  3. Leave file in work/_learning/proposals/ (don't move — defer means "still pending later")
  4. Append to audit-trail.md:
    | <ts> | <id> | pending → deferred (<defer_until>) | <reason or ""> | — |
    

Action: edit

  1. Open the proposal file for user edit ($EDITOR work/_learning/proposals/<id>.md)
  2. After edit: re-validate frontmatter against _schema.proposal.yaml
  3. Return to per-proposal view with updated content
  4. User can then accept/reject/defer/skip again

Action: skip

No state change. Move to next proposal.

Action: quit

Save progress (which proposals were touched), exit cleanly. Print summary:

✅ Reviewed N proposals: <a> accepted, <r> rejected, <d> deferred, <s> skipped.
   <X> commits staged (run /commit or git commit to push).
   <Y> still pending — run /bridge-learn anytime.

Summary mode (called by /briefing on Fridays)

When invoked by /briefing or /bridge-learn summary:

🧠 Learning Loop — Pending Review (<N>)
   P0: <count>   P1: <count>   P2: <count>   P3: <count>
   Oldest pending: <YYYY-MM-DD> (<id>)
   → /bridge-learn to review

No interactive walk. Just numbers + pointer.

List mode

/bridge-learn list — one line per proposal, no walk:

📋 Pending Proposals (<N>)
   P1 2026-05-08 <id>    skill customer-a-coordinator triggers too broad
   P2 2026-05-13 <id>    standing-order research-claim-verification (NEW)
   P3 2026-05-10 <id>    memory: tahoe sleep behavior
   ...

Useful when user just wants to scan, not act.

Trends mode

/bridge-learn trends — focuses on Layer-2 aggregated signal:

Audit history (Phase 3):

  • Per-check severity trend: "skill-tree-drift P1 went 12 → 8 over 30d"
  • Recurring fingerprints (≥3 runs same finding): list with first/last seen dates
  • New-this-week findings: list

Skill usage (Phase 4, opt-in):

  • Inactive >30d: list
  • Inactive >60d: list (review-or-delete candidates)
  • Most-used (top 5): "for context, not action"
  • Time-spent: skills with median duration >5min (split candidates)

Task estimate-vs-actual:

  • From work/done/YYYY-MM/*/STATUS.md: parse estimate_vs_actual field
  • Median + worst-case last month
  • Flag: ">3x" tasks (where did time go?)

Trigger corrections (Phase 4):

  • Skills with ≥2 corrections in 30d: list with example mismatches

Friday auto-surface (called by /briefing)

In /briefing, after Stream B (board) but before Stream D:

threshold = config.learning.proposals.auto_surface_threshold  # default 5
trigger_day = config.learning.proposals.auto_surface_in_briefing  # default "friday"

if today == trigger_day and pending_count >= threshold:
    invoke bridge-learn in summary mode

The summary lands as a /briefing block. User can drill in with /bridge-learn.

Schema validation

Before any action, validate the proposal file:

  • Frontmatter parses as YAML
  • Required fields present (id, created, source, severity, status, scope, target, proposal_type)
  • status is one of the enum values
  • target.path is a non-empty string
  • If target.action: edit or delete: target file must exist
  • If target.action: create: target file must NOT exist

If validation fails: show clear error + offer to repair via edit action.

Commit-message conventions

The skill suggests commit messages following repo convention:

Target typeCommit prefix
skillskill(<skill-name>):
standing_orderstanding-order(<name>):
rulerule(<name>):
docdocs(<area>):
protocolprotocol(<name>):
memorymemory: (or skip commit — memory edits go via auto-memory)
schemaschema(<name>):
configconfig(<scope>):

Use imperative present tense ("add", "tighten", "remove") — never "added" or "adding".

What this skill deliberately does NOT do

  • ❌ Auto-accept based on pattern (e.g. "all P3 from postmortem → reject")
  • ❌ Auto-write proposals (that's task-close-postmortem and /bridge-audit Phase 3)
  • ❌ Push commits (user runs git push separately if desired)
  • ❌ Cross-instance reasoning (only this repo's proposals)
  • ❌ Edit MEMORY.md directly (proposal can suggest a memory entry, but the actual memory write goes through the auto-memory system — target.type: memory proposals produce a suggested entry text + path, user copy-pastes)
  • ❌ Notify externally (no Slack, no email — /briefing is the surface)

Edge cases

  • No pending proposals → print "✅ No pending proposals. Run a task close or /bridge-audit (Phase 3) to generate signal."
  • Proposal file malformed → show validation error + [e]dit action; do not act on broken file.
  • Two proposals target same file → flag both, ask user "these overlap — pick one?" (one accept implicitly supersedes the other; mark loser as superseded).
  • target.action: create but file exists → ask user: accept-and-overwrite / convert-to-edit / reject.
  • Proposal scope: core but content mentions org/customer names → block accept until /bridge-leak-check passes. (Run leak-check inline before move.)
  • User runs out of time mid-walk[q]uit saves progress. Resume any time.

Related

  • skills/task-close-postmortem/SKILL.md — Layer 1 source of proposals
  • skills/bridge-audit/ — Phase 3 source of recurring-finding proposals
  • work/_learning/README.md — aggregation layer documentation
  • work/_learning/_schema.proposal.yaml — proposal frontmatter schema
  • protocols/standing-orders/task-sync.md — close-out flow that feeds proposals
  • bridge-config.yaml.learning.proposals — thresholds + Friday-surface config
  • skills/briefing/ — invokes bridge-learn in summary mode on Fridays

What ships with it: 2 files

12.4 KB alongside SKILL.md

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.