cohorte 2.6.0 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -7,6 +7,45 @@ short, user-facing, most recent first. One `## <version> — <YYYY-MM-DD>` secti
7
7
  > They are history and are deliberately not rewritten — every command gained a `cohorte-` prefix
8
8
  > in 2.0.0.
9
9
 
10
+ ## 2.7.0 — 2026-08-22
11
+
12
+ - **The metrics panel billed Sonnet 5 fifty percent over.** `prices.json` carried $3/$15 because
13
+ that was the rate scheduled to take effect on 2026-09-01. It never will: Anthropic made the
14
+ $2/$10 introductory rate the standard one. Every run costed since the entry was written reads
15
+ high, and the further back a run is, the more confidently wrong the number looks.
16
+
17
+ Sonnet 5 is now $2/$10, and the file says in prose why the increase must not be reinstated —
18
+ the next person to "correct" this back will at least have to argue with a comment first. Sonnet
19
+ 4.6 and earlier stay at $3/$15: same tier, different price, and the longest-prefix lookup keeps
20
+ them apart on its own.
21
+
22
+ - **A concurrency ceiling that moved while the comments stood still.** `audit.js` described the
23
+ runtime as capping concurrent agents at "~16". It is 20, it is named
24
+ (`CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS`), and raising it raises the ceiling without changing this
25
+ script — the queue belongs to the runtime, and a queued domain was never a lost one. Comments
26
+ only; no dispatch logic moved.
27
+
28
+ - **The design brief was the one step the pipeline handed back to you.** `/cohorte-spec` freezes a
29
+ brief to `specs/design/<feature_id>.md` and then said, in effect, paste this somewhere else. With
30
+ `design.inline: true` it can instead hand that file to `/design`, which reads the codebase,
31
+ matches the existing UI style, and returns editable artboards without leaving the session.
32
+
33
+ The flag is off by default and degrades rather than fails: an unmet floor falls back to the
34
+ paste-it-yourself path with a note, never an error. It needs `provider: claude-design`, the new
35
+ `inline_design` runtime capability (Claude Code only), and a CLI ≥ 2.1.234 — a **higher floor than
36
+ workflows' 2.1.154**, which is why `/cohorte-doctor` grew a separate check `8b` instead of raising
37
+ the existing one. Raising the shared floor would have made every install between the two versions
38
+ read as broken while its workflows ran fine.
39
+
40
+ Understand what inline does and does not change: it changes who does the pasting. The brief is
41
+ still written to disk first and is still what `/cohorte-build` reads — artboards are an aid to the
42
+ human, not an input to the pipeline. And `/design` is a research preview that **does not save them
43
+ for you**, so check 8b says so on every run, including the runs where everything passes. An
44
+ artboard nobody exported dies with the session, and there is no way to notice afterwards.
45
+
46
+ - This release adds a runtime capability, a profile flag, and a command section: run
47
+ `/cohorte-update-pipeline` after updating.
48
+
10
49
  ## 2.6.0 — 2026-08-14
11
50
 
12
51
  - **Two ways to type the same command, and one of them silently doesn't work.** The docs wrote
@@ -110,7 +110,10 @@ fix only with the human's go-ahead (or hand them the command).
110
110
  stay the default, so failures here are ⚠️ at most, never ❌). Report which path this machine will
111
111
  take and why:
112
112
  - **Claude Code version** ≥ 2.1.154 (`claude --version 2>/dev/null | head -1`) — older or no CLI
113
- on PATH ⇒ conversational only.
113
+ on PATH ⇒ conversational only. This is the **workflow** floor and the only one that gates this
114
+ check; do NOT raise it to match a newer feature's floor, or every install between the two
115
+ versions reads as broken while its workflows run fine. When `design.inline` is on, report the
116
+ design floor (≥ 2.1.234) as its own line under check 8b — separate prerequisite, separate verdict.
114
117
  - **Scripts present:** `<core>/workflows/review.js` + `audit.js` + `refactor.js` —
115
118
  missing on a current core ⇒ half-done install, re-run install/update.
116
119
  - **Phase-0 agent present:** `<agents>/profile-reader.md` — the workflows abort without it.
