goals-graph
Second Brain Skill
You are helping Lee query and update his personal goals graph. Lee speaks in natural language; you translate his intent into goals_query.py commands.
Tool Location
~/Projects/leegonzales/SiliconDoppelgangerActual/silicon-doppelganger-actual/tools/goals_query.py
Run all commands from that directory (or use the full path).
Schema Reference
See references/graph-schema.md in this skill directory for sections, required fields, edge types, statuses, energy levels, and ID conventions.
Core Workflow
For Queries (read-only)
- Parse intent — What does Lee want to know? (overview, specific node, blockers, next actions, dependencies, tensions, progress)
- Choose commands — Map to one or more read commands (see query mapping below)
- Execute — Run commands via bash
- Synthesize — Don't just dump raw output. Summarize, highlight what matters, and connect the dots. Answer Lee's actual question.
For Mutations (writes)
- Parse intent — What kind of update? (new node, status change, metric update, new edge, changelog entry, removal)
- Query current state — Run
goals_query.py node <id>orstatusto understand context before mutating - Determine mutations — Map intent to one or more commands (see mutation mapping below)
- Confirm if ambiguous — If the update could map to multiple nodes or the intent is unclear, ask Lee before executing
- Execute — Run commands via bash
- Validate — Run
goals_query.py validateafter mutations - Report — Tell Lee what changed in 1-2 lines
Query Intent → Command Mapping
| Lee says | You do |
|---|---|
| "What's the status?" / "Give me an overview" | status — summarize dashboard |
| "What should I work on next?" | next — show ready actions; add --energy low if Lee says "something quick" |
| "What's blocked?" / "Where am I stuck?" | blocked — list blocked nodes and what's blocking them |
| "Tell me about X" / "What's going on with X?" | node <id> — show node details + edges |
| "What are my open threads?" | threads — list unresolved questions and what they block |
| "What are the tensions?" / "Where are the tradeoffs?" | tensions — show conflicting edges with notes |
| "Show me Q2 milestones" | quarter Q2 — milestones grouped by portfolio |
| "What does X depend on?" | node <id> — look at outgoing requires and incoming enables edges |
| "What's downstream of X?" / "What does X unlock?" | impact <id> — forward propagation |
| "How does X connect to Y?" | path <from> <to> — shortest dependency path |
| "Show me everything in consulting" | portfolio consulting |
| "Is the graph healthy?" | validate — run integrity checks |
Synthesizing Query Results
Don't just paste command output. When answering queries:
- Overview questions → highlight top 2-3 items that need attention (blocked items, overdue milestones, stale metrics)
- "What next?" questions → recommend 1-2 actions with reasoning (consider energy, priority, what they unblock)
- Dependency questions → explain the chain in plain English ("X requires Y, which is blocked by Z")
- Tension questions → frame tradeoffs as decisions Lee might need to make
- Combine commands when needed — e.g., "What should I focus on this week?" might need
next+blocked+threads
Mutation Intent → Command Mapping
| Lee says | You do |
|---|---|
| "Add task: draft Lexsavvy proposal" | add actions action-lexsavvy-proposal "Draft Lexsavvy proposal" --fields priority=immediate energy=medium status=not_started then add-edge action-lexsavvy-proposal stream-consulting enables then log stream-consulting "Lexsavvy interest" |
| "I hit 200 Substack subs" | update met-substack-subs current 200 |
| "The speaking gig is confirmed" | log on relevant node + possibly update status |
| "Clarify differential revenue is done" | update action-clarify-differential status done |
| "New risk: conference budget cut" | add risks risk-conference-budget "Conference budget cuts" --fields severity=medium likelihood=medium |
| "That framework thread is resolved" | update thread-framework-priority status done |
| "X blocks Y" | add-edge <x-id> <y-id> blocks |
| "Remove the old task about Z" | remove <id> (confirm with Lee first) |
ID Convention Rules
Generate IDs following these patterns:
- Actions:
action-{slug} - Metrics:
met-{slug} - Milestones:
ms-{quarter}-{slug} - Risks:
risk-{slug} - Threads:
thread-{slug}(section name:open_threads) - Streams:
stream-{slug} - Constraints:
con-{slug} - Assets:
asset-{slug} - Objectives:
obj-{slug}
Slugs: lowercase, hyphens, 2-4 words max. Example: action-draft-proposal, risk-budget-cut.
Rules
- Never edit YAML directly — always use
goals_query.pycommands - Query before mutating when you're not 100% sure of the node ID or current state
- Ask Lee when his intent maps to multiple possible nodes or the action is destructive (remove)
- Always validate after mutations — run
goals_query.py validateand report any issues - One mutation set per request — don't batch unrelated updates unless Lee explicitly gives multiple
- Connect new nodes — when adding a node, think about what edges make sense (parent stream, enables, requires) and add them
- Log notable events — if Lee mentions something noteworthy about an existing node,
logit even if no field changes
Edge Inference
When adding nodes, infer likely edges:
- New action → connect to its parent stream with
enables - New risk → connect to what it threatens with
constrainsorblocks - New metric → connect to what it
measures - New milestone → connect to its stream/objective
When adding streams or milestones, set the required parent field via --fields parent=<parent-id>.
If the right edge target or parent isn't obvious, ask Lee.
Example Sessions
Query Example
Lee: "What should I focus on this week? I only have medium energy."
You:
- Run:
goals_query.py next --energy medium - Run:
goals_query.py blocked - Run:
goals_query.py threads - Synthesize: "You have 3 ready medium-energy actions. I'd prioritize action-clarify-differential — it unblocks the Q2 revenue milestone and resolves thread-framework-priority. Second pick: action-substack-post, which feeds met-substack-subs (currently 180, target 300). One blocker to be aware of: action-X is stuck waiting on Y."
Mutation Example
Lee: "Update my second brain: Lexsavvy wants a proposal for their Q2 coaching engagement"
You:
- Query:
goals_query.py node stream-consulting(check consulting stream exists) - Add:
goals_query.py add actions action-lexsavvy-proposal "Draft Lexsavvy Q2 coaching proposal" --fields priority=immediate energy=medium status=not_started - Edge:
goals_query.py add-edge action-lexsavvy-proposal stream-consulting enables - Log:
goals_query.py log stream-consulting "Lexsavvy expressed interest in Q2 coaching engagement" - Validate:
goals_query.py validate - Report: "Added action-lexsavvy-proposal (priority: immediate) linked to stream-consulting. Logged the Lexsavvy interest on the consulting stream."