@holt-os/holt 0.16.0 → 0.17.0

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/README.md CHANGED
@@ -22,7 +22,8 @@
22
22
  - **Private memory you can see.** Per-folder semantic recall and distilled facts, an interactive knowledge graph (`holt graph`), and a self-maintaining wiki (`holt wiki`) over everything you tell it. Nothing leaves your machine.
23
23
  - **Ambient by default.** `holt hook` wires memory into Claude Code so it recalls and remembers with no manual step, and an MCP server exposes the same memory to Cursor and Codex.
24
24
  - **Runs your work.** Run a task once, on a schedule, or as a named routine, and reach it from your phone over Telegram.
25
- - **Extensible, zero-infra.** Ten built-in skills plus a git-based community registry (`holt skill search`) in the portable `SKILL.md` format.
25
+ - **Useful on day one.** `/skill onboard` interviews you and fills memory in about fifteen minutes, `/skill audit` shows what is still missing, and `/skill level-up` turns one manual chore a week into something Holt does.
26
+ - **Extensible, zero-infra.** Thirteen built-in skills plus a git-based community registry (`holt skill search`) in the portable `SKILL.md` format.
26
27
  - **Writes in your voice.** `holt write` drafts in a style Holt learns from you, with built-in anti-AI checks.
27
28
 
28
29
  > **Status:** shipping and usable today. Every capability above works now.
@@ -43,6 +44,14 @@ Or with npm, if you already have Node:
43
44
  npm install -g @holt-os/holt
44
45
  ```
45
46
 
47
+ **Not comfortable in a terminal?** Install [Claude Code](https://claude.com/claude-code), open it, and paste this:
48
+
49
+ ```
50
+ Set up Holt for me: read https://raw.githubusercontent.com/holt-os/holt/main/docs/INSTALL.md and follow it exactly.
51
+ ```
52
+
53
+ It installs Holt, checks its own work, and fixes what breaks. Full detail, system requirements, and troubleshooting: [docs/INSTALL.md](./docs/INSTALL.md).
54
+
46
55
  ## Quickstart
47
56
 
48
57
  ```bash
@@ -139,6 +148,8 @@ Every exchange is saved to `<folder>/.holt/memory/turns.jsonl`, private and loca
139
148
 
140
149
  When you end a chat, Holt asks the brain to distill 1 to 5 durable facts from the session (decisions, preferences, key names, numbers) and writes them to a human-readable `<folder>/.holt/memory/facts.md` you can read and edit. Those facts are also embedded and ranked slightly higher than raw turns during recall, so the signal rises to the top over time. See them with `holt memory facts`. Turn it off by setting `memory.extractFacts` to `false` in `config.json`.
141
150
 
151
+ You do not have to wait for the end of a session. `holt memory add "<fact>"` saves one immediately, and duplicates are ignored, so it is safe to run twice. Piping in several facts, one per line, works too. Prefer this over editing `facts.md` by hand: a fact typed straight into that file is never embedded, so semantic recall will not find it.
152
+
142
153
  Two recall modes, picked automatically:
143
154
 
