create-pathfinder 3.1.0 → 4.1.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/AGENTS.md CHANGED
@@ -2,11 +2,11 @@
2
2
 
3
3
  Read `CLAUDE.md` first.
4
4
 
5
- Project truth lives in `context/`. Follow the technology and delivery choices documented in `context/project-overview.md`; do not assume a framework, package manager, branch model, or release process. That file, like `context/features/`, `context/history.md`, `context/current-feature.md`, and `context/handoff.md`, is created by the workflow that first needs it — its absence is normal, not an error. Track the durable ones in Git; `context/current-feature.md` and `context/handoff.md` are transient session state and belong in `.gitignore`. Never ignore `context/` as a whole.
5
+ Project truth lives in `context/`. Follow the technology and delivery choices documented in `context/project-overview.md`; do not assume a framework, package manager, branch model, or release process. That file, like `context/features/`, `context/history.md`, `context/current-ticket.md`, and `context/handoff.md`, is created by the workflow that first needs it — its absence is normal, not an error. `context/tickets/` exists only when local Markdown is the project's ticket store; a project whose tickets are in GitHub Issues or another tracker has none, and that is not a gap. Track the durable ones in Git; `context/current-ticket.md` and `context/handoff.md` are transient session state and belong in `.gitignore`. Never ignore `context/` as a whole.
6
6
 
7
- Use the smallest relevant context for the active task. Keep each delivery chunk stable, reviewable, and verifiable.
7
+ Use the smallest relevant context for the active task. Keep each ticket stable, reviewable, and verifiable.
8
8
 
9
- The roles are `planner`, `developer`, and `tester`. When the human names one, read `roles/<name>.md` before anything else and follow it for that session. A role is a declarative contract stating what a worker is responsible for and what it must not do, where a skill states how to perform a task. Naming one is the only thing that activates it, so a session where none is named behaves exactly as if `roles/` were not there.
9
+ The roles are `planner`, `developer`, and `tester`. Lifecycle skills assume the responsible role for each invocation and read its contract themselves. When the human explicitly names a role, read `roles/<name>.md` before anything else and use it instead for that session. A role is a declarative contract stating what a worker is responsible for and what it must not do, where a skill states how to perform a task. Assumed or explicit, a role narrows responsibility and never grants human authority.
10
10
 
11
11
  Canonical skills live under `skills/` and are the only behavior contract; anything under `.claude/skills/` or `.agents/skills/` is a generated pointer to one, so edit the canonical file and regenerate the adapter.
12
12
 
package/CLAUDE.md CHANGED
@@ -4,34 +4,41 @@ This repository uses an AI-assisted, human-in-the-loop workflow. Project truth l
4
4
 
5
5
  ## Read only what is needed
6
6
 
7
- For feature work, usually read:
7
+ For delivery work, usually read:
8
8
 
9
- 1. `context/current-feature.md`
10
- 2. its referenced feature spec
9
+ 1. `context/current-ticket.md`
10
+ 2. the ticket it names, and that ticket's parent feature spec
11
11
  3. relevant sections of `context/project-overview.md`
12
12
  4. relevant rules from `context/coding-standards.md`
13
13
  5. `context/ai-interaction.md`
14
- 6. only the source files needed for the current delivery chunk
14
+ 6. only the source files needed for the current ticket
15
15
 
16
16
  Do not load the whole repo by default.
17
17
 
18
18
  Pathfinder ships two context files: `ai-interaction.md` and
19
19
  `coding-standards.md`. Everything else in `context/` — `project-overview.md`,
20
- `features/`, `history.md`, `current-feature.md`, `handoff.md` — is written by
21
- the workflow that first needs it. A missing file here is normal; skip it rather
22
- than treating it as an error.
20
+ `features/`, `tickets/`, `history.md`, `current-ticket.md`, `handoff.md` — is
21
+ written by the workflow that first needs it. A missing file here is normal; skip
22
+ it rather than treating it as an error. `tickets/` in particular exists only
23
+ when local Markdown is the project's ticket store.
23
24
 
24
25
  Track the durable ones in Git and ignore the two transient ones,
