johns-harness 2026.9.24 → 2026.9.26

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/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.9.26
4
+
5
+ - Family 73: the `content-story`, `dashboard` and `cold-outreach` skills are removed from the bundled set on request, leaving eight generic bundled skills (`code-ops`, `web-research`, `plan-archival`, `todos`, `arch-viz`, `gcp-logs`, `activity-logging`, `outlook`). They load by description match exactly as before, workspace copies override them, and `enabled: false` and `allowBundled` still apply. Nothing else changes from 2026.9.25.
6
+ - Roll back with `npm i -g johns-harness@2026.9.25`.
7
+
8
+ ## 2026.9.25
9
+
10
+ - Family 72: eleven generic skills from the author's workspace ship as bundled skills (`code-ops`, `web-research`, `plan-archival`, `todos`, `dashboard`, `arch-viz`, `content-story`, `cold-outreach`, `gcp-logs`, `activity-logging`, `outlook`), converted to fully generic wording first: no owner names, paths, repos, accounts, or products. They load by description match like every other bundled skill (none is always-on), workspace copies override them, and `enabled: false` and `allowBundled` still apply. `RULES.md` lists all of them.
11
+ - The Family 71 packed-artifact gate now also proves all eleven bundled generic skills are inside every tarball, and verifier checks 72.1 through 72.5 enforce presence, frontmatter, the generic wording contract, and no em dashes.
12
+ - Roll back with `npm i -g johns-harness@2026.9.24`.
13
+
3
14
  ## 2026.9.24
4
15
 
5
16
  - Family 71: native-first Jiti plugin loading (Family 68) is now standard on `latest`. The `extended` dist-tag moves to this same version, so both lines converge at 2026.9.24. Node loads already-built JavaScript plugin code natively first and keeps Babel only for TypeScript plugin entries; `JITI_TRY_NATIVE` is no longer needed and is harmless if set.
package/README.md CHANGED
@@ -85,8 +85,8 @@ node johnness.mjs --help
85
85
  ### Verify
86
86
 
87
87
  ```bash
88
- npm test # 909 tests against the installed dependency tree
89
- bash scripts/verify-patches.sh # 443 checks across every patch family
88
+ npm test # 914 tests against the installed dependency tree
89
+ bash scripts/verify-patches.sh # 455 checks across every patch family
90
90
  ```
91
91
 
92
92
  ## Launch a swarm with one command
@@ -132,7 +132,7 @@ Coding agents today run as isolated processes. Two agents on the same repository
132
132
  - **Memory built for production.** Tiered recall that traces from consolidated reflections down to the verbatim record, surviving compaction and shared across the swarm. Installed and enabled by default.
133
133
  - **Production authority per commit.** Promotion is granted to an exact SHA, never to a branch name, so one worker's authorization never covers another worker's commits.
134
134
  - **An append-only action log.** Agents record every consequential action to `ACTION_LOG.md` and read it before acting.
135
- - **A fixed runtime surface.** The core does not grow on a schedule. New mechanisms enter only to solve a demonstrated production failure, one narrow, tested, reversible patch at a time: 71 patch families, each with a regression test and a rollback path.
135
+ - **A fixed runtime surface.** The core does not grow on a schedule. New mechanisms enter only to solve a demonstrated production failure, one narrow, tested, reversible patch at a time: 73 patch families, each with a regression test and a rollback path.
136
136
  - **Reliability with a definition.** Bounded retries, explicit failure states, exact-once continuation, context-pressure recovery, durable delivery, and supervised gateway recovery.
137
137
  - **Coding first, phone optional.** Direct the work at a high level from a chat channel while agents plan, implement, test, coordinate, and stage releases unattended.
138
138
  - **Local voice.** Optional native Whisper transcription of inbound audio, entirely on your machine. Off by default. [Setup](docs/NATIVE-WHISPER-MUSE.md).
@@ -199,7 +199,7 @@ The log is a [`RULES.md`](RULES.md) workspace convention enforced through the ac
199
199
 
200
200
  ## Patch families
201
201
 
202
- The runtime carries 71 patch families plus the 65.1 safe-update amendment. Each is a production fix applied at the source with a regression test, a durable patch marker, and a rollback path. A verifier runs 443 checks against the package tree and installed dependencies, and 909 tests run against the installed dependency tree.
202
+ The runtime carries 73 patch families plus the 65.1 safe-update amendment. Each is a production fix applied at the source with a regression test, a durable patch marker, and a rollback path. A verifier runs 455 checks against the package tree and installed dependencies, and 914 tests run against the installed dependency tree.
203
203
 
204
204
  Every family follows the same six steps: reproduce the failure, trace the exact runtime path, make the smallest source-level change that restores the invariant, add a regression test and a patch marker, run the verifier, and retain rollback artifacts. The full index: [`docs/PATCHES.md`](docs/PATCHES.md).
205
205
 
@@ -213,11 +213,12 @@ Every family follows the same six steps: reproduce the failure, trace the exact
213
213
  | `--dev` | Dev profile under `~/.johnness-dev` with its own gateway port and shifted derived ports |
214
214
  | Rules | [`RULES.md`](RULES.md) ships 19 operating-policy sections injected on every call. Fill in the placeholders; keep long procedures in skills. |
215
215
  | Orchestrator skill | Bundled and loaded implicitly on every install. Decide whether to pass the user's words through or expand them, then keep the briefing brief. Override with a workspace `skills/orchestrator/SKILL.md`. |
216
+ | Bundled generic skills | Eight generic skills ship in `skills/` and load by description match: `code-ops`, `web-research`, `plan-archival`, `todos`, `arch-viz`, `gcp-logs`, `activity-logging`, `outlook`. Workspace copies override; `enabled: false` and `allowBundled` still apply. |
216
217
 
217
218
  ## Documentation
218
219
 
219
220
  - [`docs/index.md`](docs/index.md): runtime docs, from gateway and channels to plugins, nodes, and CLI reference.
220
- - [`docs/PATCHES.md`](docs/PATCHES.md): the 71 patch families, one record each.
221
+ - [`docs/PATCHES.md`](docs/PATCHES.md): the 73 patch families, one record each.
221
222
  - [`docs/NATIVE-WHISPER-MUSE.md`](docs/NATIVE-WHISPER-MUSE.md): local Whisper transcription setup.
222
223
  - [`RULES.md`](RULES.md): the default operating rules, including Rule Zero on production authorization.
223
224
 
package/docs/PATCHES.md CHANGED
@@ -17,7 +17,7 @@ they predate ~2026-06-06).
17
17
 
18
18
  ## Index
19
19
 
