Files
msd-core/scripts/lint-workflow-shellcheck-baseline.json
Tom Boucher 147c89a9b8 fix(#4456): forward --ws to every downstream new-milestone.md call (#4545)
* fix(#4456): forward --ws to every downstream new-milestone.md call

new-milestone.md's Step 1 parses --ws <name> into GSD_WS, but each
workflow step's bash fence is a separate shell invocation — GSD_WS set in
Step 1 never survived to Steps 5, 6, or 7. Four call sites never
forwarded it: init.new-milestone (both calls), state.milestone-switch,
and both phases.clear branches. Under GSD_WORKSTREAM env or a stored
session pointer differing from the explicitly requested --ws, every
downstream operation silently operated on the wrong workstream (or root)
instead of the one the caller asked for.

Confirmed --ws is a universally-parsed CLI flag (gsd-core/bin/gsd-tools.cjs:
4867, resolveActiveWorkstream) — stripped from argv and written into
process.env.GSD_WORKSTREAM for the rest of that process, so appending it to
ANY gsd_run query call works uniformly. Fixed by persisting GSD_WS to
.planning/.gsd-ws-arg right after Step 1 parses it (mirroring the
established .gsd-outgoing-milestone round-trip idiom this same file
already uses for the identical cross-fence problem), reading it back in
each later step, and appending it unquoted (matching the ${GSD_WS}
splicing convention documented in workstream-flag.md). Cleaned up after
its last use in Step 7.

Bundled, in-scope fixes found while implementing the above (per this
repo's no-defer policy):

- Step 6's phase-archive `git add .planning/milestones/ .planning/phases/`
  hardcoded literal ROOT paths — both directories are workstream-scoped
  (matching cmdMilestoneComplete's established #1911 precedent), so under
  a workstream this staged nothing real. Added phases_dir/archive_dir
  fields to cmdInitNewMilestone and resolved through them instead.
- Step 6's milestone-start commit hardcoded .planning/STATE.md — also
  workstream-scoped, so it would commit the wrong (or a stale) file under
  a workstream. Resolved through init.new-milestone's existing state_path
  field instead; PROJECT.md correctly stays a literal-shaped-but-resolved
  root path (shared, per the #4455 follow-up already merged).
- cmdInitNewMilestone's config_path field: config.json is ALSO a shared
  file (marked `# Shared` in workstream-flag.md's directory diagram, same
  as PROJECT.md) but was resolved via the workstream-aware planningDir —
  fixed alongside cmdInitNewProject's identical instance of the same bug
  (found via grep, matching the precedent from the #4455 follow-up of
  fixing every occurrence of an identically-evidenced bug uniformly).

Verified: direct CLI invocation confirms phases_dir/archive_dir/state_path
resolve into the workstream while project_path/config_path stay root under
GSD_WORKSTREAM=alpha. Manual bash-fence execution of every modified fence
(Step 1 parse+persist, Step 5 forwarding, both phases.clear branches, the
git add fence, Step 7's forward+cleanup, the commit fence) confirms correct
behavior in both flat and --ws modes, including two flags composing
together (--archive-version + --ws; --reset-phase-numbers + --ws).

Rewrote the pre-existing "step 6: commit stages PROJECT.md" test, which
asserted the literal (buggy) --files string verbatim — it now asserts the
resolved paths via a JSON-returning stub, and gained isolated per-test tmp
dirs (the prior version ran with no explicit cwd, at real risk of writing
a stray .gsd-ws-arg into this repo's own .planning/ once Step 1's fence
started performing a real write).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(#4456): Steps 9/10 also commit workstream-scoped files via literal root paths

A fresh isolated code-review pass on the first version of this fix found
the identical bug in two more places, missed in the initial sweep:

- Step 9's requirements commit (`gsd_run query commit ... --files
  .planning/REQUIREMENTS.md`) and Step 10's roadmap commit (`--files
  .planning/ROADMAP.md .planning/STATE.md .planning/REQUIREMENTS.md`)
  both hardcoded literal ROOT paths for files that are workstream-scoped.
- Worse: `.planning/.gsd-ws-arg` was being deleted at the end of Step 7,
  but Steps 9 and 10 run AFTER Step 7 and still needed to re-read it —
  the round-trip mechanism this fix builds was already gone before its
  two remaining consumers ran.

Fixed by moving the `.gsd-ws-arg` cleanup to Step 10 (its true last
consumer, after the roadmap commit) and adding the same
fetch-then-_gsd_field-extract pattern already used in Step 6 to Steps 9
and 10, resolving `requirements_path`/`roadmap_path`/`state_path` through
`init.new-milestone $GSD_WS_ARG` instead of literal paths.

Also fixed (MEDIUM, same review pass): Step 1's `.gsd-ws-arg` write had
no `2>/dev/null || true`, unlike every other round-trip write in this
same file — brought into line with the established idiom.

Verified: reproduced the pre-fix bug directly (Step 9/10 fences echoing
the literal root paths regardless of --ws), confirmed both fences now
resolve the workstream-scoped paths correctly, and confirmed the
round-trip file survives Step 7 and is only removed after Step 10.
Updated the Step 7 test that previously asserted premature cleanup
(inverted to assert the file survives); added new coverage for Steps 9
and 10 in both flat and --ws modes.

Two remaining LOW/pre-existing findings from the same review pass,
deliberately left as-is: `phase_archive_path` (src/init.cts, untouched by
this diff) resolves via the same root-only `getLatestCompletedMilestone`
this fix's earlier commit already declined to touch, for the same
genuine-product-intent-ambiguity reason (workstream-scoped vs
project-pooled "latest completed milestone" is not resolvable from the
code alone). `.planning/research/` staying root-scoped in the #222
self-heal prose is consistent with the existing (unchanged) `research_dir`
field, not a new inconsistency.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(#4456): revert wrong config_path change; fix isolated-cwd test env

gsd-test caught two real regressions from this fix's earlier commits:

1. config_path is NOT shared like PROJECT.md. The prior commit's
   grep-and-replace ("fix six more functions with the identical bug")
   also touched cmdInitExecutePhase's config_path (a fourth call site
   beyond the two I'd manually checked) — but tests/init.test.cjs's
   pre-existing, ADR-0006-governed "init handlers honor GSD_WORKSTREAM"
   coverage explicitly asserts config_path IS workstream-scoped for
   execute-phase/plan-phase/phase-op/milestone-op. workstream-flag.md's
   "# Shared" marking for config.json is stale (the same class of
   staleness already found for milestones/ during the #4455 follow-up);
   ADR-0006 plus its real, passing tests is the authoritative source.
   Reverted config_path to the plain workstream-aware planningDir(cwd)
   in all four functions it was wrongly changed in.

2. Isolating cwd to a tmpDir (needed once Step 1's fence started
   performing a real .gsd-ws-arg write) broke the runtime-launcher
   preamble's own gsd-tools.cjs discovery — no git repo at an isolated
   tmpDir, no global gsd_run on the CI bench's PATH. Fixed by passing
   RUNTIME_DIR explicitly in every isolated-cwd test's env, matching
   the preamble's own documented override precedence.

Verified: direct CLI invocation confirms execute-phase's config_path is
workstream-scoped again under GSD_WORKSTREAM=wsx; the RUNTIME_DIR fix
confirmed against a stripped PATH (no global gsd_run), matching the
bench condition that surfaced the original failure.

Emitted-Drift-Ack-Growth: new-milestone.md — #4456 forwards --ws to every downstream gsd_run call across 7 fences (Steps 1/5/6x3/7/9/10), adding a persisted round-trip file plus resolved-path fetches that replace several hardcoded literal paths
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs(#4456): backfill changeset PR number and correct final scope

pr: 0 -> pr: 4545, and removed the changeset's claim that config.json
is a shared file -- that was the change this same PR later reverted
after gsd-test caught it contradicting ADR-0006's established,
workstream-scoped config_path contract.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* fix(#4456): baseline the 10 new SC2086 findings from --ws forwarding

The lint-tests CI job failed with a hard exit 1. Diagnosis (not assumed):
the log's two `fatal: ambiguous argument 'origin/next...HEAD'` git errors
(lines 244/248) are a red herring — both belong to
lint-removed-but-needed.cjs, which prints its own "could not resolve
origin/next, skipping" message and exits gracefully, exactly like the
already-handled two-dot-form error from lint-fix-has-regression-tests
earlier in the same log. Neither contributes to the actual failure.

The real cause is lint-workflow-shellcheck: this fix's new fences append
$GSD_WS_ARG unquoted to gsd_run calls (deliberately, so it splits into 0
or 2 argv tokens — the same idiom gsd-core/workflows/verify-work.md
already uses for ${GSD_WS} and already has baselined). ShellCheck
correctly flags each as SC2086, and lint-workflow-shellcheck.cjs's
baseline is a deliberate ratchet (#4109) requiring new findings to be
explicitly accepted, not auto-passed. new-milestone.md previously had
zero baselined SC2086 findings, so all 10 new (correct, intentional)
occurrences were reported as new and failed the gate.

Added 10 {file, code, message} entries to
scripts/lint-workflow-shellcheck-baseline.json for
gsd-core/workflows/new-milestone.md's SC2086 findings, matching the
established, already-accepted precedent for the identical pattern in
verify-work.md. No source or workflow file changed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: sim <sim@local>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-08 09:23:20 -04:00

1113 lines
35 KiB
JSON

[
{
"file": "gsd-core/workflows/add-tests.md",
"code": "2035",
"message": "Use ./*glob* or -- *glob* so names with dashes won't become options."
},
{
"file": "gsd-core/workflows/add-todo.md",
"code": "2102",
"message": "Ranges can only match single chars (mentioned due to duplicates)."
},
{
"file": "gsd-core/workflows/ai-integration-phase.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/autonomous.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/autonomous.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/autonomous.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/autonomous.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/autonomous.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/autonomous.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/autonomous.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/autonomous.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/check-todos.md",
"code": "2102",
"message": "Ranges can only match single chars (mentioned due to duplicates)."
},
{
"file": "gsd-core/workflows/check-todos.md",
"code": "2102",
"message": "Ranges can only match single chars (mentioned due to duplicates)."
},
{
"file": "gsd-core/workflows/cleanup.md",
"code": "1083",
"message": "This { is literal. Check expression (missing ;/\\n?) or quote it."
},
{
"file": "gsd-core/workflows/cleanup.md",
"code": "1083",
"message": "This { is literal. Check expression (missing ;/\\n?) or quote it."
},
{
"file": "gsd-core/workflows/cleanup.md",
"code": "1083",
"message": "This { is literal. Check expression (missing ;/\\n?) or quote it."
},
{
"file": "gsd-core/workflows/cleanup.md",
"code": "1083",
"message": "This } is literal. Check expression (missing ;/\\n?) or quote it."
},
{
"file": "gsd-core/workflows/cleanup.md",
"code": "1083",
"message": "This } is literal. Check expression (missing ;/\\n?) or quote it."
},
{
"file": "gsd-core/workflows/cleanup.md",
"code": "1083",
"message": "This } is literal. Check expression (missing ;/\\n?) or quote it."
},
{
"file": "gsd-core/workflows/code-review-fix.md",
"code": "1009",
"message": "The mentioned syntax error was in this then clause."
},
{
"file": "gsd-core/workflows/code-review-fix.md",
"code": "1036",
"message": "'(' is invalid here. Did you forget to escape it?"
},
{
"file": "gsd-core/workflows/code-review-fix.md",
"code": "1061",
"message": "Couldn't find 'done' for this 'do'."
},
{
"file": "gsd-core/workflows/code-review-fix.md",
"code": "1062",
"message": "Expected 'done' matching previously mentioned 'do'."
},
{
"file": "gsd-core/workflows/code-review-fix.md",
"code": "1065",
"message": "Trying to declare parameters? Don't. Use () and refer to params as $1, $2.."
},
{
"file": "gsd-core/workflows/code-review-fix.md",
"code": "1072",
"message": "Expected 'done'. Fix any mentioned problems and try again."
},
{
"file": "gsd-core/workflows/code-review-fix.md",
"code": "1073",
"message": "Couldn't parse this while loop. Fix to allow more checks."
},
{
"file": "gsd-core/workflows/code-review.md",
"code": "1009",
"message": "The mentioned syntax error was in this test expression."
},
{
"file": "gsd-core/workflows/code-review.md",
"code": "1035",
"message": "You need a space after the [ and before the ]."
},
{
"file": "gsd-core/workflows/code-review.md",
"code": "1072",
"message": "Expected end of single quoted string. Fix any mentioned problems and try again."
},
{
"file": "gsd-core/workflows/code-review.md",
"code": "1073",
"message": "Couldn't parse this single quoted string. Fix to allow more checks."
},
{
"file": "gsd-core/workflows/code-review.md",
"code": "1078",
"message": "Did you forget to close this single quoted string?"
},
{
"file": "gsd-core/workflows/code-review.md",
"code": "1078",
"message": "Did you forget to close this single quoted string?"
},
{
"file": "gsd-core/workflows/code-review.md",
"code": "1079",
"message": "This is actually an end quote, but due to next char it looks suspect."
},
{
"file": "gsd-core/workflows/code-review.md",
"code": "1079",
"message": "This is actually an end quote, but due to next char it looks suspect."
},
{
"file": "gsd-core/workflows/code-review.md",
"code": "2088",
"message": "Tilde does not expand in quotes. Use $HOME."
},
{
"file": "gsd-core/workflows/code-review.md",
"code": "2153",
"message": "Possible misspelling: DEPTH_OVERRIDE may not be assigned. Did you mean DEPTH_OVERRIDES?"
},
{
"file": "gsd-core/workflows/code-review/steps/dispatch-fix.md",
"code": "1036",
"message": "'(' is invalid here. Did you forget to escape it?"
},
{
"file": "gsd-core/workflows/code-review/steps/dispatch-fix.md",
"code": "1046",
"message": "Couldn't find 'fi' for this 'if'."
},
{
"file": "gsd-core/workflows/code-review/steps/dispatch-fix.md",
"code": "1047",
"message": "Expected 'fi' matching previously mentioned 'if'."
},
{
"file": "gsd-core/workflows/code-review/steps/dispatch-fix.md",
"code": "1065",
"message": "Trying to declare parameters? Don't. Use () and refer to params as $1, $2.."
},
{
"file": "gsd-core/workflows/code-review/steps/dispatch-fix.md",
"code": "1072",
"message": "Expected 'fi'. Fix any mentioned problems and try again."
},
{
"file": "gsd-core/workflows/code-review/steps/dispatch-fix.md",
"code": "1073",
"message": "Couldn't parse this if expression. Fix to allow more checks."
},
{
"file": "gsd-core/workflows/code-review/steps/structural-pre-pass.md",
"code": "1009",
"message": "The mentioned syntax error was in this variable assignment."
},
{
"file": "gsd-core/workflows/code-review/steps/structural-pre-pass.md",
"code": "1036",
"message": "'(' is invalid here. Did you forget to escape it?"
},
{
"file": "gsd-core/workflows/code-review/steps/structural-pre-pass.md",
"code": "1072",
"message": "Expected end of $(..) expression. Fix any mentioned problems and try again."
},
{
"file": "gsd-core/workflows/code-review/steps/structural-pre-pass.md",
"code": "1073",
"message": "Couldn't parse this command expansion. Fix to allow more checks."
},
{
"file": "gsd-core/workflows/code-review/steps/structural-pre-pass.md",
"code": "1083",
"message": "This { is literal. Check expression (missing ;/\\n?) or quote it."
},
{
"file": "gsd-core/workflows/code-review/steps/structural-pre-pass.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/code-review/steps/structural-pre-pass.md",
"code": "2157",
"message": "Argument to -z is always false due to literal strings."
},
{
"file": "gsd-core/workflows/complete-milestone.md",
"code": "2001",
"message": "See if you can use ${variable//search/replace} instead."
},
{
"file": "gsd-core/workflows/complete-milestone.md",
"code": "2001",
"message": "See if you can use ${variable//search/replace} instead."
},
{
"file": "gsd-core/workflows/complete-milestone.md",
"code": "2038",
"message": "Use 'find .. -print0 | xargs -0 ..' or 'find .. -exec .. +' to allow non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/complete-milestone.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/complete-milestone.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/complete-milestone.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/complete-milestone/detail/elaboration.md",
"code": "2001",
"message": "See if you can use ${variable//search/replace} instead."
},
{
"file": "gsd-core/workflows/complete-milestone/detail/elaboration.md",
"code": "2001",
"message": "See if you can use ${variable//search/replace} instead."
},
{
"file": "gsd-core/workflows/complete-milestone/detail/elaboration.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/complete-milestone/detail/elaboration.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/debug.md",
"code": "2010",
"message": "Don't use ls | grep. Use a glob or a for loop with a condition to allow non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/discuss-phase-assumptions.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/discuss-phase.md",
"code": "2010",
"message": "Don't use ls | grep. Use a glob or a for loop with a condition to allow non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/discuss-phase.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/discuss-phase.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/discuss-phase.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/discuss-phase.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/discuss-phase.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/discuss-phase.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/docs-update/steps/dispatch-monorepo-packages.md",
"code": "2043",
"message": "This loop will only ever run once. Bad quoting or missing glob/expansion?"
},
{
"file": "gsd-core/workflows/eval-review.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/eval-review.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/execute-phase.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/execute-phase.md",
"code": "2016",
"message": "Expressions don't expand in single quotes, use double quotes for that."
},
{
"file": "gsd-core/workflows/execute-phase.md",
"code": "2043",
"message": "This loop will only ever run once. Bad quoting or missing glob/expansion?"
},
{
"file": "gsd-core/workflows/execute-phase.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/execute-phase.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/execute-phase.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/execute-phase.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/execute-phase/detail/elaboration.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"code": "2016",
"message": "Expressions don't expand in single quotes, use double quotes for that."
},
{
"file": "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"code": "2016",
"message": "Expressions don't expand in single quotes, use double quotes for that."
},
{
"file": "gsd-core/workflows/execute-phase/steps/executor-isolation-dispatch.md",
"code": "2016",
"message": "Expressions don't expand in single quotes, use double quotes for that."
},
{
"file": "gsd-core/workflows/execute-phase/steps/gap-closure-artifacts.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/execute-phase/steps/wave-post-gate-hooks.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/execute-plan.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/execute-plan.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/execute-plan.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/forensics.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/health.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/health.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/import.md",
"code": "2194",
"message": "This word is constant. Did you forget the $ on a variable?"
},
{
"file": "gsd-core/workflows/ingest-docs.md",
"code": "2157",
"message": "Argument to -n is always true due to literal strings."
},
{
"file": "gsd-core/workflows/ingest-docs.md",
"code": "2194",
"message": "This word is constant. Did you forget the $ on a variable?"
},
{
"file": "gsd-core/workflows/ingest-docs.md",
"code": "2194",
"message": "This word is constant. Did you forget the $ on a variable?"
},
{
"file": "gsd-core/workflows/milestone-summary.md",
"code": "2046",
"message": "Quote this to prevent word splitting."
},
{
"file": "gsd-core/workflows/milestone-summary.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/milestone-summary.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/milestone-summary.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/new-milestone.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/new-milestone.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/new-milestone.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/new-milestone.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/new-milestone.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/new-milestone.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/new-milestone.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/new-milestone.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/new-milestone.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/new-milestone.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/new-milestone.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/new-project.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/new-project.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/new-project/detail/elaboration.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/new-project/detail/elaboration.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/new-workspace.md",
"code": "2164",
"message": "Use 'cd ... || exit' or 'cd ... || return' in case cd fails."
},
{
"file": "gsd-core/workflows/new-workspace.md",
"code": "2164",
"message": "Use 'cd ... || exit' or 'cd ... || return' in case cd fails."
},
{
"file": "gsd-core/workflows/next.md",
"code": "2181",
"message": "Check exit code directly with e.g. 'if ! mycmd;', not indirectly with $?."
},
{
"file": "gsd-core/workflows/next.md",
"code": "2181",
"message": "Check exit code directly with e.g. 'if ! mycmd;', not indirectly with $?."
},
{
"file": "gsd-core/workflows/pause-work.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/pause-work.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/pause-work.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/pause-work.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/pause-work.md",
"code": "2102",
"message": "Ranges can only match single chars (mentioned due to duplicates)."
},
{
"file": "gsd-core/workflows/plan-phase.md",
"code": "2010",
"message": "Don't use ls | grep. Use a glob or a for loop with a condition to allow non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/plan-phase.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/plan-phase.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/plan-phase.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/plan-phase.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/plan-phase.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/plan-phase.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/plan-phase.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/plan-phase.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/plan-phase.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/plan-phase.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/plan-phase.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/plan-phase.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/plan-phase.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/plan-phase.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/plan-phase.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/plan-phase.md",
"code": "2235",
"message": "Use { ..; } instead of (..) to avoid subshell overhead."
},
{
"file": "gsd-core/workflows/plan-phase/steps/stall-detection-helpers.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/plan-review-convergence.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/plan-review-convergence.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/plan-review-convergence.md",
"code": "2327",
"message": "This command substitution will be empty because the command's output gets redirected away."
},
{
"file": "gsd-core/workflows/plan-review-convergence.md",
"code": "2328",
"message": "This redirection takes output away from the command substitution (use tee to duplicate)."
},
{
"file": "gsd-core/workflows/plant-seed.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/plant-seed.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/pr-branch.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/pr-branch.md",
"code": "2181",
"message": "Check exit code directly with e.g. 'if ! mycmd;', not indirectly with $?."
},
{
"file": "gsd-core/workflows/progress.md",
"code": "2102",
"message": "Ranges can only match single chars (mentioned due to duplicates)."
},
{
"file": "gsd-core/workflows/progress.md",
"code": "2102",
"message": "Ranges can only match single chars (mentioned due to duplicates)."
},
{
"file": "gsd-core/workflows/quick-batch.md",
"code": "2046",
"message": "Quote this to prevent word splitting."
},
{
"file": "gsd-core/workflows/quick-batch.md",
"code": "2046",
"message": "Quote this to prevent word splitting."
},
{
"file": "gsd-core/workflows/quick.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/quick.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/quick.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/reapply-patches.md",
"code": "2088",
"message": "Tilde does not expand in quotes. Use $HOME."
},
{
"file": "gsd-core/workflows/remove-workspace.md",
"code": "2164",
"message": "Use 'cd ... || exit' or 'cd ... || return' in case cd fails."
},
{
"file": "gsd-core/workflows/review.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/review.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/review.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/review.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/review.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/review.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/review.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/secure-phase.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/settings-advanced.md",
"code": "2261",
"message": "Multiple redirections compete for stdin. Use cat, tee, or pass filenames instead."
},
{
"file": "gsd-core/workflows/settings-advanced.md",
"code": "2261",
"message": "Multiple redirections compete for stdin. Use cat, tee, or pass filenames instead."
},
{
"file": "gsd-core/workflows/settings-advanced.md",
"code": "2261",
"message": "Multiple redirections compete for stdin. Use cat, tee, or pass filenames instead."
},
{
"file": "gsd-core/workflows/settings-advanced.md",
"code": "2261",
"message": "Multiple redirections compete for stdin. Use cat, tee, or pass filenames instead."
},
{
"file": "gsd-core/workflows/settings-advanced.md",
"code": "2261",
"message": "Multiple redirections compete for stdout. Use cat, tee, or pass filenames instead."
},
{
"file": "gsd-core/workflows/settings-advanced.md",
"code": "2261",
"message": "Multiple redirections compete for stdout. Use cat, tee, or pass filenames instead."
},
{
"file": "gsd-core/workflows/settings-advanced.md",
"code": "2261",
"message": "Multiple redirections compete for stdout. Use cat, tee, or pass filenames instead."
},
{
"file": "gsd-core/workflows/settings-advanced.md",
"code": "2261",
"message": "Multiple redirections compete for stdout. Use cat, tee, or pass filenames instead."
},
{
"file": "gsd-core/workflows/settings.md",
"code": "2261",
"message": "Multiple redirections compete for stdin. Use cat, tee, or pass filenames instead."
},
{
"file": "gsd-core/workflows/settings.md",
"code": "2261",
"message": "Multiple redirections compete for stdin. Use cat, tee, or pass filenames instead."
},
{
"file": "gsd-core/workflows/settings.md",
"code": "2261",
"message": "Multiple redirections compete for stdin. Use cat, tee, or pass filenames instead."
},
{
"file": "gsd-core/workflows/settings.md",
"code": "2261",
"message": "Multiple redirections compete for stdout. Use cat, tee, or pass filenames instead."
},
{
"file": "gsd-core/workflows/settings.md",
"code": "2261",
"message": "Multiple redirections compete for stdout. Use cat, tee, or pass filenames instead."
},
{
"file": "gsd-core/workflows/settings.md",
"code": "2261",
"message": "Multiple redirections compete for stdout. Use cat, tee, or pass filenames instead."
},
{
"file": "gsd-core/workflows/ship.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/ship.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/ship.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/ship.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/ship.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/ship.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/ship.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/ship.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/ship.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/ship.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/ship.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/sketch.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/spec-phase.md",
"code": "2010",
"message": "Don't use ls | grep. Use a glob or a for loop with a condition to allow non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/spec-phase.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/spike.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/sync-skills.md",
"code": "2010",
"message": "Don't use ls | grep. Use a glob or a for loop with a condition to allow non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/sync-skills.md",
"code": "2010",
"message": "Don't use ls | grep. Use a glob or a for loop with a condition to allow non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/sync-skills.md",
"code": "2115",
"message": "Use \"${var:?}\" to ensure this never expands to / ."
},
{
"file": "gsd-core/workflows/sync-skills.md",
"code": "2115",
"message": "Use \"${var:?}\" to ensure this never expands to / ."
},
{
"file": "gsd-core/workflows/sync-skills.md",
"code": "2181",
"message": "Check exit code directly with e.g. 'if ! mycmd;', not indirectly with $?."
},
{
"file": "gsd-core/workflows/sync-skills.md",
"code": "2181",
"message": "Check exit code directly with e.g. 'if ! mycmd;', not indirectly with $?."
},
{
"file": "gsd-core/workflows/sync-skills.md",
"code": "2181",
"message": "Check exit code directly with e.g. 'if ! mycmd;', not indirectly with $?."
},
{
"file": "gsd-core/workflows/sync-skills.md",
"code": "2199",
"message": "Arrays implicitly concatenate in [[ ]]. Use a loop (or explicit * instead of @)."
},
{
"file": "gsd-core/workflows/sync-skills.md",
"code": "2199",
"message": "Arrays implicitly concatenate in [[ ]]. Use a loop (or explicit * instead of @)."
},
{
"file": "gsd-core/workflows/sync-skills.md",
"code": "2199",
"message": "Arrays implicitly concatenate in [[ ]]. Use a loop (or explicit * instead of @)."
},
{
"file": "gsd-core/workflows/sync-skills.md",
"code": "2199",
"message": "Arrays implicitly concatenate in [[ ]]. Use a loop (or explicit * instead of @)."
},
{
"file": "gsd-core/workflows/sync-skills.md",
"code": "2207",
"message": "Prefer mapfile or read -a to split command output (or quote to avoid splitting)."
},
{
"file": "gsd-core/workflows/ui-phase.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/ui-phase.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/ui-review.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/ui-review.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/undo.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/undo.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/update.md",
"code": "2046",
"message": "Quote this to prevent word splitting."
},
{
"file": "gsd-core/workflows/update.md",
"code": "2046",
"message": "Quote this to prevent word splitting."
},
{
"file": "gsd-core/workflows/update.md",
"code": "2088",
"message": "Tilde does not expand in quotes. Use $HOME."
},
{
"file": "gsd-core/workflows/validate-phase.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/verify-work.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/verify-work.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/verify-work.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/verify-work.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
},
{
"file": "gsd-core/workflows/verify-work/steps/automated-ui-verification.md",
"code": "2012",
"message": "Use find instead of ls to better handle non-alphanumeric filenames."
},
{
"file": "gsd-core/workflows/verify-work/steps/mvp-uat-framing.md",
"code": "2086",
"message": "Double quote to prevent globbing and word splitting."
}
]