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 +32 -0
- exloop/skills/exloop/SKILL.md +175 -0
- exloop/skills/exloop/agents/openai.yaml +4 -0
- exloop/skills/exloop/references/protocol.md +140 -0
- exloop/skills/exloop/references/state-model.md +157 -0
- exloop/skills/exloop/scripts/exploration_state.py +763 -0
- exloop-0.1.0.dist-info/METADATA +72 -0
- exloop-0.1.0.dist-info/RECORD +10 -0
- exloop-0.1.0.dist-info/WHEEL +4 -0
- exloop-0.1.0.dist-info/licenses/LICENSE +202 -0
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,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.
|