20
- Family 01 is retired. Families 02 through 41, 43 through 67, 69 and 70, including the 65.1 amendment, are live on `main`; Family 68 ships on the `extended` release line. Family 42 is omitted; native Codex OAuth ownership is Family 58.
20
+ Family 01 is retired. Families 02 through 41, 43 through 72, including the 65.1 amendment, are live on `main`; the `latest` and `extended` release lines converged at 2026.9.24. Family 42 is omitted; native Codex OAuth ownership is Family 58.
21
21
 
22
22
  1. **01, announce queue TTL, retired:** Removed the five-minute age filter that could discard delayed sub-agent completion announcements. [Details](#01--announce-ttl-retired-2026-07-30)
23
23
  2. **02, failover rotation:** Returns model selection to the highest-priority profile after its cooldown ends. [Details](#02--failover-rotation-undocumented)
@@ -95,6 +95,11 @@ Family 01 is retired. Families 02 through 41, 43 through 67, 69 and 70, includin
95
95
 
96
96
  70. **70, bundled orchestrator skill:** The delegation and briefing protocol ships as an always-eligible bundled skill; every install loads it implicitly and a workspace copy still overrides it. [Details](#family-70-bundled-orchestrator-skill)
97
97
 
98
+ 71. **71, native-first Jiti standard on latest:** The Family 68 native-first loader option ships on every artifact, the `latest` and `extended` lines converge, and a packed-artifact gate proves the tarball carries it. [Details](#family-71-native-first-jiti-standard-on-latest)
99
+
100
+ 72. **72, bundled generic skills:** Eight workspace skills (code operations, research, todos, planning, logs, and more) ship as generic bundled skills that load by description match, with no owner names or personal paths. [Details](#family-72-bundled-generic-skills)
101
+ 73. **73, prune bundled skills:** `content-story`, `dashboard` and `cold-outreach` are removed from the Family 72 bundled set on request after `2026.9.25`; the remaining eight ship unchanged. [Details](#family-73-prune-bundled-skills)
102
+
98
103
  ---
99
104
 
100
105
  ## 01 - announce-ttl (RETIRED 2026-07-30)
@@ -2618,3 +2623,49 @@ Family 67 hash checks continue to compare the Family-67 surface with the Family
2618
2623
  **Tests:** `tests/native-jiti-standard.test.mjs` proves the gate passes a complete tarball, fails a tarball packed without Family 68 (the 2026.9.22 and 2026.9.23 shape), fails when one copy lacks the option or is absent, fails on a version mismatch, exits non-zero from the CLI, and that the real `npm pack` output of this tree carries the marker in all ten copies. Verifier checks 71.1 through 71.3 cover the shipped gate, the packed or installed artifact, and the absence of a separate extended pin in `package.json`.
2619
2624
 
2620
2625
  Roll back with `npm i -g johns-harness@2026.9.23` (no native-first Jiti) or `npm i -g johns-harness@2026.9.21-extended.1` (Family 68 without Families 69 and 70).
2626
+
2627
+ ## Family 72: bundled generic skills
2628
+
2629
+ **Release:** `johns-harness@2026.9.25`. Published as `latest` and the `extended` dist-tag moves to it (the two lines converged at 2026.9.24).
2630
+
2631
+ Eight skills from the author's personal workspace ship as bundled skills in `skills/<name>/SKILL.md`, made fully generic first: no owner names, no personal paths, repos, accounts, or products. Every one loads by description match like the other bundled skills (none is `always`-on, unlike the Family 70 orchestrator), a workspace or managed copy overrides it, `skills.entries.<name>.enabled: false` turns it off, and an `allowBundled` allowlist that omits it is respected. (Superseded by Family 73: from `2026.9.26` `dashboard`, `content-story` and `cold-outreach` are removed from the bundle.)
2632
+
2633
+ Shipped skills: `code-ops` (learnings protocol, config tracing, publishing safety), `web-research` (never give up deep research method), `plan-archival` (move finished plans to plans/archive and memory/completed-plans), `todos` (workspace memory/todos protocol), `arch-viz` (sub-agent generated architecture visualization), `gcp-logs` (Cloud Run log debugging via gcloud, placeholder service names), `activity-logging` (log outcomes, not tasks, plus the ACTION_LOG), `outlook` (outlook tool quick reference).
2634
+
2635
+ Decision table:
2636
+
2637
+ | Skill | Decision | Reason |
2638
+ |---|---|---|
2639
+ | code-ops | ship, converted | generic protocol, anecdote generalized |
2640
+ | web-research | ship, converted | generic method, em dashes stripped |
2641
+ | plan-archival | ship, converted | personal paths replaced with workspace-relative |
2642
+ | todos | ship, converted | owner name and paths replaced |
2643
+ | dashboard | dropped | removed on request after 2026.9.25 |
2644
+ | arch-viz | ship, converted | personal paths and projects scrubbed |
2645
+ | content-story | dropped | removed on request after 2026.9.25 |
2646
+ | cold-outreach | dropped | removed on request after 2026.9.25 |
2647
+ | gcp-logs | ship, converted | baked-in service names replaced with placeholders |
2648
+ | activity-logging | ship, converted | log names and paths made workspace-relative |
2649
+ | outlook | ship, converted | account domain scrubbed |
2650
+ | hq-ops | drop | personal repo and GitHub links |
2651
+ | brain-backup | drop | personal restic bucket and paths |
2652
+ | provider-stats | drop | personal auth profiles |
2653
+ | anthropic-sub-proxy | drop | specific deployed proxy setup |
2654
+ | reddit-posting | drop | product marketing workflow |
2655
+ | comms-identity, email-format, dri-reimbursement, johns-amex-login, insyte, willow, x-original-post, memoryrouter-listings, memoryrouter-seo | drop | owner-only skills |
2656
+ | hyperframes, hyperframes-cli, hyperframes-media, website-to-hyperframes, impeccable | exclude | third-party vendored skills |
2657
+ | orchestrator | already shipped | Family 70 |
2658
+
2659
+ Verifier checks 72.1 through 72.5 cover presence with frontmatter, the generic wording contract (no owner, product or personal names and no `always` flag), no em dashes, the RULES.md skill table, and the packed artifact (the Family 71 gate now also proves all eight skills are inside the tarball). `tests/bundled-skills.test.mjs` proves every skills chunk loads all eight from an empty workspace, a workspace copy overrides, `enabled: false` disables, and the `allowBundled` allowlist still wins. `RULES.md` section 5 lists every bundled skill.
2660
+
2661
+ Roll back with `npm i -g johns-harness@2026.9.24`.
2662
+
2663
+ ## Family 73: prune bundled skills
2664
+
2665
+ **Release:** `johns-harness@2026.9.26`. Published as `latest` and the `extended` dist-tag moves to it.
2666
+
2667
+ Three of the Family 72 bundled skills are removed from the bundled set on request after `2026.9.25`: `content-story`, `dashboard` and `cold-outreach`. The remaining eight (`activity-logging`, `arch-viz`, `code-ops`, `gcp-logs`, `outlook`, `plan-archival`, `todos`, `web-research`) are unchanged, and a workspace or managed copy of a removed skill still overrides and loads as it always did. Nothing else differs from `2026.9.25`.
2668
+
2669
+ The counters move with the set: the verifier emits one check per remaining skill through the same 72.1 loop (455 checks in total), `tests/bundled-skills.test.mjs` asserts exactly eight bundled skills, `scripts/check-packed-artifact.mjs` fails closed unless a tarball carries all eight with frontmatter, and `README.md` and the pinned copy in `patches/59-migrate-cli.patch` carry the new counts together so check 59c stays green. `RULES.md` section 5 drops the three rows.
2670
+
2671
+ Roll back with `npm i -g johns-harness@2026.9.25`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "johns-harness",
3
- "version": "2026.9.24",
3
+ "version": "2026.9.26",
4
4
  "description": "John's Harness: a production agent harness that runs autonomous coding agents as one cooperative swarm.",
5
5
  "keywords": [
6
6
  "ai-agents",
@@ -10,6 +10,10 @@
10
10
  // carries exactly one Family 68 marker and exactly one `tryNative: true`, the tarball version
11
11
  // matches the tree version, and no copy is missing.
12
12
  //
13
+ // Family 72: the bundled generic skills are also part of the artifact contract. Every one of
14
+ // the Family 72 skills must be present in the tarball with a `name` and a `description` in its
15
+ // frontmatter. The same inspection runs on installed trees.
16
+ //
13
17
  // Usage:
14
18
  // node scripts/check-packed-artifact.mjs [package root] pack the tree, then inspect
15
19
  // node scripts/check-packed-artifact.mjs --tarball <file.tgz> inspect a tarball (for example
@@ -40,6 +44,33 @@ export const LOADERS10 = [
40
44
 
41
45
  const count = (text, needle) => text.split(needle).length - 1;
42
46
 
47
+ // Family 72: the generic skills shipped as bundled skills. Each must be inside the artifact
48
+ // with valid frontmatter (a `name:` and a `description:` line).
49
+ export const F72_SKILLS = [
50
+ "activity-logging",
51
+ "arch-viz",
52
+ "code-ops",
53
+ "gcp-logs",
54
+ "outlook",
55
+ "plan-archival",
56
+ "todos",
57
+ "web-research",
58
+ ];
59
+
60
+ /** Family 72: verify every bundled generic skill is present with frontmatter. Returns the count. */
61
+ export function inspectSkills72(pkgDir) {
62
+ const problems = [];
63
+ for (const name of F72_SKILLS) {
64
+ const file = path.join(pkgDir, "skills", name, "SKILL.md");
65
+ if (!fs.existsSync(file)) { problems.push(`${name}: skills/${name}/SKILL.md missing from artifact`); continue; }
66
+ const text = fs.readFileSync(file, "utf8");
67
+ if (!/^name: [a-z0-9-]+$/m.test(text)) problems.push(`${name}: frontmatter has no name line`);
68
+ if (!/^description: .+$/m.test(text)) problems.push(`${name}: frontmatter has no description line`);
69
+ }
70
+ if (problems.length) throw new Error(`Family 72: packed artifact is missing bundled generic skills:\n ${problems.join("\n ")}`);
71
+ return F72_SKILLS.length;
72
+ }
73
+
43
74
  /** Inspect an extracted package directory (the `package/` folder of a tarball). Throws on any gap. */
44
75
  export function inspectExtracted71(pkgDir, { expectVersion } = {}) {
45
76
  const manifestPath = path.join(pkgDir, "package.json");
@@ -62,7 +93,8 @@ export function inspectExtracted71(pkgDir, { expectVersion } = {}) {
62
93
  if (m === 1 && o === 1) markers += 1;
63
94
  }
64
95
  if (problems.length) throw new Error(`Family 71: packed artifact lacks native-first Jiti:\n ${problems.join("\n ")}`);
65
- return { version: manifest.version, loaders: LOADERS10.length, markers };
96
+ const skills = inspectSkills72(pkgDir);
97
+ return { version: manifest.version, loaders: LOADERS10.length, markers, skills };
66
98
  }
67
99
 
68
100
  /** Extract a tarball into a temp dir and inspect it. */
@@ -105,7 +137,7 @@ if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.me
105
137
  const root = path.resolve(positional[0] || path.join(path.dirname(fileURLToPath(import.meta.url)), ".."));
106
138
  result = packAndInspect71(root);
107
139
  }
108
- console.log(`Family 71: ${result.markers}/${result.loaders} loader copies carry native-first Jiti in ${path.basename(result.tarball)} (version ${result.version})`);
140
+ console.log(`Family 71: ${result.markers}/${result.loaders} loader copies carry native-first Jiti in ${path.basename(result.tarball)} (version ${result.version}); Family 72: ${result.skills} bundled generic skills present`);
109
141
  } catch (error) {
110
142
  console.error(error.message);
111
143
  process.exit(1);
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: activity-logging
3
+ description: Activity and action logging to the workspace. Load when logging work outcomes or recording actions to ACTION_LOG.md.
4
+ ---
5
+
6
+ # Activity & Action Logging
7
+
8
+ ## Activity Logging: Log Outcomes, Not Tasks
9
+
10
+ ### What to Log
11
+ - Features built or meaningfully improved
12
+ - Process/rule changes with real impact
13
+ - Decisions that matter
14
+ - Problems encountered and how they were resolved (if interesting)
15
+
16
+ ### What NOT to Log
17
+ - Fixing your own mistakes (type errors, build failures, typos)
18
+ - Minor tweaks or implementation details
19
+ - Each tiny step of a larger task: consolidate into one entry
20
+ - Routine maintenance
21
+
22
+ ### How to Decide
23
+ Ask: *"Would the user care about this in a weekly review?"*
24
+ - If it's an **outcome** that delivered value, log it
25
+ - If it's **busywork** or cleanup, skip it
26
+ - If multiple items are related, **consolidate** into one entry
27
+
28
+ ### Format
29
+ - **Bold the specific outcome**: then explain what/how/why
30
+ - Entry should make sense in 3 months without extra context
31
+ - Ask: *"What can the user or I do now that we couldn't before?"*
32
+ - Bad: "Improved chart system"
33
+ - Good: "Pie charts now show percentages on slices: added data labels, mobile scroll, theme colors"
34
+
35
+ ### Process
36
+ 1. Update today's log: `memory/logs/YYYY-MM-DD.md`
37
+ 2. Mirror on the dashboard if one exists
38
+ 3. Push to git:
39
+ ```bash
40
+ cd <workspace>
41
+ git add -A && git commit -m "Update log" && git push
42
+ ```
43
+
44
+ ---
45
+
46
+ ## Action Log (Real-Time Action Tracking)
47
+
48
+ **Log every action as it happens.**
49
+
50
+ ### Location
51
+ `ACTION_LOG.md` in the workspace root
52
+
53
+ ### What to Log
54
+ Every action you take: simple one-liner titles:
55
+ - Spawned sub-agent for X
56
+ - Generated image for Y
57
+ - Fixed Z in repo
58
+ - Created skill for W
59
+ - Sent message to user about V
60
+
61
+ ### Format
62
+ ```markdown
63
+ ## YYYY-MM-DD
64
+
65
+ - Action 1
66
+ - Action 2
67
+ - Action 3
68
+ ```
69
+
70
+ ### Rules
71
+ 1. **Log immediately**: after completing any action, add a one-liner
72
+ 2. **Keep it simple**: title-level, not detailed
73
+ 3. **New date section**: start each day with a new `## YYYY-MM-DD` header
74
+ 4. **Don't overthink**: if you did something, log it
75
+
76
+ ### Daily Recap (Scheduled Job)
77
+ A daily scheduled job can create `memory/YYYY-MM-DD.md` from:
78
+ 1. **Conversation history**: the full journey of what was discussed, decided, built
79
+ 2. **Action Log**: the action entries
80
+
81
+ Format:
82
+ ```markdown
83
+ # YYYY-MM-DD: [Creative title capturing the day's vibe]
84
+
85
+ ## The Story
86
+ [2-4 paragraph narrative, journal entry style, captures the day's energy]
87
+
88
+ ## Key Accomplishments
89
+ - Major wins and shipped items
90
+ - Decisions made
91
+
92
+ ## Actions Log
93
+ [Actions from ACTION_LOG.md]
94
+ ```
95
+
96
+ This captures the journey over time: both the story AND the specifics.
@@ -0,0 +1,94 @@
1
+ ---
2
+ name: arch-viz
3
+ description: Generate a detailed visual architecture image for any codebase. Spawns a sub-agent that analyzes the code, understands the flow, and creates a cyberpunk-style visualization showing data moving through the system.
4
+ metadata: { "johnness": { "emoji": "🎨" } }
5
+ ---
6
+
7
+ # Architecture Visualizer
8
+
9
+ Spawns a sub-agent to analyze a codebase and generate a detailed visual architecture image.
10
+
11
+ ## When to Use
12
+
13
+ - User says "visualize this codebase"
14
+ - User wants an architecture diagram that's creative/visual (not mermaid)
15
+ - User asks for a "picture of how this works"
16
+ - User wants to see "the flow" or "how data moves"
17
+
18
+ ## How It Works
19
+
20
+ 1. You spawn a sub-agent with the task below
21
+ 2. Sub-agent analyzes the codebase (entry points, folder structure, docs)
22
+ 3. Sub-agent identifies components and data flows
23
+ 4. Sub-agent crafts a detailed image prompt
24
+ 5. Sub-agent generates the image with an image-generation tool available in the environment
25
+ 6. Sub-agent reports back with the image path
26
+
27
+ ## Spawn Template
28
+
29
+ ```
30
+ sessions_spawn(
31
+ task: "Analyze the codebase and create a detailed visual architecture image.
32
+
33
+ Working directory: [PATH]
34
+
35
+ Steps:
36
+ 1. Read the codebase - entry points, folder structure, README, any architecture docs
37
+ 2. Identify the core components:
38
+ - User-facing interfaces (mobile app, web, CLI, API consumers)
39
+ - Backend services/APIs (frameworks, routes, controllers)
40
+ - Databases and storage (what data, how structured)
41
+ - External services (AI providers, payments, auth, third-party APIs)
42
+ - Key data flows (what goes in, transforms, comes out)
43
+
44
+ 3. Create a DETAILED image generation prompt following this style:
45
+ - Isometric 3D, dark background, neon cyberpunk aesthetic
46
+ - Show data MOVING through the system (binary streams, glowing packets, light pulses)
47
+ - Each component has INTERNAL DETAIL visible (like a cross-section of a living machine)
48
+ - Stage the flow left-to-right: Input → Processing → Output
49
+ - Visual elements to include:
50
+ * Binary 1s and 0s streaming between components
51
+ * API calls as light pulses traveling along pathways
52
+ * Database with visible rows/tables scrolling
53
+ * Storage with file thumbnails flowing in/out
54
+ * AI as neural network with synapses firing
55
+ * Auth as locks/keys/tokens
56
+ * Payments as cards/coins/tiers
57
+ - NO TEXT LABELS - everything visually self-explanatory
58
+ - Color palette: deep purples, electric blues, hot pinks, cyan accents
59
+ - Style keywords: 'hyper-detailed cyberpunk tech visualization'
60
+
61
+ 4. Generate the image with an image-generation tool or skill available in your
62
+ environment, saving it as '[project-name]-architecture.png' at 2K resolution.
63
+
64
+ 5. Report the image path so it can be sent to the user.
65
+
66
+ Be thorough in your analysis. The more you understand the codebase, the better the visualization.",
67
+ label: "arch-viz-[project-name]",
68
+ runTimeoutSeconds: 600
69
+ )
70
+ ```
71
+
72
+ ## Example Usage
73
+
74
+ User: "Visualize the <project> codebase"
75
+
76
+ → Spawn with the path of the codebase.
77
+
78
+ User: "Make an architecture image for <project>"
79
+
80
+ → Spawn with the path of the codebase.
81
+
82
+ ## Output
83
+
84
+ The sub-agent will generate an image and report the path. Send it to the user with:
85
+
86
+ ```
87
+ message(action: "send", media: "[image_path]", message: "Here's your architecture visualization")
88
+ ```
89
+
90
+ ## Tips
91
+
92
+ - For larger codebases, the analysis takes longer but produces better results
93
+ - The sub-agent may ask clarifying questions if the codebase structure is unclear
94
+ - Images are saved to the workspace by default
@@ -0,0 +1,121 @@
1
+ ---
2
+ name: code-ops
3
+ description: "Code operations: learnings protocol, config tracing, publishing safety. Load BEFORE editing the agent runtime or any codebase, starting a coding project, or publishing anything."
4
+ ---
5
+
6
+ # Code Operations: Learnings, Config Tracing, Publishing
7
+
8
+ ## Learnings Protocol: Read First, Write After
9
+
10
+ **Before starting ANY coding project, read `.learnings/` if it exists. After completing work, write learnings.**
11
+
12
+ ### Before Starting
13
+ 1. **Check** if `.learnings/` folder exists in the project root
14
+ 2. **If it exists**, read ALL files in `.learnings/` before writing any code
15
+ 3. **Internalize** the lessons. They are hard-won insights from past mistakes
16
+
17
+ ### After Completing
18
+ When you discover something important or finish a project:
19
+ 1. **Create** `.learnings/` folder if it doesn't exist
20
+ 2. **Write** a learnings file: `.learnings/YYYY-MM-DD-brief-topic.md`
21
+ 3. **Include:**
22
+ - What went wrong / what we learned
23
+ - Root cause
24
+ - The fix
25
+ - How to prevent it next time
26
+
27
+ ### Format
28
+ ```markdown
29
+ # [Topic]: Learnings from YYYY-MM-DD
30
+
31
+ ## What Happened
32
+ [Brief description of the issue/discovery]
33
+
34
+ ## Root Cause
35
+ [Why it happened]
36
+
37
+ ## The Fix
38
+ [How we solved it]
39
+
40
+ ## Prevention
41
+ [How to avoid this next time]
42
+ ```
43
+
44
+ ### Why
45
+ - Don't repeat the same mistakes
46
+ - Institutional memory lives in the codebase
47
+ - Future you (or other agents) will thank you
48
+ - Learnings compound over time
49
+
50
+ **Read learnings FIRST. Write learnings AFTER. Always.**
51
+
52
+ ---
53
+
54
+ ## Code Edits: Trace the Full Path
55
+
56
+ **When editing the agent runtime or any codebase, TRIPLE CHECK the config flow before committing.**
57
+
58
+ ### The Rule
59
+ Before ANY code change that touches config, types, or exports:
60
+ 1. **Trace the variable**: follow it through EVERY file it touches
61
+ 2. **Check validation schemas**: does the schema need updating?
62
+ 3. **Check type exports**: are all functions still exported that should be?
63
+ 4. **Check config validation**: will the config loader accept this?
64
+ 5. **Build and test**: the build must pass
65
+ 6. **Test runtime**: start the gateway and verify it doesn't crash
66
+
67
+ ### What This Prevents
68
+ - Orphaned exports (function removed but re-export left behind)
69
+ - Missing schema fields (config exists but validation rejects it)
70
+ - Type mismatches (compiles but runtime fails)
71
+ - Partial implementations (added feature but forgot plumbing)
72
+
73
+ ### The Checklist (Run Before Every Commit)
74
+ ```
75
+ □ Traced all new/changed variables through full code path
76
+ □ Updated schema if adding config fields
77
+ □ Removed orphaned exports if deleting functions
78
+ □ Build passes
79
+ □ Gateway starts without crash
80
+ □ Feature actually works (manual test)
81
+ ```
82
+
83
+ ### Why This Matters
84
+ One real incident: a search integration was added without updating the validation schema, and an orphaned export was left behind. Result: the gateway crashed and the agent had to be revived. This is unacceptable. Code changes to your own infrastructure require extra care.
85
+
86
+ ### Anti-Patterns (NEVER do these)
87
+ ❌ Add config field but forget the schema
88
+ ❌ Remove function but leave the export
89
+ ❌ Commit without building
90
+ ❌ Trust that "it should work" without testing
91
+ ❌ Rush the commit to ship faster
92
+
93
+ **Every code edit: trace, validate, build, test. No shortcuts.**
94
+
95
+ ---
96
+
97
+ ## Publishing Rules
98
+
99
+ **Before publishing ANYTHING, verify secrets are excluded.**
100
+
101
+ ### The Rule
102
+ Before publishing to any registry, repo, or public location:
103
+ 1. **Check ignore files**: confirm `.env`, secrets, and dev files are excluded
104
+ 2. **Preview what's included**: dry-run or list files before publishing
105
+ 3. **Look for red flags**: `.env`, config files with keys, anything sensitive
106
+
107
+ ### Pre-Publish Checklist
108
+ ```
109
+ □ Ignore files properly configured (.gitignore, .npmignore, .dockerignore, etc.)
110
+ □ Previewed/verified file list before publishing
111
+ □ No secrets in any included files
112
+ □ Version bumped appropriately
113
+ ```
114
+
115
+ ### If Secrets Are Published
116
+ 1. **Immediately** publish a clean version
117
+ 2. **Deprecate/remove** the compromised version
118
+ 3. **Rotate** any exposed credentials
119
+ 4. **Notify** affected parties if applicable
120
+
121
+ **Every publish: verify what's included. No exceptions.**
@@ -0,0 +1,83 @@
1
+ ---
2
+ name: gcp-logs
3
+ description: Check Google Cloud Run logs for errors, debug issues, and monitor services. Use when debugging Cloud Run deployments, checking for errors, or investigating issues.
4
+ metadata: { "johnness": { "emoji": "📋", "requires": { "bins": ["gcloud"] } } }
5
+ ---
6
+
7
+ # GCP Cloud Run Logs
8
+
9
+ Check Cloud Run service logs to debug issues, find errors, and monitor services.
10
+
11
+ ## Service Names
12
+
13
+ Run `gcloud run services list` to see the user's service names, then substitute `SERVICE_NAME` in the commands below.
14
+
15
+ ## Quick Commands
16
+
17
+ ### Check Recent Errors (any service)
18
+ ```bash
19
+ gcloud logging read "resource.type=cloud_run_revision AND severity>=ERROR" --limit=10 --format="table(timestamp,resource.labels.service_name,textPayload)"
20
+ ```
21
+
22
+ ### Check Specific Service Errors
23
+ ```bash
24
+ gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=SERVICE_NAME AND severity>=ERROR" --limit=10 --format="value(textPayload)"
25
+ ```
26
+
27
+ ### Check Errors in Last N Minutes
28
+ ```bash
29
+ gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=SERVICE_NAME AND severity>=ERROR AND timestamp>=\"$(date -u -v-10M '+%Y-%m-%dT%H:%M:%SZ')\"" --limit=20 --format="value(textPayload)"
30
+ ```
31
+
32
+ ### All Logs for a Service (recent)
33
+ ```bash
34
+ gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=SERVICE_NAME" --limit=50 --format="table(timestamp,severity,textPayload)"
35
+ ```
36
+
37
+ ## Common Patterns
38
+
39
+ ### Startup Failures
40
+ ```bash
41
+ gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=SERVICE_NAME AND textPayload:\"STARTUP\"" --limit=5
42
+ ```
43
+
44
+ ### Database Connection Issues
45
+ ```bash
46
+ gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=SERVICE_NAME AND (textPayload:\"sqlalchemy\" OR textPayload:\"database\" OR textPayload:\"connection\")" --limit=10
47
+ ```
48
+
49
+ ### Python Tracebacks
50
+ ```bash
51
+ gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=SERVICE_NAME AND textPayload:\"Traceback\"" --limit=5 --format="value(textPayload)"
52
+ ```
53
+
54
+ ## Output Formats
55
+
56
+ - `--format="table(timestamp,severity,textPayload)"`: clean table
57
+ - `--format="value(textPayload)"`: raw text only
58
+ - `--format="json"`: full JSON (verbose)
59
+
60
+ ## Examples
61
+
62
+ ### Check if staging is erroring
63
+ ```bash
64
+ gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=SERVICE_NAME-staging AND severity>=ERROR" --limit=5 --format="value(textPayload)"
65
+ ```
66
+
67
+ ### Check prod for last hour errors
68
+ ```bash
69
+ gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=SERVICE_NAME AND severity>=ERROR AND timestamp>=\"$(date -u -v-1H '+%Y-%m-%dT%H:%M:%SZ')\"" --limit=20
70
+ ```
71
+
72
+ ### Get health check status
73
+ ```bash
74
+ curl -s https://SERVICE_NAME-PROJECT_NUMBER.REGION.run.app/health
75
+ curl -s https://SERVICE_NAME-staging-PROJECT_NUMBER.REGION.run.app/health
76
+ ```
77
+
78
+ ## Service URLs
79
+
80
+ - **Production:** `https://SERVICE_NAME-PROJECT_NUMBER.REGION.run.app`
81
+ - **Staging:** `https://SERVICE_NAME-staging-PROJECT_NUMBER.REGION.run.app`
82
+
83
+ (Find the region and project number with `gcloud run services list` or `gcloud projects describe PROJECT_ID`.)
@@ -0,0 +1,139 @@
1
+ ---
2
+ name: outlook
3
+ description: Use the outlook tool to read, send, reply to, forward, and organize Microsoft 365 email, including inbox rules and folders. Load when the user asks to handle Outlook or Microsoft 365 email.
4
+ ---
5
+
6
+ # Outlook Tool Skill
7
+
8
+ Use the `outlook` tool to interact with Microsoft 365 email for the user's account.
9
+
10
+ ## Email Operations
11
+
12
+ ### Search Emails
13
+ ```
14
+ outlook(action="search", query="is:unread", max=10)
15
+ outlook(action="search", query="from:someone@example.com", max=20)
16
+ ```
17
+
18
+ ### Read Specific Email
19
+ ```
20
+ outlook(action="read", messageId="<MESSAGE_ID>")
21
+ ```
22
+
23
+ ### Send New Email
24
+ ```
25
+ outlook(
26
+ action="send",
27
+ to="recipient@example.com",
28
+ subject="Subject here",
29
+ body="Email body here"
30
+ )
31
+ ```
32
+
33
+ With CC/BCC:
34
+ ```
35
+ outlook(
36
+ action="send",
37
+ to="to@example.com",
38
+ cc="cc@example.com",
39
+ bcc="bcc@example.com",
40
+ subject="Subject here",
41
+ body="Body here"
42
+ )
43
+ ```
44
+
45
+ For HTML body:
46
+ ```
47
+ outlook(
48
+ action="send",
49
+ to="recipient@example.com",
50
+ subject="Subject",
51
+ bodyHtml="<p>Formatted content</p>"
52
+ )
53
+ ```
54
+
55
+ ### Reply to Email
56
+ ```
57
+ outlook(
58
+ action="reply",
59
+ messageId="<ORIGINAL_MSG_ID>",
60
+ body="Your reply text here"
61
+ )
62
+ ```
63
+
64
+ ### Reply All
65
+ ```
66
+ outlook(
67
+ action="reply_all",
68
+ messageId="<ORIGINAL_MSG_ID>",
69
+ body="Reply all text here"
70
+ )
71
+ ```
72
+
73
+ ### Forward Email
74
+ ```
75
+ outlook(
76
+ action="forward",
77
+ messageId="<ORIGINAL_MSG_ID>",
78
+ to="forward-to@example.com",
79
+ body="Forwarding note"
80
+ )
81
+ ```
82
+
83
+ ### Mark Read/Unread
84
+ ```
85
+ outlook(action="mark_read", messageId="<MSG_ID>")
86
+ outlook(action="mark_unread", messageId="<MSG_ID>")
87
+ ```
88
+
89
+ ### Flag/Unflag
90
+ ```
91
+ outlook(action="flag", messageId="<MSG_ID>")
92
+ outlook(action="unflag", messageId="<MSG_ID>")
93
+ ```
94
+
95
+ ### Delete/Move
96
+ ```
97
+ outlook(action="delete", messageId="<MSG_ID>")
98
+ outlook(action="move", messageId="<MSG_ID>", destinationFolderId="<FOLDER_ID>")
99
+ ```
100
+
101
+ ### List Folders
102
+ ```
103
+ outlook(action="folders_list")
104
+ ```
105
+
106
+ ## Inbox Rules
107
+
108
+ ### Create Rule
109
+ ```
110
+ outlook(
111
+ action="rule_create",
112
+ ruleName="Auto-archive newsletters",
113
+ ruleSenderContains=["newsletter@", "updates@"],
114
+ ruleMarkAsRead=true,
115
+ ruleMoveToFolder="<ARCHIVE_FOLDER_ID>"
116
+ )
117
+ ```
118
+
119
+ ### List/Delete Rules
120
+ ```
121
+ outlook(action="rules_list")
122
+ outlook(action="rule_delete", ruleId="<RULE_ID>")
123
+ ```
124
+
125
+ ## Quick Reference
126
+
127
+ | Action | Tool Call |
128
+ |--------|-----------|
129
+ | Search emails | `outlook(action="search", query="...", max=10)` |
130
+ | Read email | `outlook(action="read", messageId="...")` |
131
+ | Send email | `outlook(action="send", to="...", subject="...", body="...")` |
132
+ | Reply | `outlook(action="reply", messageId="...", body="...")` |
133
+ | Reply all | `outlook(action="reply_all", messageId="...", body="...")` |
134
+ | Forward | `outlook(action="forward", messageId="...", to="...", body="...")` |
135
+ | Mark read | `outlook(action="mark_read", messageId="...")` |
136
+ | Flag | `outlook(action="flag", messageId="...")` |
137
+ | Delete | `outlook(action="delete", messageId="...")` |
138
+ | List folders | `outlook(action="folders_list")` |
139
+ | List rules | `outlook(action="rules_list")` |
@@ -0,0 +1,84 @@
1
+ ---
2
+ name: plan-archival
3
+ description: Archive completed plans. Load when a plan is finished or a sub-agent completes plan work.
4
+ ---
5
+
6
+ # Plan Archival
7
+
8
+ ## When a Plan is Completed: Archive It
9
+
10
+ ### Workflow
11
+ 1. **Execute the plan**: do the work outlined in the plan document
12
+ 2. **Move to archive**: `plans/` to `plans/archive/` in the workspace
13
+ 3. **Add completion metadata**: date completed, outcome summary at top of file
14
+ 4. **Link in logs**: when logging the completion, link to the archived plan
15
+
16
+ ### Plan Location
17
+ `plans/` (in the workspace root)
18
+
19
+ ### Archive Location
20
+ `plans/archive/`
21
+
22
+ ### Completion Metadata (add to top of archived plan)
23
+ ```markdown
24
+ > **Status:** ✅ Completed
25
+ > **Completed:** YYYY-MM-DD
26
+ > **Outcome:** [1-2 sentence summary of what was achieved]
27
+ > **Log Entry:** [Link to the log entry that recorded completion]
28
+
29
+ ---
30
+ [Original plan content below]
31
+ ```
32
+
33
+ ### Why This Matters
34
+ - Todos and logs stay clean (single title line)
35
+ - Full context preserved for posterity
36
+ - Can dive into any past decision/implementation
37
+ - Creates institutional memory
38
+
39
+ ### Process
40
+ ```bash
41
+ cd <workspace>
42
+ mv plans/PLAN_NAME.md plans/archive/PLAN_NAME.md
43
+ # Edit to add completion metadata
44
+ git add -A && git commit -m "Archive completed plan: PLAN_NAME" && git push
45
+ ```
46
+
47
+ ---
48
+
49
+ ## Completed Plans to Memory
50
+
51
+ **When a plan is completed, also move it to `memory/completed-plans/`.**
52
+
53
+ ### When to Move
54
+ - Sub-agent completes work on a plan
55
+ - All phases of a plan are done
56
+ - You review sub-agent work and confirm completion
57
+
58
+ ### Process
59
+ 1. **Review** the sub-agent's work on the plan
60
+ 2. **Confirm** all objectives are met
61
+ 3. **Move** the plan file:
62
+ ```bash
63
+ mv memory/plans/PLAN_NAME.md memory/completed-plans/PLAN_NAME.md
64
+ # OR
65
+ mv plans/PLAN_NAME.md memory/completed-plans/PLAN_NAME.md
66
+ ```
67
+ 4. **Add completion note** at top of file:
68
+ ```markdown
69
+ > **Status:** ✅ Completed
70
+ > **Completed:** YYYY-MM-DD
71
+ > **Outcome:** [Brief summary of what was achieved]
72
+ ```
73
+ 5. **Commit + push**
74
+
75
+ ### Locations
76
+ - **Active plans:** `plans/` or `memory/plans/`
77
+ - **Completed plans:** `memory/completed-plans/`
78
+
79
+ ### Why
80
+ - Keeps active plans clean and focused
81
+ - Preserves history of completed work
82
+ - Easy to find what's been done vs what's pending
83
+
84
+ **Every time you review a sub-agent's completed work on a plan, move it to completed-plans.**
@@ -0,0 +1,111 @@
1
+ ---
2
+ name: todos
3
+ description: Manage the user's todos in memory/todos. Use when the user mentions tasks, todos, things to do, projects, or anything that sounds like "we need to do X". Also use for organizing, updating, or reviewing todos.
4
+ ---
5
+
6
+ # Todo Management Skill
7
+
8
+ Todos live in `memory/todos/` in the workspace.
9
+
10
+ ## Structure
11
+
12
+ ```
13
+ memory/todos/
14
+ ├── README.md # Main dashboard with TODAY section at top
15
+ ├── TODAY.md # Copy of today's daily todos (refreshed daily)
16
+ ├── projects/ # Project folders
17
+ │ ├── project-name/
18
+ │ │ ├── README.md # Project todos + context (Unassigned → In Progress → Done)
19
+ │ │ ├── DONE.md # Completed todos for this project
20
+ │ │ └── *.md # Additional context/reference files
21
+ │ └── ...
22
+ └── archive/ # Stale projects (no activity >30 days)
23
+ ```
24
+
25
+ ## Todo Format
26
+
27
+ Use checkboxes for all todos. Todos can have sub-todos:
28
+
29
+ ```markdown
30
+ - [ ] Main task
31
+ - [ ] Subtask 1
32
+ - [ ] Subtask 2
33
+ - [ ] Sub-subtask
34
+ ```
35
+
36
+ ## Project README Structure
37
+
38
+ Each project folder has a README.md:
39
+
40
+ ```markdown
41
+ # Project Name
42
+
43
+ **Last Active:** YYYY-MM-DD
44
+
45
+ ## Context
46
+ Brief description of the project.
47
+
48
+ ## Unassigned
49
+ - [ ] Task not yet started
50
+
51
+ ## In Progress
52
+ - [ ] Task being worked on
53
+
54
+ ## Done
55
+ - [x] Completed task (move to DONE.md when section gets long)
56
+
57
+ ## References
58
+ - [Related doc](./related.md)
59
+ ```
60
+
61
+ ## Main README (todos/README.md)
62
+
63
+ ```markdown
64
+ # Todos Dashboard
65
+
66
+ **Last Updated:** YYYY-MM-DD
67
+
68
+ ## 📅 Today
69
+ <!-- Copy from TODAY.md each morning -->
70
+ - [ ] Daily task 1
71
+ - [ ] Daily task 2
72
+
73
+ ## 🔥 Active Projects
74
+ - [Project Name](./projects/project-name/) - brief status
75
+
76
+ ## 📦 Archive
77
+ - [Old Project](./archive/old-project/) - archived YYYY-MM-DD
78
+ ```
79
+
80
+ ## Rules
81
+
82
+ 1. **Capture everything**: if the user says "we need to do X" or anything todo-like, add it
83
+ 2. **Update dates**: every edit, update "Last Active" or "Last Updated"
84
+ 3. **Archive stale projects**: no activity in 30+ days, move to archive/
85
+ 4. **Group by project**: new topics become new project folders
86
+ 5. **Daily refresh**: a daily scheduled job reviews recent conversations and updates todos
87
+ 6. **Push changes**: after updating, commit and push to git:
88
+ ```bash
89
+ cd <workspace>
90
+ git add -A && git commit -m "Update todos" && git push
91
+ ```
92
+
93
+ ## Workflow
94
+
95
+ ### Adding a todo
96
+ 1. Identify the project (create folder if new)
97
+ 2. Add to appropriate section (Unassigned/In Progress)
98
+ 3. Update "Last Active" date
99
+ 4. Push to git
100
+
101
+ ### Completing a todo
102
+ 1. Mark with [x]
103
+ 2. Move to Done section (or DONE.md if section is long)
104
+ 3. Update dates
105
+ 4. Push to git
106
+
107
+ ### Archiving a project
108
+ 1. Check "Last Active" date
109
+ 2. If >30 days with no mentions, move folder to archive/
110
+ 3. Update main README.md
111
+ 4. Push to git
@@ -0,0 +1,153 @@
1
+ ---
2
+ name: web-research
3
+ description: Deep web research methodology. Use when searching for information, investigating topics, or answering questions that require thorough research. Never give up until the answer is found.
4
+ ---
5
+
6
+ # Web Research Skill
7
+
8
+ **Objective:** Find the answer. Don't stop until you have it.
9
+
10
+ ---
11
+
12
+ ## The Process
13
+
14
+ ### 1. Initial Search
15
+ ```
16
+ web_search(query="<initial query>", count=10)
17
+ ```
18
+ - Start broad but relevant
19
+ - Look at the results: identify which URLs look most promising
20
+ - Note: titles and descriptions give clues about content quality
21
+
22
+ ### 2. Investigate Promising Links
23
+ ```
24
+ web_fetch(url="<promising url>")
25
+ ```
26
+ For each promising result:
27
+ - Fetch the page content
28
+ - Scan for the information you need
29
+ - Note any specific terminology, names, or concepts discovered
30
+
31
+ ### 3. Refine & Go Deeper
32
+
33
+ **If the page answers the question:**
34
+ - Extract the answer
35
+ - Verify with a second source if important
36
+ - Report back
37
+
38
+ **If the page gives you better search terms:**
39
+ - Search again with the refined query
40
+ - New terminology, proper names, or specific phrases = better results
41
+ ```
42
+ web_search(query="<refined specific query>", count=10)
43
+ ```
44
+
45
+ **If the page has promising links:**
46
+ - Follow them with `web_fetch`
47
+ - Go deeper into the rabbit hole
48
+ - Source pages often link to primary sources
49
+
50
+ **If the page is useless:**
51
+ - Move to the next promising result
52
+ - Don't waste time on dead ends
53
+
54
+ ### 4. Change Strategy If Stuck
55
+
56
+ If initial searches aren't yielding results:
57
+ - Try different phrasings
58
+ - Search for adjacent topics that might lead to the answer
59
+ - Look for expert sources (academic, official, specialized sites)
60
+ - Try adding "reddit", "forum", "explained" for human perspectives
61
+ - Use date filters for recent info: `startDate`, `endDate`
62
+ - Use category filters: `news`, `papers`, `company`, etc.
63
+
64
+ ### 5. Never Give Up
65
+
66
+ The information exists. Keep searching until you find it:
67
+ - Try 3-5 different search strategies before considering it unfindable
68
+ - If one angle fails, approach from another
69
+ - Sometimes the answer is in an unexpected place
70
+
71
+ ---
72
+
73
+ ## Search Tips
74
+
75
+ ### Query Strategies
76
+ | Goal | Strategy |
77
+ |------|----------|
78
+ | Exact phrase | `"exact phrase here"` |
79
+ | Exclude terms | Add negative context in query |
80
+ | Recent only | Use `startDate` parameter |
81
+ | Specific sites | Include domain in query |
82
+ | Technical depth | Add "documentation", "spec", "RFC" |
83
+ | Human explanation | Add "explained", "ELI5", "guide" |
84
+
85
+ ### Source Quality
86
+ | High Quality | Lower Quality |
87
+ |--------------|---------------|
88
+ | Official docs | Content farms |
89
+ | Primary sources | Aggregators |
90
+ | Expert blogs | Generic listicles |
91
+ | Academic papers | Thin affiliate content |
92
+ | GitHub repos | Outdated forums |
93
+
94
+ ### Category Filters (search APIs)
95
+ - `news` - Recent news articles
96
+ - `papers` - Academic/research papers
97
+ - `company` - Company websites
98
+ - `github` - GitHub repos
99
+ - `tweet` - Twitter/X posts
100
+ - `linkedin` - LinkedIn content
101
+
102
+ ---
103
+
104
+ ## Example Workflows
105
+
106
+ ### Finding a specific fact
107
+ 1. `web_search("who invented X")`
108
+ 2. Fetch top 2-3 results
109
+ 3. Cross-reference the answer
110
+ 4. Report with source
111
+
112
+ ### Understanding a concept
113
+ 1. `web_search("how does X work explained")`
114
+ 2. Fetch educational content
115
+ 3. If too shallow, search for technical docs
116
+ 4. If too deep, search for simpler explanations
117
+ 5. Synthesize understanding
118
+
119
+ ### Finding current information
120
+ 1. `web_search("X 2026", startDate="2026-01-01")`
121
+ 2. Fetch recent articles
122
+ 3. Follow links to primary announcements
123
+ 4. Verify with multiple sources
124
+
125
+ ### Investigating a company/person
126
+ 1. `web_search("Company Name")` - official site
127
+ 2. `web_search("Company Name news", category="news")`
128
+ 3. `web_search("Company Name reviews reddit")`
129
+ 4. Fetch and synthesize multiple perspectives
130
+
131
+ ---
132
+
133
+ ## Rules
134
+
135
+ 1. **Don't report "I couldn't find it" after one search** - try harder
136
+ 2. **Don't summarize search results without fetching** - actually read the pages
137
+ 3. **Don't stop at surface level** - dig until you hit truth
138
+ 4. **Do verify important facts** - cross-reference sources
139
+ 5. **Do follow the trail** - links lead to better links
140
+ 6. **Do adapt your strategy** - different questions need different approaches
141
+
142
+ ---
143
+
144
+ ## The Mindset
145
+
146
+ You're an investigator. The answer is out there. Your job is to find it.
147
+
148
+ - First search = opening a door
149
+ - Each fetch = looking inside a room
150
+ - Each refinement = getting closer
151
+ - The answer = mission complete
152
+
153
+ **Don't come back empty-handed.**