25
- `current-feature.md` and `handoff.md`. `context/coding-standards.md` carries the
26
+ `current-ticket.md` and `handoff.md`. `context/coding-standards.md` carries the
26
27
  rule; do not ignore `context/` wholesale.
27
28
 
28
29
  ## Roles
29
30
 
30
- When the human names a role, read `roles/<name>.md` before anything else and follow it for the session. A role says what a worker is responsible for, what it reads, and what it must not do, where a skill says how to perform a task.
31
+ Lifecycle skills assume their responsible role for each invocation and read its
32
+ contract themselves: planning uses `planner`, ticket implementation and
33
+ completion use `developer`, and ticket review uses `tester`.
31
34
 
32
- The roles are `planner`, `developer`, and `tester`. Activate one with `/role <name>`.
35
+ The human can explicitly override that default with `/role <name>`. Read the
36
+ named `roles/<name>.md` before anything else and follow it for the session. A
37
+ role says what a worker is responsible for, what it reads, and what it must not
38
+ do, where a skill says how to perform a task.
33
39
 
34
- Naming a role is the only thing that activates one. If the human names none, ignore `roles/` and work as this guide otherwise describes. A role narrows what a session may do and never widens it. Human authority sits outside the role system: approval, acceptance, merge, and release are always the human's.
40
+ A role narrows responsibility and never widens authority. Approval, acceptance,
41
+ merge, and release remain the human's whether a role was assumed or explicit.
35
42
 
36
43
  ## Project-selected policies
37
44
 
@@ -44,7 +51,7 @@ If a policy is `TBD`, do not invent it. Ask the human or clearly mark it unresol
44
51
  Restate:
45
52
 
46
53
  1. Goal
47
- 2. Active delivery chunk
54
+ 2. Active ticket
48
55
  3. Expected files or areas
49
56
  4. Required context
50
57
  5. Risks
@@ -60,8 +67,8 @@ Ask before actions identified in `context/ai-interaction.md`, especially depende
60
67
 
61
68
  ## Scope and quality
62
69
 
63
- - Implement only the active feature and current delivery chunk.
64
- - Keep the project stable after each chunk.
70
+ - Implement only the active feature and current ticket.
71
+ - Keep the project stable after each ticket.
65
72
  - Do not convert prototype code into production code without an explicit feature decision.
66
73
  - Prefer concrete verification over confident narration.
67
74
  - Report conflicts between specs, repository reality, and durable context.
@@ -81,7 +88,8 @@ An adapter carries the canonical skill's frontmatter and a pointer to it, and no
81
88
  - `reverse-engineer` — analyze an external reference and produce an evidence-based reconstruction blueprint
82
89
  - `prototype` — create and iterate the cheapest useful validation artifact
83
90
  - `to-specs` — generate context-sized feature specs
84
- - `feature` — run one action of the Feature delivery loop: `load`, `start`, `review`, `complete`
91
+ - `to-tickets` — decompose one approved Feature into blocker-linked tickets
92
+ - `ticket` — run one action of the ticket delivery loop: `load`, `start`, `review`, `complete`
85
93
  - `debug-issue` — diagnose an observed failure to its root cause, apply the smallest justified fix, and verify it
86
94
  - `learn-feature` — create an interactive lesson for a completed feature
87
95
  - `learn-codebase` — create a modular learning portal for the repository
@@ -92,8 +100,8 @@ An adapter carries the canonical skill's frontmatter and a pointer to it, and no
92
100
  - `learning-review` — review accumulated lessons, identify gaps, and create a reinforcement plan
93
101
  - `reflect` — review completed work, and the reflection itself, and propose reusable workflow improvements for human approval
94
102
  - `handoff` — preserve useful state between sessions or tools
95
- - `role` — activate one named role for the current session
103
+ - `role` — explicitly override the role the lifecycle would assume
96
104
  - `whereami` — report a compact read-only snapshot of the current session
97
105
  - `skillsmith` — teach and create small local skills