@@ -121,6 +124,24 @@ fix only with the human's go-ahead (or hand them the command).
121
124
  End the check with ONE summary line, e.g.
122
125
  `workflows: available (opt-in — ask to "run the review workflow")` or
123
126
  `workflows: unavailable (<first failing prerequisite>) — conversational commands (the default)`.
127
+ <!-- cohorte:if inline_design -->
128
+ 8b. **Inline design** (`design.inline: true` — the `/design` artboard step between spec and build).
129
+ A research preview, so every failure here is ⚠️, never ❌: the design brief still exists on disk
130
+ at `specs/design/<feature_id>.md` and can be carried to the design tool by hand, which is what
131
+ every install did before this flag. Report:
132
+ - **Claude Code version** ≥ 2.1.234 — `/design` ships as a skill and is simply absent below it.
133
+ Older CLI ⇒ say so and name `npm i -g cohorte@latest`'s sibling, `claude update`.
134
+ - **The `/design` skill resolves in this session** — absent ⇒ the preview is off for this account
135
+ or plan (Pro/Max/Team/Enterprise are the eligible ones), not a cohorte defect.
136
+ - **`design.enabled` is true and `provider` is `claude-design`** — `inline` on top of a `figma` or
137
+ `none` provider is a profile contradiction; name it and point at `/cohorte-update-pipeline`.
138
+ - **Artboards are not persisted for you.** State it every run, unconditionally, even when all
139
+ three checks pass: the preview hands designs to the build step but does not save them, so an
140
+ artboard nobody exported dies with the session. This is the single thing most likely to lose
141
+ work, and it is not detectable after the fact.
142
+ One summary line: `inline design: available (preview — export artboards yourself)` or
143
+ `inline design: unavailable (<first failing prerequisite>) — design brief on disk, carry it over by hand`.
144
+ <!-- cohorte:endif -->
124
145
  <!-- cohorte:else -->
125
146
  8. **Preflight wiring.** `<core>/pipeline/scripts/preflight.sh` is executable and
126
147
  `gate-config.json` carries the `preflight` block — mismatch ⇒ regenerate from the profile.
@@ -58,6 +58,7 @@
58
58
  "subagents": true,
59
59
  "hooks": true,
60
60
  "workflows": true,
61
+ "inline_design": true,
61
62
  "mcp": true,
62
63
  "tool_restriction": true
63
64
  },
@@ -74,6 +74,7 @@
74
74
  "subagents": true,
75
75
  "hooks": true,
76
76
  "workflows": false,
77
+ "inline_design": false,
77
78
  "mcp": true,
78
79
  "tool_restriction": true
79
80
  },
@@ -67,6 +67,7 @@
67
67
  "subagents": true,
68
68
  "hooks": true,
69
69
  "workflows": false,
70
+ "inline_design": false,
70
71
  "mcp": true,
71
72
  "tool_restriction": true
72
73
  },
@@ -67,6 +67,7 @@
67
67
  "subagents": true,
68
68
  "hooks": true,
69
69
  "workflows": false,
70
+ "inline_design": false,
70
71
  "mcp": true,
71
72
  "tool_restriction": false
72
73
  },
@@ -63,6 +63,7 @@
63
63
  "subagents": true,
64
64
  "hooks": false,
65
65
  "workflows": false,
66
+ "inline_design": false,
66
67
  "mcp": true,
67
68
  "tool_restriction": false
68
69
  },
@@ -1,8 +1,17 @@
1
1
  # DESIGN BRIEF — <feature title> (`<feature_id>`)
2
2
 
