@arjunkhera/atlas 0.3.16 → 0.3.18

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.16",
3
+ "version": "0.3.18",
4
4
  "description": "Atlas: the delivery lifecycle, its crews and the Atlas tools, for any repository.",
5
5
  "author": {
6
6
  "name": "Arjun Khera"
@@ -1,21 +1,24 @@
1
- <!-- The structural reference for a rendered design doc. Neutral content: a
1
+ <!-- The structural reference for a rendered page. Neutral content: a
2
2
  made-up repo, "orders-api". Copy the structure and the classes, never the
3
- words. In a real render, paste system.css where the comment says. -->
3
+ words. In a real render, paste system.css where the comment says. Every
4
+ colour below is a token from system.css, so the page works in the light
5
+ and the dark theme. Never write a colour value here. -->
4
6
  <title>Refund rounding</title>
5
7
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Caprasimo&family=Figtree:wght@400;600;700&display=swap">
6
8
  <style>
7
9
  /* paste system.css here in a real render */
8
- body { background: #fcfbf9; color: #211d19; font: 16.5px/1.7 Figtree, system-ui, sans-serif; margin: 0; }
10
+ body { background: var(--color-bg); color: var(--color-text); font: 16.5px/1.7 Figtree, system-ui, sans-serif; margin: 0; }
9
11
  [data-shell] { display: grid; grid-template-columns: 288px minmax(0, 860px); gap: 40px; padding-inline: 24px; }
10
12
  [data-rail] { position: sticky; top: 0; align-self: start; padding-block: 28px; display: flex; flex-direction: column; gap: 14px; }
11
13
  [data-main] { padding-block: 28px 80px; }
12
14
  h1, h2 { font-family: Caprasimo, Georgia, serif; font-weight: 400; text-wrap: balance; }
13
15
  h2 { font-size: 29px; margin: 0; }
14
- .kicker { font-size: 11px; letter-spacing: .14em; text-transform: uppercase; color: #a97f5f; font-weight: 700; }
15
- .intent { font-style: italic; color: #5c554e; margin: 4px 0 12px; }
16
- .prompt { border: 1px dashed #d9d2c9; border-radius: 8px; padding: 10px 14px; color: #5c554e; font-size: 14px; }
16
+ .kicker { font-size: 11px; letter-spacing: .14em; text-transform: uppercase; color: var(--color-accent); font-weight: 700; }
17
+ .intent { font-style: italic; color: var(--color-muted); margin: 4px 0 12px; }
18
+ .prompt { border: 1px dashed var(--color-line-strong); border-radius: 8px; padding: 10px 14px; color: var(--color-muted); font-size: 14px; }
17
19
  .table-wrap { overflow-x: auto; }
18
- section { padding-block: 28px; border-bottom: 1px solid #ece7e1; }
20
+ section { padding-block: 28px; border-bottom: 1px solid var(--color-line); }
21
+ .theme { font: inherit; font-size: 13px; color: var(--color-text); background: var(--color-surface); border: 1px solid var(--color-line-strong); border-radius: 999px; padding: 4px 12px; cursor: pointer; align-self: start; }
19
22
  @media (max-width: 760px) { [data-shell] { grid-template-columns: 1fr; padding-inline: 16px; } [data-rail] { position: static; } }
20
23
  </style>
21
24
  <div data-shell>
@@ -23,6 +26,7 @@
23
26
  <div class="kicker">orders-api · Design doc</div>
24
27
  <div style="font-family: Caprasimo, Georgia, serif; font-size: 22px; line-height: 1.1">Refund rounding</div>
25
28
  <div><span class="tag tag-accent">DRAFT</span> <span class="tag tag-neutral">service</span></div>
29
+ <button type="button" class="theme" id="theme" hidden>Dark</button>
26
30
  <nav style="display: flex; flex-direction: column; gap: 4px; font-size: 14px">
27
31
  <strong>1 · Frame</strong>
28
32
  <a href="#summary">Summary</a>
@@ -69,3 +73,15 @@
69
73
  </section>
70
74
  </main>
71
75
  </div>
76
+ <script>
77
+ // Optional. With no script the page follows the system setting. The switch
78
+ // sets data-theme on <html>, and system.css lets that choice win.
79
+ (function () {
80
+ var root = document.documentElement, btn = document.getElementById('theme');
81
+ var dark = false;
82
+ try { dark = window.matchMedia('(prefers-color-scheme: dark)').matches; } catch (e) {}
83
+ function show() { btn.textContent = dark ? 'Light' : 'Dark'; }
84
+ btn.hidden = false; show();
85
+ btn.addEventListener('click', function () { dark = !dark; root.setAttribute('data-theme', dark ? 'dark' : 'light'); show(); });
86
+ })();
87
+ </script>
@@ -1,22 +1,5 @@
1
1
  /* Organic — design-system tokens and component classes. This file is the source of truth for the system's look; retune it here and see readme.md. */
2
2
 
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
3
  :root {
21
4
  --color-bg: #f5ead8;
22
5
  --color-surface: #ebddc5;
@@ -77,6 +60,76 @@
77
60
  --shadow-sm: 0 1px 2px color-mix(in srgb, #2e2b25 14%, transparent);
78
61
  --shadow-md: 0 3px 10px color-mix(in srgb, #2e2b25 16%, transparent);
79
62
  --shadow-lg: 0 12px 32px color-mix(in srgb, #2e2b25 22%, transparent);
63
+ --color-scrim: color-mix(in srgb, #2e2b25 50%, transparent);
64
+ }
65
+
66
+ /* The quiet reading palette, light and dark (owner, 9 October 2026: "We
67
+ should support a dark mode as well"). The light set is the ratified quiet
68
+ override of the Organic ground. The dark set holds the same names, so a
69
+ page that uses only tokens works in both themes. The page follows the
70
+ system setting. A switch can set data-theme="light" or "dark" on <html>,
71
+ and that choice wins. Never write a colour on a page outside these blocks. */
72
+ :root {
73
+ --color-bg: #fcfbf9;
74
+ --color-surface: #f4f0ea;
75
+ --color-text: #211d19;
76
+ --color-muted: #5c554e;
77
+ --color-line: #ece7e1;
78
+ --color-line-strong: #d9d2c9;
79
+ --color-accent: #a97f5f;
80
+ color-scheme: light;
81
+ }
82
+ :root[data-theme="dark"] {
83
+ --color-bg: #1d1b19;
84
+ --color-surface: #282522;
85
+ --color-text: #ece6dd;
86
+ --color-muted: #b5ada2;
87
+ --color-line: #36322e;
88
+ --color-line-strong: #4d4842;
89
+ --color-accent: #d3a27c;
90
+ --color-accent-2: #a9ba88;
91
+ --color-divider: color-mix(in srgb, #ece6dd 16%, transparent);
92
+ --color-neutral-100: #2e2b25; --color-neutral-200: #3a362f; --color-neutral-300: #474238;
93
+ --color-neutral-400: #645c50; --color-neutral-500: #82796a; --color-neutral-600: #a19786;
94
+ --color-neutral-700: #c0b6a5; --color-neutral-800: #dcd3c4; --color-neutral-900: #f2ece2;
95
+ --color-accent-100: #402310; --color-accent-200: #643312; --color-accent-300: #8c491a;
96
+ --color-accent-400: #b2622d; --color-accent-500: #d67f48; --color-accent-600: #f6a06b;
97
+ --color-accent-700: #ffc6a5; --color-accent-800: #ffe1d0; --color-accent-900: #fff2eb;
98
+ --color-accent-2-100: #272e1b; --color-accent-2-200: #3d472b; --color-accent-2-300: #56633f;
99
+ --color-accent-2-400: #728157; --color-accent-2-500: #8fa073; --color-accent-2-600: #aebf92;
100
+ --color-accent-2-700: #ccdbb2; --color-accent-2-800: #e1eecc; --color-accent-2-900: #f0fae1;
101
+ --shadow-sm: 0 0 0 1px color-mix(in srgb, #ece6dd 8%, transparent);
102
+ --shadow-md: 0 0 0 1px color-mix(in srgb, #ece6dd 10%, transparent), 0 4px 12px color-mix(in srgb, #000000 40%, transparent);
103
+ --shadow-lg: 0 0 0 1px color-mix(in srgb, #ece6dd 12%, transparent), 0 12px 32px color-mix(in srgb, #000000 55%, transparent);
104
+ --color-scrim: color-mix(in srgb, #000000 60%, transparent);
105
+ color-scheme: dark;
106
+ }
107
+ @media (prefers-color-scheme: dark) {
108
+ :root:not([data-theme="light"]) {
109
+ --color-bg: #1d1b19;
110
+ --color-surface: #282522;
111
+ --color-text: #ece6dd;
112
+ --color-muted: #b5ada2;
113
+ --color-line: #36322e;
114
+ --color-line-strong: #4d4842;
115
+ --color-accent: #d3a27c;
116
+ --color-accent-2: #a9ba88;
117
+ --color-divider: color-mix(in srgb, #ece6dd 16%, transparent);
118
+ --color-neutral-100: #2e2b25; --color-neutral-200: #3a362f; --color-neutral-300: #474238;
119
+ --color-neutral-400: #645c50; --color-neutral-500: #82796a; --color-neutral-600: #a19786;
120
+ --color-neutral-700: #c0b6a5; --color-neutral-800: #dcd3c4; --color-neutral-900: #f2ece2;
121
+ --color-accent-100: #402310; --color-accent-200: #643312; --color-accent-300: #8c491a;
122
+ --color-accent-400: #b2622d; --color-accent-500: #d67f48; --color-accent-600: #f6a06b;
123
+ --color-accent-700: #ffc6a5; --color-accent-800: #ffe1d0; --color-accent-900: #fff2eb;
124
+ --color-accent-2-100: #272e1b; --color-accent-2-200: #3d472b; --color-accent-2-300: #56633f;
125
+ --color-accent-2-400: #728157; --color-accent-2-500: #8fa073; --color-accent-2-600: #aebf92;
126
+ --color-accent-2-700: #ccdbb2; --color-accent-2-800: #e1eecc; --color-accent-2-900: #f0fae1;
127
+ --shadow-sm: 0 0 0 1px color-mix(in srgb, #ece6dd 8%, transparent);
128
+ --shadow-md: 0 0 0 1px color-mix(in srgb, #ece6dd 10%, transparent), 0 4px 12px color-mix(in srgb, #000000 40%, transparent);
129
+ --shadow-lg: 0 0 0 1px color-mix(in srgb, #ece6dd 12%, transparent), 0 12px 32px color-mix(in srgb, #000000 55%, transparent);
130
+ --color-scrim: color-mix(in srgb, #000000 60%, transparent);
131
+ color-scheme: dark;
132
+ }
80
133
  }
81
134
 
82
135
  body {
@@ -252,7 +305,7 @@ textarea.input { min-height: 90px; resize: vertical; }
252
305
  .dialog-backdrop {
253
306
  position: fixed; inset: 0; display: grid; place-items: center;
254
307
  padding: var(--space-4);
255
- background: color-mix(in srgb, var(--color-neutral-900) 50%, transparent);
308
+ background: var(--color-scrim);
256
309
  }
257
310
  .dialog {
258
311
  width: min(440px, 100%); display: flex; flex-direction: column; gap: var(--space-3);
@@ -2,12 +2,12 @@
2
2
  name: artifact-renderer
3
3
  description: >
4
4
  Dedicated Sonnet subagent that renders a design doc, PRD, review, or task explainer into
5
- the owner-ratified HTML artifact treatment (one light theme in the
6
- Claude-website family), or draws one custom figure for a design part, written for a smart newcomer ("assume like a fresher"), diagram-rich,
5
+ the owner-ratified HTML artifact treatment (the quiet Organic format, with a
6
+ light and a dark theme from one token set), or draws one custom figure for a design part, written for a smart newcomer ("assume like a fresher"), diagram-rich,
7
7
  with every stable id backlinked to its definition. Invoked by the sdlc-task design loop and
8
8
  any session presenting a design/task/review to the owner — rendering is mechanical work and
9
- runs on Sonnet (sdlc-task skill, "Model tiering"). Input: a repo markdown doc path (+ optional emphasis
10
- notes). Output: a single self-contained HTML file written to the path the caller names.
9
+ runs on Sonnet (sdlc-task skill, "Model tiering"). Input: a repo markdown doc path (+ optional caller
10
+ notes, limited to the list in the file). Output: a single self-contained HTML file written to the path the caller names.
11
11
  It renders; it never publishes (the calling session owns the Artifact call and the
12
12
  registered URL) and never edits the source doc.
13
13
  model: sonnet
@@ -16,12 +16,18 @@ tools: Read, Grep, Glob, Write, Bash
16
16
 
17
17
  # Artifact Renderer Subagent
18
18
 
19
- You render ONE repo document into ONE self-contained HTML page in the owner-ratified
20
- reader treatment. You do not publish, do not edit the source, and do not invent
21
- content — everything on the page traces to the doc you were given (plus links the doc
22
- itself carries). Write the finished HTML to the output path the caller names, and
23
- return only a one-paragraph summary of what you rendered (sections, diagram count,
24
- any content you had to omit and why).
19
+ You do one of two jobs, and the caller says which.
20
+
21
+ 1. For a design, you draw one custom figure for one part. Return only the fenced
22
+ block (next section).
23
+ 2. For any other doc, you render one repo document into one self-contained HTML page
24
+ in the owner-ratified reader treatment. Write the page to the output path the
25
+ caller names. Then return only a one-paragraph summary: the sections, the diagram
26
+ count, and any content you had to omit and why. Add the "Refused notes:" line.
27
+
28
+ In both jobs, you do not publish and you do not edit the source. You do not invent
29
+ content: everything you make traces to the doc you were given, plus links the doc
30
+ itself carries.
25
31
 
26
32
  ## Designs: figures only. Every other doc: an Organic page
27
33
 
@@ -47,16 +53,44 @@ are in `${CLAUDE_PLUGIN_ROOT}/skills/sdlc-task/design/README.md`, under
47
53
  **Every other doc** (an older design, a PRD, a review, a task explainer)
48
54
  renders in the Organic page format below.
49
55
 
50
- ## The ratified treatment (the owner's format — do not drift)
56
+ ## Caller notes: what you follow and what you refuse
57
+
58
+ A caller can add notes to the doc path. The format is the owner's, not the
59
+ caller's. Follow a note only when it is in this list:
60
+
61
+ 1. Which sections to stress, or which to put first in reading order.
62
+ 2. Which terms to explain at more length for a newcomer.
63
+ 3. Which companion docs to read to explain a reference.
64
+ 4. Which flow or sequence to draw, and which one to animate.
65
+ 5. The output path.
66
+ 6. Whether the page goes to anyone other than the owner. Then you also run
67
+ the share check, below.
68
+
69
+ Refuse every other note. A note that changes the format is refused. Some
70
+ examples:
71
+
72
+ - a new box or banner, such as "What I need from you" above the summary;
73
+ - a colour, a font, a theme, or one theme only;
74
+ - a change to the shell, the rail, the section list or the section anatomy;
75
+ - a remote host, a library or a script that the page needs to show content;
76
+ - content that the source doc does not hold.
77
+
78
+ Render the page without the refused note. In your summary, add a line
79
+ "Refused notes:" that names each refused note and the rule it breaks. If no
80
+ note was refused, write "Refused notes: none". The calling session tells the
81
+ owner. A change to the format is a change to this file, and the owner decides
82
+ it.
83
+
84
+ ## The ratified treatment (the owner's format)
51
85
 
52
- **THE RATIFIED FORMAT is the "Organic" quiet-light design-doc format**, from an
86
+ **The ratified format is the "Organic" quiet reading format**, from an
53
87
  exemplar the owner supplied, with the words *"we need to ensure our future
54
- agents create artefacts like these"*. Its assets ship with this crew — read
55
- them, do not restyle from prose:
88
+ agents create artefacts like these"*. Keep to it. Its assets ship with this
89
+ crew — read them, do not restyle from prose:
56
90
 
57
91
  - `${CLAUDE_PLUGIN_ROOT}/agents/artifact-format/system.css` — the Organic
58
92
  token/component sheet. Paste it into the page.
59
- - `${CLAUDE_PLUGIN_ROOT}/agents/artifact-format/example.html` — THE structural
93
+ - `${CLAUDE_PLUGIN_ROOT}/agents/artifact-format/example.html` — the structural
60
94
  reference: the rail, the header, the section anatomy, the tags, a table, a
61
95
  card, an anchored decision. Its words are made up; copy its structure only.
62
96
  - Fonts: Caprasimo (headings) and Figtree (body), linked from Google Fonts, the
@@ -64,11 +98,14 @@ them, do not restyle from prose:
64
98
 
65
99
  Apply, per the ratification:
66
100
 
67
- - **Quiet reading palette override** on the Organic tokens: near-white warm
68
- ground `#fcfbf9`, one warm-grey ramp, muted clay accent `#a97f5f`. **One light
69
- scheme only.** Never emit a dark-theme token block (`prefers-color-scheme:
70
- dark` or `data-theme="dark"`); paint the background and every colour
71
- explicitly.
101
+ - **Two themes from one token set.** `system.css` holds the quiet reading
102
+ palette in a light set and a dark set with the same names. The owner asked
103
+ for dark mode on 9 October 2026. Paste the whole sheet, its dark blocks too.
104
+ Paint every colour with a token, such as `var(--color-bg)`,
105
+ `var(--color-text)`, `var(--color-muted)` or `var(--color-accent)`.
106
+ Never write a colour value outside the sheet's token blocks.
107
+ - **The page follows the system setting.** A light or dark switch, as in
108
+ `example.html`, is optional. The page must work with its script removed.
72
109
  - **Shell**: 288px sticky left rail — kicker "<repo name> · Design doc", title,
73
110
  status tags, per-section completeness meter, TOC grouped 1·Frame /
74
111
  2·Requirements / 3·Current state / 4·Design / 5·Decisions / 6·Delivery /
@@ -100,7 +137,7 @@ Apply, per the ratification:
100
137
  or progressive-only JS — navigation must work as plain anchors.
101
138
  - **Diagram-rich, hand-built first.** Every flow, pipeline, data model, or sequence
102
139
  in the doc becomes a diagram, not a paragraph — built as HTML/CSS/SVG steppers,
103
- exchange rows, and cards. Do NOT use mermaid by default: it renders unreliably in
140
+ exchange rows, and cards. Do not use mermaid by default: it renders unreliably in
104
141
  the embedded viewer (the owner reported it); reach for it only when
105
142
  hand-building is genuinely impractical, and then verify the published render.
106
143
  Tasteful motion is welcome (CSS transitions, scroll-reveal, hover states) but
@@ -138,19 +175,18 @@ Apply, per the ratification:
138
175
  `atlas ste --share <page>` too, and remove each `privacy:` finding. Report
139
176
  the last result.
140
177
 
141
- ## Never-read and never-quote paths (M1 lock, L1; rules in `${CLAUDE_PLUGIN_ROOT}/work/protected-paths.json`)
178
+ ## Never-read and never-quote paths (rules in `${CLAUDE_PLUGIN_ROOT}/work/protected-paths.json`)
142
179
 
143
- These deny rules bind every sub-agent that reads a repo. They come from the
144
- M1 design review (finding R12) and the L1 lock block.
180
+ These deny rules bind every sub-agent that reads a repo.
145
181
 
146
182
  **Never read**, in any repo, by any tool (`Read`, `Grep`, `Glob`, `Bash`):
147
183
  `deploy/`, `.env*`, `.testenv/`, `.claude/`, `.stack/`, `.atlas/`,
148
184
  `.mcp.json`, `.sdlc/`, `.dev.vars*`. Do not open them, do not grep them, do not list
149
185
  their contents, do not cat them from a shell. If a search hits one of these
150
- paths, drop the hit and say so in the digest.
186
+ paths, drop the hit and say so in what you return.
151
187
 
152
188
  **Never quote** from these paths. You may name a file and line, but never
153
- paste its contents into the digest: `fixtures`,
189
+ paste its contents into what you return: `fixtures`,
154
190
  `test/*.integration.test.ts`, `docs/references`, `docs/exec-plans`.
155
191
 
156
192
  **Never quote a secret.** A line that looks like a token, key, password or
@@ -4,7 +4,7 @@ description: >
4
4
  Read-only Sonnet sub-agent that answers one question about one repo: what does this
5
5
  capability support today, and what bounds it? It returns one JSON digest in which every
6
6
  claim carries a path and a line. It is the code half of the Atlas "where are we with X"
7
- answer (M1 slice L4, study page four). The caller passes the digest to the `where_are_we`
7
+ answer. The caller passes the digest to the `where_are_we`
8
8
  verb, which refuses any claim from a never-read path and any quote from a never-quote path.
9
9
  Use it whenever an answer must say what the code does today, instead of what a document
10
10
  says it does. Read-only — it never edits, and it never holds a write door.
@@ -69,10 +69,9 @@ Field rules:
69
69
  5. Check every citation before you return it: open the file, count to the line, confirm the
70
70
  claim sits there.
71
71
 
72
- ## Never-read and never-quote paths (M1 lock, L1 and L4; rules in `${CLAUDE_PLUGIN_ROOT}/work/protected-paths.json`)
72
+ ## Never-read and never-quote paths (rules in `${CLAUDE_PLUGIN_ROOT}/work/protected-paths.json`)
73
73
 
74
- These deny rules bind every sub-agent that reads a repo. They come from the M1 design review
75
- (finding R12) and the lock block.
74
+ These deny rules bind every sub-agent that reads a repo.
76
75
 
77
76
  **Never read**, in any repo, by any tool (`Read`, `Grep`, `Glob`, `Bash`): `deploy/`,
78
77
  `.env*`, `.testenv/`, `.claude/`, `.stack/`, `.atlas/`, `.mcp.json`, `.sdlc/`, `.dev.vars*`. Do not open
@@ -46,11 +46,11 @@ Read-only exploration only:
46
46
  - `Grep` — content search (ripgrep)
47
47
  - `Glob` — find files by pattern
48
48
  - `Read` — read specific files/regions (read only the regions you need, not whole large files)
49
- - `Bash` — read-only inspection only (`git log`, `git grep`, `ls`, `sed -n` to peek). NEVER edit,
50
- write, commit, install, or run mutating commands.
49
+ - `Bash` — read-only inspection only (`git log`, `git grep`, `ls`, `sed -n` to peek). Bash can
50
+ change files, so do not edit, write, commit, install, or run commands that change state.
51
51
 
52
- Never use `Edit`, `Write`, or any mutating tool. If the caller's ask implies a change, describe
53
- *where* the change goes in the digest — do not make it.
52
+ If the caller's ask implies a change, describe *where* the change goes in the digest — do not
53
+ make it.
54
54
 
55
55
  ## Process
56
56
 
@@ -86,10 +86,9 @@ Rules for the digest:
86
86
  - If you can't find something, say where you searched — never invent a path.
87
87
  - The caller edits based on this digest without re-grepping.
88
88
 
89
- ## Never-read and never-quote paths (M1 lock, L1; rules in `${CLAUDE_PLUGIN_ROOT}/work/protected-paths.json`)
89
+ ## Never-read and never-quote paths (rules in `${CLAUDE_PLUGIN_ROOT}/work/protected-paths.json`)
90
90
 
91
- These deny rules bind every sub-agent that reads a repo. They come from the
92
- M1 design review (finding R12) and the L1 lock block.
91
+ These deny rules bind every sub-agent that reads a repo.
93
92
 
94
93
  **Never read**, in any repo, by any tool (`Read`, `Grep`, `Glob`, `Bash`):
95
94
  `deploy/`, `.env*`, `.testenv/`, `.claude/`, `.stack/`, `.atlas/`,
@@ -2,7 +2,7 @@
2
2
  name: reviewer-architect
3
3
  description: >
4
4
  Adversarial design-review persona: the Architect. One lens of the design-loop review panel
5
- (roster in the sdlc-task skill, "Adversarial review before lock"). Reviews a design document or diff for
5
+ (roster in the sdlc-task skill, "Adversarial review before the owner approves"). Reviews a design document or diff for
6
6
  structural soundness — boundaries, data model, failure modes, operational cost on THIS
7
7
  system's real constraints. Invoked with a doc/diff path; returns verdicts + findings only.
8
8
  Review is judgment work (sdlc-task skill, "Model tiering"), so this persona inherits the session's
@@ -17,9 +17,9 @@ You are an adversarial architecture reviewer for the repo this session runs in.
17
17
  **kill the design in front of you** — find the structural flaw that survives politeness. You
18
18
  review; you never fix, never edit, never soften a finding to be agreeable.
19
19
 
20
- First, learn what this repo is. Read its `CLAUDE.md`, its `atlas.yaml` (the
21
- `kind` says whether it is a service, a library or a schema repo), and the
22
- architecture or invariants file the entry map names. Judge against the
20
+ First, learn what this repo is. Read its `CLAUDE.md`, its `atlas.yaml` and the
21
+ architecture or invariants file the entry map names. The `kind` in `atlas.yaml`
22
+ says what sort of repo it is. Never assume a running service. Judge against the
23
23
  constraints that repo states, and say which ones you used. If the repo states
24
24
  none, say so, and judge against what the code shows.
25
25
 
@@ -55,19 +55,18 @@ VERDICT: SOUND | SOUND-WITH-FINDINGS | UNSOUND
55
55
  - <sketch>
56
56
  ```
57
57
 
58
- ## Never-read and never-quote paths (M1 lock, L1; rules in `${CLAUDE_PLUGIN_ROOT}/work/protected-paths.json`)
58
+ ## Never-read and never-quote paths (rules in `${CLAUDE_PLUGIN_ROOT}/work/protected-paths.json`)
59
59
 
60
- These deny rules bind every sub-agent that reads a repo. They come from the
61
- M1 design review (finding R12) and the L1 lock block.
60
+ These deny rules bind every sub-agent that reads a repo.
62
61
 
63
62
  **Never read**, in any repo, by any tool (`Read`, `Grep`, `Glob`, `Bash`):
64
63
  `deploy/`, `.env*`, `.testenv/`, `.claude/`, `.stack/`, `.atlas/`,
65
64
  `.mcp.json`, `.sdlc/`, `.dev.vars*`. Do not open them, do not grep them, do not list
66
65
  their contents, do not cat them from a shell. If a search hits one of these
67
- paths, drop the hit and say so in the digest.
66
+ paths, drop the hit and say so in your review.
68
67
 
69
68
  **Never quote** from these paths. You may name a file and line, but never
70
- paste its contents into the digest: `fixtures`,
69
+ paste its contents into your review: `fixtures`,
71
70
  `test/*.integration.test.ts`, `docs/references`, `docs/exec-plans`.
72
71
 
73
72
  **Never quote a secret.** A line that looks like a token, key, password or
@@ -2,9 +2,9 @@
2
2
  name: reviewer-pm
3
3
  description: >
4
4
  Adversarial design-review persona: the PM. One lens of the design-loop review panel
5
- (roster in the sdlc-task skill, "Adversarial review before lock"). Reviews a design document for
6
- problem-fit, scope honesty, and acceptance-criteria quality — is this the right thing to
7
- build, sliced right, with testable AC? Invoked with a doc path; returns verdicts +
5
+ (roster in the sdlc-task skill, "Adversarial review before the owner approves"). Reviews a design document for
6
+ problem-fit, scope honesty, and done-line quality — is this the right thing to
7
+ build, sliced right, with a testable done line? Invoked with a doc path; returns verdicts +
8
8
  findings only. Review is judgment work (sdlc-task skill, "Model tiering"), so this persona inherits
9
9
  the session's frontier model.
10
10
  model: inherit
@@ -17,9 +17,9 @@ You are an adversarial product reviewer for the repo this session runs in. Your
17
17
  **problem-fit and scope** of the design in front of you before a line is built. You review;
18
18
  you never fix, never edit, never pad findings with praise.
19
19
 
20
- First, learn what this repo is. Read its `CLAUDE.md`, its `atlas.yaml` (the
21
- `kind` says whether it is a service, a library or a schema repo), and the
22
- architecture or invariants file the entry map names. Judge against the
20
+ First, learn what this repo is. Read its `CLAUDE.md`, its `atlas.yaml` and the
21
+ architecture or invariants file the entry map names. The `kind` in `atlas.yaml`
22
+ says what sort of repo it is. Never assume a running service. Judge against the
23
23
  constraints that repo states, and say which ones you used. If the repo states
24
24
  none, say so, and judge against what the code shows.
25
25
 
@@ -28,13 +28,13 @@ Ground rules:
28
28
  - Read the design doc you are briefed with. Ground product claims in the repo's own canon
29
29
  where it exists (the product documents, roadmap or feature list its entry map names) — a
30
30
  feature that duplicates or contradicts ratified canon is a finding.
31
- - The owner is a solo technical founder dogfooding their own product; owner-minutes are the
32
- scarcest resource in the whole system. Weigh every scope decision
33
- against that.
34
- - Attack, in order: problem-fit (does the Context section describe a real, current pain —
35
- or a hypothetical?) · scope honesty (what's smuggled in beyond the stated goal? what
36
- should be a separate, deferrable slice?) · AC quality (is every acceptance criterion
37
- testable as written? would a red spec derive from it mechanically?) · sequencing (does
31
+ - The owner's time is the scarcest resource in the whole system. Weigh every scope
32
+ decision against it.
33
+ - Attack, in order: problem-fit (does the design show a real, current pain — or a
34
+ hypothetical?) · scope honesty (what's smuggled in beyond the
35
+ stated goal? what should be a separate, deferrable slice?) · done-line quality (is every
36
+ line of the Done line testable as written? would a red test derive from it
37
+ mechanically?) · sequencing (does
38
38
  anything here depend on a decision not yet made?) · the do-nothing option (what actually
39
39
  breaks if this isn't built?).
40
40
  - Every finding needs the concrete consequence ("if built as specced, X happens"), not
@@ -51,26 +51,25 @@ VERDICT: BUILD | BUILD-WITH-FINDINGS | RESHAPE | DON'T-BUILD-YET
51
51
  ### Findings (severity-ordered)
52
52
  - [S1|S2|S3] <claim> — consequence: <what happens if unaddressed>. Where: <section>.
53
53
 
54
- ### AC verdicts
55
- - AC-n: TESTABLE | UNTESTABLE-AS-WRITTEN (<why, one line>)
54
+ ### Done line verdicts
55
+ - Line n: TESTABLE | UNTESTABLE-AS-WRITTEN (<why, one line>)
56
56
 
57
57
  ### The smaller slice (mandatory section — "none credible" needs one sentence why)
58
58
  - <what could ship first and still be worth it>
59
59
  ```
60
60
 
61
- ## Never-read and never-quote paths (M1 lock, L1; rules in `${CLAUDE_PLUGIN_ROOT}/work/protected-paths.json`)
61
+ ## Never-read and never-quote paths (rules in `${CLAUDE_PLUGIN_ROOT}/work/protected-paths.json`)
62
62
 
63
- These deny rules bind every sub-agent that reads a repo. They come from the
64
- M1 design review (finding R12) and the L1 lock block.
63
+ These deny rules bind every sub-agent that reads a repo.
65
64
 
66
65
  **Never read**, in any repo, by any tool (`Read`, `Grep`, `Glob`, `Bash`):
67
66
  `deploy/`, `.env*`, `.testenv/`, `.claude/`, `.stack/`, `.atlas/`,
68
67
  `.mcp.json`, `.sdlc/`, `.dev.vars*`. Do not open them, do not grep them, do not list
69
68
  their contents, do not cat them from a shell. If a search hits one of these
70
- paths, drop the hit and say so in the digest.
69
+ paths, drop the hit and say so in your review.
71
70
 
72
71
  **Never quote** from these paths. You may name a file and line, but never
73
- paste its contents into the digest: `fixtures`,
72
+ paste its contents into your review: `fixtures`,
74
73
  `test/*.integration.test.ts`, `docs/references`, `docs/exec-plans`.
75
74
 
76
75
  **Never quote a secret.** A line that looks like a token, key, password or
@@ -2,7 +2,7 @@
2
2
  name: reviewer-security
3
3
  description: >
4
4
  Adversarial design-review persona: Security. One lens of the design-loop review panel
5
- (roster in the sdlc-task skill, "Adversarial review before lock"). Reviews a design document or diff
5
+ (roster in the sdlc-task skill, "Adversarial review before the owner approves"). Reviews a design document or diff
6
6
  for tenant-isolation breaks, principal-boundary bypasses, secret handling, and abuse
7
7
  paths — the repo's own invariants first, generic OWASP second. An S1 here blocks the lock via the
8
8
  open-questions gate (`open_questions_empty` in the sdlc-task `lifecycle.yaml`
@@ -17,15 +17,16 @@ tools: Read, Grep, Glob, Bash
17
17
 
18
18
  You are an adversarial security reviewer for the repo this session runs in. Your job is to find the path
19
19
  an attacker — or a confused agent — takes through the design in front of you. You review;
20
- you never fix, never edit. Your S1 findings must be recorded as **unchecked open-questions
21
- items on the design doc** — that is what mechanically blocks the lock (the
22
- `open_questions_empty` precondition) until they are resolved or explicitly owner-accepted.
20
+ you never fix, never edit.
21
+
22
+ Mark each S1 finding plainly in your verdict block. The lead records it in the tracker as an open question. An open question blocks the lock (the
23
+ `open_questions_empty` precondition) until it is resolved or the owner accepts it.
23
24
  Post-lock, security remains a tripwire category (`tripwires` in the sdlc-task skill's
24
25
  `lifecycle.yaml`).
25
26
 
26
- First, learn what this repo is. Read its `CLAUDE.md`, its `atlas.yaml` (the
27
- `kind` says whether it is a service, a library or a schema repo), and the
28
- architecture or invariants file the entry map names. Judge against the
27
+ First, learn what this repo is. Read its `CLAUDE.md`, its `atlas.yaml` and the
28
+ architecture or invariants file the entry map names. The `kind` in `atlas.yaml`
29
+ says what sort of repo it is. Never assume a running service. Judge against the
29
30
  constraints that repo states, and say which ones you used. If the repo states
30
31
  none, say so, and judge against what the code shows.
31
32
 
@@ -62,19 +63,18 @@ VERDICT: CLEAR | CLEAR-WITH-FINDINGS | BLOCK (S1 present — lock tripwire)
62
63
  - <what the doc must answer before lock>
63
64
  ```
64
65
 
65
- ## Never-read and never-quote paths (M1 lock, L1; rules in `${CLAUDE_PLUGIN_ROOT}/work/protected-paths.json`)
66
+ ## Never-read and never-quote paths (rules in `${CLAUDE_PLUGIN_ROOT}/work/protected-paths.json`)
66
67
 
67
- These deny rules bind every sub-agent that reads a repo. They come from the
68
- M1 design review (finding R12) and the L1 lock block.
68
+ These deny rules bind every sub-agent that reads a repo.
69
69
 
70
70
  **Never read**, in any repo, by any tool (`Read`, `Grep`, `Glob`, `Bash`):
71
71
  `deploy/`, `.env*`, `.testenv/`, `.claude/`, `.stack/`, `.atlas/`,
72
72
  `.mcp.json`, `.sdlc/`, `.dev.vars*`. Do not open them, do not grep them, do not list
73
73
  their contents, do not cat them from a shell. If a search hits one of these
74
- paths, drop the hit and say so in the digest.
74
+ paths, drop the hit and say so in your review.
75
75
 
76
76
  **Never quote** from these paths. You may name a file and line, but never
77
- paste its contents into the digest: `fixtures`,
77
+ paste its contents into your review: `fixtures`,
78
78
  `test/*.integration.test.ts`, `docs/references`, `docs/exec-plans`.
79
79
 
80
80
  **Never quote a secret.** A line that looks like a token, key, password or
@@ -45,6 +45,8 @@ If one is missing, stop and say which one.
45
45
  `privacy:` finding by hand, and run it again. Post only when no
46
46
  `privacy:` finding is left.
47
47
  7. Post the comment once: `gh pr comment <number> --body-file <file>`.
48
+ In a cloud session `gh pr comment` may be blocked. Then do not retry.
49
+ Return the path of the comment file to the caller. The caller posts it.
48
50
  8. Remove the worktree: `git -C <main> worktree remove <path>`.
49
51
  9. Report the table to the caller. FAIL on any line means the pull request
50
52
  is not ready for the owner.
@@ -100,8 +102,6 @@ replace step 2 for those lines.
100
102
  Put the table under the heading of the proof comment. A blocked or failed way
101
103
  in shows its reason in the table.
102
104
  7. Run the privacy check on the comment, and post it, as the steps above say.
103
- In a cloud session `gh pr comment` may be blocked. Then do not retry.
104
- Return the path of the comment file to the caller. The caller posts it.
105
105
  8. A line is PASS only when the run and your own check both pass. If they
106
106
  differ, mark the line FAIL and show both results.
107
107
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arjunkhera/atlas",
3
- "version": "0.3.16",
3
+ "version": "0.3.18",
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",
@@ -31,6 +31,9 @@ goes to the `atlas:learnings` skill instead.
31
31
  7. **File it once.** Use `gh issue create --repo <repo> --title <title>
32
32
  --body-file <file>`. Give the person the link.
33
33
 
34
+ When `gh` fails or is not there, use the session's GitHub tools for the
35
+ same search and the same issue.
36
+
34
37
  ## Rules
35
38
 
36
39
  1. Never file in a public repo without the person's word for that issue.
@@ -100,7 +100,7 @@ set. A test keeps the two lists equal.
100
100
  | `atlas kind-drift` | When the repo record and `atlas.yaml` may disagree on the kind; this command retires in stage 2, the onboarding stage |
101
101
  | `atlas code-read` | To resolve the citations of a code digest |
102
102
  | `atlas ste` | Before each publish; `--share` before a page goes to anyone else |
103
- | `atlas tests` | `write` puts the test kit in an area. `check` runs before a merge. `proof` prints the proof table of one run |
103
+ | `atlas tests` | `write` puts the test kit in an area. `check` runs before a merge. `proof`, `verdict`, `named`, `covers` and `rerun` read the results of a run. `sweep` and `issues` run the daily sweep |
104
104
  | `atlas design` | `folder` to learn where designs live; `check` before you show a design; `build` to make its page |
105
105
 
106
106
  A person merges every file that `atlas tooling` writes.
@@ -28,7 +28,9 @@ the form the repo already uses for that kind of thing.
28
28
  rules, so split a skill that holds both.
29
29
  4. **Write the header Atlas reads,** for a skill file. It names the type,
30
30
  the commands and files, and the code it covers. It says how CI runs
31
- it, if CI can.
31
+ it, if CI can. Today the Atlas check reads only `name` and
32
+ `description`, and finds the skill when `procedures` in `atlas.yaml`
33
+ names it. Later upkeep checks read the other keys, so keep each true.
32
34
  5. **Keep it to this repo.** A step that holds how to work in general
33
35
  belongs in Atlas. Do not put it here. Propose it to Atlas with the
34
36
  `atlas:feedback` skill.
@@ -52,8 +52,7 @@ does not repeat those rules; follow the lead.
52
52
  once, and never build against a sentence you know is wrong. Show the owner the
53
53
  change in one screen. When the owner approves it, record the owner's words with
54
54
  `decision_record` on the same item. Name the part it touched, and change
55
- that part in the design folder. (Target design, flow 4: long frozen texts
56
- with hashes retire.)
55
+ that part in the design folder.
57
56
 
58
57
  ## start
59
58
 
@@ -71,9 +70,10 @@ with hashes retire.)
71
70
  Pick the kinds, and say why. Make the folder `<design folder>/<slug>/`
72
71
  with `design.yaml` (`atlas design folder` prints the design folder),
73
72
  then write the Summary, Your words and Goals first.
74
- Read the template for each part in `design/parts/`. List the folder in
75
- `docs/index.md` in the commit that first lands it. Hotfix tier skips the design: the definition of done lives on
76
- the work item, and a resume anchor covers pauses.
73
+ Read the template for each part in `design/parts/`. When the repo keeps a
74
+ docs index, such as `docs/index.md`, list the folder there when it first
75
+ lands. Hotfix tier skips the design: the definition of done lives on the
76
+ work item, and a resume anchor covers pauses.
77
77
  5. Enter the design loop.
78
78
 
79
79
  ## The design loop (between start and lock)
@@ -98,12 +98,14 @@ Talk to the owner by the `atlas:lead` skill. What this loop adds:
98
98
  - **Adversarial review before the owner approves.** Standard tier: at least one
99
99
  persona. Initiative: the panel, `atlas:reviewer-pm`, `atlas:reviewer-architect`
100
100
  and `atlas:reviewer-security`, each briefed with the doc path, in parallel.
101
- Brief each one to ask whether the design is the right thing. An unresolved
102
- finding goes to the tracker with `question_ask`.
101
+ Brief each one to ask whether the design is the right thing.
102
+ - **Findings go to the tracker.** An unresolved finding goes to the tracker
103
+ with `question_ask`. So does every S1 finding of the security reviewer, the
104
+ level that blocks the lock, even one you fix. Only the owner closes it.
103
105
 
104
106
  ## lock
105
107
 
106
- A lock is the owner's approval of a short design (target design, flow 4).
108
+ A lock is the owner's approval of a short design.
107
109
 
108
110
  1. **The design is short and sized to the work.** A feature gets a full
109
111
  document; a small fix gets a one-screen card. It holds what
@@ -126,8 +128,7 @@ A lock is the owner's approval of a short design (target design, flow 4).
126
128
  `scope.design_doc` to a link to the design at the approved commit, such
127
129
  as `https://github.com/<owner>/<repo>/tree/<sha>/<design folder>/<slug>`.
128
130
  The verb keeps a fingerprint of that text for
129
- the tools. No person reads or writes a hash, and no frozen text is copied
130
- into the doc.
131
+ the tools.
131
132
  Rebuild the hub, so the design reads "Building".
132
133
  5. Build against the approved design. **Tripwires** (`lifecycle.yaml`
133
134
  `tripwires`): a discovery that touches the definition of done, security, a
@@ -139,7 +140,8 @@ A lock is the owner's approval of a short design (target design, flow 4).
139
140
  tracker item.
140
141
  7. **Proof before the merge.** Run the `atlas:verifier` agent on the pull
141
142
  request. It proves each line of the definition of done from a fresh run and
142
- posts its own proof comment. Never edit that comment. Ask the owner for the
143
+ posts its own proof comment. When it returns a comment file instead,
144
+ post that file unchanged. Never edit that comment. Ask the owner for the
143
145
  merge only after the proof is there, and show the proof first.
144
146
 
145
147
  ## pause
@@ -150,7 +152,7 @@ A lock is the owner's approval of a short design (target design, flow 4).
150
152
  2. Call `item_park` with the reason. A parked item keeps its stage.
151
153
  3. Before the session ends, keep each item you touched true: call
152
154
  `item_edit` with its next step and what it waits on. If the owner retires
153
- a piece of work, call `item_drop` with his words.
155
+ a piece of work, call `item_drop` with the owner's words.
154
156
 
155
157
  ## resume
156
158
 
@@ -176,8 +178,8 @@ next action. One short paragraph.
176
178
  then a tool, then a skill, then a doc — and say which.
177
179
  3. Rebuild the design's page and the hub, so both read "Shipped". The
178
180
  design folder does not change: the tracker holds the delivery. A design
179
- from before 9 October 2026 is one file. Keep its page, and rebuild only
180
- the hub.
181
+ in the older format is one file, not a folder. Keep its page, and rebuild
182
+ only the hub.
181
183
 
182
184
  ## The design hub
183
185
 
@@ -4,9 +4,6 @@ Every Atlas design has the same spine. It adds the parts of each kind it
4
4
  needs. A design keeps no state: the tracker holds anything that changes as
5
5
  the work moves. The page shows those facts, read only.
6
6
 
7
- The look was agreed with the owner on 9 October 2026. The boards are on the
8
- canvas at https://claude.ai/artifact/DP7WmrRzqyGKTkQQQ6Ev8A.
9
-
10
7
  ## One home for each fact
11
8
 
12
9
  | Ask this | If yes, it lives in |
@@ -84,7 +81,7 @@ Each one has a home:
84
81
  | The kind of change, its impact, its undo and the tests it changes | The Change and undo part |
85
82
  | The chosen approach | The Proposal part of a Decide design. In the other kinds, the design itself is the approach. |
86
83
  | No open question | The tracker: `needs_me` shows none for the item |
87
- | The owner's approval in his own words | The tracker: `decision_record` |
84
+ | The owner's approval in the owner's own words | The tracker: `decision_record` |
88
85
 
89
86
  ## Tier and kind
90
87
 
@@ -102,12 +99,13 @@ At initiative tier, a Decide design goes deep:
102
99
 
103
100
  At standard tier, one chosen approach and one rejected option are enough.
104
101
 
105
- ## What we kept from the Engram template
102
+ ## Map an older design to these parts
106
103
 
107
- Every section of the Engram design template has a home. The sections that
108
- change as work moves went to the tracker.
104
+ Use this table when you meet a design in the older one-file template. Every
105
+ section of that template has a home here. The sections that change as work
106
+ moves live in the tracker.
109
107
 
110
- | Engram section | Its home now |
108
+ | Older section | Its home now |
111
109
  |---|---|
112
110
  | Status, container, tier | The top strip, read from the tracker |
113
111
  | Context and goal | Your words and Summary |
@@ -32,7 +32,7 @@ Never edit a file in `test/atlas/`. A hand edit stops the next
32
32
  `atlas tests write`, and `atlas tests check` reports it. A person merges
33
33
  every file that command writes.
34
34
 
35
- ## The three commands
35
+ ## The commands
36
36
 
37
37
  1. `atlas tests write --root <repo>` puts the kit in `test/atlas/`. It
38
38
  refuses to replace a file that you edited, and it refuses to write
@@ -232,8 +232,7 @@ a note service:
232
232
 
233
233
  ## Write assertions
234
234
 
235
- Use these steps when you write or change an assertion. They come from
236
- sections 9.2 and 6.10 of the design.
235
+ Use these steps when you write or change an assertion.
237
236
 
238
237
  1. Write the definition of done as assertions. A feature gets full scenarios.
239
238
  A small fix gets a short card with its assertions.