144
155
  - **Semantic** (best): a local [Ollama](https://ollama.com) with an embedding model, which `holt init` offers to set up for you. Recall matches by meaning: asking "who owns my apartment" finds "my landlord is called Pieter". No API keys, nothing leaves your machine.
@@ -148,6 +159,7 @@ Inspect it any time:
148
159
 
149
160
  ```bash
150
161
  holt memory # stats for this folder
162
+ holt memory add "<fact>" # teach it something durable right now
151
163
  holt memory facts # show the distilled facts (facts.md)
152
164
  holt memory search <query> # find remembered moments
153
165
  holt memory embed # embed older moments for semantic recall
@@ -315,6 +327,11 @@ Holt ships with a small, curated set of general-purpose skills, available in eve
315
327
  - **plan**: break a goal into a concrete, ordered set of steps.
316
328
  - **rewrite**: tighten and clarify a piece of text without changing its meaning.
317
329
  - **decide**: weigh a decision and give a clear recommendation.
330
+ - **onboard**: a guided first-day interview that fills memory with who you are and what you are working on.
331
+ - **audit**: a read-only health check across the four rungs, naming the gaps and the single next fix.
332
+ - **level-up**: a weekly session that turns one recurring manual chore into something Holt does, and ships it.
333
+
334
+ The last three are the setup loop. `onboard` on day one, then `audit` and `level-up` weekly. Holt gets useful in four rungs, in order: **Know** (it holds facts about you), **Reach** (it can see your real material), **Do** (it runs your repeated work), **Run** (it acts while you are away). Automating on top of an empty memory just produces confident nonsense on a timer, so the order matters.
318
335
 
319
336
  ### Skill registry (`holt skill search` / `publish`)
320
337
 
@@ -578,7 +595,7 @@ holt graph see your memory as an interactive knowledge graph
578
595
  holt mcp run an MCP server so other tools use this folder's memory (holt mcp setup)
579
596
  holt hook ambient memory for Claude Code: install | remove | status
580
597
  holt skill manage skills: list | show | create | add | remove
581
- holt memory inspect memory: holt memory [search <query> | facts | embed | clear]
598
+ holt memory inspect memory: holt memory [add <fact> | search <query> | facts | embed | clear]
582
599
  holt wiki derived knowledge wiki: holt wiki [sync | auto | rebuild | lint | list | show | status]
583
600
  holt setting configure brains, API brains, and launch command
584
601
  holt login <brain> sign in to claude, codex, or gemini
package/dist/cli.js CHANGED
@@ -677,7 +677,7 @@ function clearMemory() {
677
677
  function normalizeFact(s) {
678
678
  return (s || "").toLowerCase().replace(/\s+/g, " ").trim().replace(/[.,;:!?]+$/, "");
679
679
  }
680
- var FACTS_HEADER = "# Holt facts\n\nDistilled memories for this folder. Safe to edit by hand.\n";
680
+ var FACTS_HEADER = '# Holt facts\n\nDistilled memories for this folder. Edit or delete lines freely.\nTo ADD one, use `holt memory add "<fact>"`: a line typed in here by hand is\nnever embedded, so semantic recall will not find it.\n';
681
681
  async function saveFact(content, session) {
682
682
  const clean = content.trim();
683
683
  if (!clean) return false;
@@ -2515,6 +2515,24 @@ function buildCronLine(job, holtPath) {
2515
2515
  const command = buildCommand(job, holtPath);
2516
2516
  return `${minute} ${hour} * * * ${command} # ${CRON_MARKER}${job.id}`;
2517
2517
  }