98
- - `setup-tracker` — configure an optional external work tracker
99
- - `sync-tracker` — publish approved feature specs to the configured tracker, one-way and idempotently
106
+ - `hooksmith` — turn a described guarantee into one verified hook for the active harness
107
+ - `setup-tracker` — choose the canonical ticket store when it is not local Markdown
package/README.md CHANGED
@@ -80,11 +80,11 @@ The installer copies six kit entries into your repository:
80
80
  | --- | --- |
81
81
  | `AGENTS.md`, `CLAUDE.md` | Entry files that tell supported agents how to work in the project |
82
82
  | `context/` | Project standards and interaction rules; other context is created only when needed |
83
- | `roles/` | Three optional responsibility contracts: planner, developer, tester |
84
- | `skills/` | Reusable procedures for discovery, specs, delivery, debugging, review, learning, and optional work tracking |
83
+ | `roles/` | Planner, developer, and tester contracts assumed by lifecycle skills |
84
+ | `skills/` | Reusable procedures for discovery, specs, delivery, debugging, review, learning, and ticket-store selection |
85
85
  | `templates/` | Minimal starting shapes; records are created from them later, when a workflow needs one |
86
86
 
87
- A fresh Pathfinder 2.0 project begins with only:
87
+ A fresh Pathfinder project begins with only:
88
88
 
89
89
  ```text
90
90
  context/
@@ -20,7 +20,7 @@ Ask before:
20
20
  - Git history rewriting
21
21
  - commits, merges, releases, or deployments
22
22
  - adopting prototype code into production
23
- - writes outside the repository, such as shared tracker changes
23
+ - writes outside the repository, such as tickets in a shared store
24
24
 
25
25
  The human owns judgment, acceptance, merge, and release decisions.
26
26
 
@@ -34,21 +34,24 @@ or deployment workflow.
34
34
  Inspect current Git state before acting. If the workflow is unclear or
35
35
  `TBD`, ask.
36
36
 
37
- ## Feature Workflow
37
+ ## Delivery Workflow
38
38
 
39
39
  Use the workflow skills instead of recreating their procedures in chat:
40
40
 
41
- 1. `/feature load` — load the active work and relevant context.
42
- 2. `/feature start` — implement the current delivery chunk.
43
- 3. `/feature review` — verify the work and report findings.
44
- 4. `/feature complete` — complete accepted work and durable records.
45
- 5. `learn-feature`optionally teach what was implemented.
41
+ 1. `to-tickets`slice one approved Feature into executable tickets.
42
+ 2. `/ticket load` — load one ticket, its Feature, and relevant context.
43
+ 3. `/ticket start` — implement that ticket.
44
+ 4. `/ticket review` — verify the work and report findings.
45
+ 5. `/ticket complete` — complete accepted work and durable records, and name
46
+ the tickets that are now ready.
47
+ 6. `learn-feature` — optionally teach what was implemented.
46
48
 
47
- Roles are optional. The workflow must work without activating one.
49
+ Lifecycle skills assume their responsible role automatically. Explicit
50
+ activation with `/role` is optional and overrides that default for the session.
48
51
 
49
52
  ### Status
50
53
 
51
- Feature status records durable lifecycle state only:
54
+ Ticket status records durable lifecycle state only:
52
55
 
53
56
  `Proposed` → `Ready` → `In Progress` → `Complete`
54
57
 
@@ -56,17 +59,20 @@ Feature status records durable lifecycle state only:
56
59
 
57
60
  - `Ready` means the human approved execution.
58
61
  - Review and testing are optional workflow activity, not a status.
59
- A Feature stays `In Progress` until it is complete.
60
- - `Blocked` is not a status; record the blocker in current workspace state.
62
+ A ticket stays `In Progress` until it is complete.
63
+ - `Blocked` is not a status. A ticket's blockers are the edges under its
64
+ `## Blocked by`, and anything else that stops work is recorded in current
65
+ workspace state.
66
+ - A Feature's status is derived from its tickets, never maintained by hand.
61
67
  - The human decides approval, acceptance, cancellation, and supersession.
62
68
 
63
69
  ## Context Discipline
64
70
 
65
71
  - Read only what the current work requires.
66
72
  - Prefer exact files or sections over broad repository scans.
