chore(release): 1.0.1#20
Merged
Merged
Conversation
aks-reviewes
approved these changes
May 18, 2026
aks-reviewes
left a comment
Collaborator
There was a problem hiding this comment.
Auto-approved by aks-builds secondary account - PR opened by the sole codeowner.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Security hardening — pass through audit findings
Eleven commits addressing every HIGH / MEDIUM / LOW-with-security-impact finding from the v1.0.0 quality audit. 113/113 tests; +14 new regression tests across the touched surfaces.
HIGH severity:
cli/src/http.js— every adapter HTTP request now bounded byAbortSignal.timeout(timeoutMs)(default 30s). A hung Jira / ADO / Linear / GitLab endpoint no longer wedgessync --allindefinitely. New test confirms the request rejects within budget, not at wall-clock max.cli/src/adapters/azure.js+cli/src/adapters/gitlab.js— user-controlleditem.id/child.id/parent.id(fromtasks.mdfrontmatter, user-editable) now wrapped inencodeURIComponentbefore URL-path interpolation. Closes a path-injection vector — a typo'dexternal_id: "1/../99"no longer reaches unintended endpoints. Jira was already correct.cli/src/tracking.js—loadChangenow validates thattasks.mdfrontmatteritems:is an array of well-shaped objects (each with a stringtitle). Malformed entries are silently dropped; non-arrayitems:raises a clear error with a remediation pointing at the file to repair. Malformed YAML itself raises with file context instead of crashing deep withTypeError: items is not iterable.cli/src/openspec-bridge.js— newassertSafeFeatureName()rejects empty / non-string input, anything containing..///\/ Windows drive letters, and anything outside/^[a-z0-9][a-z0-9._-]*$/i. Called at the top ofchangeDir(),changeExists(), andpropose()so every entry point into the OpenSpec layout validates first. Closes path-traversal via feature name.cli/src/commands/sync.js+cli/src/commands/bulk.js—sync,sync --all, andship --all-readynow throw at the end if any task or change failed, instead of swallowing per-task errors and returning 0.openspecpm sync feature && deployin CI no longer proceeds on silent partial sync. Per-tasklast_errorstill persisted totasks.mdfrontmatter for inspection.cli/src/notify.js—fetchresponse status is now checked instead of being discarded. A 401 / 403 / 500 from Slack / Teams / generic counts as an error, not a successful send.standup --broadcastno longer claims success when the webhook silently rejected.MEDIUM severity:
cli/tests/github-adapter.test.js— locked the leading-dash title behavior under array argv (M3). No code change needed; execa array-args + cobra's flag parser already handle--title "--evil-flag"correctly, but the regression test prevents a future refactor from breaking it.cli/src/audit.js—SECRET_SEGMENTSextended to includebearer,cookie,session,webhook,signature,assertion. NewscrubValue()redacts webhook URLs from any string value (Slack hooks, MS Teams connectors, M365 webhooks).record()'sresultanderrorfields now also go throughscrubValue.cli/src/notify.jssanitizes itstarget.urlfrom every error message at the source. Two-layer defense: the URL can't leak from notify's error path, and even if some other code path puts a webhook URL in an audit entry, the sink redacts it. (M6 + M11 + LOW-4)cli/bin/openspecpm.js— installeduncaughtExceptionandunhandledRejectionhandlers that print sanitized message + remediation + a pointer toaudit.log. A future programming bug (TypeError, etc.) no longer dumps Node's default stack trace with absolute install / tmp paths to stderr. (M8)cli/src/commands/sync.js—extractSummarynow strips C0/C1 control chars (except TAB/LF/CR), DEL, zero-width / joiner chars, bidi overrides (LRE/RLE/PDF/LRO/RLO), and isolates (LRI/RLI/FSI/PDI) before sending the proposal body to the remote tracker as the epic description. Closes homograph / hidden-content vector in issue titles and bodies. (M9)LOW severity (defense-in-depth):
cli/src/adapters/azure.js—listWorkItemsnow allowlist-validates the WIQLtagagainst/^[a-zA-Z0-9._:-]+$/. Single-quote doubling escape already handled the only known WIQL string-literal breakout, but allowlist validation is more robust than escape-based protection. (LOW-1)Post-1.0 doc sweep
standup --broadcast.bdd-llm-revieweras shipped (no longer in the active 6); count adjusted to 5 remaining.cli/src/contents (20 commands, 5 adapters undercli/src/adapters/,audit.js/notify.js/telemetry.js/install-hints.js/bdd/judge.js), workflow set (test.yml+auto-approve.yml+release.yml+publish.yml),docs/screenshots/, andopenspec/changes/v2 roadmap directory.skill/openspecpm/references/{conventions,sync,execute,plan}.md: "(Sprint N)" / "(Sprint N+)" annotations stripped throughout — those markers were pre-1.0 development history noise, no longer meaningful.openspec/changes/README.md: added a "Shipped" section calling outbdd-llm-reviewer(v1.0.0); active roadmap table reduced from 6 to 5 changes; totals recomputed (47 tasks, ~178 hrs).openspec/changes/bdd-llm-reviewer/proposal.md: frontmatterstatus: draft→status: shippedwithshipped_in: 1.0.0andshipped_at: 2026-05-18.cli/bin/openspecpm.js:program.version()now reads frompackage.jsonat runtime instead of the hardcoded'0.1.0-alpha.0'. Futurenpm versionbumps keepopenspecpm --versionin sync automatically.