2518
+ function buildWindowsTaskFields(job, holtPath) {
2519
+ let args;
2520
+ if (job.runArgs && job.runArgs.length > 0) {
2521
+ args = [...job.runArgs, "--quiet"];
2522
+ } else {
2523
+ args = ["run", job.task];
2524
+ if (job.brain) args.push("--brain", job.brain);
2525
+ args.push("--quiet", "--out", logPath(job.id));
2526
+ }
2527
+ const quoted = args.map((a) => /[\s"]/.test(a) ? `"${a.replace(/"/g, '\\"')}"` : a);
2528
+ return {
2529
+ program: holtPath,
2530
+ args: quoted.join(" "),
2531
+ startIn: job.workspace,
2532
+ when: job.when,
2533
+ name: `Holt ${job.id}`
2534
+ };
2535
+ }
2518
2536
  function stripCronLines(crontab, id) {
2519
2537
  const marker = `# ${CRON_MARKER}${id}`;
2520
2538
  const kept = crontab.split("\n").filter((line) => !line.includes(marker));
@@ -4824,6 +4842,34 @@ async function memoryCmd(sub, rest = []) {
4824
4842
  close();
4825
4843
  return;
4826
4844
  }
4845
+ if (action === "add" || action === "remember") {
4846
+ let items = [];
4847
+ const inline = rest.join(" ").trim();
4848
+ if (inline) items = [inline];
4849
+ else if (!process.stdin.isTTY) {
4850
+ items = readFileSync14(0, "utf8").split("\n").map((l) => l.replace(/^\s*[-*]\s+/, "").trim()).filter(Boolean);
4851
+ }
4852
+ if (items.length === 0) {
4853
+ console.log(c.dim('\n Usage: holt memory add "<fact>" (or pipe one fact per line on stdin)\n'));
4854
+ close();
4855
+ return;
4856
+ }
4857
+ const session = newSessionId();
4858
+ let saved = 0;
4859
+ let dupes = 0;
4860
+ for (const item of items) {
4861
+ if (await saveFact(item, session)) saved++;
4862
+ else dupes++;
4863
+ }
4864
+ const dupNote = dupes ? c.dim(` (${dupes} already known)`) : "";
4865
+ console.log("\n" + c.green(` Remembered ${saved} fact${saved === 1 ? "" : "s"}.`) + dupNote);
4866
+ if (saved && !await embeddingsAvailable()) {
4867
+ console.log(c.dim(' Saved in keyword mode. Run "holt doctor --fix" for semantic recall.'));
4868
+ }
4869
+ console.log("");
4870
+ close();
4871
+ return;
4872
+ }
4827
4873
  if (action === "facts") {
4828
4874
  if (!existsSync13(factsMdPath())) {
4829
4875
  console.log(c.dim("\n No facts distilled yet. They form when you end a chat session.\n"));
@@ -4864,9 +4910,9 @@ async function memoryCmd(sub, rest = []) {
4864
4910
  close();
4865
4911
  return;
4866
4912
  }
4867
- if (action && !["clear", "embed", "facts", "search", "global"].includes(action)) {
4913
+ if (action && !["add", "remember", "clear", "embed", "facts", "search", "global"].includes(action)) {
4868
4914
  console.error(`
4869
- Unknown memory subcommand: "${sub}". Use: search <query> | facts | embed | global | clear
4915
+ Unknown memory subcommand: "${sub}". Use: add <fact> | search <query> | facts | embed | global | clear
4870
4916
  `);
4871
4917
  process.exitCode = 1;
4872
4918
  close();
@@ -4888,7 +4934,8 @@ async function memoryCmd(sub, rest = []) {
4888
4934
  }
4889
4935
  const gEnabled = isGlobalEnabled(workspace());
4890
4936
  console.log(` global ${gEnabled ? c.green("on") + c.dim(" (contributes + reads shared facts)") : c.dim("off (this folder is isolated, the default)")}`);
4891
- console.log(c.dim("\n holt memory search <query> find remembered moments"));
4937
+ console.log(c.dim('\n holt memory add "<fact>" teach it something durable right now'));
4938
+ console.log(c.dim(" holt memory search <query> find remembered moments"));
4892
4939
  console.log(c.dim(" holt memory facts show distilled facts (facts.md)"));
4893
4940
  console.log(c.dim(" holt memory embed embed older memories for semantic recall"));
4894
4941
  console.log(c.dim(" holt memory global share high-value facts across your folders"));
@@ -7486,7 +7533,7 @@ function holtTools() {
7486
7533
  }
7487
7534
 
7488
7535
  // src/version.ts
7489
- var VERSION = "0.16.0";
7536
+ var VERSION = "0.17.0";
7490
7537
 
7491
7538
  // src/commands/mcp.ts
7492
7539
  function printSetup() {
@@ -7801,11 +7848,28 @@ async function addCmd(rest) {
7801
7848
  console.log(` log ${logPath(job.id)}`);
7802
7849
  if (process.platform === "darwin") installDarwin(job, holtPath);
7803
7850
  else if (process.platform === "linux") installLinux(job, holtPath);
7804
- else {
7851
+ else printManualInstall(job, holtPath);
7852
+ console.log("");
7853
+ }
7854
+ function printManualInstall(job, holtPath) {
7855
+ if (process.platform !== "win32") {
7805
7856
  console.log(c.dim("\n Your OS has no built-in installer. Install this entry yourself:"));
7806
7857
  console.log(" " + buildCronLine(job, holtPath));
7858
+ return;
7859
+ }
7860
+ const f = buildWindowsTaskFields(job, holtPath);
7861
+ console.log(c.dim("\n Saved, but not started: Holt cannot install timers on Windows yet."));
7862
+ console.log(c.dim(' Open Task Scheduler, choose "Create Basic Task", and fill in:'));
7863
+ console.log(` Name ${f.name}`);
7864
+ console.log(` Trigger Daily at ${f.when}`);
7865
+ console.log(` Program ${f.program}`);
7866
+ console.log(` Arguments ${f.args}`);
7867
+ console.log(` Start in ${f.startIn}`);
7868
+ if (job.notify) {
7869
+ console.log(
7870
+ c.dim("\n Note: --notify does not carry over to Task Scheduler. Read the log file instead.")
7871
+ );
7807
7872
  }
7808
- console.log("");
7809
7873
  }
7810
7874
  function listCmd2() {
7811
7875
  const jobs = loadJobs();
@@ -8007,10 +8071,7 @@ function installSchedule(r) {
8007
8071
  addJob(job);
8008
8072
  if (process.platform === "darwin") installDarwin2(job, holtPath);
8009
8073
  else if (process.platform === "linux") installLinux2(job, holtPath);
8010
- else {
8011
- console.log(c.dim("\n Your OS has no built-in installer. Install this entry yourself:"));
8012
- console.log(" " + buildCronLine(job, holtPath));
8013
- }
8074
+ else printManualInstall(job, holtPath);
8014
8075
  }
8015
8076
  function removeScheduleDarwin(id) {
8016
8077
  const path = plistPath(id);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@holt-os/holt",
3
- "version": "0.16.0",
3
+ "version": "0.17.0",
4
4
  "description": "An open-source personal agent OS: any LLM, private memory you can see and walk.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -0,0 +1,111 @@
1
+ ---
2
+ name: audit
3
+ description: A read-only health check of your Holt setup across the four rungs (Know, Reach, Do, Run), naming the gaps and the single next thing to fix. Use weekly, or when Holt feels less useful than expected.
4
+ ---
5
+
6
+ # audit
7
+
8
+ ## When to use
9
+
10
+ The user wants to know whether Holt is actually set up well, or why it feels
11
+ thin. This skill inspects the real state of the folder and reports back. It
12
+ changes nothing: no files written, no settings altered, no facts saved. If a fix
13
+ is obvious, name the command and let the user run it.
14
+
15
+ ## The four rungs
16
+
17
+ Each rung depends on the one below it. A gap low down makes everything above it
18
+ worse, so always report the lowest gap first.
19
+
20
+ 1. **Know**: it holds facts about the user and their work.
21
+ 2. **Reach**: it can see the real material, not just what is typed at it.
22
+ 3. **Do**: it runs their repeated work as skills.
23
+ 4. **Run**: it acts without the user being present.
24
+
25
+ ## Instructions
26
+
27
+ ### Gather the state
28
+
29
+ Run these and read the output. If you cannot run commands in this session, ask
30
+ the user to paste the output of the first three rather than guessing.
31
+
32
+ ```
33
+ holt memory facts count, embedded count, recall mode
34
+ holt memory facts what it actually knows
35
+ holt voice show is there a writing profile
36
+ holt hook status ambient memory in Claude Code
37
+ holt skill list which skills exist, and which are built in
38
+ holt routine list named jobs
39
+ holt schedule list timers
40
+ holt doctor machine level problems
41
+ holt wiki status derived knowledge, if used
42
+ ```
43
+
44
+ ### Score each rung
45
+
46
+ Be strict. A generous audit is a useless one. Mark each rung **solid**, **thin**,
47
+ or **missing**, and say what the evidence was.
48
+
49
+ - **Know** is solid when memory holds a few dozen facts that are about the
50
+ user's actual work, and recall is running on embeddings rather than keyword
51
+ match. It is thin when the facts are mostly setup trivia, or when
52
+ `holt memory` shows moments that were never embedded. Read the facts, do not
53
+ just count them: fifty facts about one afternoon is still thin.
54
+ - **Reach** is solid when Holt sees material without the user pasting it: the
55
+ hook is installed, or MCP is wired into the tools they use, or the folder
56
+ holds the real files. It is missing when every session starts by pasting
57
+ context in by hand.
58
+ - **Do** is solid when at least one skill exists that the user or their
59
+ registry provided, tuned to their work. Built-in skills alone do not count;
60
+ everyone has those. Note which ones are actually being used.
61
+ - **Run** is solid when something has produced output while they were away, and
62
+ they read it. A routine that exists but has never run is thin, not solid.
63
+
64
+ ### Report
65
+
66
+ 1. Name the rung they are on: the highest one that is solid, with everything
67
+ below it also solid. Say it in one line.
68
+ 2. List the gaps, lowest rung first. For each, state what is missing and the
69
+ command that would close it.
70
+ 3. Give **one** next action. Not a menu, not a ranked list of five. The single
71
+ thing that unblocks the most.
72
+ 4. Flag anything actively broken separately from anything merely absent. A
73
+ scheduled routine that fails every night is worse than no routine, and a
74
+ memory in keyword mode is quietly degrading every answer.
75
+
76
+ Keep the whole report short enough to read in a minute. It is a dashboard, not
77
+ an essay.
78
+
79
+ ### Known traps to check for
80
+
81
+ - **Keyword mode.** If `holt memory` says recall is keyword rather than
82
+ embeddings, semantic recall is off and every answer is worse. `holt doctor
83
+ --fix` usually repairs it.
84
+ - **Unembedded moments.** If embedded count is below total, older memories are
85
+ invisible to semantic recall. `holt memory embed` fixes it in one pass.
86
+ - **Hand-edited facts.** Facts added by editing `facts.md` directly are never
87
+ embedded, so they never come back through recall. They must be re-added with
88
+ `holt memory add`.
89
+ - **Windows and timers.** On Windows, `holt schedule` and a routine's `--at`
90
+ time do not install anything. Anything on rung four there has to run another
91
+ way, so check the platform before calling rung four solid.
92
+ - **Automation above an empty memory.** If Run looks solid while Know is thin,
93
+ say so bluntly. That setup produces confident wrong output on a timer, and it
94
+ is the most expensive failure on this list.
95
+
96
+ ## Example
97
+
98
+ You are on rung two. Know and Reach are solid, Do is thin.
99
+
100
+ Know: solid. 41 facts covering the agro project, the job search, and family
101
+ health. Recall is on embeddings.
102
+ Reach: solid. Hook installed, so Claude Code sessions recall automatically.
103
+ Do: thin. Ten skills listed, all built in. Nothing tuned to your work.
104
+ Run: missing. No routines, no schedules.
105
+
106
+ Broken: 12 of 340 moments have no embeddings, so a slice of last month is
107
+ invisible to recall.
108
+
109
+ Next action: run `/skill level-up` and turn the weekly client update into a
110
+ skill. Rung four is not worth touching until something on rung three has earned
111
+ its place.
@@ -0,0 +1,118 @@
1
+ ---
2
+ name: level-up
3
+ description: A weekly working session that turns one piece of recurring manual work into something Holt does for you, and ships it before the session ends. Use as a standing ritual once memory has real facts in it.
4
+ ---
5
+
6
+ # level-up
7
+
8
+ ## When to use
9
+
10
+ The user has been using Holt and wants it to carry more. This is the ritual that
11
+ compounds: once a week, one drain becomes one shipped capability. Run it after
12
+ memory holds real facts about their work; on an empty folder, run `onboard`
13
+ first.
14
+
15
+ The session fails if it ends in a plan. It succeeds if something exists that did
16
+ not exist an hour ago.
17
+
18
+ ## Instructions
19
+
20
+ ### 1. Find the constraint
21
+
22
+ Read what memory already knows. Relevant past notes are injected above; also run
23
+ `holt memory facts` and search for the work they complain about:
24
+
25
+ ```
26
+ holt memory search <what they keep doing by hand>
27
+ ```
28
+
29
+ Then ask what ate their time this week, and what they did more than once. Pick
30
+ **one**. The best candidate is frequent, rule-shaped, and low-stakes if it comes
31
+ out slightly wrong. Say plainly why you picked it over the others.
32
+
33
+ If several are tempting, choose the boring one. A dull thing that runs every
34
+ week beats an ambitious thing that runs once.
35
+
36
+ ### 2. Decide what to do with it
37
+
38
+ Three options, in this order:
39
+
40
+ - **Drop it.** Does this task need to exist? Work that only continues out of
41
+ habit should be stopped, not automated. Ask this first and mean it; the
42
+ cheapest automation is the one you do not build.
43
+ - **Automate it.** Rule-shaped and repeatable, with a checkable output.
44
+ - **Hand it off.** It needs judgement, relationships, or accountability a
45
+ machine should not hold. Say so and move to the next candidate.
46
+
47
+ Automating something that should have been dropped makes the waste permanent
48
+ and harder to see. Push back before building.
49
+
50
+ ### 3. Map it before building
51
+
52
+ Walk the task through in the user's own words: what starts it, what information
53
+ it needs, what it produces, and who sees the output. Write the steps down. If
54
+ you cannot state the steps in plain sentences, it is not ready to build.
55
+
56
+ Then set how much rope it gets:
57
+
58
+ - **Drafts, you send.** Anything that leaves the house: email, posts, messages.
59
+ - **Runs, you review.** Produces a file or a note you read afterwards.
60
+ - **Runs unattended.** Only for work that is reversible and already proven by
61
+ hand for a few cycles.
62
+
63
+ Start one level more cautious than feels necessary. Moving up later is easy;
64
+ un-sending is not.
65
+
66
+ ### 4. Build it now
67
+
68
+ Pick the lightest thing that works:
69
+
70
+ - A **skill**, when it is a repeatable way of thinking or writing:
71
+ `holt skill create <name>`, then write the instructions into its `SKILL.md`.
72
+ Check the registry first with `holt skill search <topic>`, because the work
73
+ may be done already.
74
+ - A **routine**, when it is a task worth naming and rerunning:
75
+ `holt routine add <name> "<task>"`, run it with `holt routine run <name>`.
76
+ - A **schedule**, when it should happen without being asked:
77
+ `holt schedule add`, or a scheduled routine. Only after it has produced good
78
+ output by hand at least twice.
79
+ - A **connection**, when the blocker is that Holt cannot see the material:
80
+ `holt hook` for ambient memory in Claude Code, `holt mcp setup` for other
81
+ tools. Sometimes the whole win is that it can finally read the thing.
82
+
83
+ Prefer a fixed sequence of steps over an open-ended agent. Predictable and
84
+ slightly dumb beats clever and unrepeatable.
85
+
86
+ ### 5. Test it on something real
87
+
88
+ Run it once, now, on genuine input, and read the output with the user. If it is
89
+ wrong, fix it in this session. A capability that has never run on real data is
90
+ not shipped.
91
+
92
+ Then agree how it gets switched off: which command removes it, or which file to
93
+ delete. Anything that runs on a timer needs a way to stop.
94
+
95
+ ### 6. Close the loop
96
+
97
+ 1. Save what was built and why, so next week starts informed:
98
+ ```
99
+ holt memory add "Built the <name> routine on <date>: <what it does, what triggers it>"
100
+ ```
101
+ 2. Note what to watch for: the failure mode most likely to show up first.
102
+ 3. Name the single next candidate from the list you did not pick, so the next
103
+ session starts with a running head start.
104
+
105
+ ## Example
106
+
107
+ This week: forty minutes lost to writing the same client update every Friday.
108
+
109
+ Not dropped, it is genuinely wanted. Not handed off, the facts live here.
110
+ Automate it, at drafts-you-send, because it goes to a client.
111
+
112
+ Built as a routine over the folder's memory, run once against this week's real
113
+ work. First draft named the wrong milestone; instructions tightened, second
114
+ draft was sendable. Off switch: `holt routine remove friday-update`.
115
+
116
+ Watch for: it will keep sounding confident about numbers it has not been given.
117
+
118
+ Next week's candidate: the invoice chase.
@@ -0,0 +1,125 @@
1
+ ---
2
+ name: onboard
3
+ description: A guided first-day interview that fills Holt's memory with who you are and what you are working on, so recall is useful from day one instead of after weeks of use. Use on a fresh folder, or to top up a thin memory.
4
+ ---
5
+
6
+ # onboard
7
+
8
+ ## When to use
9
+
10
+ Holt is installed but it does not know the user yet. An empty memory makes every
11
+ answer generic, which is the most common reason people install Holt and drift
12
+ away. This skill front-loads the knowledge that recall needs, in about fifteen
13
+ minutes, and ends with one real piece of work.
14
+
15
+ Also use it when `holt memory` shows very few facts and answers still feel
16
+ generic, or when the user starts a new folder for a different part of their life.
17
+
18
+ ## The ladder
19
+
20
+ Holt gets useful in four rungs, in order. Onboarding is rung one.
21
+
22
+ 1. **Know**: it holds facts about you and your work. (`holt memory`)
23
+ 2. **Reach**: it can see your real material: files, notes, other tools. (`holt hook`, `holt mcp`)
24
+ 3. **Do**: it runs your repeated work as skills. (`holt skill`)
25
+ 4. **Run**: it acts without you being there. (`holt routine`, `holt schedule`)
26
+
27
+ Do not skip ahead. Automation on top of an empty memory produces confident
28
+ nonsense on a timer.
29
+
30
+ ## Instructions
31
+
32
+ ### Before you start
33
+
34
+ 1. Check what is already known: run `holt memory` and, if any facts exist,
35
+ `holt memory facts`. If the folder already holds real facts, say so and offer
36
+ a top-up on the thin areas instead of the full interview. Never re-ask
37
+ something already in memory.
38
+ 2. Set expectations in two lines: seven questions, about fifteen minutes, and
39
+ they can stop at any point because you save as you go.
40
+
41
+ ### Running the interview
42
+
43
+ Ask **one question at a time.** Wait for the answer before moving on. Never
44
+ present the whole list at once; a wall of questions is the main reason people
45
+ abandon setup. Keep your own words short between questions.
46
+
47
+ Ask for the real thing, never a description of it. "Paste the last update you
48
+ sent your team" beats "how would you describe your writing style". Concrete
49
+ input is what makes recall work later.
50
+
51
+ If an answer is thin or abstract, ask one follow-up for a specific name, number,
52
+ or example, then move on. Two follow-ups on one question is too many.
53
+
54
+ The seven questions:
55
+
56
+ 1. **Who you are.** What is your work, and what does a normal day actually
57
+ involve? Get the role, and what they are responsible for.
58
+ 2. **What is live.** The three to five things genuinely in flight right now, and
59
+ the state of each. Push for status, not just titles.
60
+ 3. **Who matters.** The people, clients, teams, or companies that come up
61
+ regularly, and how each relates to them. Names matter here.
62
+ 4. **Standing rules.** Decisions and preferences you should never re-ask:
63
+ how they want to be spoken to, what is off limits, choices already made.
64
+ 5. **Where the work lives.** Which folders, tools, and accounts hold the real
65
+ material. This becomes the map for rung two, so note what is not reachable
66
+ yet rather than pretending it is.
67
+ 6. **What drains the time.** The recurring work they resent doing by hand. Ask
68
+ for the last three times it happened. These are the candidates the `level-up`
69
+ skill will draw from later.
70
+ 7. **Their voice.** Ask them to paste two or three samples of their real
71
+ writing: a sent email, a message, a published post. Then run
72
+ `holt voice add <file>` if the samples are in files, or tell them the command
73
+ so their drafts sound like them rather than like a model.
74
+
75
+ ### Saving as you go
76
+
77
+ After every two questions, write what you learned to memory with:
78
+
79
+ ```
80
+ holt memory add "<one durable fact>"
81
+ ```
82
+
83
+ One fact per call. Several facts can be piped in at once, one per line.
84
+
85
+ Write facts that will still be true in a month and that a future session could
86
+ not guess. "Runs product for a fintech in Bhubaneswar, nine years in" is a fact.
87
+ "Wants to be more productive" is noise. Include names, numbers, and dates. Write
88
+ the fact so it stands alone, because recall will surface it without this
89
+ conversation around it.
90
+
91
+ If you cannot run commands in this session, write the facts out as a block of
92
+ `holt memory add` lines and ask the user to paste them into their terminal.
93
+ Do not hand-edit `facts.md`: facts added that way are never embedded, so
94
+ semantic recall will not find them.
95
+
96
+ ### Finishing
97
+
98
+ 1. Show what was captured: run `holt memory facts` so they see their own words
99
+ stored in a file they own and can edit.
100
+ 2. Prove it works. Ask one question whose answer depends on what they just told
101
+ you, and answer it from memory. This is the moment the tool becomes real, so
102
+ do not skip it.
103
+ 3. Do one real thing now. Pick the smallest useful task from what they said
104
+ drains their time and complete it in this session. An artifact beats a plan.
105
+ 4. Name rung two. Tell them the single next step, usually `holt hook` so Claude
106
+ Code remembers automatically, or `holt mcp setup` to reach their other tools.
107
+ One step, not a menu.
108
+ 5. Point at the ritual: `/skill level-up` weekly turns one drain into one
109
+ automation, and `/skill audit` shows which rung they are on.
110
+
111
+ ## Example
112
+
113
+ Not: "Tell me about your business, your projects, your clients, your
114
+ preferences, and your writing style."
115
+
116
+ Instead: "First one. What is your work, and what does a normal Tuesday actually
117
+ look like?" then, after the answer: "Got it. Now the live list: what are the three to five
118
+ things genuinely in flight this week?"
119
+
120
+ Then, quietly, between questions:
121
+
122
+ ```
123
+ holt memory add "Senior product manager, nine years, currently between roles and job-hunting in the Netherlands"
124
+ holt memory add "Runs Sasyam Agro with an uncle in Bargarh; demo plots are on the uncle's land"
125
+ ```