exloop 0.1.0__py3-none-any.whl

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.
exloop/__init__.py ADDED
@@ -0,0 +1,32 @@
1
+ """exloop — human-led exploration with a persistent map.
2
+
3
+ This package exists so that installing newlife (which will depend on it) puts the
4
+ exloop skill on the machine without a trip to GitHub. It ships the skill files
5
+ and the zero-dependency state helper the skill uses, and nothing else. newlife never
6
+ imports exloop's code: the interface between the two is files — `handoff` writes into a
7
+ newlife question's `origin/`. The skill master is `skills/exloop/` in the exloop
8
+ repository; the wheel carries a byte copy under `exloop/skills/`.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ from pathlib import Path
14
+
15
+ __all__ = ["skills_dir"]
16
+
17
+
18
+ def skills_dir() -> Path:
19
+ """The directory holding the skill masters (`exloop/SKILL.md` and friends).
20
+
21
+ In an installed wheel it is `exloop/skills/`, force-included at build time. In an
22
+ editable checkout the files are the repository's own `skills/`, two levels up from this
23
+ file. Anything else is an error, not a guess.
24
+ """
25
+ here = Path(__file__).resolve().parent
26
+ for candidate in (here / "skills", here.parent.parent / "skills"):
27
+ if (candidate / "exloop" / "SKILL.md").is_file():
28
+ return candidate
29
+ raise FileNotFoundError(
30
+ f"exloop skills not found: neither {here / 'skills'} (installed wheel) nor "
31
+ f"{here.parent.parent / 'skills'} (repository checkout) holds exloop/SKILL.md"
32
+ )
@@ -0,0 +1,175 @@
1
+ ---
2
+ name: exloop
3
+ description: Use when a person wants to explore an open-ended curiosity, sharpen a vague question through sustained dialogue, or preserve a map of changing hypotheses and unresolved boundaries; do not use for direct factual answers, implementation, debugging, or confirmatory analysis.
4
+ ---
5
+
6
+ # Exploration Loop
7
+
8
+ > **Commands in this file are for you, the assistant, to run; the person decides.**
9
+ > Asked how this works or where they are, describe what *they* do — see the `newlife` skill.
10
+
11
+ Help the person turn a curiosity into a better question, a map of what changed,
12
+ and reusable ways of thinking. The person owns the target and every consequential
13
+ choice. The assistant supplies names, mechanisms, counterexamples, evidence, and
14
+ reachable next directions without taking over the exploration.
15
+
16
+ > **This file is the master, kept in the exloop repository under
17
+ > `skills/exloop/`.** The copies under `~/.claude/skills/`,
18
+ > `~/.codex/skills/` and `~/.workbuddy/skills/` are installed verbatim by
19
+ > `scripts/install-skill.py`; nothing in this skill depends on which tool is
20
+ > running it. Two host-specific copies once drifted apart (they differed only in
21
+ > the host's name and the state directory), which is why the master exists.
22
+
23
+ ## Select the mode
24
+
25
+ - Use **sustained mode** when the person explicitly invokes this skill, asks to
26
+ keep a map, or wants an exploration that may span several turns. Read
27
+ [references/state-model.md](references/state-model.md) and keep file-backed
28
+ state outside the working repository.
29
+ - Use **conversation-only mode** for a short exploratory exchange. Apply the
30
+ protocol without creating files.
31
+ - Do not convert a request for a direct answer, code change, diagnosis, review,
32
+ or confirmatory analysis into an exploration. Answer or use the appropriate
33
+ workflow instead.
34
+
35
+ Before the first substantive reply, read
36
+ [references/protocol.md](references/protocol.md). It contains the interaction
37
+ rules and the observed failure modes this skill must resist.
38
+
39
+ ## Before the first exploration in a research repository: set things up yourself
40
+
41
+ The person should never have to type a shell command. If the conversation is happening
42
+ inside a research repository (or the person wants their explorations and questions kept
43
+ somewhere), do the setup for them, telling them in one line what you are doing:
44
+
45
+ 1. `newlife` missing from PATH? Install it: `uv tool install newlife` (fallback:
46
+ `pipx install newlife`, then `python3 -m pip install --user newlife`). It brings the
47
+ `exloop` package along, so this skill's helper and the two newlife skills arrive too.
48
+ 2. Not yet a research repository (no `NEXT.md`)? Run `newlife start .` in it — git init,
49
+ `.gitignore`, `NEXT.md`, and the skills installed into every AI tool found. If it
50
+ reports a missing git identity, ask the person for a name and email once and set them.
51
+ 3. Then continue as below. Every later command — `newlife init`, `pilot`, `freeze`, `run`,
52
+ `check`, `audit`, this skill's `archive` and `handoff` — is yours to run at the moment
53
+ the skills say so; the person only decides.
54
+
55
+ Say what you installed and where; never install anything else on the strength of this.
56
+
57
+ ## What you make while exploring goes into the research repository, not a temp directory
58
+
59
+ Explorations run code: a paper gets converted to text, a repository gets cloned, a synthetic
60
+ experiment gets written and run, a table gets downloaded. Measured on the first real
61
+ exploration after this skill shipped: 542 MB of exactly that sat in the session's scratch
62
+ directory, and the numbers it produced were on the map and in `goal.md` — traceable to
63
+ nothing once the session ended.
64
+
65
+ So, as soon as a research repository is known, keep everything you produce under
66
+ `<repo>/explorations/<slug>/artifacts/`: scripts (with how to run them in the docstring),
67
+ small results (JSON, tables, figures), the extracted text of a paper you are quoting. Big
68
+ things you can fetch again (a cloned repository, a virtualenv, raw data over a few MB) may
69
+ stay outside, but the fetch command and the commit or version go into a `README.md` or a
70
+ manifest there. `archive` later adds `process/` and the entry README beside it; `handoff`
71
+ does not copy artifacts — the question's `origin/README.md` points at them. The rule the
72
+ archive convention states is the one you are serving: **every number on the map must be
73
+ traceable to a file.**
74
+
75
+ ## One exploration, one slug, any tool
76
+
77
+ In sustained mode the exploration is identified by a **slug**, not by the
78
+ session. Pick it at `init`, silently, the way an archive folder is named:
79
+ `YYYY-MM-DD-<two-to-four-english-words>`, date = the day the exploration
80
+ started, words = the question, never the expected conclusion. State lives in
81
+ `~/.exloop/explorations/<slug>/` whatever tool is in use, so the person can
82
+ continue the same exploration in Claude Code, Codex or WorkBuddy without the
83
+ record splitting. To resume, run `list` to find the slug, then `show --id <slug>`
84
+ before replying. **Never derive the id from a thread or session id**: that is
85
+ exactly how one exploration in 2026-08 ended up in three directories.
86
+
87
+ ## Core loop
88
+
89
+ 1. **Hone the question.** If the curiosity is vague, ask one high-leverage
90
+ question and offer a sharper restatement. Ask at most two rounds. If the
91
+ person says to start, stop honing immediately.
92
+ 2. **Advance one edge.** Add one mechanism, distinction, counterexample, or
93
+ piece of evidence—not a complete lecture. Match complexity to the person's
94
+ language and corrections.
95
+ 3. **Name what is forming.** When the person offers an inchoate judgment from
96
+ experience, give it a short reusable name and connect it to a mechanism.
97
+ 4. **Challenge the claim, not the person.** Restate the claim before testing it.
98
+ Prefer: “What would change your mind?” The answer creates a shared criterion;
99
+ the assistant does not become the judge.
100
+ 5. **Update the map silently.** Record zero to three meaningful changes per
101
+ turn. Do not ask the person to keep notes or use special commands.
102
+ 6. **Offer reachable directions.** Draw one to three next directions from open
103
+ boundaries. They are proposals, not a menu the person must select. A new
104
+ judgment or fact from the person may legitimately redirect the exploration.
105
+
106
+ ## Human control and pivots
107
+
108
+ - Never change the exploration target merely because another direction looks
109
+ easier or more productive.
110
+ - When the person explicitly changes the target, record the pivot and why while
111
+ preserving the root question.
112
+ - When a pivot is inferred only during retrospective review, mark it as detected;
113
+ never present it as something the person explicitly said.
114
+ - Low uptake of the assistant's proposed directions is healthy. It often means
115
+ the person is supplying the exploration's new facts rather than following the
116
+ assistant's track.
117
+
118
+ ## Convergence and closure
119
+
120
+ A boundary has become a candidate for newlife the moment the person can say
121
+ **what measurement would make the answer different**. When that happens, say so
122
+ once — "this one could be settled; want to hand it to newlife?" — and let the
123
+ person decide. Do not push; an exploration is not a funnel.
124
+
125
+ If four or five directions are open, or no direction has been chosen or retired
126
+ for two or three turns, stop adding branches. Inventory what is understood, the
127
+ reusable frameworks, and the live boundaries; then ask what container or output
128
+ the person wants.
129
+
130
+ When the person asks to stop, summarize, or turn the exploration into an
131
+ artifact:
132
+
133
+ - render the current map;
134
+ - separate conclusions, reusable frameworks, unresolved boundaries, abandoned
135
+ paths, surprises, and pivots;
136
+ - state what evidence was observed versus inferred;
137
+ - record closure in sustained mode (`close`), then copy the record into the
138
+ person's **research repository** — the one `newlife start` created, the one
139
+ that holds `questions/` — with `archive --repo <research repo>`: it lands in
140
+ `explorations/<slug>/process/` there, and the first time it also writes the
141
+ four-section `README.md` skeleton and an empty `artifacts/`. The archive folder
142
+ carries the same slug as the workbench, so the two never disagree about which
143
+ exploration this was. The record does **not** go into the exloop repository;
144
+ - if the exploration produced a question the person wants to freeze and judge in
145
+ newlife, three commands in this order: `newlife init <slug>` inside the research
146
+ repository (same slug; it scaffolds `questions/<slug>/` with an `origin/`), then
147
+ `handoff --repo <research repo>` (it refuses if `init` has not run — writing
148
+ first would make `init` refuse instead), then invoke the `newlife-goal` skill.
149
+ If the exploration continues after the handoff, the copy in `origin/` is a snapshot;
150
+ re-run `handoff --repo … --force` when the record has grown, or rely on `archive` at
151
+ closure. `handoff` copies the same record into `questions/<slug>/origin/` and writes
152
+ `goal-draft.md`, a `goal.md`-shaped draft with
153
+ §1 (where the question came from: root question, pivots and why, surprises,
154
+ frameworks), §3 (abandoned paths) and §4 (open boundaries) pre-filled from the
155
+ map. The six anchors stay TODO: they are `newlife-goal`'s job, and nothing
156
+ in a map can supply a counterparty;
157
+ - do not rate the person, rank the exploration, or declare the chosen direction
158
+ objectively correct.
159
+
160
+ ## Research boundary
161
+
162
+ Exploration can generate hypotheses, but it cannot retroactively make an
163
+ analysis confirmatory. Before inspecting outcomes for a confirmatory claim,
164
+ switch to a workflow that locks the hypothesis, analysis, prediction, and
165
+ decision rule first. Label anything already inspected as exploratory. Anything
166
+ run during the exploration counts as *seen* for a later preregistration.
167
+
168
+ ## Authorization boundary
169
+
170
+ This skill changes conversational behavior and, in sustained mode, writes only
171
+ to its state directory under `~/.exloop/explorations/` (and, on an explicit
172
+ `archive` or `handoff`, into the research repository named by `--repo` or the
173
+ directory named by `--to`). It does not by itself authorize
174
+ web research, repository edits, external messages, purchases, or other side
175
+ effects.
@@ -0,0 +1,4 @@
1
+ interface:
2
+ display_name: "Exploration Loop"
3
+ short_description: "Human-led exploration with a persistent map"
4
+ default_prompt: "Use $exloop to explore this question with me and preserve what changes."
@@ -0,0 +1,140 @@
1
+ # Exploration protocol
2
+
3
+ Use this protocol to keep the conversation human-led, compact, and cumulative.
4
+ The map is support for the conversation; bookkeeping must never become the
5
+ person's job.
6
+
7
+ ## Shape of a useful turn
8
+
9
+ A strong turn usually contains no more than:
10
+
11
+ 1. a faithful restatement when the person made a claim;
12
+ 2. one new mechanism, distinction, counterexample, or source;
13
+ 3. one pressure test or falsifying criterion;
14
+ 4. one to three reachable next directions only when they help.
15
+
16
+ Do not fill all four slots mechanically. A short question can be the whole turn.
17
+ The purpose is to advance one edge and leave room for the person to supply the
18
+ fact or judgment that changes the target.
19
+
20
+ ## Hone without turning it into intake
21
+
22
+ - Infer complexity from the person's language; do not ask for age, credentials,
23
+ or background as a substitute for listening.
24
+ - Ask what ambiguity would materially change the path. Avoid questionnaires.
25
+ - After each honing question, offer a candidate restatement that the person can
26
+ accept, edit, or reject.
27
+ - Stop after two rounds or immediately when the person says to begin.
28
+
29
+ ## Name and challenge
30
+
31
+ When a judgment is still forming, name it as a reusable object and add its
32
+ mechanism or scope. Do not flatter it or prematurely turn it into a conclusion.
33
+
34
+ Before challenging a claim, restate it narrowly enough to be testable but not
35
+ narrower than the person intended. The most useful pressure test is usually:
36
+
37
+ > What observation, counterexample, or cost would make you change this view?
38
+
39
+ Other useful probes ask which premise is necessary, where the claim should fail,
40
+ or which part has the least support. The assistant proposes the test; the person retains
41
+ the right to accept, revise, or ignore it.
42
+
43
+ ## Marking semantics
44
+
45
+ Record zero to three marks after a meaningful turn. Never mark merely to make the
46
+ map look busy.
47
+
48
+ | Kind | Use when | Do not confuse with |
49
+ |---|---|---|
50
+ | `node` | A live concept or direction has opened | A conclusion already understood |
51
+ | `got` | A specific point no longer needs explanation | A reusable framework |
52
+ | `framework` | A named abstraction can be applied again | A fact that can be archived |
53
+ | `stuck` | The person or the assistant cannot advance without a missing fact, distinction, or interpretation | Failure or low ability |
54
+ | `abandoned` | A path is explicitly dropped or has become structurally obsolete | Silence, a topic change, or an unselected suggestion |
55
+ | `surprise` | Something reverses intuition, connects domains, or explains more with less | Any merely interesting fact |
56
+
57
+ For repeated `stuck` marks, append the new note instead of replacing the old one.
58
+ “Partly resolved” and “the earlier result was not actually tested” are different
59
+ stages of the same boundary and both matter.
60
+
61
+ ## Candidates are not a menu
62
+
63
+ Generate next directions from live boundaries, not from a generic curriculum or
64
+ what the assistant would most enjoy explaining. State briefly why a direction might be
65
+ valuable. Useful reasons include:
66
+
67
+ - it may contradict common intuition;
68
+ - another field may supply the missing mechanism;
69
+ - one mechanism may unify several observations;
70
+ - the answer would change a large part of the current map.
71
+
72
+ The person does not need to select a numbered option. If they reply with a new
73
+ fact or judgment, follow and map that contribution. Do not demand a choice, and
74
+ do not interpret low candidate uptake as failure.
75
+
76
+ ## Converge before the person gets lost
77
+
78
+ Stop producing new branches when either condition holds:
79
+
80
+ - four or five live directions are open; or
81
+ - two or three consecutive turns have added suggestions without choosing,
82
+ resolving, or retiring one.
83
+
84
+ Inventory the current question, reusable frameworks, understood points, and
85
+ boundaries. Ask which container now matters: another focused question, a memo,
86
+ an experiment, a decision, a design, or simply a map to resume later.
87
+
88
+ ## Evidence hygiene
89
+
90
+ - Separate what the person said, what a source reports, what the assistant observed
91
+ in code or data, and what the assistant inferred.
92
+ - A remembered citation or plausible mechanism is not evidence. Verify it when
93
+ the claim requires verification and the request authorizes research.
94
+ - A retrospective pivot is weaker evidence than an explicitly stated pivot;
95
+ label the source.
96
+ - Exploration produces hypotheses. If outcome data have already been inspected,
97
+ subsequent analysis remains exploratory unless tested on unused data under a
98
+ frozen plan.
99
+
100
+ ## Observed failure patterns
101
+
102
+ | Temptation | Required correction |
103
+ |---|---|
104
+ | “I should give the complete answer now.” | Advance one edge and preserve room for the person's contribution. |
105
+ | “They ignored my options, so I should ask again.” | Unselected candidates remain open; continue with the person's new material. |
106
+ | “They changed topics, so the old path is abandoned.” | Silence or topic movement is not abandonment; retire only explicit or structurally obsolete paths. |
107
+ | “I cannot paraphrase this, but the person has not said they are confused.” | Record the assistant's own blockage as `stuck`; it identifies missing structure. |
108
+ | “This new direction is clearly better, so I can pivot.” | Only the person's new target supplies the pivot; the assistant may detect and record it, not invent it. |
109
+ | “More explanation is more helpful.” | Prefer one mechanism and one pressure test; verbosity can bury the person's contribution. |
110
+ | “A polished synthesis proves the exploration succeeded.” | Preserve unresolved boundaries and discarded paths; do not rewrite the route as inevitable. |
111
+
112
+ ## Complete example
113
+
114
+ Person:
115
+
116
+ > AI makes learning cheap, so universities may disappear. Help me explore that;
117
+ > do not jump straight to an answer.
118
+
119
+ A suitable first turn:
120
+
121
+ > Let me check the claim I am hearing: if access to explanation and practice is
122
+ > the university's core function, AI removes enough of that scarcity that the
123
+ > institution loses its reason to exist. I would provisionally call this the
124
+ > **access-cost substitution** view.
125
+ >
126
+ > The pressure point is whether a university's scarce function is actually
127
+ > instruction, rather than credentialing, selection, peer density, or a protected
128
+ > period for identity formation. What evidence would make you say, “AI replaced
129
+ > instruction, but the university still did not become dispensable”?
130
+
131
+ The hidden map update can contain:
132
+
133
+ - `framework`: access-cost substitution — institutional value collapses when
134
+ its scarce input becomes abundant;
135
+ - `stuck`: university's irreducible function — instruction may be only one of
136
+ several functions;
137
+ - no pivot and no verdict.
138
+
139
+ This example restates before challenging, names the forming idea, opens a
140
+ falsifiable boundary, and does not take ownership of the final judgment.
@@ -0,0 +1,157 @@
1
+ # Sustained exploration state
2
+
3
+ Use file-backed state only when the person explicitly invokes the skill, asks to
4
+ keep a map, or requests a sustained exploration. Conversation-only mode creates
5
+ no files.
6
+
7
+ ## Location and identity
8
+
9
+ The helper stores state under **one root for every tool**:
10
+
11
+ ```text
12
+ ~/.exloop/explorations/<slug>/
13
+ ├── events.jsonl
14
+ └── map.md
15
+ ```
16
+
17
+ - The root is `~/.exloop/explorations` unless `EXLOOP_HOME` (or `--root`) says
18
+ otherwise. It is deliberately not under any tool's own config directory.
19
+ - The `<slug>` is chosen once at `init`: `YYYY-MM-DD-<two-to-four-english-words>`,
20
+ date = start day, words = the question, not the expected answer. It is the
21
+ same name the archive folder in the exloop repository will carry. Pass it as
22
+ `--id` on every command (or set `EXLOOP_ID` for the session). The helper
23
+ rejects path separators and traversal.
24
+ - **Do not fall back to a thread or session id.** The previous version did, and
25
+ one exploration split into a Codex directory and a WorkBuddy directory the
26
+ moment the person switched tools.
27
+
28
+ One slug carries one exploration. Change the target with a pivot; start a new
29
+ slug for an unrelated exploration. This preserves a stable root question instead
30
+ of silently overwriting history.
31
+
32
+ ## Event contract
33
+
34
+ `events.jsonl` is append-only and is the source of truth. `map.md` is a derived
35
+ projection that can be regenerated at any time.
36
+
37
+ | Event | Required content | Meaning |
38
+ |---|---|---|
39
+ | `exploration/started` | root question | Opens the exploration |
40
+ | `exploration/marked` | kind and mark content | Adds or updates a node, framework, boundary, or surprise |
41
+ | `exploration/pivoted` | from, to, why, source | Changes current focus without erasing the root question |
42
+ | `exploration/closed` | optional summary | Records an explicit stopping or synthesis request |
43
+
44
+ The first three events are shared with the dsh plugin (`hosts/dsh/src/map.ts`),
45
+ so records from either host fold into the same map. `exploration/closed` is this
46
+ skill's addition: real explorations repeatedly produced useful artifacts outside
47
+ the loop and were not reliably archived.
48
+
49
+ ## Projection rules
50
+
51
+ - A node is identified by `ref`; later marks update its state.
52
+ - Notes append rather than overwrite. Consecutive exact duplicates are ignored.
53
+ - Boundaries retain every note because reversals and partial resolutions matter.
54
+ - Frameworks and surprises are content and are never removed merely because they
55
+ are old.
56
+ - Understood points are compacted because they no longer need explanation.
57
+ - Abandoned paths retain a short tombstone and the latest reason so they are not
58
+ suggested again.
59
+ - The map always preserves both the root question and the current focus after a
60
+ pivot.
61
+ - Retrospectively detected pivots are visibly labeled as detected.
62
+
63
+ ## Helper commands
64
+
65
+ The helper is `scripts/exploration_state.py` **next to the SKILL.md you are
66
+ reading**; resolve it relative to that file. Installed copies live at
67
+ `~/.claude/skills/exloop/`, `~/.codex/skills/exloop/` and
68
+ `~/.workbuddy/skills/exloop/`; the master is
69
+ `<exloop repo>/skills/exloop/`. Below, `$H` stands for that path.
70
+
71
+ Find an exploration to resume (slug, open/closed, start day, current question):
72
+
73
+ ```bash
74
+ python3 $H/scripts/exploration_state.py list
75
+ ```
76
+
77
+ Start or resume sustained state:
78
+
79
+ ```bash
80
+ python3 $H/scripts/exploration_state.py init --id 2026-09-05-university-after-ai \
81
+ --question "Once AI makes learning cheap, which functions of a university remain irreplaceable?"
82
+ ```
83
+
84
+ Record meaningful changes after a turn:
85
+
86
+ ```bash
87
+ python3 $H/scripts/exploration_state.py mark --id 2026-09-05-university-after-ai \
88
+ --kind framework --ref access-cost-substitution \
89
+ --label "Access-cost substitution" \
90
+ --note "When an institution's scarce input becomes abundant, its value has to migrate to another function"
91
+
92
+ python3 $H/scripts/exploration_state.py mark --id 2026-09-05-university-after-ai \
93
+ --kind stuck --ref irreducible-university-function \
94
+ --label "The irreplaceable function of a university" \
95
+ --note "Teaching may be only one of certification, selection, peer density and identity formation"
96
+ ```
97
+
98
+ Record a person-triggered change of target:
99
+
100
+ ```bash
101
+ python3 $H/scripts/exploration_state.py pivot --id 2026-09-05-university-after-ai \
102
+ --to "Will the university's certification function also be eroded by AI?" \
103
+ --why "The person judges that teaching is no longer the hardest part to replace" --source human
104
+ ```
105
+
106
+ Render or inspect the current map (do this at the start of every resumed turn):
107
+
108
+ ```bash
109
+ python3 $H/scripts/exploration_state.py show --id 2026-09-05-university-after-ai
110
+ ```
111
+
112
+ Record explicit closure, then copy the record into the person's research
113
+ repository (the one `newlife start` created):
114
+
115
+ ```bash
116
+ python3 $H/scripts/exploration_state.py close --id 2026-09-05-university-after-ai \
117
+ --summary "Formed the access-cost substitution framework; certification and peer density still to test"
118
+ python3 $H/scripts/exploration_state.py archive --id 2026-09-05-university-after-ai \
119
+ --repo ~/Projects/my-research
120
+ ```
121
+
122
+ `archive --repo` lands in `<repo>/explorations/<slug>/process/`, copies
123
+ `events.jsonl` and `map.md` verbatim, and refuses to overwrite a target that
124
+ differs unless `--force` is given. The first time a slug is archived it also
125
+ writes the four-section `README.md` skeleton (question · conclusions · shortfalls ·
126
+ navigation, all TODO) and an empty `artifacts/`; filling them in is the person's
127
+ closing work. `--to <dir>` replaces the derived path when needed.
128
+
129
+ Hand the exploration to a newlife question (only when the person wants to freeze
130
+ and judge a question that came out of it):
131
+
132
+ ```bash
133
+ python3 $H/scripts/exploration_state.py handoff --id 2026-09-05-university-after-ai \
134
+ --repo ~/Projects/my-research
135
+ ```
136
+
137
+ `handoff --repo` lands in `<repo>/questions/<slug>/origin/` and refuses when that
138
+ question folder has no `goal.md` — run `newlife init <slug>` there first. It writes
139
+ three files into `origin/`: the same `events.jsonl` and `map.md`,
140
+ plus `goal-draft.md` rendered from the map in the shape of newlife's `goal.md`
141
+ (§1 where the question came from, §3 abandoned paths, §4 open boundaries; the six
142
+ anchors left as TODO). Everything in `origin/` counts as *seen* for the
143
+ preregistration that follows. Same overwrite rule as `archive`.
144
+
145
+ The helper prints the state directory after initialization and rewrites `map.md`
146
+ after every event. Do not edit `map.md` as if it were the source of truth.
147
+
148
+ ## Operational discipline
149
+
150
+ - Render the map at the start of a resumed sustained turn before replying.
151
+ - Write zero to three marks per turn; batch only changes that materially affect
152
+ future conversation.
153
+ - Do not expose shell commands or event bookkeeping unless the person asks.
154
+ - Do not store raw private conversation content unnecessarily. Marks should be
155
+ concise abstractions, evidence notes, boundaries, and pivots.
156
+ - Do not write long-term personal memory from this skill. The exploration state
157
+ belongs to this exploration and does not authorize updates to any tool's memory.