Skip to content
Back to skills

Suggestions

ASecurity

Use when the friend wants to review pending suggestions: rare, high-stakes items a producer (retrospective, promotion, doctrine, wiki-health) has raised for explicit approve/reject — never auto-applied. Triggers on the /ren:suggestions slash command. The single interactive decide surface over lib.suggestions' durable store (Task 14); this is where an accepted decision actually becomes a write.

  • 2 stars
  • 0 votes
  • 0 copies
  • 3 views
  • Added September 2, 2026
ai-agentsgo

Works with

  • cli

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned September 20, 2026

npx -y skills add hazarsozer/ren-os --skill suggestions --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Suggestions?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Suggestions
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/hazarsozer-suggestions/badge)](https://www.skillsdirectory.com/skills/hazarsozer-suggestions)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: suggestions
description: |
  Use when the friend wants to review pending suggestions: rare, high-stakes
  items a producer (retrospective, promotion, doctrine, wiki-health) has
  raised for explicit approve/reject — never auto-applied. Triggers on the
  /ren:suggestions slash command. The single interactive decide surface over
  lib.suggestions' durable store (Task 14); this is where an accepted
  decision actually becomes a write.
version: 0.8.8
license: MIT

framework_version: "0.8.8"
schema_version: 1
type: skill
execution_tier: judgment

contract:
  required_outputs:
    - "Every pending suggestion shown to the friend one at a time, each with an explicit accept/decline answer recorded"
    - "Each accepted suggestion applied by kind (page_write/promote_to_global/refresh_claude_md) or, for review_contradiction, evidence surfaced for conversational reconciliation"
  budgets:
    turns: 20
    files_written: 0
    duration_seconds: 120
  permissions:
    read:
      - "~/.renos/wiki/**"
    write:
      - "~/.renos/wiki/**"
      - "~/.claude/CLAUDE.md"
    execute: []
  completion_conditions:
    - "Every suggestion returned by render_list() at invocation time has a recorded accepted/declined decision"
  output_paths:
    - "~/.renos/wiki/"

tags: [judgment, suggestions, approve-reject, decide, gate]
related_skills: [wiki-health, retrospective, recall]
references_required: []
references_on_demand: []
---

# suggestions

The single interactive approve/reject surface over `lib.suggestions`'
durable store (Task 14). Suggestions are RARE AND HIGH-STAKES by design
(spec §1.2) — this is the only place a suggestion's payload actually gets
applied. `lib.suggestions.decide` itself is a pure state transition; this
skill's `accept()` is what turns an "accepted" decision into a real write.

## When to use this skill

- Friend invokes `/ren:suggestions` — review whatever's pending
- A producer (retrospective, promotion, doctrine, wiki-health) just raised a
  new suggestion and the friend wants to act on it now rather than later

## When NOT to use this skill

- The friend wants to record something new mid-session → `/ren:pin`
- The friend wants a coherence sweep, not a decision queue → `/ren:wiki-health`

## Behavior

1. Call `skills.suggestions.lib.render_list()`.
2. If it returns `"No pending suggestions."`, say so and stop — nothing else
   to do.
3. Otherwise walk the pending suggestions **ONE AT A TIME**, in the order
   `render_list()` returned them (oldest first):
   - Show `render_suggestion(s)` for the current suggestion — title,
     rationale, producer, and (for `page_write` suggestions) a content
     preview.
   - Ask the friend to Approve or Reject (AskUserQuestion, or plain chat if
     unavailable). Get an **explicit per-item answer** — never assume, never
     infer from silence.
   - On approve: call `skills.suggestions.lib.accept(sid, session)`. Report
     what happened from the returned `{"sid", "applied", "detail"}` — if
     `applied` is `False`, say so and show `detail` (e.g. a duplicate-content
     no-op, or the two pages + evidence for a `review_contradiction`
     suggestion the friend now reconciles conversationally). The result also
     carries `"decision_recorded"` (`True`/`False`) on every path that
     followed an apply attempt — absent only on the up-front already-decided
     check, so use `.get("decision_recorded")`. If it's `False`, the change
     may already have landed (`applied` can still be `True`) but the decision
     itself wasn't recorded — the suggestion stays pending and will be
     offered again; mention that to the friend rather than treating it as a
     clean accept.
   - On reject: call `skills.suggestions.lib.decline(sid)` — durable, this
     suggestion is never re-offered.
   - Move to the next suggestion.
4. **Never batch-apply.** Never apply a suggestion without an explicit
   per-item answer from the friend.

## Apply routes (by suggestion kind / payload action)

- `page_write` → `lib.memory.queue.propose` then
  `queue.approve_and_apply(qid, who="suggestions")`. Instruction-plane
  (`global/`) pages go through the SAME human-gated door as ever — the
  recorded suggestion decision IS the human approval. If `propose` returns a
  synthetic `noop-duplicate` entry (content already matches the live page),
  `accept()` treats it as `applied=False` with a `"content already on page"`
  detail and still records the accept decision — never a half-applied state.
- `promote_to_global` → `lib.memory.promotion.promote_to_global(source_page,
  session)` then `approve_and_apply`.
- `refresh_claude_md` → `lib.adapter.claude_md.write_global_claude_md()`.
- `review_contradiction` → applies nothing; returns the two page paths and
  evidence so the session can reconcile them conversationally.
- `orphan_page` (#55) → applies nothing; hands the orphan page off to the
  session to place (a hub, a map, `log.md`), same convention as
  `review_contradiction`.

Any apply failure is caught inside `accept()` and surfaced in `detail` —
the decision stays recorded either way.

Files in this skill

  • SKILL.md5 KB
  • lib/__init__.py14.1 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.