shapeup-sdlc 3.18.1 → 3.18.3

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,7 +1,7 @@
1
1
  {
2
2
  "name": "shapeup-sdlc-plugin",
3
3
  "displayName": "ShapeUp SDLC Plugin",
4
- "version": "3.18.1",
4
+ "version": "3.18.3",
5
5
  "description": "Shape Up SDLC harness for Claude Code: shaping, intake, orient, scope-mapping, building (T0-verified, sandboxed, scope-contracted), evaluation and QA skills orchestrated by a tech-lead.",
6
6
  "author": {
7
7
  "name": "Liberty Nguyen",
@@ -106,14 +106,21 @@ function tokens(segment) {
106
106
  * The program names answer it. Arguments are never recorded — they are where a secret, a token or a
107
107
  * private path would be — and a basename says which tool ran without saying where it lives.
108
108
  *
109
+ * A `\`-continued line is joined to the one before it FIRST, before any segment split — a shell
110
+ * reads `cmd \<newline> --flag x` as one logical line, and so must this. Splitting on the bare
111
+ * newline first (measured, live) read a multi-line `init run` as one "program" per physical line —
112
+ * `node`, then `--slug`, then `--auto-level`, each a flag misread as an executable — which is how
113
+ * a real dispatch and a garbled one produced the same "clean, permitted" shape in the ledger.
114
+ *
109
115
  * @param {string} command - The raw Bash command.
110
116
  * @returns {(string|null)} Program basenames joined by " | ", in order, duplicates kept; null when
111
117
  * no segment yields one.
112
118
  */
113
119
  export function programsOf(command) {
114
120
  if (!command || typeof command !== "string") return null;
121
+ const joined = command.replace(/\\[ \t]*\n/g, " ");
115
122
  const names = [];
116
- for (const segment of command.split(/\s*(?:\|\||&&|;|\||\n)\s*/).filter(Boolean)) {
123
+ for (const segment of joined.split(/\s*(?:\|\||&&|;|\||\n)\s*/).filter(Boolean)) {
117
124
  const first = commandTokens(segment)[0];
118
125
  if (!first) continue;
119
126
  const base = first.replace(/^["']|["']$/g, "").split("/").pop();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shapeup-sdlc",
3
- "version": "3.18.1",
3
+ "version": "3.18.3",
4
4
  "description": "Shape Up for coding agents \u2014 with gates the agent can't talk its way past. Harness for Claude Code.",
5
5
  "bin": {
6
6
  "shapeup-sdlc": "bin/init.mjs"
@@ -189,6 +189,16 @@ Per charter:
189
189
  a charter is a license to deviate INSIDE its ground, not a script.
190
190
  H.2 Suspected finding → reproduce it (≥1 clean repro) before recording. No repro →
191
191
  log in session notes as "unconfirmed observation", NOT a finding.
192
+ - A claim that something is GONE / vanished / missing from the screen is not
193
+ reproduced by one tree read (DOM/layout dump) showing no match. Rule out that it
194
+ is merely COVERED first: dismiss whatever sits in front of it — keyboard, dialog,
195
+ sheet, toast, modal — and recheck, or confirm with a second signal (a screenshot,
196
+ scrolling it into view). A node absent from one read and present the moment the
197
+ overlay closes was never gone; that is not a finding, on any platform.
198
+ - A claim that a value SURVIVES a restart/relaunch is not reproduced by observing it
199
+ once after relaunching. Diff it against what a fresh instance shows from its own
200
+ seed/reset state first. A value that matches the seed is the app re-seeding
201
+ correctly, not evidence that anything persisted.
192
202
  H.3 Confirmed → record it IMMEDIATELY (in the growing WorkResult, not batched to the end
193
203
  of the hunt — a crashed session must not lose confirmed findings):
194
204
 
@@ -352,3 +362,8 @@ No verdict line exists in this file by design. The Hunter's last words:
352
362
  7. **Never invent severity from code reading.** Every finding has a live repro on the
353
363
  running app.
354
364
  8. **Never gate on Test Surface.** Its absence degrades the hunt; it never blocks it.
365
+ 9. **Never call something gone from one tree read.** A DOM/layout dump has no concept of
366
+ what covers a node — rule out an overlay (keyboard, dialog, sheet, toast) before an
367
+ absence counts as reproduced (H.2).
368
+ 10. **Never call a value "surviving" a relaunch without diffing the seed.** A value that
369
+ matches the fresh/reset state after a restart is not persistence (H.2).