@uchibeke/gallivant 0.2.0 → 0.3.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.
Files changed (133) hide show
  1. package/README.md +120 -60
  2. package/SECURITY.md +9 -0
  3. package/bin/gallivant.mjs +41 -14
  4. package/bin/promote-bitbucket.mjs +40 -0
  5. package/bin/task-pr.mjs +9 -0
  6. package/bin/task-review.mjs +15 -0
  7. package/docs/README.md +6 -2
  8. package/docs/agent-setup.md +55 -41
  9. package/docs/architecture.md +11 -3
  10. package/docs/bitbucket-promotion.md +69 -0
  11. package/docs/bitbucket-review.md +330 -0
  12. package/docs/chains.md +30 -1
  13. package/docs/codex-cloud.md +7 -0
  14. package/docs/codex-review.md +50 -0
  15. package/docs/commands.md +103 -14
  16. package/docs/config.md +45 -13
  17. package/docs/execution.md +1 -1
  18. package/docs/first-party-review.md +266 -0
  19. package/docs/git-hosts.md +294 -0
  20. package/docs/guardrails.md +56 -0
  21. package/docs/install.md +137 -67
  22. package/docs/launch.md +7 -4
  23. package/docs/network-recovery.md +9 -0
  24. package/docs/openai-agents.md +3 -2
  25. package/docs/prd.md +23 -2
  26. package/docs/preparation.md +2 -2
  27. package/docs/release-qualification.md +1 -1
  28. package/docs/releasing.md +46 -22
  29. package/docs/task-delivery.md +5 -5
  30. package/docs/task-profiles.md +537 -0
  31. package/docs/tasks.md +59 -197
  32. package/lib/attribution.mjs +7 -3
  33. package/lib/block.mjs +10 -1
  34. package/lib/chains.mjs +101 -30
  35. package/lib/codex_cloud.mjs +2 -1
  36. package/lib/codex_cloud_input.mjs +15 -6
  37. package/lib/codex_cloud_result.mjs +1 -1
  38. package/lib/commands/doctor.mjs +22 -453
  39. package/lib/commands/init.mjs +281 -28
  40. package/lib/commands/register.mjs +81 -13
  41. package/lib/commands/resume.mjs +5 -1
  42. package/lib/commands/review.mjs +66 -0
  43. package/lib/commands/serve.mjs +8 -0
  44. package/lib/commands/start.mjs +30 -11
  45. package/lib/commands/status.mjs +18 -2
  46. package/lib/commands/task.mjs +9 -1
  47. package/lib/commands/up.mjs +19 -11
  48. package/lib/commands/why.mjs +7 -3
  49. package/lib/config.mjs +42 -9
  50. package/lib/context.mjs +28 -21
  51. package/lib/control.mjs +21 -6
  52. package/lib/credential.mjs +20 -14
  53. package/lib/deliverable.mjs +2 -0
  54. package/lib/events.mjs +96 -53
  55. package/lib/execution.mjs +132 -11
  56. package/lib/execution_preparation.mjs +16 -1
  57. package/lib/execution_result.mjs +26 -5
  58. package/lib/first_party_review.mjs +618 -0
  59. package/lib/fs.mjs +10 -3
  60. package/lib/gh.mjs +144 -56
  61. package/lib/git.mjs +133 -32
  62. package/lib/git_diff.mjs +121 -0
  63. package/lib/harness.mjs +14 -10
  64. package/lib/host_contract.mjs +71 -0
  65. package/lib/host_definitions.mjs +22 -0
  66. package/lib/hosts/bitbucket.mjs +553 -0
  67. package/lib/hosts/bitbucket_contract.mjs +57 -0
  68. package/lib/hosts/bitbucket_credential.mjs +62 -0
  69. package/lib/hosts/bitbucket_review.mjs +44 -0
  70. package/lib/hosts/bitbucket_review_producer.mjs +50 -0
  71. package/lib/hosts/github.mjs +57 -0
  72. package/lib/hosts/github_contract.mjs +27 -0
  73. package/lib/hosts/github_doctor.mjs +482 -0
  74. package/lib/hosts/github_review_summary.mjs +38 -0
  75. package/lib/hosts/transport_doctor.mjs +35 -0
  76. package/lib/hosts.mjs +130 -0
  77. package/lib/learning_qualification.mjs +1 -1
  78. package/lib/notify.mjs +1 -1
  79. package/lib/openai_agents_input.mjs +7 -2
  80. package/lib/openai_agents_sources.mjs +16 -8
  81. package/lib/plugin_package.mjs +13 -1
  82. package/lib/pr_operation.mjs +41 -0
  83. package/lib/prd.mjs +18 -3
  84. package/lib/preparation_codex.mjs +6 -1
  85. package/lib/probe.mjs +6 -4
  86. package/lib/process.mjs +24 -0
  87. package/lib/promotion.mjs +132 -0
  88. package/lib/promotion_git.mjs +63 -0
  89. package/lib/prompt.mjs +16 -13
  90. package/lib/provider_health.mjs +14 -3
  91. package/lib/repository.mjs +68 -0
  92. package/lib/repository_preflight.mjs +11 -0
  93. package/lib/review_evaluation.mjs +25 -0
  94. package/lib/review_evidence.mjs +500 -0
  95. package/lib/review_history.mjs +73 -0
  96. package/lib/review_image.mjs +145 -0
  97. package/lib/review_link.mjs +12 -0
  98. package/lib/review_policy.mjs +132 -0
  99. package/lib/review_policy_contract.mjs +18 -0
  100. package/lib/review_state.mjs +13 -0
  101. package/lib/review_visual.mjs +94 -0
  102. package/lib/runtime-environment.mjs +6 -0
  103. package/lib/runtime_node.mjs +3 -2
  104. package/lib/runtime_state.mjs +39 -5
  105. package/lib/sources/prd.mjs +6 -3
  106. package/lib/state.mjs +137 -24
  107. package/lib/task_completion.mjs +7 -3
  108. package/lib/task_contract.mjs +201 -27
  109. package/lib/task_delivery.mjs +9 -2
  110. package/lib/task_delivery_contract.mjs +13 -9
  111. package/lib/task_delivery_view.mjs +18 -2
  112. package/lib/task_environment.mjs +13 -1
  113. package/lib/task_limits.mjs +13 -0
  114. package/lib/task_model_config.mjs +99 -0
  115. package/lib/task_model_route.mjs +243 -0
  116. package/lib/task_prepare.mjs +21 -8
  117. package/lib/task_profile.mjs +1875 -0
  118. package/lib/task_repository_context.mjs +65 -0
  119. package/lib/tasks.mjs +252 -51
  120. package/lib/tick.mjs +373 -98
  121. package/lib/time.mjs +1 -0
  122. package/lib/tracker/pages.mjs +19 -5
  123. package/lib/tracker/review.mjs +21 -0
  124. package/lib/tracker_process.mjs +8 -1
  125. package/lib/verification_sandbox.mjs +2 -1
  126. package/lib/work_artifacts.mjs +79 -0
  127. package/npm-shrinkwrap.json +12 -3
  128. package/package.json +9 -3
  129. package/templates/plugin/task-delivery.SKILL.md +17 -10
  130. package/templates/plugin/task-intake-contract.json +18 -0
  131. package/templates/plugin/task-profile-requests.mjs +1448 -0
  132. package/templates/tracker/tracker.css +3 -0
  133. package/templates/tracker/tracker.js +38 -0