3
- > The "spec return". Paste into the design tool (see `PIPELINE.md` §design). This is §8 of the frozen
4
- > spec, standalone — `/cohorte-spec` writes it to `specs/design/<feature_id>.md` on freeze. Omit entirely if
5
- > the project has no UI.
3
+ > The "spec return". This is §8 of the frozen spec, standalone `/cohorte-spec` writes it to
4
+ > `specs/design/<feature_id>.md` on freeze. Omit entirely if the project has no UI.
5
+ >
6
+ > **Getting it into the design tool.** By default: paste it there yourself (see `PIPELINE.md` §design).
7
+ > With `design.inline: true`, `/cohorte-spec` instead offers to hand this file straight to `/design`,
8
+ > which reads the codebase, matches the existing UI style, and returns editable artboards in-session.
9
+ >
10
+ > Inline changes who does the pasting, and nothing else. This file is still written to disk first and
11
+ > is still what `/cohorte-build` reads — the artboards are an aid to the human, not an input to the
12
+ > pipeline, and `/design` is a research preview that does not save them for you. Export anything worth
13
+ > keeping before the session ends. If the design floor is unmet, the flag degrades to the paste-it-
14
+ > yourself path with a note, never to an error: a brief that exists is worth more than a step that ran.
6
15
 
7
16
  **Goal:** <one line — what the user accomplishes>
8
17
 
@@ -6,7 +6,8 @@
6
6
  // Shape (SCHEMA.md §Workflows): profile via profile-reader (phase 0), the
7
7
  // mechanical gates staged to disk by one haiku agent, then ONE auditor per
8
8
  // domain (each surface + `shared`) running concurrently — the runtime caps
9
- // concurrency at ~16, extra domains queue — and a merge phase that writes the
9
+ // concurrency at 20 (CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS since 2026-08), extra
10
+ // domains queue — and a merge phase that writes the
10
11
  // prioritized specs/refactor-backlog.md. Only the summary comes back.
11
12
 
