@arjunkhera/atlas 0.3.32 → 0.3.34

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "atlas",
3
- "version": "0.3.32",
3
+ "version": "0.3.34",
4
4
  "description": "Atlas: the delivery lifecycle, its crews and the Atlas tools, for any repository.",
5
5
  "author": {
6
6
  "name": "Arjun Khera"
@@ -28,6 +28,10 @@
28
28
  {
29
29
  "kit_sha256": "08c868aa39e6c9f471da2571e9a1d5939932a59856cea9c4176e3173f93454db",
30
30
  "first_package": "0.3.30"
31
+ },
32
+ {
33
+ "kit_sha256": "c4a506ec261d2d2fd7884943c9d317fb7b522704f4f63669b5bd37d32326bde5",
34
+ "first_package": "0.3.32"
31
35
  }
32
36
  ]
33
37
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arjunkhera/atlas",
3
- "version": "0.3.32",
3
+ "version": "0.3.34",
4
4
  "description": "Atlas: the delivery lifecycle, its crews and the Atlas tools, as a Claude Code plugin for any repository.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -3,7 +3,7 @@ name: feedback
3
3
  description: >
4
4
  File a report about Atlas, or about a product, as an issue in the right public repo.
5
5
  Trigger when someone says "Atlas should …", "report this", "file an issue", or asks for a
6
- feature or a fix that is not a correction of the work in this session. It searches open
6
+ feature or a fix that is not a correction of the work in this session. It searches the
7
7
  issues first and files nothing until the person says "file it".
8
8
  ---
9
9
 
@@ -18,10 +18,14 @@ goes to the `atlas:learnings` skill instead.
18
18
  1. **Find the issue repo.** Read it from the product record: the Atlas
19
19
  tools return it with the product. For a report about Atlas itself, the
20
20
  issue repo is the Atlas repo. If no issue repo is known, ask for it.
21
- 2. **Search open issues first.** Use `gh issue list --repo <repo>
22
- --state open --search "<key words>"`. Try two or three short searches.
23
- 3. **Show what you found.** If an open issue matches, show its title and
24
- link. Offer to add the new detail to it as a comment.
21
+ 2. **Search the issues first.** Use `gh issue list --repo <repo>
22
+ --state all --search "<key words>"`. Try two or three short searches.
23
+ Search closed issues too: an issue closes when its tracker item
24
+ exists, and its closing note names the item.
25
+ 3. **Show what you found.** If an issue matches, show its title and
26
+ link. A closing note can name an item. Then the work lives in that
27
+ item, so offer to add the new detail with `item_comment`. Otherwise
28
+ offer to add it to the issue as a comment.
25
29
  4. **Draft the issue.** Write a title and a short body: what happens, what
26
30
  should happen, and the steps to see it. Write in plain words.
27
31
  5. **Run the privacy filter.** Write the draft to a scratch file, and run
@@ -30,24 +34,28 @@ goes to the `atlas:learnings` skill instead.
30
34
  "file it", or the same in their own words.
31
35
  7. **File it once.** Use `gh issue create --repo <repo> --title <title>
32
36
  --body-file <file>`.
33
- 8. **Put the issue in the tracker.** Every open issue has a tracker item.
37
+ 8. **Move the issue into the tracker.** The tracker item is the one home
38
+ for the work. The issue stays as the record of the report, closed.
34
39
  The lead does this step, because only the lead writes to the tracker.
35
40
  1. Call `item_propose` with the product and the repo of the issue.
36
41
  Use the issue title as the title. Use the person's own words as
37
42
  the origin, with the issue link as its source.
38
43
  2. Call `item_link` on the new item with kind `issue`, the issue URL
39
44
  and role `report`.
40
- 3. Add a comment on the issue that names the item id.
45
+ 3. Close the issue with a comment that names the item id. Say that
46
+ the item now holds the work. Use `gh issue close <number> --repo
47
+ <repo> --comment "<note>"`.
41
48
  4. Give the person the issue link and the item id.
42
49
 
43
- If the issue adds to an open issue that has an item, link it to that
44
- item instead, and make no new item. If `item_propose` refuses because
45
- the owner is not present, give the person the issue link and say that
46
- the owner must add the item.
50
+ The issue can add to an issue that has an item. Then link it to that
51
+ item, make no new item, and close it the same way. `item_propose` can
52
+ refuse because the owner is not present. Then keep the issue open,
53
+ give the person the issue link, and say that the owner must add it.
47
54
 
48
55
  Example: the person says "Atlas should show which copy runs", then
49
56
  "file it". The lead files issue #150, proposes the item "Show which copy
50
- of Atlas runs", links #150 to it, and comments the item id on #150.
57
+ of Atlas runs", and links #150 to it. Then the lead closes #150 with the
58
+ note "Tracked as item 1a2b3c4d. The item holds the work now."
51
59
 
52
60
  When `gh` fails or is not there, use the session's GitHub tools for the
53
61
  same search and the same issue.
@@ -60,3 +68,5 @@ same search and the same issue.
60
68
  3. One report is one issue. Split a report that holds two asks.
61
69
  4. Never leave a filed issue with no tracker item, except when the owner
62
70
  is not present. Then say so.
71
+ 5. Never keep an issue open after its item exists. The owner's rule of
72
+ 21 October 2026: the work moves to the item.
package/tests/model.mjs CHANGED
@@ -291,6 +291,9 @@ export async function runClaude({ prompt, args = [], key, cwd, meter, what, reda
291
291
  meter.add(Number.isFinite(cost) ? cost : left, what, id);
292
292
  if (!envelope) throw new Error(`${what}: the model command gave no answer (exit ${out.exit}): ${(redactor ? redactor.text(out.stderr || out.stdout) : out.stderr || out.stdout).slice(0, 400)}`);
293
293
  const clean = (t) => (redactor ? redactor.text(t) : t);
294
+ // An error answer with no cost never reached the model: a refused sign-in, no credit, a bad model
295
+ // name. The scenario cannot pass or fail on it, so it reads blocked, with the reason.
296
+ if (envelope.is_error && !Number.isFinite(cost)) throw new Blocked(`${what}: the model call failed before the model answered: ${clean(String(envelope.result ?? envelope.error ?? (out.stderr || out.stdout))).slice(0, 400)}`);
294
297
  if (out.signal === 'SIGKILL') throw new Error(`${what}: the model call ran past ${Math.round(timeoutMs / 1000)} seconds and was stopped`);
295
298
  return { exit: out.exit, stdout: clean(out.stdout), stderr: clean(out.stderr), envelope, events, cost: Number.isFinite(cost) ? cost : null };
296
299
  } finally {