67
- - Do not load history, roadmap, tracker data, or unrelated context by
73
+ - Do not load history, roadmap, other tickets, or unrelated context by
68
74
  default.
69
- - Work one delivery chunk at a time.
75
+ - Work one ticket at a time.
70
76
  - If the work can no longer be understood safely in a focused session,
71
77
  stop and split or hand off.
72
78
  - Extra scaffolding must earn its cost by reducing downstream context.
@@ -92,10 +92,12 @@ Keep durable truth in its appropriate project artifact.
92
92
  `context/project-overview.md`
93
93
  - Feature contracts:
94
94
  `context/features/`
95
+ - executable tickets, when local Markdown is the configured store:
96
+ `context/tickets/`
95
97
  - completed outcomes:
96
98
  `context/history.md`
97
99
  - active workspace state:
98
- `context/current-feature.md`
100
+ `context/current-ticket.md`
99
101
  - state handed to the next session:
100
102
  `context/handoff.md`
101
103
 
@@ -115,6 +117,7 @@ project", it outlives any session, and a reviewer should see it change:
115
117
  ```text
116
118
  context/project-overview.md
117
119
  context/features/
120
+ context/tickets/ # only when local Markdown is the ticket store
118
121
  context/history.md
119
122
  context/tracker.md
120
123
  ```
@@ -124,14 +127,14 @@ it belongs to one session on one machine, and committing it puts one person's
124
127
  in-flight work in everybody's diff:
125
128
 
126
129
  ```text
127
- context/current-feature.md
130
+ context/current-ticket.md
128
131
  context/handoff.md
129
132
  ```
130
133
 
131
134
  Two lines in `.gitignore` are the whole mechanism:
132
135
 
133
136
  ```text
134
- context/current-feature.md
137
+ context/current-ticket.md
135
138
  context/handoff.md
136
139
  ```
137
140
 
@@ -144,7 +147,8 @@ A team that would rather share workspace state — a single-machine project, or
144
147
  handoff meant to be read by a colleague — can track them instead. Nothing in the
145
148
  kit reads Git state to decide how to behave.
146
149
 
