bridge-learn — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited bridge-learn (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
/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.
| Trigger | Mode |
|---|---|
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 list | List-only — no actions, just an overview |
User says /bridge-learn trends | Trends — recurring + sleeping skills, no proposals |
User says /bridge-learn <proposal-id> | Single — go directly to that proposal |
work/_learning/proposals/*.md — all pending proposalswork/_learning/audit-trail.md — lifecycle log (for statistics)work/_learning/audit-history/ — Phase 3, for trends sectionbridge-config.yaml.learning — thresholds (auto_surface_threshold etc.)work/_learning/skill-usage.jsonl — Phase 4, for "sleeping skills"═══ 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 / quitSort proposals by:
created first╭─ 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> │
│ │
│ Prior rejections (if prior_rejections set): │
│ <id>: <reason> │
│ │
│ Verification (if verification set): │
│ <kind>: <command> │
│ before: <before> after: <after> │
│ │
╰───────────────────────────────────────────────────────╯
[a]ccept [r]eject [e]dit [d]efer [s]kip [q]uitA proposal without verification: or prior_rejections: shows neither block, nothing else changes. prior_rejections means the writer found an earlier rejection on the same target and argued past it: read that argument in the body before deciding. verification: is evidence for the reviewer, never a threshold: it does not accept or reject anything on its own (rules/learning-autonomy.md).
source.type: curator-suggestion whoseevidence cites skills/<name>/LEARNINGS.md#…, from /bridge-curator --pass learnings): accept writes the target AND, in the same commit, deletes each cited journal entry from LEARNINGS.md. That trim is part of the accept, not optional. A proposal that creates a journal (target.path: …/LEARNINGS.md, action: create) also appends the routing block to that skill's SKILL.md in the same commit, from docs/skill-learnings.md § Templates; check-skill-learnings.py fails on half a pair.
diff_preview is set AND is a literal diff/patch:target.path against repo rootaction: create: write file from diff bodyaction: edit: apply diffaction: delete: remove fileaction: rename: parse new path from body, git mvdiff_preview is descriptive prose (not literal diff):git mv work/_learning/proposals/<id>.md work/_learning/proposals/accepted/<id>.md,then set status: accepted and accepted_at: in its frontmatter (Edit tool).
python3 scripts/learning-ledger.py record <id> --to accepted --reason "<user's note, or omit>"The script measures the timestamp and refuses if folder or status do not match accepted yet.
Suggested commit: <type>(<scope>): <one-line summary from proposal>
<2-3 line body>
Commit now? [y/n/edit]status: implemented in the proposal'sfrontmatter, then git commit the staged changes PLUS the moved proposal file and the step 5 trail row.
python3 scripts/learning-ledger.py record <id> --to implementedThe commit cell is HEAD's real short SHA plus its diffstat, never a placeholder. The same call stores implemented_commit and recurrence_fingerprint (<target.path>#<gap slug>, which trends mode checks against later evidence). For target.type: skill it also appends one line, - <date> · <id> · <why>, to work/_learning/provenance/<name>.md (created on first use, SKILL.md untouched), the why being the accept reason from step 5, else the first prose line of the proposal body. Rejecting never writes provenance. Commit that bookkeeping as a follow-up (chore(learning): record <id>); never amend, since amending changes the SHA the row just recorded.
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).
git mv work/_learning/proposals/<id>.md work/_learning/proposals/rejected/<id>.mdstatus: rejected, rejected_at:, reject_reason:python3 scripts/learning-ledger.py record <id> --to rejected --reason "<reason>"status: deferred + defer_until: <user-input>work/_learning/proposals/ (don't move — defer means "still pending later")python3 scripts/learning-ledger.py record <id> --to deferred --until "<defer_until>" --reason "<reason, or omit>"$EDITOR work/_learning/proposals/<id>.md)_schema.proposal.yamlNo state change. Move to next proposal.
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.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 reviewNo interactive walk. Just numbers + pointer.
/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.
/bridge-learn trends — focuses on Layer-2 aggregated signal:
Audit history (Phase 3):
Skill usage (Phase 4, opt-in):
Recurrences (implemented proposals that came back):
python3 scripts/learning-ledger.py recurrences: every implementedproposal whose target.path shows up in a newer proposal, postmortem or audit-history file is listed as recurred: <date> with that evidence
Task estimate-vs-actual:
work/done/YYYY-MM/*/STATUS.md: parse estimate_vs_actual fieldTrigger corrections (Phase 4):
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 modeThe summary lands as a /briefing block. User can drill in with /bridge-learn.
python3 scripts/learning-ledger.py check compares, for every proposal, the folder its file sits in, its frontmatter status, and its last audit-trail row, and flags placeholder timestamps, implemented rows without a commit and rows without a file. It reports and exits 1; it never fixes. Run it at the start of an interactive walk and show any finding before the first proposal.
Before any action, validate the proposal file:
status is one of the enum valuestarget.path is a non-empty stringtarget.action: edit or delete: target file must existtarget.action: create: target file must NOT existIf validation fails: show clear error + offer to repair via edit action.
The skill suggests commit messages following repo convention:
| Target type | Commit prefix |
|---|---|
| skill | skill(<skill-name>): |
| standing_order | standing-order(<name>): |
| rule | rule(<name>): |
| doc | docs(<area>): |
| protocol | protocol(<name>): |
| memory | memory: (or skip commit — memory edits go via auto-memory) |
| schema | schema(<name>): |
| config | config(<scope>): |
Use imperative present tense ("add", "tighten", "remove") — never "added" or "adding".
git push separately if desired)actual memory write goes through the auto-memory system — target.type: memory proposals produce a suggested entry text + path, user copy-pastes)
/briefing is the surface)/bridge-audit (Phase 3) to generate signal."[e]dit action; do not act on broken file.superseded with superseded_by: and superseded_at:, then python3 scripts/learning-ledger.py record <loser-id> --to superseded --reason "superseded by <winner-id>").[q]uit saves progress. Resume any time.skills/task-close-postmortem/SKILL.md — Layer 1 source of proposalsskills/bridge-audit/ — Phase 3 source of recurring-finding proposalswork/_learning/README.md — aggregation layer documentationwork/_learning/_schema.proposal.yaml — proposal frontmatter schema (the one definition)scripts/learning-ledger.py — audit-trail writer (record), consistency check, fingerprint, recurrences, prior rejectionsprotocols/standing-orders/task-sync.md — close-out flow that feeds proposalsbridge-config.yaml.learning.proposals — thresholds + Friday-surface configskills/briefing/ — invokes bridge-learn in summary mode on Fridays~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.