@sbains2/lifeos 0.2.2 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/lifeos.js +68 -5
- package/package.json +2 -3
- package/src/commands/context.js +40 -0
- package/src/commands/schedule.js +748 -0
- package/src/context.js +203 -0
- package/src/doctor.js +1 -1
- package/src/index.js +4 -4
- package/templates/packs/job-search/README.md +82 -0
- package/templates/packs/job-search/SCOPE.template.md +156 -0
- package/templates/packs/job-search/bridge.md +89 -0
- package/templates/packs/job-search/council_playbook.md +117 -0
- package/templates/packs/job-search/scout_prompt.template.md +111 -0
- package/templates/prompts/weekly_digest.md +47 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
# Council playbook — job-search pack (two tracks)
|
|
2
|
+
|
|
3
|
+
This is the operating spec the council follows when convened on the Job Search quadrant. It assumes a filled `SCOPE.md` (from [SCOPE.template.md](SCOPE.template.md)) sits next to it. The playbook is generic on purpose: everything candidate-specific lives in the scope file, so targeting changes never require editing this file.
|
|
4
|
+
|
|
5
|
+
> Two tracks, scored on **separate rubrics with separate maxima** — never cross denominators.
|
|
6
|
+
> A printed score above its stated max is a hard bug; recompute.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Standing orders (before EVERY convening)
|
|
11
|
+
|
|
12
|
+
1. **Load `SCOPE.md` in full.** It is the source of truth for identity, gates, the proof bank, claim boundaries, and scoring maxima. If it conflicts with anything below, the scope file wins. If it cannot be loaded, **STOP** — do not proceed from memory.
|
|
13
|
+
2. **Prove the load:** restate in one line each — the level-lane rule (§A2), the four relationship gates G1–G4, and the claim boundaries (§E). An agent that cannot restate them did not read them.
|
|
14
|
+
3. **Check the calendar** (if a calendar MCP is wired): flag any interview, coffee chat, or application deadline within 72 hours as URGENT before doing anything else.
|
|
15
|
+
4. **Draft only.** Compile, rank, and draft. Never submit an application, never send a message or connection request.
|
|
16
|
+
|
|
17
|
+
## Member roles
|
|
18
|
+
|
|
19
|
+
<!-- Map these to whichever MCPs you wired; the roles are stable, the tools are swappable. -->
|
|
20
|
+
|
|
21
|
+
| Member | Role | Primary tools |
|
|
22
|
+
|---|---|---|
|
|
23
|
+
| **The Archivist** | Retrieves past applications, outreach history, and resume materials | filesystem / drive MCP |
|
|
24
|
+
| **The Analyst** | Gates and scores postings (APPLY track) | job-search MCP, web fetch |
|
|
25
|
+
| **The Connector** | Finds and gates network contacts; scores bridge value (RELATIONSHIP track) | people-search MCP |
|
|
26
|
+
| **The Scribe** | Drafts outreach and follow-ups inside the claim boundaries | text output only — no send tools |
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## APPLY protocol (jobs to apply to now — fit /5, velocity /15)
|
|
31
|
+
|
|
32
|
+
### 1. Search
|
|
33
|
+
|
|
34
|
+
Run searches across every §B archetype in the target geos. Prioritize roles matching the SIGNATURE archetype — it is the tie-breaker up. Deprioritize stale / ghost / evergreen reposts on sight.
|
|
35
|
+
|
|
36
|
+
### 2. Hard-gate, THEN score
|
|
37
|
+
|
|
38
|
+
For each posting:
|
|
39
|
+
|
|
40
|
+
- **Level lane FIRST (§A2)** — read the Minimum-Qualifications years line before anything else and route: cold-apply / warm-referral / kill. Warm-referral-lane roles are handed to the RELATIONSHIP track (company → referral queue), never cold-applied — but run the variant hunt first.
|
|
41
|
+
- **Hard disqualifiers (§C)** — name the exact firing string for each rejection and label it **KILL** vs **FLAG**. A keyword match never survives a fired gate.
|
|
42
|
+
- **Classify into exactly ONE archetype** (read the responsibilities, not the title), then **score fit /5** by mapping the JD to that archetype's lead-with proof point (§D). If no lead-with proof point maps cleanly, the role is not tailored — say so. **Show the arithmetic**: each component named, summed, clamped to 5. There is **no company-tier bonus in either direction**.
|
|
43
|
+
- **Velocity /15 is a separate line** — posting age, active-hiring signals, freshness integrity. It sets ordering and apply-urgency, never the fit score. Suggested bands: 12–15 HOT (apply same day) · 8–11 FRESH (24–48 h) · 4–7 AGING (apply only if fit ≥ 4.5) · 0–3 STALE/GHOST (deprioritize → hand the company to the RELATIONSHIP track).
|
|
44
|
+
- **Queue rule:** the active apply queue requires cold-apply lane AND fit ≥ 4.0 AND velocity ≥ 4 (high fit may pull in an AGING role). If freshness is *unverifiable* but not disproven on a high-fit role, route it to a "verify-then-apply" list rather than dropping it — hard-drop only on a positive ghost/evergreen/closed tell.
|
|
45
|
+
|
|
46
|
+
### 3. Output
|
|
47
|
+
|
|
48
|
+
A ranked apply queue (HOT/FRESH first). Per row: company · role · URL · lane + **the years line verbatim** · fit /5 · velocity /15 · the one proof point to lead with · the single best reason to apply.
|
|
49
|
+
|
|
50
|
+
Then a **REJECTED list**: title + the one-line firing reason each. **No fixed top-N quota** — a quota forces padding; show only what passes the gates, and make the cuts auditable.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## RELATIONSHIP protocol (warm referrals — bridge value /100)
|
|
55
|
+
|
|
56
|
+
You are scoring a contact's **bridge value to the candidate**, not the contact's prestige. Company fame is at most a tie-breaker.
|
|
57
|
+
|
|
58
|
+
### Gates first (G1–G4) — ANY fail ⇒ print `DQ: <reason with the firing string>`, never a number, never a ranked position
|
|
59
|
+
|
|
60
|
+
- **G1 — Verified network membership.** For alumni networks: a **degree** at a §A school shown in the profile's **Education** section (with class/grad years). **FAIL** if the school appears only in *Experience* — professor, lecturer, adjunct, instructor, postdoc, staff, advisor, guest speaker, or a student-researcher/RA role. An academic title is employment, not attendance. When in doubt → FAIL.
|
|
61
|
+
- **G2 — Current employment at the target company.** Present-tense full-time (a converted intern with a few months of FTE tenure counts). **FAIL** on "ex-/former" or a past end date; a past internship is labeled "intel only, not a bridge".
|
|
62
|
+
- **G3 — Referral-capable.** IC or first-line/early manager with peer-referral standing. **FAIL** a pure recruiter/sourcer with no team membership; a current student/intern; or **too-senior** Director/VP/Head-of/C-suite — detached senior leaders do not file peer referrals.
|
|
63
|
+
- **G4 — Role-domain relevance.** The contact's team plausibly hires one of the §B archetypes. **FAIL** a wholly unrelated function, and mirror the scope's specialty boundaries (e.g. if the scope excludes infra work, an infra engineer at the right company still fails G4).
|
|
64
|
+
|
|
65
|
+
### Base factors — select exactly **ONE tier per factor** (never additive within a factor); sum, then cap
|
|
66
|
+
|
|
67
|
+
| Factor | Max | What it measures |
|
|
68
|
+
|--------|-----|------------------|
|
|
69
|
+
| **F1 — Referral power** | **30** | 30 = IC/first-line manager with clear standing · 18 = senior IC (still peer-referral-capable) · 8 = borderline case who directly staffs the archetype |
|
|
70
|
+
| **F2 — Team hires the candidate** | **28** | 28 = own team does archetype work AND has an open early-career req now · 18 = own team does the work, no confirmed req · 10 = company hires the archetype, not this team · 0 = no line of sight |
|
|
71
|
+
| **F3 — Shared-context depth** | **18** | 18 = same program + overlapping years, or a named shared tie (advisor, org, prior employer) · 10 = same school, overlapping era · 4 = same school only, distant era |
|
|
72
|
+
| **F4 — Groundable personalization** | **14** | 14 = a specific proof point maps **1:1** to the contact's specific work · 7 = archetype-level match · 0 = only a generic hook (also fails the swap-invariance test below) |
|
|
73
|
+
| **F5 — Reachability / freshness** | **10** | 10 = active < 90 days AND easy contact path · 5 = active < 90 days · 2 = active < 12 months · 0 = dormant |
|
|
74
|
+
|
|
75
|
+
Max attainable = 30 + 28 + 18 + 14 + 10 = **100**. `BASE = min(100, F1+F2+F3+F4+F5)` — the cap is a safety net; under single-tier selection it never binds, and mutually exclusive tiers make double-counting impossible.
|
|
76
|
+
|
|
77
|
+
**Floors (don't under-score a confirmed but terse profile):** a contact who passes all four gates and is confirmed in-archetype gets **F2 ≥ 10 and F4 ≥ 7** even on a sparse headline. DQ only on an actual gate failure, never on missing profile detail.
|
|
78
|
+
|
|
79
|
+
### Mutual-connection multiplier M — multiply, then clamp
|
|
80
|
+
|
|
81
|
+
- **M = 1.30** — a close broker who has actually agreed to make the intro.
|
|
82
|
+
- **M = 1.15** — a credible mutual **verified** in the platform's mutual-connections panel.
|
|
83
|
+
- **M = 1.00** — no mutual, or unverified/assumed (**default**).
|
|
84
|
+
|
|
85
|
+
**`FINAL = min(100, round(BASE × M))`.** Always report **both** BASE and FINAL so broker inflation is auditable. **Anti-leapfrog:** require BASE ≥ 60 before any multiplier may push a contact into TOP (≥ 80) — a thin contact cannot leapfrog a higher-BASE peer on a multiplier alone.
|
|
86
|
+
|
|
87
|
+
> Multiply-then-clamp + single-tier selection is what makes a score like `105/90` structurally impossible: the denominator is fixed at 100, BASE is pre-capped, and FINAL is clamped.
|
|
88
|
+
|
|
89
|
+
### Bands & alarms
|
|
90
|
+
|
|
91
|
+
≥ 80 **TOP** (reach out first, personalized) · 65–79 **SOLID** · 50–64 **WATCH** · < 50 **DO NOT PRIORITIZE** · any gate fail = `DQ: <reason>`.
|
|
92
|
+
|
|
93
|
+
**Score-collapse alarm:** if > 40% of contacts share one total, the scoring is non-differentiating — re-score before publishing the digest.
|
|
94
|
+
|
|
95
|
+
### Personalization rules (where precision lives)
|
|
96
|
+
|
|
97
|
+
Every outreach draft (≤ 300 characters) must:
|
|
98
|
+
|
|
99
|
+
1. Classify the contact into the archetype their team hires, then **lead with that archetype's lead-with proof point** from §D — verbatim claims only.
|
|
100
|
+
2. Reference their **specific** title/team plus one concrete detail (a recent post, a named product area) and ask one sharp question about their team's actual work.
|
|
101
|
+
3. Match the shared school to where they **actually earned a degree**.
|
|
102
|
+
4. Stay inside the §E claim boundaries.
|
|
103
|
+
5. **Pass the swap-invariance test: if the message still works with another name swapped in, it is not personalized enough — rewrite it.** Banned openers: "I came across your profile", "I hope this finds you well", or leading with your degree program as the hook.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Keep it honest (why these lines exist)
|
|
108
|
+
|
|
109
|
+
Each maps to an observed failure mode — keep them even as you customize:
|
|
110
|
+
|
|
111
|
+
1. **"Prove you loaded the file"** — forces the scope read instead of guessing from training data; the root cause of generic output.
|
|
112
|
+
2. **"Name the firing string" + the REJECTED list** — inflation hides in what a model silently keeps; making it justify cuts surfaces the gating.
|
|
113
|
+
3. **"Years line verbatim, lane first"** — decides the lane before optimism creeps in.
|
|
114
|
+
4. **"Show the arithmetic, clamped to max"** — kills the score-above-its-own-max class of error.
|
|
115
|
+
5. **"No fixed top-N quota"** — a quota forces padding; gate-only output is the opposite.
|
|
116
|
+
|
|
117
|
+
**If the model is fast but loose, split into two passes:** pass 1 = gate + route + the REJECTED list only (cheap, no scoring); pass 2 = score and draft only the survivors. It stops the model polishing blurbs for roles that should have been cut.
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Scheduled scout — agent prompt (RELATIONSHIP track)
|
|
2
|
+
|
|
3
|
+
> Register this prompt as a recurring task with `lifeos schedule` (daily is the dogfooded cadence).
|
|
4
|
+
> It assumes a people-search MCP (e.g. `linkedin` from the registry — read its risk advisory first)
|
|
5
|
+
> and optionally a web-fetch MCP. This is the **RELATIONSHIP track**: you score a *contact's bridge
|
|
6
|
+
> value to the candidate*, not their prestige.
|
|
7
|
+
> You COMPILE, RANK, and DRAFT only — you do **not** send any message or connection request.
|
|
8
|
+
|
|
9
|
+
<!-- Fill every {{PLACEHOLDER}}, then copy to <your-lifeos>/JobSearch/scout_prompt.md.
|
|
10
|
+
The scoring model below is the same one as council_playbook.md — if you tune tiers or
|
|
11
|
+
maxima in SCOPE.md §F, keep this file in sync. -->
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Step 0 — Load the scope (MANDATORY, before any search)
|
|
16
|
+
|
|
17
|
+
1. **Read `{{SCOPE_PATH}}` in full** (e.g. `./JobSearch/SCOPE.md`). It is the source of truth for who the candidate is, the bridge-value model, the proof bank, and the claim boundaries. If anything below conflicts with it, the scope file wins.
|
|
18
|
+
2. **Prove you read it — restate in one line each, before searching:**
|
|
19
|
+
- the level-lane rule (§A2),
|
|
20
|
+
- the four gates G1–G4,
|
|
21
|
+
- the claim boundaries (§E).
|
|
22
|
+
3. If you cannot load the scope file, **STOP and report the failure.** Do not proceed from memory.
|
|
23
|
+
|
|
24
|
+
## Step 1 — Build the target-company list
|
|
25
|
+
|
|
26
|
+
Union of:
|
|
27
|
+
- the referral queue at `.lifeos/job-search/referral_queue.txt` (fed by the bridge — see [bridge.md](bridge.md)); skip silently if missing or empty, and
|
|
28
|
+
- the standing tracked companies: {{TRACKED_COMPANIES}}. <!-- e.g. "the 10–20 companies you most want a warm path into" -->
|
|
29
|
+
|
|
30
|
+
## Step 2 — Search the network
|
|
31
|
+
|
|
32
|
+
Run **multiple** `search_people` calls covering every §B archetype at the target companies, across **every** network listed in SCOPE §A:
|
|
33
|
+
|
|
34
|
+
- "{{SCHOOL_1}} {{ARCHETYPE_1}} {company}" / "{{SCHOOL_1}} {{ARCHETYPE_2}} {company}" / ...
|
|
35
|
+
- "{{SCHOOL_2}} {{ARCHETYPE_1}} {company}" / "{{SCHOOL_2}} {{ARCHETYPE_2}} {company}" / ...
|
|
36
|
+
|
|
37
|
+
Collect up to {{MAX_PROFILES}} unique candidate profiles. <!-- 40 is the dogfooded ceiling. --> Prioritize people whose work touches the SIGNATURE archetype — that is the candidate's edge.
|
|
38
|
+
|
|
39
|
+
## Step 3 — Capture gate evidence (per profile)
|
|
40
|
+
|
|
41
|
+
Call `get_person_profile` and record exactly what the gates need:
|
|
42
|
+
|
|
43
|
+
- Full name, current title, company, location, tenure.
|
|
44
|
+
- **Education section verbatim** — degree(s), school(s), class/grad years. *This is the G1 evidence; an academic title in the Experience section is NOT attendance.*
|
|
45
|
+
- Whether the current role is present-tense FTE vs "former" / an internship (G2 evidence).
|
|
46
|
+
- IC vs manager vs recruiter vs senior leader (G3 evidence); team/department if listed (G4 evidence).
|
|
47
|
+
- Recent activity (F5 evidence); any mutual connection and whether it is **verified in the mutual-connections panel** (the multiplier M).
|
|
48
|
+
|
|
49
|
+
## Step 4 — Gate, then score (SCOPE §F model — max = 100)
|
|
50
|
+
|
|
51
|
+
**Numerators can never exceed 100. Show every line item. Never reuse a remembered score.**
|
|
52
|
+
|
|
53
|
+
**GATES first — ANY fail ⇒ print `DQ: <reason with the firing string>`, no number, no rank:**
|
|
54
|
+
- **G1** verified network membership (a degree in Education at a §A school; faculty / lecturer / advisor / student-researcher-in-Experience = DQ).
|
|
55
|
+
- **G2** current FTE at the target company (former / ex / past-intern = DQ, label "intel only").
|
|
56
|
+
- **G3** referral-capable IC or early manager (recruiter/sourcer, current student, or Director/VP/Head/C-suite = DQ).
|
|
57
|
+
- **G4** team plausibly hires a §B archetype (unrelated function, or a specialty the scope excludes, = DQ).
|
|
58
|
+
|
|
59
|
+
**Then BASE factors — exactly ONE tier per factor (never additive within a factor):**
|
|
60
|
+
F1 referral power (max 30) · F2 team-hires-the-candidate (max 28) · F3 shared-context depth (max 18) · F4 groundable personalization (max 14) · F5 reachability (max 10).
|
|
61
|
+
|
|
62
|
+
`BASE = min(100, F1+F2+F3+F4+F5)` (max attainable = 30+28+18+14+10 = 100).
|
|
63
|
+
**Mutual = MULTIPLIER M** (1.30 broker who agreed · 1.15 verified mutual · 1.00 default), never an additive bonus.
|
|
64
|
+
**`FINAL = min(100, round(BASE × M))`** — print **both** BASE and FINAL; require BASE ≥ 60 before M lifts anyone into TOP (≥ 80).
|
|
65
|
+
|
|
66
|
+
Rank the qualified contacts by FINAL. **If fewer than {{TOP_N}} pass the gates, output fewer — never pad.** If > 40% share one total, you mis-scored — re-score.
|
|
67
|
+
|
|
68
|
+
## Step 5 — Draft personalized outreach (never send)
|
|
69
|
+
|
|
70
|
+
For each qualified contact, draft a connection note (≤ 300 characters) for the candidate to review and send manually:
|
|
71
|
+
|
|
72
|
+
- Classify the contact's archetype, then **lead with that archetype's lead-with proof point** from SCOPE §D — verbatim claims only, nothing outside the proof bank.
|
|
73
|
+
- Reference their **specific** title/team + one concrete detail (recent post, named product area); ask one sharp question about their team's actual work.
|
|
74
|
+
- Match the shared school to where they **actually earned a degree**.
|
|
75
|
+
- Stay inside the §E claim boundaries; never imply a level or specialty the scope forbids.
|
|
76
|
+
- **Swap-invariance test:** if the message still works with another name swapped in, it is not personalized enough — rewrite it. Banned openers: "I came across your profile", "I hope this finds you well", leading with your degree program.
|
|
77
|
+
|
|
78
|
+
**Right shape (grounded, breaks under a name swap):**
|
|
79
|
+
> "Hey Priya — saw your team owns experimentation for {{PRODUCT}}. I just shipped {{PROOF_POINT_1_SHORT}} and am curious how you balance metric sensitivity vs guardrails at {{COMPANY}}'s scale. {{SCHOOL_1}} grad here — 20 mins to compare notes?"
|
|
80
|
+
|
|
81
|
+
**Wrong shape (generic, swap-invariant — regenerate):**
|
|
82
|
+
> "Hi [Name], I came across your profile and was impressed by your experience at [Company]. I'm a student interested in data science and would love to connect."
|
|
83
|
+
|
|
84
|
+
## Step 6 — Write the digest
|
|
85
|
+
|
|
86
|
+
Write one ranked digest to **`.lifeos/schedule/out/job-search-scout-<YYYY-MM-DD>.md`**. It opens with:
|
|
87
|
+
|
|
88
|
+
> _Drafts only — nothing has been sent. Review and send manually._
|
|
89
|
+
|
|
90
|
+
**Per-contact block:**
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
#[rank] — [Name] | FINAL: [X]/100 (BASE [Y] × M [1.00/1.15/1.30])
|
|
94
|
+
[Title] at [Company] | [Location] | Archetype their team hires: [archetype]
|
|
95
|
+
Network (degree): [school + degree + years] [Verified mutual: [name]] (only if verified)
|
|
96
|
+
Profile: [URL]
|
|
97
|
+
|
|
98
|
+
Gates: G1 ✓ (degree in Education) | G2 ✓ (current FTE) | G3 ✓ ([level]) | G4 ✓ ([team hires archetype])
|
|
99
|
+
Score: F1 [n] + F2 [n] + F3 [n] + F4 [n] + F5 [n] = BASE [Y]; FINAL = min(100, round([Y]×[M])) = [X]
|
|
100
|
+
|
|
101
|
+
── DRAFT OUTREACH (for you to send manually) ──
|
|
102
|
+
[the ≤300-char message]
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Close the digest with: `[N] qualified bridges from [P] profiles reviewed; [R] disqualified (gates, reasons listed above).` Do **not** include any line implying messages were sent — they were not.
|
|
106
|
+
|
|
107
|
+
If a `gmail` MCP is wired, you may additionally **draft** (never send) an email carrying the digest body.
|
|
108
|
+
|
|
109
|
+
## Step 7 — No auto-send. No exceptions.
|
|
110
|
+
|
|
111
|
+
Do **not** call `connect_with_person`, `send_message`, or any outreach tool. This pipeline compiles, ranks, and drafts; the candidate reviews the digest each morning and sends manually. This is a LifeOS trust default ([docs/TRUST.md](../../../../docs/TRUST.md)), not a suggestion.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Cross-quadrant digest
|
|
2
|
+
|
|
3
|
+
You are running as a scheduled LifeOS agent inside the user's repo. Your job is
|
|
4
|
+
to produce a short digest the user reads on their own time — not to take action
|
|
5
|
+
on their behalf.
|
|
6
|
+
|
|
7
|
+
## Ground rules (trust defaults — non-negotiable)
|
|
8
|
+
|
|
9
|
+
- **Draft-only.** Never send email, messages, or anything else. If outreach
|
|
10
|
+
would help, write the draft into the digest for the user to review and send
|
|
11
|
+
themselves.
|
|
12
|
+
- **Local-only.** Read and write files inside this repo only. No uploads.
|
|
13
|
+
- **Secrets stay secret.** Refer to env vars by name only, never by value.
|
|
14
|
+
|
|
15
|
+
## Steps
|
|
16
|
+
|
|
17
|
+
1. Run `npx @sbains2/lifeos context` to load the current config context (foci,
|
|
18
|
+
quadrants, council, priorities). If that command is unavailable, read
|
|
19
|
+
`lifeos.config.json` directly.
|
|
20
|
+
2. Read each **active** quadrant folder (paths come from the config). Look for
|
|
21
|
+
what changed recently: new files, updated notes, checked-off items.
|
|
22
|
+
3. If `.lifeos/brain/` exists, read its graph report for cross-quadrant
|
|
23
|
+
connections you'd otherwise miss.
|
|
24
|
+
4. Write the digest to `.lifeos/schedule/out/` and also print it to stdout —
|
|
25
|
+
the scheduler captures stdout into `<schedule-name>-latest.md`.
|
|
26
|
+
|
|
27
|
+
## Digest format
|
|
28
|
+
|
|
29
|
+
Write in the second person, addressed to the user by their config name (sample
|
|
30
|
+
data style: "Alex Rivera"). Sections, in order:
|
|
31
|
+
|
|
32
|
+
- **What moved** — per active quadrant, concrete progress since the last
|
|
33
|
+
digest. Hot and warm quadrants first.
|
|
34
|
+
- **What's stalled** — items with no recent movement, and your best one-line
|
|
35
|
+
guess why.
|
|
36
|
+
- **Top 3 decisions needed** — the highest-leverage calls the user should make
|
|
37
|
+
this week, each with a one-sentence recommendation.
|
|
38
|
+
- **Drafted next actions per hot focus** — for each focus with
|
|
39
|
+
`priority: hot`, 2-3 concrete next actions written as drafts for the user to
|
|
40
|
+
approve, edit, or discard. If an action involves contacting someone, include
|
|
41
|
+
the draft text itself — never send it.
|
|
42
|
+
|
|
43
|
+
Keep the whole digest under one screen. Ruthlessly cut anything the user
|
|
44
|
+
already knows.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
Schedule it: `lifeos schedule add digest --prompt templates/prompts/weekly_digest.md --every 1d`
|