147
- `context/tracker.md` is durable and tracked, with one exception that does not
148
- apply to your project: Pathfinder's own repository ignores it, because `context`
149
- is a directory in the installer's copy list and a committed copy would ship
150
- Pathfinder's tracker config to every new install.
150
+ `context/tracker.md` is durable and tracked when the project selects a store
151
+ other than local Markdown. With local Markdown, `context/tickets/` is durable
152
+ and tracked instead. Pathfinder's own repository ignores its tracker config,
153
+ because `context` is a directory in the installer's copy list and a committed
154
+ copy would ship Pathfinder's store selection to every new install.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "create-pathfinder",
3
- "version": "3.1.0",
4
- "description": "Install the Pathfinder AI-assisted, human-in-the-loop workflow kit into a Git repository.",
3
+ "version": "4.1.0",
4
+ "description": "Install Pathfinder's ticket-first, human-in-the-loop workflow kit into a Git repository.",
5
5
  "keywords": [
6
6
  "pathfinder",
7
7
  "ai",
@@ -17,7 +17,8 @@ Do not load unrelated history, roadmap, Features, or repository areas by default
17
17
 
18
18
  ## Use
19
19
 
20
- - `feature` — its load action to load the work, its start action to implement it.
20
+ - `ticket` — its load action to load work, start action to implement it, and
21
+ complete action to record work the human accepted.
21
22
  - Use the project's existing build, test, and verification commands as needed.
22
23
 
23
24
  ## Rules
package/roles/planner.md CHANGED
@@ -1,14 +1,14 @@
1
1
  ---
2
2
  name: planner
3
- description: Turns approved direction into small, implementable Feature specs.
3
+ description: Discovers project direction and turns it into implementable Features and tickets.
4
4
  ---
5
5
 
6
6
  # Planner
7
7
 
8
8
  ## Responsibility
9
9
 
10
- Turn approved direction into clear Feature specs for another session to
11
- implement.
10
+ Discover project direction, turn approved direction into clear Feature specs,
11
+ and slice those Features into tickets another session can implement.
12
12
 
13
13
  ## Context
14
14
 
@@ -18,8 +18,10 @@ Inspect implementation code only when necessary to understand the work.
18
18
 
19
19
  ## Use
20
20
 
21
+ - `kickstart-pathfinder` to discover and initialize project context.
21
22
  - `debate-me` when direction still needs pressure-testing.
22
23
  - `to-specs` to create Feature specs.
24
+ - `to-tickets` to slice one approved Feature into executable tickets.
23
25
 
24
26
  ## Rules
25
27
 
@@ -33,6 +35,6 @@ Inspect implementation code only when necessary to understand the work.
33
35
 
34
36
  ## Finish
35
37
 
36
- Produce the Feature specs and clearly identify any unresolved human decisions.
37
-
38
- Stop before implementation.
38
+ Finish at the invoked skill's stop condition: approved project context, Feature
39
+ specs, or a ticket graph. Identify unresolved human decisions and stop before
40
+ implementation.
package/roles/tester.md CHANGED
@@ -20,7 +20,7 @@ Do not rely on the developer's summary as proof.
20
20
 
21
21
  ## Use
22
22
 
23
- - `feature` — its review action, to verify implemented work.
23
+ - `ticket` — its review action, to verify implemented work.
24
24
  - Use the project's existing test commands and relevant testing tools.
25
25
 
26
26
  ## Rules
@@ -29,9 +29,9 @@ Use Debug Issue when there is a concrete unexpected behavior such as:
29
29
 
30
30
  Do not use it merely because implementation work is difficult.
31
31
 
32
- If the task is planned feature construction, use `/feature start`.
32
+ If the task is planned construction, use `/ticket start`.
33
33
 
34
- If the goal is reviewing completed implementation for possible defects, use `/feature review`.
34
+ If the goal is reviewing completed implementation for possible defects, use `/ticket review`.
35
35
 
36
36
  If the real question is broad understanding of the repository, use `learn-codebase`.
37
37
 
@@ -202,8 +202,8 @@ It does not:
202
202
 
203
203
  * implement unrelated feature scope
204
204
  * perform a general repository review
205
- * replace `/feature review`
206
- * replace `/feature complete`
205
+ * replace `/ticket review`
206
+ * replace `/ticket complete`
207
207
  * silently change architecture or dependencies
208
208
  * turn debugging into opportunistic refactoring
209
209
  * hide uncertainty behind a successful-looking workaround
@@ -0,0 +1,265 @@
1
+ ---
2
+ name: hooksmith
3
+ description: Turn a plain-English automation or deterministic guarantee into the smallest working, correctly scoped, verified hook for the active AI coding harness.
4
+ argument-hint: [what the hook must guarantee or do]
5
+ ---
6
+
7
+ # Hooksmith
8
+
9
+ A skill is reusable reasoning. A hook is deterministic lifecycle automation.
10
+
11
+ > A skill asks. A hook guarantees.
12
+
13
+ Start from the behavior the human describes. Do not start from a harness, an
14
+ event name, a settings file, or a script.
15
+
16
+ A hook is trusted executable configuration: it runs automatically, with the
17
+ human's credentials, every time its trigger matches, and nothing asks first.
18
+ Build one the way you would accept a change to CI.
19
+
20
+ ## 1. Decide whether this should be a hook
21
+
22
+ Answer before anything else, out loud:
23
+
24
+ - deterministic lifecycle behavior — a guarantee, or an automatic reaction to
25
+ something the session did → hook candidate
26
+ - judgment or reasoning workflow → a skill; use `skillsmith`
27
+ - something a human runs when they want it → a script, a command, or a Make
28
+ target
29
+
30
+ Example: "never allow edits to approved Feature specs." Whether the rule holds
31
+ cannot depend on an agent remembering it, and the answer is a path comparison.
32
+ That is a hook.
33
+
34
+ Anti-example: "review whether this implementation actually satisfies the
35
+ Feature." That is a reading of intent against evidence. No trigger expresses it,
36
+ and a hook that approximates it will block correct work and pass incorrect work.
37
+ It belongs in a reviewer skill.
38
+
39
+ Say which of the three the request is. Concluding "this is not a hook" is a
40
+ successful outcome of this skill — stop there and name what to use instead.
41
+
42
+ ## 2. Describe the hook without naming a harness
43
+
44
+ Write the behavior down in these terms, and only these, before looking at any
45
+ harness:
46
+
47
+ - **lifecycle moment** — what point in the session's life this attaches to
48
+ - **trigger** — what narrows it to the cases the human means
49
+ - **action** — what actually happens when it fires
50
+ - **blocking or non-blocking** — must it *stop* something, or only react to it
51
+ - **ownership and scope** — whose sessions this fires in
52
+ - **failure behavior** — what happens when the hook itself errors
53
+ - **verification** — what would prove it works, and what would prove it does not
54
+
55
+ The worked example becomes:
56
+
57
+ > pre-action, blocking file-mutation guard on the approved Feature spec paths,
58
+ > owned by the project or the kit, failing closed only if the check is trivially
59
+ > correct, verified by one edit that must pass and one that must be refused.
60
+
61
+ That paragraph is the portable contract: what the hook must guarantee, stated in
62
+ terms no harness owns. What follows it is four different things, and keeping
63
+ them apart is the point of the rest of this skill — translation onto one
64
+ harness's primitives (step 4), implementation of the action (step 5–6),
65
+ configuration that installs it (step 7), and verification that it actually
66
+ behaves that way (step 8). Only the first is translation.
67
+
68
+ Keep this description in the report. It is what survives a change of harness.
69
+
70
+ ## 3. Identify the active harness and read what it can actually do
71
+
72
+ Name the harness this session is running in. Then inspect its current hook or
73
+ lifecycle capabilities and conventions — its documentation, its configuration
74
+ files, what it already has configured — rather than assuming they match another
75
+ harness or match what you remember.
76
+
77
+ Confirm four things before translating anything:
78
+
79
+ - which lifecycle moments it exposes, and their real names
80
+ - how a trigger is expressed, and how precisely it can narrow
81
+ - whether the moment you need can **block**, or only observe
82
+ - where the configuration lives, and what scopes it offers
83
+
84
+ If the harness exposes no equivalent lifecycle primitive, or exposes one that
85
+ cannot block when the guarantee requires blocking, say so plainly and stop. A
86
+ guarantee the harness cannot enforce is not a hook — it is a rule, a skill, or a
87
+ check the human runs. Do not build something that looks like enforcement and is
88
+ not.
89
+
90
+ ### Claude Code
91
+
92
+ The first harness this skill supports concretely, and a reference for what a
93
+ translation looks like — not the definition of a hook.
94
+
95
+ Under Claude Code, read the current documentation before relying on any detail:
96
+
97
+ - https://code.claude.com/docs/en/hooks.md — reference
98
+ - https://code.claude.com/docs/en/hooks-guide.md — examples
99
+
100
+ That contract changes faster than any skill describing it, which is why nothing
101
+ here restates its event list. Once confirmed against the fetched page, use its
102
+ own vocabulary directly — the lifecycle event names, the matcher and condition
103
+ syntax, the handler types, the settings and plugin locations, the way a handler
104
+ receives input and returns a decision. Naming them is correct here and wrong
105
+ anywhere else.
106
+
107
+ Under any other harness, use that harness's native equivalent on the same terms:
108
+ read its documentation first, then speak its vocabulary.
109
+
110
+ #### The worked example, realized here
111
+
112
+ The step 2 description — *pre-action, blocking file-mutation guard on the
113
+ approved Feature spec paths, owned by the project or the kit* — becomes, under
114
+ this harness and no other:
115
+
116
+ | Portable term | Claude Code realization |
117
+ | --- | --- |
118
+ | lifecycle moment, pre-action | a `PreToolUse` event, which fires before the tool call and can block it |
119
+ | trigger | a matcher on the file-writing tools, narrowed further by an `if` condition on the spec paths |
120
+ | blocking | a denying permission decision, or exit code 2, returned by the handler |
121
+ | ownership, project or kit | `.claude/settings.json` in the repository, or the plugin's `hooks/hooks.json` |
122
+
123
+ Every cell on the right is this harness's dialect. Another harness answers the
124
+ same four questions with different names, or cannot answer one of them at all —
125
+ which is what step 3 is for. Treat the table as an illustration of the shape of
126
+ a translation, and confirm each cell against the documentation you just fetched
127
+ before relying on it; the names and the decision format change.
128
+
129
+ ## 4. Translate, narrowest first
130
+
131
+ Map the description from step 2 onto what step 3 found:
132
+
133
+ - the lifecycle moment → the harness's nearest real moment, blocking-capable if
134
+ the guarantee needs it
135
+ - the trigger → the narrowest expression the harness supports; a trigger that
136
+ fires on everything is a noise problem that hides the cases the hook exists for
137
+ - ownership → the smallest scope that delivers the guarantee. Scope is a blast
138
+ radius: a guarantee one person wants does not belong in everyone's
139
+ configuration, and a project guarantee does not belong in something that ships
140
+ to other people's projects.
141
+
142
+ State every place the translation is imperfect. The guarantee is only as strong
143
+ as the trigger, so say plainly what it does not catch.
144
+
145
+ For a hook that ships with Pathfinder, prefer what the installation environment
146
+ already guarantees. A hook needing a runtime, a package manager, or a dependency
147
+ the kit does not already assume is a hook Pathfinder cannot ship.
148
+
149
+ ### Two approval gates
150
+
151
+ They are independent, and either one can apply:
152
+
153
+ - **Location.** Writing outside the repository — user settings, machine
154
+ configuration — needs approval.
155
+ - **Blast radius.** Installing or changing a hook whose behavior reaches beyond
156
+ the human's own private, local configuration needs approval, wherever the file
157
+ sits. That covers a project hook committed to the repository and a hook
158
+ shipped by Pathfinder or a plugin: both make other people's sessions behave
159
+ differently, and neither is yours to decide.
160
+
161
+ Building and testing a candidate hook in a scratch or local-only place is not
162
+ gated. Ask at the moment of installing or modifying shared automatic behavior,
163
+ not before experimenting.
164
+
165
+ ## 5. Choose the smallest reliable action
166
+
167
+ Prefer, in order: what the harness's own handler types give you for free; a
168
+ short shell command; a small script in a runtime the environment already has.
169
+ Choose a language because it is present and appropriate, not out of habit.
170
+
171
+ The action runs in the harness's environment, not the human's shell. Do not
172
+ assume a project's virtual environment, `PATH`, or dependencies are active. If
173
+ the hook must run a project command, run it as the human would type it, in the
174
+ project directory, and confirm it resolves there — a hook that always fails
175
+ looks exactly like a hook that always works.
176
+
177
+ ## 6. Decide failure and recursion behavior
178
+
179
+ State the choice explicitly:
180
+
181
+ - **fail open** — an unexpected error allows the action. The default. A broken
182
+ hook must not brick a session.
183
+ - **fail closed** — an unexpected error blocks. Only for a real safety boundary,
184
+ and only when the check is simple enough to be obviously correct.
185
+
186
+ A hook attached to the end of a turn must not block the very ending it caused.
187
+ Find the harness's re-entry signal and exit early when it is set. A hook that
188
+ loops is worse than no hook.
189
+
190
+ Keep the action fast. It runs on every match.
191
+
192
+ ## 7. Merge, never overwrite
193
+
194
+ Read the existing configuration before writing. Add this hook to what is already
195
+ there; leave every other moment and every other hook intact. Losing someone's
196
+ unrelated hook is a silent, hard-to-notice failure.
197
+
198
+ ## 8. Prove it, both ways
199
+
200
+ Run the hook, the way this harness runs hooks. Verification is where the
201
+ abstraction ends: use the harness's real invocation, real input shape, and real
202
+ signals.
203
+
204
+ Verify both sides of the boundary:
205
+
206
+ - a case that must be **allowed** — it passes
207
+ - a case that must **trigger, block, or react** — it fires, with a reason a
208
+ reader would understand
209
+
210
+ A hook that responds identically to both is broken, whichever way it responds.
211
+ Fix it and re-run before reporting anything.
212
+
213
+ Never report success from reading the code. A hook that always blocks and a hook
214
+ that always allows are indistinguishable on the page.
215
+
216
+ ## 9. Report
217
+
218
+ State:
219
+
220
+ - the harness-independent description from step 2
221
+ - the harness, and what its capabilities were confirmed to be
222
+ - what was created, and where it lives
223
+ - what triggers it, what it guarantees, and what it does not catch
224
+ - what was actually executed, and what each run proved
225
+ - the one line the human would edit to adjust it
226
+ - how the human can trigger it themselves
227
+ - that the hook runs automatically with their credentials, and should be
228
+ reviewed like any other executable configuration
229
+
230
+ Say plainly what could not be verified, and name anything the harness could not
231
+ enforce.
232
+
233
+ ## Rules
234
+
235
+ - One hook per invocation. Finish it, verify it, report it, stop.
236
+ - Do not treat one harness's event names, configuration files, handler types, or
237
+ input and output contracts as universal. They are that harness's dialect.
238
+ - Do not build a cross-harness abstraction layer, runtime, adapter framework,
239
+ registry, or orchestration system. The abstraction is the reasoning in steps
240
+ 1–2; everything written to disk is native to one harness.
241
+ - Do not write outside the repository — user settings, machine configuration —
242
+ without approval.
243
+ - Do not install or change a hook that affects anyone but the human running this
244
+ session — a project hook in the repository, a hook shipped by Pathfinder or a
245
+ plugin — without approval. Experimenting locally is free; making shared
246
+ automatic behavior is not.
247
+ - Do not add a dependency to make a hook possible. Choose a smaller hook.
248
+ - Do not weaken an existing hook to make a new one fit.
249
+ - Do not report a hook as working without having run it.
250
+
251
+ ## Stop conditions
252
+
253
+ Stop and hand the decision back when:
254
+
255
+ - the behavior turns out to need judgment, and belongs in a skill
256
+ - the active harness has no equivalent primitive, or none that can block when
257
+ blocking is the point
258
+ - its documentation contradicts what the hook would rely on
259
+ - the guarantee cannot be expressed by any available trigger
260
+ - the correct scope is one the human has not approved, or is shared and the
261
+ human has not approved installing it
262
+ - verification cannot distinguish the allowed case from the blocked one
263
+
264
+ Keep version one small and easy to delete. A hook nobody can explain is a hook
265
+ nobody can trust.
@@ -7,6 +7,12 @@ description: Discover and initialize a new or existing project without writing p
7
7
 
8
8
  Use this skill to turn an idea or existing repository into durable, human-approved project context.
9
9
 
10
+ ## Assumed role
11
+
12
+ Unless the human explicitly activated a role, assume `planner` for this
13
+ invocation: read `roles/planner.md` and follow it. An explicit role overrides
14
+ this default. A role narrows responsibility and never grants human authority.
15
+
10
16
  ## Rules
11
17
 
12
18
  - Do not install packages or write product code.
@@ -13,7 +13,7 @@ The goal is retrieval and diagnosis, not entertainment and not a long exam.
13
13
  ## Read First
14
14
 
15
15
  1. The relevant lesson in `context/learning/lessons/`
16
- 2. `context/current-feature.md`
16
+ 2. `context/current-ticket.md`
17
17
  3. Only the implementation or tests needed to verify answers
18
18
  4. `context/learning/progress.md`
19
19
 
@@ -173,7 +173,7 @@ Use one of these:
173
173
  * `debate-me` — when major product or technical decisions remain
174
174
  * `prototype` — when the experience or technical assumption needs validation
175
175
  * `to-specs` — when the direction is approved and ready to become feature files
176
- * `/feature load` — when the analysis applies to one already-planned feature
176
+ * `/ticket load` — when the analysis applies to one already-planned ticket
177
177
  * `learn-codebase` — when the user wants to understand their own repository instead
178
178
  * no handoff — when the user only requested analysis
179
179