mc-position-review
Walk this project's standing positions and test whether any of their reasons have expired, then report to the human. TRIGGER when the task begins with a "[Position review]" marker, when a scheduled run asks you to review standing positions or check what has changed in the field, or when the user asks "are any of our decisions stale?" / "review our positions" / "what's changed that we should reconsider?". Do NOT trigger in ordinary sessions.
- License 许可
- MIT
- 最近更新
- 2026-11-14
- Stars
- ★ 17
- Forks
- 2
01 前言 Front Matter
- name
- mc-position-review
- description
- Walk this project's standing positions and test whether any of their reasons have expired, then report to the human. TRIGGER when the task begins with a "[Position review]" marker, when a scheduled run asks you to review standing positions or check what has changed in the field, or when the user asks "are any of our decisions stale?" / "review our positions" / "what's changed that we should reconsider?". Do NOT trigger in ordinary sessions.
02 资源文件 5
- 脚本scripts/.gitkeep—
- 参考文档soul/communication-style.md118 B
- 参考文档soul/decision-framework.md157 B
- 参考文档soul/principles.md153 B
- 参考文档soul/README.md461 B
03 SKILL.md 正文
Reviewing standing positions — what would change our mind, and has it
A position is a settled question: a subject, a verdict, a reason, and
expires_when — the condition that would re-open it. That last field is why
this job is tractable. You are not re-reading an archive hoping to notice
something stale; you are testing a short list of named conditions.
This also is the daily field-research job (MC-898). An open-ended sweep of "what's new in agentic mission control" has no stopping condition and no way to tell an interesting finding from a relevant one. The standing positions supply the query set: has anything changed that trips one of our own rulings?
The one hard rule
You report. You never edit a position. Changing a ruling that steers every other agent on this project is a human's call — the same reason the learning system's authority guard refuses artifacts that expand an agent's own permissions. Your writes go to the review sidecar and nowhere else.
Concretely: never POST …/memory/positions, never DELETE one, never hand-edit
a position_*.md. If a position should change, say so and let Ron do it.
The cycle
1. Get the worksheet
python tools/position-review.py brief --project <project_id>
Deterministic — it decides which positions are due (default: every 7 days, or immediately if a human edited one since its last review). Judging whether a condition has come true is your job; picking the set is not, because a model picking it would quietly review something different every night.
2. Test each one, on its own terms
Read the what would change our mind line and go check that, specifically.
The trigger tells you which tool to reach for:
- An internal claim ("our own graph machinery stops resolving links") — run
it.
tools/memory-link-check.py, a test, a grep. Cheap and conclusive. - An external claim ("X ships a feature that replaces Y") — WebSearch, and read the primary source, not a summary of it. A blog post about a release is not the release.
- A usage claim ("its output starts feeding other agents") — check the code and the config, not your memory of them.
Two failure modes to refuse:
- Do not trip a position on vibes. "Obsidian is popular again" is not the recorded condition. Only the named condition counts. If you think the wrong condition was recorded, that is a finding to report — not licence to substitute your own.
- Do not confirm a position either. You are testing for expiry, not re-litigating the verdict. "Still correct" is a fine and common outcome.
A position with no expires_when is flagged in the brief as
NOTHING RECORDED. Do not test it — propose a trigger for it. A ruling nobody
wrote a trigger for is one nobody has revisited since the day it was made, and
that is the most useful thing you can say about it.
3. Log the outcome — always, for every position you checked
python tools/position-review.py record --project <pid> \
--file position_<slug>.md \
--finding "what you checked, and what you saw" \
[--tripped]
--finding is the point of the record: next review starts from what you already
established rather than re-deriving it. Write what you checked, not what you
concluded — "ran memory-link-check.py, 0 unresolved links across 412 notes"
beats "still fine".
record prints newly_flagged. True exactly once per trip — that is your
cue to interrupt a human.
4. Report
Always append to the journal — docs/_journal/<item-id>-<slug>.md, newest
at the bottom, dated. Every position you checked, what you checked it with, and
the outcome. This is the durable log. Unattended cycles never write backlog
notes (CLAUDE.md).
Email only when newly_flagged came back true, or when you have a proposed
trigger for an untriggered position worth a decision. Reuse the mailer, do not
build one:
python tools/night-review/send_mail.py \
--subject "[Clayrune positions] DECISION NEEDED: <subject> may have expired" \
--body-file /tmp/mail_body.txt
The body must stand on its own — Ron may read it days later on a phone with no session context. Include: the position as it stands (verdict + reason), the recorded trigger, what you found and where (link the primary source), and the three options with your recommendation:
- Keep — the trigger did not really fire.
- Re-open with a new reason — the verdict may still hold but the reasoning
moved. Ron edits the reason in the Memory modal; that supersedes in place and
keeps the old text under
## Previously. - Forget — the ruling was wrong. Ron uses Forget in the Memory modal.
Then stop. An emailed ask is not approval. The next cycle reads his reply
via the mail MCP server (search_email("[Clayrune positions]")) before
re-raising anything.
A quiet night gets no email. Nothing expired is the expected result and the journal already records it. Mailing a nightly "all clear" is precisely how this channel stops being read, and then you lose the one night it mattered.
Where things live
| the positions | <project memory dir>/position_*.md |
| review sidecar | <same dir>/position_review.json — yours to write |
| open flags | python tools/position-review.py flags [--json] |
| the design | docs/DAVE_DESIGN.md §4 (positions), §9 (phase 3) |
| the human's view | project menu → Memory → Standing positions |
04 同仓库更多 Skills
prompt-injection-skill
TEST FIXTURE (MC-912) — do not install. Exercises the prompt-injection detector.
persistence-skill
TEST FIXTURE (MC-912) — do not install. Exercises the persistence detector.
exfiltration-skill
TEST FIXTURE (MC-912) — do not install. Exercises the exfiltration detector.
destructive-skill
TEST FIXTURE (MC-912) — do not install. Exercises the destructive-command detector.
config-mod-skill
TEST FIXTURE (MC-912) — do not install. Exercises the agent-config-mod detector's write-API coverage (the gap Hermes's own scanner documents missing).
benign-skill
TEST FIXTURE (MC-912) — negative control. Should produce zero scanner findings.