package/docs/install.md CHANGED
@@ -1,14 +1,34 @@
1
1
  # Install
2
2
 
3
- Get one repository task from a brief to a reviewed pull request. Install the CLI,
4
- sign in to GitHub and one harness, finish the checks, then start a small task.
5
- Gallivant keeps the implementation and review loop moving; you review and merge.
3
+ Get one repository task from a brief to a reviewed pull request. One command sets
4
+ up a repository; `doctor` tells you what still needs your decision or login; then
5
+ you start a small task. Gallivant keeps the implementation and review loop moving
6
+ and you review and merge.
6
7
 
7
8
  **Using a coding agent to set this up?** Give it the [agent setup guide](agent-setup.md).
8
- It includes a copy/paste prompt, setup checks and the point where a real run starts.
9
+ It includes a copy/paste prompt, the setup checks and the point where a real run starts.
9
10
 
10
- For DNS errors or stalled provider calls, see [network diagnosis and recovery](network-recovery.md).
11
- The diagnostic command works before configuration or login, on Linux and macOS.
11
+ ## 1. Prerequisites
12
+
13
+ Requirements shared by the coordinator: macOS or Linux, Node 22 or newer, Git,
14
+ `gh` signed in, and `jq`. For the recommended local path, use signed-in Codex CLI
15
+ 0.160.0+ or Claude Code 2.1.263+ (Codex implementation accepts 0.158.0+, but
16
+ plain-language preparation needs 0.160.0+). Hosted OpenAI Agents execution has a
17
+ separate setup below and needs no local Codex or Claude binary. See the
18
+ [capability matrix](../README.md#harness-support) before choosing another harness.
19
+
20
+ | Prerequisite | Check | If it fails |
21
+ | --- | --- | --- |
22
+ | Node 22+ | `node --version` | install Node from your package manager or a version manager |
23
+ | Git and jq | `git --version`, `jq --version` | `brew install git jq`, `apt install git jq` or `dnf install git jq` |
24
+ | GitHub CLI signed in | `gh auth status` | `gh auth login` |
25
+ | Codex CLI signed in | `codex login status` | `codex login` |
26
+ | Claude Code signed in | `claude auth status` | `claude auth login` |
27
+ | Git identity | `git config --get user.name`, `git config --get user.email` | `git config --global user.name "..."` and `user.email` |
28
+
29
+ Each login belongs to that tool's own flow. Nothing in Gallivant asks for a
30
+ password, token or browser cookie, and `init` stops before writing anything when
31
+ `gh` or the selected harness is signed out.
12
32
 
13
33
  Linux installations need process inspection through `ps` with `lstart`, `command`,
14
34
  PID and process-group fields (normally the `procps`/`procps-ng` package). Minimal
@@ -17,72 +37,103 @@ blocks safe restart rather than allowing overlapping agents. The CI baseline is
17
37
  Ubuntu with Node 22/24; other distributions must also satisfy their harness and
18
38
  sandbox prerequisites.
19
39
 
20
- Start with one harness and one repository. `gallivant init` creates your local
21
- config; `gallivant doctor` checks the prerequisites and prints a fix for each
22
- missing item. Setup time depends on whether your harness and GitHub are already
23
- configured. No model call is needed to install the CLI or validate a hand-written PRD.
40
+ For DNS errors or stalled provider calls, see [network diagnosis and recovery](network-recovery.md).
41
+ The diagnostic command works before configuration or login, on Linux and macOS.
24
42
 
25
- Requirements shared by the coordinator: macOS or Linux, Node 22 or newer, Git,
26
- `gh` signed in, and `jq`. For the recommended local path, use signed-in Claude
27
- Code 2.1.263+ or Codex CLI 0.160.0+ (Codex implementation accepts 0.158.0+, but
28
- plain-language preparation needs 0.160.0+). Hosted OpenAI Agents execution has a
29
- separate setup below and needs no local Codex or Claude binary. See the
30
- [capability matrix](../README.md#harness-support) before choosing another harness.
43
+ ## 2. The command
31
44
 
32
- ## 1. The command
45
+ Inside the Git checkout you want Gallivant to work in:
33
46
 
34
- Check the [registry version](https://www.npmjs.com/package/@uchibeke/gallivant). If one
35
- is available, install the CLI with `npm install -g @uchibeke/gallivant` and check
36
- `gallivant --version`. If the package has not been published yet, use the source
37
- checkout:
47
+ ```bash
48
+ cd /path/to/your/repository
49
+ npx --yes @uchibeke/gallivant init --harness codex # or: --harness claude
50
+ ```
51
+
52
+ This setup flow requires **0.2.1 or newer**. Check npm's current release with
53
+ `npm view @uchibeke/gallivant version`. Source changes on `main` reach this
54
+ command through a [versioned release](releasing.md); setup itself does not publish
55
+ a package.
56
+
57
+ `npx` downloads the published `@uchibeke/gallivant` package into npm's cache and
58
+ runs its `gallivant` command. Nothing is installed globally, no `gallivant`
59
+ command is added to your PATH, and this repository is not cloned. The command
60
+ ends by saying so and printing both the next `npx` command and the optional
61
+ persistent install:
38
62
 
39
63
  ```bash
40
- git clone https://github.com/uchibeke/gallivant && cd gallivant
41
- npm ci --ignore-scripts
42
- npm link
64
+ npm install -g @uchibeke/gallivant # optional; then use plain `gallivant`
43
65
  gallivant --version
44
- gallivant --help # from any directory, to confirm it is on your PATH
45
66
  ```
46
67
 
47
- The package has locked runtime dependencies; `npm ci` installs them for a source
48
- checkout. `npm i -g .` copies instead of linking.
49
- If the shell cannot find the command afterwards,
50
- the `bin` directory under `npm prefix -g` is not on your PATH.
68
+ If the shell cannot find `gallivant` after a global install, the `bin` directory
69
+ under `npm prefix -g` is not on your PATH. Avoid `sudo npm install`; use a
70
+ user-owned Node installation or prefix. The rest of this guide writes
71
+ `gallivant`; with `npx`, read that as `npx --yes @uchibeke/gallivant`.
72
+
73
+ ### What `init` does
74
+
75
+ 1. Refuses to continue, writing nothing, when the directory is not a Git
76
+ checkout, its `origin` remote is not a github.com repository, `gh` is signed
77
+ out, the selected harness is missing, too old or signed out, or the resolved
78
+ run credential cannot see or push to the repository. Each refusal names the
79
+ command that fixes it. Classic credentials also need `public_repo` or `repo`
80
+ scope; a failed scope lookup stops setup before writing and asks you to retry.
81
+ 2. Creates `~/.gallivant/config.json` (mode 600) with your authenticated GitHub
82
+ login in `trusted_authors`, the selected installed harness, notifications
83
+ disabled and a separate `~/.gallivant-worktrees` directory for task checkouts.
84
+ Use `--worktrees /absolute/path` to put checkouts elsewhere, outside the
85
+ config home.
86
+ 3. Records the repository in `repos` once, by its lowercased `owner/name`.
87
+ 4. Prints the `doctor` report and exits with its status: `0` when every check
88
+ passes, `1` while something still needs you.
89
+
90
+ Running it again is safe. An existing config keeps every key as written,
91
+ including custom harness binaries, `github_token_file`, `repos` entries with
92
+ their base branches, `notify` and `worktrees`; the only change is the one `repos`
93
+ entry for the current repository, and a repository already listed is not
94
+ duplicated. `--worktrees` is refused when it differs from the configured
95
+ directory, so edit the config to move checkouts. `--harness` adds the named
96
+ harness when it is not configured yet and leaves the others alone.
97
+ If both Codex and Claude are configured, pass `--harness codex` or
98
+ `--harness claude` explicitly. Setup rechecks settings changed by another command
99
+ before writing, so concurrent repository registrations preserve each other's entries.
100
+
101
+ ### What `init` leaves to you
102
+
103
+ `doctor` reports these with the exact fix. `init` does not perform them:
104
+
105
+ - **Reviewer.** The default reviewer is the Codex GitHub integration. Enable it
106
+ on the repository, configure another supported bot, or set `"reviewer": null`
107
+ to rely on CI and trusted human feedback. Without one of these, the default
108
+ loop waits for a review that cannot arrive. See [the reviewer key](config.md#the-reviewer-object).
109
+ - **Branch protection.** Section 5 below. `doctor` prints the `gh api` call; you
110
+ run it.
111
+ - **Harness guardrails.** Sections 7 and 8 below. APort's installer writes the
112
+ hook, and Codex asks you to trust it interactively.
113
+ - **Credentials and notifications.** Sections 4 and 6 below are optional and
114
+ need your own token or ntfy topic.
115
+ - **Starting work.** Setup never prepares or starts a task, so it spends nothing
116
+ on inference. Section 9 covers the first task and what `--run` authorizes.
51
117
 
52
118
  Global configuration lives in `~/.gallivant/config.json` (or
53
- `$GALLIVANT_HOME/config.json` when explicitly set). Task commands still
54
- need a target checkout: run inside it, pass `--dir` for natural-language tasks, or
55
- pass the PRD path for a written brief.
119
+ `$GALLIVANT_HOME/config.json` when explicitly set). See [config.md](config.md)
120
+ for every key. Task commands still need a target checkout: run inside it, pass
121
+ `--dir` for natural-language tasks, or pass the PRD path for a written brief.
56
122
 
57
- ## 2. Sign in and create config
123
+ ### Install from source
124
+
125
+ Contributors who want to run the checkout they are editing:
58
126
 
59
127
  ```bash
60
- gh auth login # skip if gh auth status already passes
61
- codex login # or sign in with claude, if that is your selected harness
62
- git config --get user.name
63
- git config --get user.email
64
- gallivant init --harness codex # or --harness claude
65
- gallivant doctor
128
+ git clone https://github.com/uchibeke/gallivant && cd gallivant
129
+ npm ci --ignore-scripts
130
+ npm link
131
+ gallivant --version
66
132
  ```
67
133
 
68
- `init` writes `~/.gallivant/config.json` with mode 600, trusts your authenticated
69
- GitHub login, records only the selected installed harness, and creates
70
- `~/.gallivant-worktrees` for separate task checkouts. Use `--worktrees /absolute/path`
71
- to choose another location outside the config home. Notifications start disabled.
72
- Existing configs are never overwritten. If `init` reports an existing config,
73
- continue with `doctor`; preserve the config and repair only the relevant keys.
74
- Set your Git name/email if the checks
75
- above are empty; commits use your configured identity.
76
-
77
- `doctor` can also print a suggested config when none exists. It reports missing
78
- guardrails, credentials and repository protections; `init` does not configure
79
- those for you. Add the target repository to `repos` so `doctor` checks its
80
- permissions, base branch and protections. See [config.md](config.md) for every key.
81
- The default reviewer is
82
- the Codex GitHub integration: enable it on your target repository, configure
83
- another supported bot, or explicitly set `"reviewer": null` to use CI and trusted
84
- human feedback. Without a configured review bot, the default loop waits for a
85
- review that cannot arrive.
134
+ The package has locked runtime dependencies; `npm ci` installs them for a source
135
+ checkout. `npm i -g .` copies instead of linking. This is not the path for using
136
+ Gallivant; the published package is.
86
137
 
87
138
  ### Hosted Agents API instead of a local CLI
88
139
 
@@ -134,7 +185,16 @@ currently disabled because repository ownership of the selected environment
134
185
  cannot be verified. See [the Cloud gate](codex-cloud.md); local Codex and Claude
135
186
  remain available.
136
187
 
137
- ## 3. GitHub auth
188
+ ## 3. Read the report
189
+
190
+ `init` ends with the `doctor` report; `gallivant doctor` prints it again at any
191
+ time. Every failing line carries the command or file that fixes it. Work through
192
+ them in order, then rerun `doctor`. `doctor` without flags checks configuration,
193
+ credentials and repository access without launching a model run; `doctor --probe`
194
+ runs a real Claude sandbox test and `doctor --send` sends a real notification,
195
+ so use those only when you mean to.
196
+
197
+ ## 4. GitHub auth
138
198
 
139
199
  By default Gallivant uses the login you already have, however you set it up. Nothing to configure beyond `gh auth status` passing. There is no file to copy for this: every git setting a run needs, the credential helper included, is passed in the run's environment.
140
200
 
@@ -178,11 +238,11 @@ recognizes enterprise hosts on an existing checkout, but new-task repository
178
238
  resolution and clone URLs currently use github.com. An enterprise login or token
179
239
  alone does not establish supported end-to-end operation.
180
240
 
181
- ## 4. A ruleset on each repo
241
+ ## 5. A ruleset on each repo
182
242
 
183
243
  The one control that stops a push to the default branch is GitHub's. `doctor` prints the exact `gh api` call for every repo in `repos`; it creates a ruleset that blocks deletion and force pushes on the default branch and requires a pull request, with no bypass actors. Gallivant never merges, so the ruleset costs nothing in the loop.
184
244
 
185
- ## 5. Notifications
245
+ ## 6. Notifications
186
246
 
187
247
  Optional: create a topic on [ntfy.sh](https://ntfy.sh) or your own server, install the ntfy app, and set
188
248
  `"notify": { "ntfy": "https://ntfy.sh/<unguessable-topic>", "email": null }`.
@@ -195,7 +255,7 @@ gallivant doctor --send # sends one test message
195
255
 
196
256
  Three kinds of message exist: `ready for a human`, `needs you: <reason>`, and a throttled `gallivant: <error>` when the daemon itself cannot work (gh not authenticated, a harness signed out). Nothing on merge. Nothing per round.
197
257
 
198
- ## 6. APort on Claude Code
258
+ ## 7. APort on Claude Code
199
259
 
200
260
  APort's installer writes a PreToolUse hook with matcher `*` into whichever settings file it is pointed at, and the hook enforces one passport. Gallivant's passport is strict on purpose: writes only under the worktrees directory, control-plane directories blocked. Installed into `~/.claude/settings.json`, that policy would apply to every interactive Claude session you run and block your normal work. So the installer goes into a Gallivant-owned directory, and every run loads it with `--settings` plus `APORT_CLAUDE_CODE_CONFIG_DIR`. Nothing about the sandbox requires this; it is only about keeping Gallivant's policy separate from yours.
201
261
 
@@ -224,7 +284,7 @@ gallivant doctor --probe # a real run: a write inside the checkout succeeds,
224
284
 
225
285
  The probe reads the APort audit log to tell apart a hook that never ran from a passport that allowed the write, and prints the fix for each.
226
286
 
227
- ## 7. APort on Codex
287
+ ## 8. APort on Codex
228
288
 
229
289
  ```bash
230
290
  npx @aporthq/aport-agent-guardrails codex --global --enforcement=warn
@@ -239,10 +299,10 @@ Git metadata writes and escalations, the scoped token and the ruleset. Gallivant
239
299
  sets the approval mode on start and resume. A denial must be diagnosed, not
240
300
  bypassed. See [guardrails.md](guardrails.md#codex-git-writes-need-automatic-approval).
241
301
 
242
- ## 8. First task
302
+ ## 9. First task
243
303
 
244
304
  Before dispatch, confirm the repository, target branch, permitted changes and
245
- spending limits. The default `max_iterations` is 30 automatic fix rounds;
305
+ spending limits. The default `max_iterations` is 60 automatic fix rounds;
246
306
  `max_budget_usd` defaults to 5 and gives Claude a native per-run dollar cap.
247
307
  Other local harnesses do not enforce an equivalent dollar cap. Use your provider's
248
308
  spend controls and review [budget semantics](config.md) before unattended work.
@@ -271,9 +331,9 @@ gallivant task start TASK_ID --revision REVISION --run
271
331
  gallivant start
272
332
  ```
273
333
 
274
- Alternatively, add `--run` to the original `task` request to authorize
275
- implementation as soon as preparation and any clarifications succeed. The task
276
- service starts the daemon; `gallivant start` with no path also opens the dashboard.
334
+ Preparation always returns for review, including when the original request
335
+ contains `--run`. Approve the visible ready revision with the separate start
336
+ command above. The task service starts the daemon; `gallivant start` with no path also opens the dashboard.
277
337
  Read [task operations](tasks.md) for selected context, revisions, recovery and costs.
278
338
 
279
339
  ### From a written brief
@@ -336,3 +396,13 @@ Watch `gallivant status` after the start run ends: the entry moves from `impleme
336
396
  | `<worktrees>/<repo>/<prd>` | one partial clone per PRD; durable until you delete it |
337
397
 
338
398
  Override the home directory with `GALLIVANT_HOME` to run a second instance.
399
+
400
+ ## Bitbucket-only first run
401
+
402
+ Bitbucket setup uses Node, Git, a selected local harness, an account API token,
403
+ and explicit reviewer or no-reviewer policy. It does not require `gh` sign-in.
404
+ Follow the [first-run commands](bitbucket-review.md#first-setup-including-a-checkout-with-no-existing-configuration),
405
+ including separate SSH and API credentials when using SSH Git. Setup checks
406
+ transport access; a live public repository run has reached ready with explicit
407
+ no-reviewer policy. Independent review and a clean Linux installation have not
408
+ been qualified. Check `gallivant doctor` before starting your own repository.
package/docs/launch.md CHANGED
@@ -1,10 +1,13 @@
1
1
  # Announcement drafts
2
2
 
3
3
  Publish these only after [the release checks](releasing.md#verify-before-announcing)
4
- pass and the repository is public. Use the install command that actually works
5
- for the released version; do not advertise npm installation before publication.
6
- Add a genuine dashboard screenshot or recording of a task reaching a reviewed
7
- PR. Fixture tests are not live provider evidence.
4
+ pass for the version being announced. The package is published as
5
+ `@uchibeke/gallivant`; the setup command to advertise is
6
+ `npx --yes @uchibeke/gallivant init --harness codex` (or `--harness claude`),
7
+ run inside the target checkout. Check that the behavior the README describes is
8
+ in the released version before quoting it. Add a genuine dashboard screenshot or
9
+ recording of a task reaching a reviewed PR. Fixture tests are not live provider
10
+ evidence.
8
11
 
9
12
  ## X
10
13
 
@@ -1,5 +1,14 @@
1
1
  # Network failures and recovery
2
2
 
3
+ The coordinator normally retains a successful local provider health check for
4
+ five minutes, so a long coordinator cycle does not immediately expire it. A due,
5
+ pending, failed or timed-out check still fences dispatch. An explicit
6
+ `execution.progressMs` setting controls this interval and remains authoritative.
7
+ Provider readiness refreshes on its own timer while a long coordinator cycle
8
+ is still processing. A pending or failed refresh continues to block dispatch.
9
+ Messages and resume requests remain queued while a readiness check is pending;
10
+ an actual failed check still reports failure for the operator to repair.
11
+
3
12
  `ENOTFOUND` means a hostname lookup failed. `EAI_AGAIN` indicates a temporary
4
13
  resolver failure. Neither proves that a provider is down, credentials expired,
5
14
  or APort denied a tool call. DNS can affect one hostname while other sites work.
@@ -85,7 +85,8 @@ entry, prepare and inspect a brief first, then follow the returned next action:
85
85
  ```sh
86
86
  gallivant task "Document the existing test commands in CONTRIBUTING.md. Change documentation only." \
87
87
  --harness openai-agents --verify 'git diff --check'
88
- # Add --run to authorize implementation once the brief passes readiness.
88
+ # Review the ready draft, then substitute its returned task ID and revision:
89
+ gallivant task start TASK_ID --revision REVISION --run
89
90
  ```
90
91
 
91
92
  Natural-language intake uses the selected provider's versioned preparation
@@ -414,7 +415,7 @@ publication and review correction. Use the exact prerequisites above to record
414
415
  those phases; fixture passes alone are not end-to-end qualification.
415
416
 
416
417
  The original M5/M6 integration handoff points to
417
- [`aporthq/agent-passport#417`](https://github.com/aporthq/agent-passport/pull/417),
418
+ [`aporthq/agent-passport#417`](https://github.com/aporthq/agent-passport/pull/417) (not publicly readable),
418
419
  merged on 2026-10-09. Its canonical brief is
419
420
  `docs/prds/aport-task-delivery-workflow-integration.md` in that repository, with
420
421
  job identity `aporthq/agent-passport/aport-task-delivery-workflow-integration`.
package/docs/prd.md CHANGED
@@ -76,6 +76,27 @@ These keys beyond `status` and `harness` are read if present:
76
76
  editing a document it was handed, and the list is part of the contract: adding or removing a file stops the entry
77
77
  the way an edited criterion does. See [config.md](config.md#files-a-brief-carries-sources) for how it differs from
78
78
  `context_paths`.
79
+ - `publish_files` is an optional list of **exact output files** that would otherwise match the task-artifact policy:
80
+
81
+ ```yaml
82
+ publish_files:
83
+ - docs/audit/requested-security-report.md
84
+ - docs/evidence/export-dialog.png
85
+ ```
86
+
87
+ Use it only for reports, evidence or carried documents the operator explicitly wants in the PR. It does not list
88
+ ordinary implementation files or tests. No globs, directories, absolute paths or more than 100 entries are accepted.
89
+ The saved, approved brief supplies these exceptions; editing the session's copy cannot grant permission. Changing
90
+ the list changes the contract and uses the normal `prd-changed` repair/approval flow.
91
+
92
+ Task work logs, session transcripts, scratch files, audit chronology and review/handoff notes belong outside Git.
93
+ Create scratch space with `mktemp -d`; put concise verification results in the PR receipt. Keep lasting project
94
+ documentation and release/rollback instructions concise. The commit hook and final remote PR-diff check reject
95
+ conventional work-artifact paths (including `docs/audit/`, `docs/evidence/`, `docs/verification/`, `WORK_LOG.md`,
96
+ `NOTES.md`, and carried `sources`) unless listed here. Deletions remain allowed so an existing PR can be cleaned.
97
+ Required image evidence must remain committed at its explicitly approved paths; deleting it would invalidate review.
98
+ This is a path hygiene check, not a semantic content scanner: do not rename work logs to evade it.
99
+
79
100
  - `context_paths` gives this one brief read access to directories outside its checkout, added to whatever
80
101
  `config.json` already lists rather than replacing it. Comma-separated, or a `[a, b]` list:
81
102
 
@@ -128,7 +149,7 @@ file in your checkout are two files, and until this existed nothing compared the
128
149
  the run finished against criteria nobody was asking for and the PR arrived satisfying a document that had changed.
129
150
 
130
151
  So the two are compared, and what happens depends on what you changed. The comparison is in the contract's own terms:
131
- the acceptance criteria, Verify commands, `harness`, `context_paths`, `sources`,
152
+ the acceptance criteria, Verify commands, `harness`, `context_paths`, `sources`, `publish_files`,
132
153
  and the **Coordinator delivery contract** when present. The ownership section
133
154
  keeps a natural-language publication instruction separate from provider work.
134
155
  It is validated and fingerprinted too; malformed edits cannot be silently ignored.
@@ -138,7 +159,7 @@ request bytes remain exact.
138
159
  | What you changed | What happens |
139
160
  |---|---|
140
161
  | Anything outside those contract fields: the Problem prose, a reworded story, a new Out of scope bullet | Nothing stops. The snapshot follows your edit so later prompts carry your current wording, the log says it happened, and you are not told. Stopping a run to ask about a typo fix would be worse than useless. |
141
- | A criterion, a Verify command, the harness, `context_paths`, `sources` or coordinator delivery ownership | The entry stops with `prd-changed` before the gate runs, and `gallivant why` names each difference. |
162
+ | A criterion, a Verify command, the harness, `context_paths`, `sources`, `publish_files` or coordinator delivery ownership | The entry stops with `prd-changed` before the gate runs, and `gallivant why` names each difference. |
142
163
  | The ORDER of two criteria, without changing a word of either | Also `prd-changed`. Criteria are numbered by position, and the receipt on the open PR attests `ac-1` and `ac-2` by those numbers, so swapping two of them leaves the receipt attesting each criterion with the other's evidence. |
143
164
  | The file no longer passes the contract | `prd-illegal`. Fix the file and `gallivant ready` it again; it cannot become the brief the gate judges as it stands. |
144
165
  | The file is gone from your checkout | `prd-gone`. Restore it, or `gallivant remove` the entry. |
@@ -16,7 +16,7 @@ Preparation and implementation are separate capabilities:
16
16
  | Claude Code | Tools disabled | Local checkout |
17
17
  | Codex | Isolated native profile, Codex 0.160.0+ | Local checkout |
18
18
  | OpenAI Agents API | Text only, no tools or environment | Hosted sandbox |
19
- | Gemini CLI, OpenCode, Goose | Unavailable; use `new` → `ready` → `start` | Local checkout |
19
+ | Gemini CLI, OpenCode, Goose | Unavailable through the harness; the configured [model route](task-profiles.md#planner-routes) can draft, or use `new` → `ready` → `start` | Local checkout |
20
20
  | Codex Cloud | Unavailable | New dispatch blocked on environment/repository verification |
21
21
 
22
22
  An adapter's presence does not prove the configured account can use its selected
@@ -102,7 +102,7 @@ Official configuration references:
102
102
  Re-run native qualification when upgrading the CLI or adding tool capabilities.
103
103
 
104
104
  The recorded cross-repository integration handoff names
105
- [`aporthq/agent-passport#417`](https://github.com/aporthq/agent-passport/pull/417),
105
+ [`aporthq/agent-passport#417`](https://github.com/aporthq/agent-passport/pull/417) (not publicly readable),
106
106
  with job identity `aporthq/agent-passport/aport-task-delivery-workflow-integration`.
107
107
  The handoff calls for reusing that continuation after the actual portable package
108
108
  is available. This document qualifies the preparation boundary; it does not
@@ -16,7 +16,7 @@ the accessible actual demo recording URL. Do not substitute generated images.
16
16
 
17
17
  ```sh
18
18
  npm run release:preflight -- --config "$PACKAGE_CONFIG" --setup "$SETUP_EVIDENCE"
19
- npm run release:package -- --config "$PACKAGE_CONFIG" --out "$RELEASE_DIR" --core-version 0.2.0 --source-commit "$SOURCE_COMMIT" --deployment "$DEPLOYMENT_RECORD" --evidence "$LIVE_EVIDENCE"
19
+ npm run release:package -- --config "$PACKAGE_CONFIG" --out "$RELEASE_DIR" --core-version 0.3.0 --source-commit "$SOURCE_COMMIT" --deployment "$DEPLOYMENT_RECORD" --evidence "$LIVE_EVIDENCE"
20
20
  npm run release:validate -- --out "$RELEASE_DIR"
21
21
  ```
22
22
 
package/docs/releasing.md CHANGED
@@ -1,9 +1,16 @@
1
1
  # Releasing
2
2
 
3
3
  The package name is `@uchibeke/gallivant`; the executable is `gallivant`. The repository is
4
- `uchibeke/gallivant`. Before announcing a version, confirm npm publication and a
5
- passing consumer smoke check. A public GitHub repository alone does not make the
6
- npm command work.
4
+ `uchibeke/gallivant`. The first public release, 0.2.0, was published on
5
+ 2026-10-19; `npm view @uchibeke/gallivant version` reports the current one.
6
+ Before announcing a version, confirm its npm publication and a passing consumer
7
+ smoke check. A public GitHub repository alone does not make the npm command work.
8
+
9
+ The README and installation guide lead with
10
+ `npx --yes @uchibeke/gallivant init --harness codex`, which runs whatever
11
+ version npm serves as `latest`. When `init` or another documented command changes
12
+ behavior, release the version that carries it before, or together with, the
13
+ documentation that describes it.
7
14
 
8
15
  ## One-time launch setup
9
16
 
@@ -21,14 +28,13 @@ npm command work.
21
28
  Enable the `main` ruleset with pull requests, the four portability checks,
22
29
  and protection against deletion and force pushes. Read back both settings:
23
30
  merely referencing `environment: npm` in YAML does not create protection.
24
- 3. For a package that does not exist yet, arrange the initial npm publication
25
- credential with the npm owner. If needed, set a short-lived granular
26
- `NPM_TOKEN` in the protected `npm` environment, scoped as narrowly as npm
27
- permits. Never put it in the repository or a PR.
28
- A local `npm login` is not authentication for GitHub Actions. Do not publish
29
- the release locally to bypass this setup: the release's provenance is
30
- generated in supported CI, not by the developer's terminal.
31
- 4. Once the package exists, configure its npm trusted publisher for GitHub owner
31
+ 3. The initial publication used a short-lived granular `NPM_TOKEN` in the
32
+ protected `npm` environment, scoped as narrowly as npm permits. Never put a
33
+ token in the repository or a PR. A local `npm login` is not authentication
34
+ for GitHub Actions. Do not publish a release locally to bypass this setup:
35
+ the release's provenance is generated in supported CI, not by the
36
+ developer's terminal.
37
+ 4. With the package published, configure its npm trusted publisher for GitHub owner
32
38
  `uchibeke`, repository `gallivant`, workflow `release.yml`, environment `npm`.
33
39
  Permit direct `npm publish`, which is what this workflow runs. Validate a new
34
40
  trusted publisher within two days or recreate it after expiry; configure it
@@ -56,8 +62,8 @@ npm whoami --registry=https://registry.npmjs.org
56
62
  npm view @uchibeke/gallivant version --registry=https://registry.npmjs.org
57
63
  ```
58
64
 
59
- An absent package is expected before the first publication. An absent `npm`
60
- environment or disabled branch protection is unfinished release setup.
65
+ `npm view` should report the published version. An absent `npm` environment or
66
+ disabled branch protection is unfinished release setup.
61
67
 
62
68
  ### Staged publishing is a different workflow
63
69
 
@@ -75,10 +81,25 @@ GitHub release. Until then, use the documented CI bootstrap credential route.
75
81
 
76
82
  ## Release a version
77
83
 
84
+ Merging a PR to `main` does not bump the version, create a tag or publish a
85
+ package. There is no scheduled release or automatic version-bump PR. Prepare a
86
+ version-bump PR, wait for its checks, merge it, then trigger the workflow and
87
+ approve the protected `npm` environment. A newer source checkout with an already
88
+ published version cannot refresh that npm version: the tag and tarball guards
89
+ deliberately require the original commit and bytes.
90
+
78
91
  Update the version with `npm version patch --no-git-tag-version` (or `minor`),
79
92
  which updates `package.json` and `npm-shrinkwrap.json`. Include release notes in
80
93
  the PR and merge it after CI passes. Do not bump the version for a retry.
81
94
 
95
+ Update `CORE_VERSION` in `lib/task_delivery_contract.mjs` to the same version.
96
+ For a minor release, review and update its pre-1.0 compatibility window, the
97
+ handshake tests and the packaging examples in [task delivery](task-delivery.md)
98
+ and [release qualification](release-qualification.md). Other minor versions
99
+ require explicit migration; keep the exact artifact pin and wire-schema guards.
100
+ Run the full portability suite, including plugin packaging and release assembly,
101
+ before publishing: the npm install smoke alone does not exercise those builders.
102
+
82
103
  The workflow follows the guardrails repository's pattern: validate the release
83
104
  ref, test before publishing, and permit recovery without replacing published
84
105
  versions. This single-package project does not need its multi-registry dispatcher.
@@ -87,8 +108,8 @@ Choose one trigger:
87
108
 
88
109
  ```sh
89
110
  # From an up-to-date main checkout; replace the example with package.json's version.
90
- git tag -a v0.2.0 -m 'Release 0.2.0'
91
- git push origin v0.2.0
111
+ git tag -a v0.3.0 -m 'Release 0.3.0'
112
+ git push origin v0.3.0
92
113
 
93
114
  # Or dispatch against main; the workflow uses main's package version.
94
115
  gh workflow run release.yml --repo uchibeke/gallivant --ref main
@@ -113,7 +134,8 @@ original workflow rather than dispatching newer `main` with the old version.
113
134
 
114
135
  ```sh
115
136
  npm view @uchibeke/gallivant version dist.integrity dist.attestations
116
- npm install -g @uchibeke/gallivant
137
+ npx --yes @uchibeke/gallivant --version # the command the README leads with
138
+ npm install -g @uchibeke/gallivant # the documented persistent option
117
139
  gallivant --version
118
140
  gallivant --help
119
141
  ```
@@ -124,9 +146,9 @@ in a clean project that installed the released version to verify registry
124
146
  signatures and available provenance. Metadata presence alone is not signature
125
147
  verification; see [npm provenance verification](https://docs.npmjs.com/generating-provenance-statements/#verifying-provenance-attestations).
126
148
 
127
- After publication is verified, update the README and installation guide to put
128
- the tested npm install command first and remove the first-release-pending notes
129
- (including this page). Keep the source-install alternative.
149
+ After publication is verified, check that the README's `npx` command and the
150
+ installation guide match the behavior of the released version, and keep the
151
+ source-install alternative for contributors.
130
152
 
131
153
  Use a clean test account/home and the [getting-started guide](install.md) for one
132
154
  small real PR. Confirm implementation, feedback-driven continuation, CI and the
@@ -135,6 +157,8 @@ paid-provider access. Recheck anonymous GitHub access and all README links.
135
157
  Announcement drafts are in [launch.md](launch.md).
136
158
 
137
159
  For local validation without publishing: `npm run lint`, `npm test`, and
138
- `npm run test:install`. The last command packs and installs under a disposable
139
- directory, exercises setup and PRD commands outside the source tree, and imports
140
- every declared module export. It makes registry requests but no model calls.
160
+ `npm run test:install`. The last command packs the tarball under a disposable
161
+ directory, runs the README's `npx` setup command against it from a fixture
162
+ repository with a throwaway home, installs it as a dependency, exercises PRD
163
+ commands outside the source tree, and imports every declared module export. It
164
+ makes registry requests but no model calls.
@@ -12,14 +12,14 @@ must enforce the same authorization, ownership, persistence and recovery
12
12
  contracts. In the APort integration, APort owns publication and the host
13
13
  responsibilities above. Its existing
14
14
  `aporthq/agent-passport/aport-task-delivery-mcp` job produced merged
15
- [PR #414](https://github.com/aporthq/agent-passport/pull/414); reuse that integration.
15
+ [PR #414](https://github.com/aporthq/agent-passport/pull/414) (not publicly readable); reuse that integration.
16
16
  The M5/M6 notes below preserve that integration's milestone evidence and gates;
17
17
  they do not certify another host or supply a public UI, database or competing
18
18
  runner.
19
19
 
20
20
  ## Installed exports
21
21
 
22
- Core `0.2.0`, task schema `1`, execution schema `1`, operation schema `1`.
22
+ Core `0.3.0`, task schema `1`, execution schema `1`, operation schema `1`.
23
23
  The candidate digest comes from the emitted `runtime.json`/`manifest.json`;
24
24
  pin the artifact produced from the eventual human-merged commit, not this branch.
25
25
 
@@ -218,7 +218,7 @@ Before wake-up, migrate/pin the exact runtime artifact. Supply the emitted
218
218
  The coordinator refuses a different active-job digest. Compatible patches keep
219
219
  task/provider/brief identities; drain jobs before staging a different artifact.
220
220
  No running code is silently upgraded. The public API's pre-1.0 compatibility
221
- window is `0.2.x`, with operation/task/execution wire schemas all `1`; other
221
+ window is `0.3.x`, with operation/task/execution wire schemas all `1`; other
222
222
  versions need migration.
223
223
 
224
224
  The portable contracts/views/wake envelope have no Node dependencies. The complete
@@ -267,9 +267,9 @@ changes and remain development fixtures:
267
267
  npm ci --ignore-scripts
268
268
  node bin/package-plugin.mjs --config /private/aport-package.json --validate-public
269
269
  npm run package:plugin -- --config /private/aport-package.json --out /private/candidate \
270
- --core-version 0.2.0 --source-commit <40-character-merged-commit>
270
+ --core-version 0.3.0 --source-commit <40-character-merged-commit>
271
271
  # For development only, add --internal; keep fixture:true in the config.
272
- npm install --ignore-scripts --prefix /private/candidate-runtime /private/candidate/uchibeke-gallivant-0.2.0.tgz
272
+ npm install --ignore-scripts --prefix /private/candidate-runtime /private/candidate/uchibeke-gallivant-0.3.0.tgz
273
273
  node /private/candidate-runtime/node_modules/@uchibeke/gallivant/bin/task-delivery-state.mjs check \
274
274
  --home /durable/preview --manifest /private/candidate/runtime.json
275
275
  node /private/previous-runtime/node_modules/@uchibeke/gallivant/bin/task-delivery-state.mjs backup \