Polaris/.agents/skills/polaris-cascade/SKILL.md

153 lines
7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: polaris-cascade
description: "Sync an Polaris vault's wiki/ navigation layer from the numbered folders. Rewrites wiki/hot.md (current state: outstanding sends, workstreams, the owner's own next moves, people due for follow-up), appends one wiki/log.md entry, rebuilds wiki/index.md when structure changed, and reports how many log entries are waiting to be folded. Run at the end of every session that changed something. Triggers on: cascade, run cascade, sync the wiki, update the wiki."
---
# polaris-cascade — sync the wiki layer
The numbered folders are the source of truth. Cascade reads them and rewrites `wiki/` to match. **One command, no flags.** Always rewrite `hot.md` and append to `log.md`; rebuild `index.md` when you see the structure changed (a hub added, moved, renamed, or its `status`/`area` changed). When in doubt, rebuild it.
⛔ Skip every path listed under *Fences* in `AGENTS.md`.
---
## 1. Read hubs
Glob `1. Projects/**/*_hub.md` and `2. Areas/**/*_hub.md` — **match the `_hub` suffix, never a full filename.**
- **Skip `paused`, `closed` and `archived` Projects** for attention purposes (count them, don't read them further). Paused is a deliberate exclusion.
- **Areas carry no attention status.** List them; never compute drift or freshness on one.
- For each `open` Project: `id`, name, `next:` (**may be a YAML list — read every entry**), `deadline:`.
## 2. Read people
Glob `3. Resources/People/*.md`. **Only `tier: relationship` pages can flag.**
For each: compute the **live due date**:
- `follow_up_by` after `last_contact` (or no `last_contact`) → `follow_up_by`.
- `follow_up_by` on or before `last_contact` is **spent** → `weekly`/`biweekly`/`monthly`: `last_contact` + 7/14/30 days, marked *(from last contact)*; `organic`: **no date since contact** (its own line, never overdue).
- No `follow_up_by` at all → **defect**.
Bucket: **Overdue** · **Due within 7 days** · **No date since contact** · **Defects**. **Never write a computed date back to the page.**
⚠ **This step is where names get swapped or dropped.** Before writing, check every name you're about to render against its own file's `tier:` and dates. Similar names are the usual failure.
## 3. Read threads
Glob `3. Resources/Threads/*.md`: `status`, one-line state. **A thread whose `domains:` no longer name any live hub has collapsed** — flag it for close or drop.
## 4. Read holds
`wiki/meta/holds.md`, before rendering any age. Rules → `AGENTS.md`, *Holds*. In short: an open hold covering an item → render `held`; a closed hold → `3d (since 01-05, 11d held)`; an item created after the hold began is not covered.
## 5. Rewrite `wiki/hot.md`
**Rewrite, never append.** Hard cap **80 lines.** Sections in this order:
```markdown
## Hold ← only when one is open. Two lines: period, scope
## Outstanding sends ← every `send` and `wait` from live hubs, with age
## Workstreams ← "N open: WEB-1, WEB-3, OPS-2 · N paused: …" — one line, never a block each
## Now ← every `build`/`decide` next: — the owner's own moves. Oldest [since] first, no ages
## People ← "N armed", then overdue / due soon / defects by name
## Threads ← open threads, one line each (omit if none)
## Warnings ← ⚠ items worth carrying (omit if none)
## Standing state ← carried forward, pruned each run
```
**Ageing sends:** `[since YYYY-MM-DD]` is the authority → else git (`git log -1 --format=%ad --date=short -S'next:' -- <hub>`) → else **no age**. A wrong age is worse than none.
**Mis-verbed moves are a repair:** a `send →`/`wait →` naming the owner is really a `build`; a `build →` whose move is a message is really a `send`. Fix the hub's verb, then render.
**Never age an `open` workstream.** It has no clock by design.
**The cap is enforced by eviction, not compression.** At 80 lines, find what no longer belongs; don't shrink prose or raise the cap.
**The two-run exit for warnings.** A `⚠` item that appears in **two consecutive cascades** without resolving moves to `wiki/meta/open-questions.md` as a forced binary, and `hot.md` keeps one pointer line stating the consequence:
```markdown
⚠ Vendor quote unverified — don't cite its dates → open question #4
```
**Never drop a warning without leaving a pointer.**
**Vault voice:** everything in `hot.md` is the vault speaking. A claim sourced from a document, not from the owner, stays attributed or stays out.
## 6. Rebuild `wiki/index.md` — when structure changed
Plain markdown, one line per page, navigation only — no prose:
```markdown
## Areas
- [[2. Areas/Website/Website_hub|Website]] — standing · prefix WEB · 3 issued
## Projects
### Open
- [[1. Projects/Website/Pricing Page/WEB-3_hub|WEB-3 Pricing Page]] — done when: "…"
### Paused
## Threads
## People
### Relationship tier
- [[3. Resources/People/Sam Example|Sam Example]] — monthly · due 2026-02-01
### Contacts
## Decisions
- [[4. Decisions/2026-01-05-pricing-model|2026-01-05 Pricing model]] — open
## Folds
```
*(If the vault is opened in Obsidian with Dataview, the owner may replace sections with queries. Keep the headings.)*
## 7. Append to `wiki/log.md`
New entry **at the top**, below the header. Never edit a past entry.
```markdown
## YYYY-MM-DD — [vault] Cascade: <what changed, in a few words>
- Projects: N open, N paused
- People: N overdue, N due soon — <names>
- <notable state changes>
```
Use `[build]` only when the session shipped something, and then add `Shipped: <what exists now that didn't>`.
## 8. Count unfolded log entries — every run
```bash
grep -c '^## [0-9]' wiki/log.md # all entry headings
grep -c '\[folded\]' wiki/log.md # fold pointers — not entries
```
**Unfolded = headings − pointers.** Threshold **16**. Print the number every run, above or below threshold: `Log: 9 / 16` or `Log: 23 / 16 — fold due`. **Don't run the fold** — that's `polaris-fold`, on the owner's word.
---
## Output
```
## Cascade — YYYY-MM-DD
Sends outstanding
- <Person> — <what> (<age>)
Workstreams: N open (<IDs>) · N paused (<IDs>)
People (armed: N)
Overdue: <Name> (due YYYY-MM-DD)
Due this week: <Name> (due YYYY-MM-DD[, from last contact])
Defects: <Name> — no follow_up_by
Threads: <collapsed or notable>
Log: N / 16 [— fold due]
Wiki updated: hot.md · log.md [· index.md]
Verified: <N> rendered names checked against their own files — pass / <mismatch>
```
The `Log` and `Verified` lines print every run. A check that only speaks when something's wrong teaches nobody what normal looks like.
## Rules
- **`hot.md` and `index.md` are state — rewrite. `log.md` is a ledger — prepend, never edit.**
- **Skip paused/closed/archived Projects. Never compute drift on an Area.**
- **Only `tier: relationship` people flag.** Spent follow-ups compute a live date; the stored one is never rewritten.
- **Never render an age you can't source.**
- **Unconfirmed claims stay attributed or out.**
- **Verify every rendered name and count before writing.**