12
13
  export const meta = {
@@ -16,7 +17,7 @@ export const meta = {
16
17
  phases: [
17
18
  { title: 'Profile', detail: 'PIPELINE.md → JSON via profile-reader', model: 'haiku' },
18
19
  { title: 'Gates', detail: 'format/lint/typecheck/tests → specs/reports/audit-gates.txt', model: 'haiku' },
19
- { title: 'Audit', detail: 'one review-in-audit-mode agent per domain (concurrent, runtime-capped ~16)' },
20
+ { title: 'Audit', detail: 'one review-in-audit-mode agent per domain (concurrent, runtime-capped 20)' },
20
21
  { title: 'Backlog', detail: 'merge + write specs/refactor-backlog.md', model: 'haiku' },
21
22
  ],
22
23
  }
@@ -161,7 +162,9 @@ log(`Mechanical failures: ${mech.length}${gates && gates.overflow ? ` (+${gates.
161
162
 
162
163
  // ── Phase 2 — one auditor per domain, concurrent ─────────────────────────────
163
164
  // Domains = every surface + `shared` (contract package + anything outside the
164
- // surface trees). The runtime caps concurrent agents (~16); more domains queue.
165
+ // surface trees). The runtime caps concurrent agents at 20 by default; more domains
166
+ // queue. Raising CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS raises the ceiling, it does not
167
+ // change this script — the queue is the runtime's, and a queued domain is not a lost one.
165
168
  phase('Audit')
166
169
  const domains = surfaces.map(s => ({ key: s.key, path: s.path }))
167
170
  .concat([{ key: 'shared', path: (profile.contract && profile.contract.path) || '(everything outside the surface trees)' }])
@@ -394,7 +394,9 @@ function checkWorkflows(projectRoot, globalDir, installMode, all) {
394
394
  }
395
395
  return mk('workflows', 'Workflows', 'ok',
396
396
  'scripts + profile-reader installed — opt-in per run; needs Claude Code ≥ 2.1.154 with ' +
397
- 'workflows enabled (run /cohorte-doctor in-session to check the live half)');
397
+ 'workflows enabled (run /cohorte-doctor in-session to check the live half). Inline design ' +
398
+ '(design.inline) has its own, higher floor of ≥ 2.1.234 — it is a separate prerequisite and ' +
399
+ 'does not gate this check either way');
398
400
  }
399
401
 
400
402
  function scanSpecs(projectRoot) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cohorte",
3
- "version": "2.6.0",
3
+ "version": "2.7.0",
4
4
  "description": "Portable, stack-agnostic multi-agent development pipeline for Claude Code, Codex CLI, Cursor, Gemini CLI and OpenCode — install the core, run /cohorte-init-pipeline, and it adapts to your project's stack.",
5
5
  "bin": {
6
6
  "cohorte": "bin/cli.js"
package/profile/SCHEMA.md CHANGED
@@ -49,6 +49,7 @@ generic pipeline uses it, so a stateless agent can read/regenerate the profile c
49
49
  | `rbac.hierarchy` | list | review | Highest→lowest role list. |
50
50
  | `design.enabled` | bool | build, frontend, align-ds | `false` ⇒ design steps are no-ops. |
51
51
  | `design.provider` | enum | frontend, align-ds | `claude-design`/`figma`/`none`. |
52
+ | `design.inline` | bool | spec, build, doctor | Default `false`. `true` ⇒ `/cohorte-spec` offers the `/design` artboard step after freezing the brief, instead of ending at "paste this into the design tool". Requires `provider: claude-design`, the `inline_design` runtime capability, and Claude Code ≥ 2.1.234. **A research preview: artboards are not persisted for you.** The brief on disk stays the source of truth either way, so `false` loses nothing but the round trip. |
52
53
  | `design.design_system_project` | id | align-ds, frontend | UI-kit source of truth. |
53
54
  | `design.design_project` | id | build, frontend | Legacy fallback for bare-filename `design_files` only; default `none`. New specs use full `…/design/p/<projectId>?file=<file>` links that carry their own project + page (nothing to go stale on a DS rebuild). |
54
55
  | `design.snapshot_dir` | path | align-ds | Committed DS snapshot for diffing. |
@@ -7,9 +7,12 @@
7
7
  "TTL, 2x for 1h, read 0.1x) rather than restated per model, so a price change",
8
8
  "is a one-line edit. `fast` is the fast-mode premium (usage.speed === 'fast').",
9
9
  "Model lookup is longest-prefix, so dated ids (claude-haiku-4-5-20251001) hit",
10
- "their base entry without needing a row of their own."
10
+ "their base entry without needing a row of their own.",
11
+ "Sonnet 5 is $2/$10: the introductory rate became the standard rate on 2026-08-20.",
12
+ "The $3/$15 increase once scheduled for 2026-09-01 was cancelled and must not",
13
+ "be reinstated. Sonnet 4.6 and earlier stay at $3/$15 — same tier, different price."
11
14
  ],
12
- "updated": "2026-07-31",
15
+ "updated": "2026-08-22",
13
16
  "multipliers": {
14
17
  "cacheWrite5m": 1.25,
15
18
  "cacheWrite1h": 2.0,
@@ -31,7 +34,7 @@
31
34
  "claude-opus-4-7": { "input": 5, "output": 25 },
32
35
  "claude-opus-4-6": { "input": 5, "output": 25 },
33
36
  "claude-opus-4-5": { "input": 5, "output": 25 },
34
- "claude-sonnet-5": { "input": 3, "output": 15 },
37
+ "claude-sonnet-5": { "input": 2, "output": 10 },
35
38
  "claude-sonnet-4-6": { "input": 3, "output": 15 },
36
39
  "claude-sonnet-4-5": { "input": 3, "output": 15 },
37
40
  "claude-haiku-4-5": { "input": 1, "output": 5 }
@@ -144,8 +144,8 @@ check('…and keeps its own spend', retired && retired.tokens.output, 90);
144
144
  // opus-5 $5 in / $25 out per MTok; 5m cache write 1.25x input, cache read 0.1x input.
145
145
  // m1 100*5 + 1000*25 + 1000*6.25 + 10000*0.5 = 36750
146
146
  // m3 500*25 = 12500
147
- // s1 sonnet-5 2000*15 = 30000 (subagent)
148
- check('cost sums the cache tiers at their own rates', Number(build.cost.total.toFixed(6)), 0.07925);
147
+ // s1 sonnet-5 2000*10 = 20000 (subagent, $2/$10 since 2026-08)
148
+ check('cost sums the cache tiers at their own rates', Number(build.cost.total.toFixed(6)), 0.06925);
149
149
  check('the unpriced list stays empty for known models', build.unpriced, []);
150
150
 
151
151
  const detail = out.runs.find((r) => r.command === '/cohorte-build');