lorekeeper-pm — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited lorekeeper-pm (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.
Product management workflow for the Lorekeeper project.
lorekeeper-dev skill as they learnThese guide every decision — scoping, prioritization, design, review:
Practical application — backlog hygiene:
S:proposal.When committing as PM (Akane), set local git identity in the repo:
git config --local user.name "Akane (PM)"
git config --local user.email "[email protected]"This is enforced by the commit-msg hook. Load commit-convention skill for full details on message format, ticket tags, and examples.
Full ticket lifecycle, numbering, scripts, and template → load the backlog-management skill.Tickets live in backlogs/ as LKPR-N-slug.md. Completed → backlogs/done/. Numbering: sequential (highest+1), never fill gaps.
Once per week, pull up to 10 proposal tickets into the active backlog:
backlogs/proposal/ — pick high-value, unblocked itemsS:ready and set prioritymain — auto-approved, no review neededWhen Jason sets a new sprint goal mid-sprint (e.g. "lets continue with a new goal in mind":
S:ready, move files to backlogs/ready/ if needed, commit on chore/backlog branch, open PR. Don't stop after analysis.dashboard/. If backend-only, write _none_ explicitly.Dev should not have to guess whether a backend change needs a dashboard update.
Filing a new ticket:
./scripts/lorekeeper-backlog.sh | grep "Next ticket number" — get next LKPR-Ncp backlogs/TEMPLATE.md backlogs/LKPR-NEXT-<slug>.md[LKPR-0] chore: add LKPR-N <short title> (housekeeping = [LKPR-0], not [LKPR-dev])Since LKPR-24, status and priority are tracked via GitHub Issue labels — specs still live in markdown files. See backlogs/backlog/LKPR-24-hybrid-backlog.md for full details.
Quick reference:
# View active backlog on GitHub
gh issue list --label "S:Ready" --repo Jessinra/Lorekeeper
# Start work
gh issue edit LKPR-30 --add-label "S:In-progress" --remove-label "S:Ready"
# PR ready for review
gh issue edit LKPR-30 --add-label "S:Review" --remove-label "S:In-progress"
# Solved
gh issue edit LKPR-30 --add-label "S:Done" --remove-label "S:Review"
# View all done tickets this sprint
gh issue list --label "S:Done" --repo Jessinra/Lorekeeper
# Proposals
gh issue list --label "S:Proposal" --repo Jessinra/LorekeeperWeekly sync (PM): Pull all issue labels → update markdown status: fields → commit on chore/backlog → PR → auto-merge.
Run this to check for inconsistencies between GitHub Issues, merged PRs, and backlog markdown files. The script uses the GitHub REST API directly — no local repo clone needed. Run from the repo root.
cd /Users/jessinra/Code/lorekeeper && python3 scripts/gh_reconcile.pyChecks:
| Check | What it finds |
|---|---|
| Merged PRs → issue not S:Done | Implementation PRs merged but ticket not marked done |
| S:Done issues still open | Tickets labeled done but not closed |
| Duplicate issues | Multiple issues with the same LKPR-N |
| Markdown vs GitHub mismatch | status: field in .md ≠ label on GitHub issue |
| Missing/invalid labels | Issues missing S: or P: labels |
Options:
--fix-done — auto-close issues with merged PRs--fix-labels — auto-add missing S:proposal / P3:low defaultsFull status reconciliation with per-ticket verdicts. Use this when doing a manual datafix sweep:
python3 ~/.hermes/scripts/gh_reconcile.py --deepAdditional deep checks:
| Deep Check | What it detects | Common fix |
|---|---|---|
| S:Done verification | Feature PR vs proposal PR — flags pre-PR era tickets | Verify manually |
| S:Cancelled verification | Implemented but cancelled (#32/LKPR-7 pattern) | → S:Done |
| Closed S:Proposal categorization | Orphan vs duplicate vs not_planned | REOPEN orphans |
| Closed S:Ready → S:Done | Merged PRs but label not updated | → S:Done |
| File location vs GH label | File in wrong backlog directory | Move file |
| Missing GH issues | Backlog file with no corresponding issue | Create issue |
Output: A full LKPR-sorted table with the 🔴→ markers showing things that need fixing, and a summary of actions at the end.
After --deep reveals issues, here's how to apply fixes:
#### 1. Change GH label
GH_TOKEN=<token> gh issue edit <num> --add-label "S:Done" --remove-label "S:Cancelled"
GH_TOKEN=<token> gh issue edit <num> --add-label "S:Done" --remove-label "S:Ready"#### 2. Reopen a closed issue
GH_TOKEN=<token> gh issue reopen <num>
GH_TOKEN=<token> gh issue edit <num> --add-label "S:Proposal"#### 3. Move backlog file between directories
Edit the file on the chore/backlog branch, move to correct directory, PR → auto-merge.
#### 4. Create missing GH issue for a backlog file
GH_TOKEN=<token> gh issue create \
--repo Jessinra/Lorekeeper \
--title "LKPR-N: <title from file>" \
--label "S:Done,P2:medium" \
--body "$(cat backlogs/done/LKPR-N-slug.md)"#### 5. Duplicate resolution (manual)
The script lives at scripts/gh_reconcile.py in the repo. Run it from the repo root:
cd /Users/jessinra/Code/lorekeeper
python3 scripts/gh_reconcile.py # standard check
python3 scripts/gh_reconcile.py --deep # full datafix analysis
python3 scripts/gh_reconcile.py --fix-done # auto-close merged PR issues
python3 scripts/gh_reconcile.py --fix-labels # auto-add missing labelsDev must submit work via a pull request (PR) — never direct commits to main.
[LKPR-N] prefix, pushes branchmain. PM reviews the PR on GitHubdoneIf dev commits directly to main: revert the commits, reset main, and have dev resubmit via PR. No exceptions.
Copilot review note: if the repo has Copilot review instructions, use them. But do not assume @copilot is a valid GitHub reviewer login — request review only after verifying the repo/org supports that login, and separate reviewer assignment from PR creation so a lookup failure doesn't block the PR.
When reviewing a PR:
uv run pytest, uv run ruff check src testsstatus: review or status: done, resolved_date if donelore_remember score must match lore_insert's default of 5)_increment_metric() in the orchestrator and have a TOOL_COLORS entry in dashboard/static/js/metrics.jsIf anything is missing — send back with specific ask, don't approve partial work.
Priorities use P: prefix so GitHub labels sort correctly:
P0:critical — Only for bug & critical fixes. Blocking other work or causing data loss.P1:high — High impact, urgent, must do. Significant UX or correctness issue, next sprint.P2:medium — Medium impact, improvement, in-pipeline feature, nice to have. Schedule when capacity allows.P3:low — Small impact, not urgent, small improvement. Polish, cleanup, nice-to-have.When in doubt: ship correctness before features.
Dev committed LKPR-29 directly to main without review. Jason reset main, dev was asked to reflect. Enforcement: always use PR workflow. If any commit lands without a PR, revert and re-route.
LKPR-29's PR (#5) was missing two things: default score should be 5 (match lore_insert), and lore_remember wasn't recording metrics in the dashboard. Both were caught only during PM review on GitHub, not in the initial implementation. Lesson: add explicit cross-reference and dashboard checks to review (see checklist above).
During mid-sprint goal shifts, PM can fall into analysis mode — producing good reasoning but stopping short of executing the status changes, branch, and PR. Encode the "Mid-sprint goal shift" workflow above into practice: present analysis → get greenlight → execute fully.
lorekeeper-dev when they discover new quirks, pitfalls, or patternslorekeeper-pm) and the overall backlog structure.hermes/skills/ inside the repo — treat them like living docs, patch as you go~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.