@opengsd/gsd-core 1.6.0-rc.1 → 1.6.0-rc.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.
- package/.claude-plugin/plugin.json +2 -1
- package/agents/gsd-planner.md +8 -57
- package/agents/gsd-roadmapper.md +6 -0
- package/agents/gsd-security-auditor.md +37 -18
- package/bin/install.js +243 -345
- package/commands/gsd/capture.md +5 -1
- package/gemini-extension.json +1 -1
- package/gsd-core/bin/gsd-tools.cjs +53 -6
- package/gsd-core/bin/lib/adr-parser.cjs +21 -6
- package/gsd-core/bin/lib/audit-command-router.cjs +52 -14
- package/gsd-core/bin/lib/capability-lifecycle.cjs +30 -7
- package/gsd-core/bin/lib/capability-registry.cjs +96 -83
- package/gsd-core/bin/lib/capability-validator.cjs +22 -0
- package/gsd-core/bin/lib/cjs-command-router-adapter.cjs +40 -2
- package/gsd-core/bin/lib/command-routing-hub.cjs +10 -3
- package/gsd-core/bin/lib/commands.cjs +247 -0
- package/gsd-core/bin/lib/config-loader.cjs +6 -0
- package/gsd-core/bin/lib/config-schema.cjs +1 -0
- package/gsd-core/bin/lib/config.cjs +70 -21
- package/gsd-core/bin/lib/coverage.cjs +464 -0
- package/gsd-core/bin/lib/frontmatter.cjs +7 -3
- package/gsd-core/bin/lib/graphify-command-router.cjs +53 -36
- package/gsd-core/bin/lib/init.cjs +8 -4
- package/gsd-core/bin/lib/install-profiles.cjs +6 -3
- package/gsd-core/bin/lib/intel-command-router.cjs +79 -60
- package/gsd-core/bin/lib/phase-id.cjs +25 -11
- package/gsd-core/bin/lib/phase.cjs +4 -4
- package/gsd-core/bin/lib/planning-workspace.cjs +157 -13
- package/gsd-core/bin/lib/probe-core.cjs +7 -0
- package/gsd-core/bin/lib/profile-output.cjs +18 -6
- package/gsd-core/bin/lib/prohibition-enforcement.cjs +59 -26
- package/gsd-core/bin/lib/roadmap-command-router.cjs +16 -3
- package/gsd-core/bin/lib/roadmap-parser.cjs +29 -8
- package/gsd-core/bin/lib/roadmap-upgrade.cjs +47 -17
- package/gsd-core/bin/lib/roadmap.cjs +5 -2
- package/gsd-core/bin/lib/runtime-artifact-conversion.cjs +473 -16
- package/gsd-core/bin/lib/runtime-artifact-install-plan.cjs +77 -0
- package/gsd-core/bin/lib/runtime-artifact-layout.cjs +22 -31
- package/gsd-core/bin/lib/runtime-hooks-surface.cjs +15 -0
- package/gsd-core/bin/lib/runtime-name-policy.cjs +89 -0
- package/gsd-core/bin/lib/shell-command-projection.cjs +55 -1
- package/gsd-core/bin/lib/state.cjs +364 -52
- package/gsd-core/bin/lib/surface.cjs +47 -22
- package/gsd-core/bin/lib/update-context.cjs +2 -2
- package/gsd-core/bin/lib/validate.cjs +5 -2
- package/gsd-core/bin/lib/verify.cjs +11 -2
- package/gsd-core/bin/lib/worktree-safety.cjs +202 -0
- package/gsd-core/bin/shared/config-defaults.manifest.json +2 -1
- package/gsd-core/bin/shared/config-schema.manifest.json +1 -0
- package/gsd-core/references/context-budget.md +8 -8
- package/gsd-core/references/execute-phase-context-guard.md +16 -0
- package/gsd-core/references/planner-guidance.md +66 -0
- package/gsd-core/references/planning-config.md +3 -2
- package/gsd-core/references/prohibition-probe.md +15 -9
- package/gsd-core/references/security-asvs-levels.md +27 -0
- package/gsd-core/templates/SECURITY.md +6 -4
- package/gsd-core/templates/summary-complex.md +4 -0
- package/gsd-core/templates/summary-minimal.md +3 -0
- package/gsd-core/templates/summary-standard.md +4 -0
- package/gsd-core/templates/summary.md +41 -0
- package/gsd-core/workflows/autonomous.md +33 -33
- package/gsd-core/workflows/diagnose-issues.md +6 -1
- package/gsd-core/workflows/execute-phase.md +8 -6
- package/gsd-core/workflows/execute-plan.md +5 -0
- package/gsd-core/workflows/help/modes/full.md +10 -0
- package/gsd-core/workflows/list-seeds.md +63 -0
- package/gsd-core/workflows/manager.md +37 -37
- package/gsd-core/workflows/new-project.md +4 -4
- package/gsd-core/workflows/plan-phase.md +15 -0
- package/gsd-core/workflows/pr-branch.md +156 -0
- package/gsd-core/workflows/quick.md +6 -1
- package/gsd-core/workflows/review.md +10 -2
- package/gsd-core/workflows/secure-phase.md +13 -7
- package/gsd-core/workflows/spec-phase.md +8 -3
- package/gsd-core/workflows/verify-phase.md +2 -2
- package/gsd-core/workflows/verify-work.md +30 -1
- package/package.json +7 -2
- package/scripts/gen-plugin-skills.cjs +117 -0
- package/scripts/lint-test-file-count.allowlist.json +2 -1
- package/scripts/prompt-injection-scan.sh +5 -0
- package/scripts/release-notes/conventional-title.cjs +88 -0
- package/scripts/release-notes/format-github-release-notes.cjs +4 -3
- package/skills/gsd-add-tests/SKILL.md +38 -0
- package/skills/gsd-ai-integration-phase/SKILL.md +37 -0
- package/skills/gsd-audit-fix/SKILL.md +33 -0
- package/skills/gsd-audit-milestone/SKILL.md +37 -0
- package/skills/gsd-audit-uat/SKILL.md +25 -0
- package/skills/gsd-autonomous/SKILL.md +51 -0
- package/skills/gsd-capture/SKILL.md +67 -0
- package/skills/gsd-cleanup/SKILL.md +24 -0
- package/skills/gsd-code-review/SKILL.md +59 -0
- package/skills/gsd-complete-milestone/SKILL.md +142 -0
- package/skills/gsd-config/SKILL.md +56 -0
- package/skills/gsd-debug/SKILL.md +53 -0
- package/skills/gsd-discuss-phase/SKILL.md +77 -0
- package/skills/gsd-docs-update/SKILL.md +49 -0
- package/skills/gsd-eval-review/SKILL.md +33 -0
- package/skills/gsd-execute-phase/SKILL.md +65 -0
- package/skills/gsd-explore/SKILL.md +28 -0
- package/skills/gsd-extract-learnings/SKILL.md +22 -0
- package/skills/gsd-fast/SKILL.md +31 -0
- package/skills/gsd-forensics/SKILL.md +56 -0
- package/skills/gsd-graphify/SKILL.md +204 -0
- package/skills/gsd-health/SKILL.md +31 -0
- package/skills/gsd-help/SKILL.md +29 -0
- package/skills/gsd-import/SKILL.md +46 -0
- package/skills/gsd-inbox/SKILL.md +39 -0
- package/skills/gsd-ingest-docs/SKILL.md +43 -0
- package/skills/gsd-manager/SKILL.md +45 -0
- package/skills/gsd-map-codebase/SKILL.md +83 -0
- package/skills/gsd-mempalace-capture/SKILL.md +71 -0
- package/skills/gsd-mempalace-recall/SKILL.md +102 -0
- package/skills/gsd-milestone-summary/SKILL.md +51 -0
- package/skills/gsd-mvp-phase/SKILL.md +45 -0
- package/skills/gsd-new-milestone/SKILL.md +45 -0
- package/skills/gsd-new-project/SKILL.md +47 -0
- package/skills/gsd-ns-context/SKILL.md +24 -0
- package/skills/gsd-ns-ideate/SKILL.md +23 -0
- package/skills/gsd-ns-manage/SKILL.md +35 -0
- package/skills/gsd-ns-project/SKILL.md +26 -0
- package/skills/gsd-ns-review/SKILL.md +28 -0
- package/skills/gsd-ns-workflow/SKILL.md +33 -0
- package/skills/gsd-pause-work/SKILL.md +43 -0
- package/skills/gsd-phase/SKILL.md +57 -0
- package/skills/gsd-plan-phase/SKILL.md +63 -0
- package/skills/gsd-plan-review-convergence/SKILL.md +60 -0
- package/skills/gsd-pr-branch/SKILL.md +26 -0
- package/skills/gsd-profile-user/SKILL.md +47 -0
- package/skills/gsd-progress/SKILL.md +49 -0
- package/skills/gsd-quick/SKILL.md +174 -0
- package/skills/gsd-resume-work/SKILL.md +31 -0
- package/skills/gsd-review/SKILL.md +42 -0
- package/skills/gsd-review-backlog/SKILL.md +63 -0
- package/skills/gsd-secure-phase/SKILL.md +36 -0
- package/skills/gsd-settings/SKILL.md +29 -0
- package/skills/gsd-ship/SKILL.md +24 -0
- package/skills/gsd-sketch/SKILL.md +60 -0
- package/skills/gsd-spec-phase/SKILL.md +63 -0
- package/skills/gsd-spike/SKILL.md +57 -0
- package/skills/gsd-stats/SKILL.md +20 -0
- package/skills/gsd-surface/SKILL.md +162 -0
- package/skills/gsd-thread/SKILL.md +24 -0
- package/skills/gsd-ui-phase/SKILL.md +35 -0
- package/skills/gsd-ui-review/SKILL.md +33 -0
- package/skills/gsd-ultraplan-phase/SKILL.md +34 -0
- package/skills/gsd-undo/SKILL.md +35 -0
- package/skills/gsd-update/SKILL.md +50 -0
- package/skills/gsd-validate-phase/SKILL.md +36 -0
- package/skills/gsd-verify-work/SKILL.md +39 -0
- package/skills/gsd-workspace/SKILL.md +53 -0
- package/skills/gsd-workstreams/SKILL.md +70 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gsd-core",
|
|
3
3
|
"displayName": "GSD Core",
|
|
4
|
-
"version": "1.6.0-rc.
|
|
4
|
+
"version": "1.6.0-rc.3",
|
|
5
5
|
"description": "GSD Core is a meta-prompting, context engineering, and spec-driven development system for AI coding agents.",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "open-gsd",
|
|
@@ -19,5 +19,6 @@
|
|
|
19
19
|
"gsd"
|
|
20
20
|
],
|
|
21
21
|
"commands": "./commands/gsd/",
|
|
22
|
+
"skills": "./skills/",
|
|
22
23
|
"hooks": "./hooks/hooks.json"
|
|
23
24
|
}
|
package/agents/gsd-planner.md
CHANGED
|
@@ -380,11 +380,11 @@ Output: [Artifacts created]
|
|
|
380
380
|
|
|
381
381
|
## STRIDE Threat Register
|
|
382
382
|
|
|
383
|
-
| Threat ID | Category | Component | Disposition | Mitigation Plan |
|
|
384
|
-
|
|
385
|
-
| T-{phase}-01 | {S/T/R/I/D/E} | {function/endpoint/file} | mitigate | {specific
|
|
386
|
-
| T-{phase}-02 | {category} | {component} | accept | {rationale
|
|
387
|
-
| T-{phase}-SC | Tampering | npm/pip/cargo installs | mitigate | slopcheck + blocking human checkpoint for [ASSUMED]/[SUS] |
|
|
383
|
+
| Threat ID | Category | Component | Severity | Disposition | Mitigation Plan |
|
|
384
|
+
|-----------|----------|-----------|----------|-------------|-----------------|
|
|
385
|
+
| T-{phase}-01 | {S/T/R/I/D/E} | {function/endpoint/file} | {critical\|high\|medium\|low} | mitigate | {specific mitigation action} |
|
|
386
|
+
| T-{phase}-02 | {category} | {component} | low | accept | {rationale for acceptance} |
|
|
387
|
+
| T-{phase}-SC | Tampering | npm/pip/cargo installs | high | mitigate | slopcheck + blocking human checkpoint for [ASSUMED]/[SUS] |
|
|
388
388
|
</threat_model>
|
|
389
389
|
|
|
390
390
|
<verification>
|
|
@@ -459,7 +459,7 @@ Only include what Claude literally cannot do.
|
|
|
459
459
|
**Step 0: Extract Requirement IDs**
|
|
460
460
|
Read ROADMAP.md `**Requirements:**` line for this phase. Strip brackets if present (e.g., `[AUTH-01, AUTH-02]` → `AUTH-01, AUTH-02`). Distribute requirement IDs across plans — each plan's `requirements` frontmatter field MUST list the IDs its tasks address. **CRITICAL:** Every requirement ID MUST appear in at least one plan. Plans with an empty `requirements` field are invalid.
|
|
461
461
|
|
|
462
|
-
**Security (when `security_enforcement` enabled — absent = enabled):** Identify trust boundaries in this phase's scope. Map STRIDE categories to applicable tech stack from RESEARCH.md security domain. For each threat: assign
|
|
462
|
+
**Security (when `security_enforcement` enabled — absent = enabled):** Identify trust boundaries in this phase's scope. Map STRIDE categories to applicable tech stack from RESEARCH.md security domain. For each threat: assign a **severity** (critical|high|medium|low) based on impact × likelihood, and a disposition (`mitigate`/`accept`/`transfer`) per the configured OWASP ASVS level — see @~/.claude/gsd-core/references/security-asvs-levels.md. Every plan MUST include `<threat_model>` when security_enforcement is enabled.
|
|
463
463
|
|
|
464
464
|
**Package legitimacy gate (npm/pip/cargo only):**
|
|
465
465
|
- Require RESEARCH.md `## Package Legitimacy Audit` before package-manager install tasks.
|
|
@@ -477,66 +477,16 @@ Take phase goal from ROADMAP.md. Must be outcome-shaped, not task-shaped.
|
|
|
477
477
|
**Step 2: Derive Observable Truths**
|
|
478
478
|
"What must be TRUE for this goal to be achieved?" List 3-7 truths from USER's perspective.
|
|
479
479
|
|
|
480
|
-
For "working chat interface":
|
|
481
|
-
- User can see existing messages
|
|
482
|
-
- User can type a new message
|
|
483
|
-
- User can send the message
|
|
484
|
-
- Sent message appears in the list
|
|
485
|
-
- Messages persist across page refresh
|
|
486
|
-
|
|
487
|
-
**Test:** Each truth verifiable by a human using the application.
|
|
488
|
-
|
|
489
480
|
**Step 3: Derive Required Artifacts**
|
|
490
481
|
For each truth: "What must EXIST for this to be true?"
|
|
491
482
|
|
|
492
|
-
"User can see existing messages" requires:
|
|
493
|
-
- Message list component (renders Message[])
|
|
494
|
-
- Messages state (loaded from somewhere)
|
|
495
|
-
- API route or data source (provides messages)
|
|
496
|
-
- Message type definition (shapes the data)
|
|
497
|
-
|
|
498
|
-
**Test:** Each artifact = a specific file or database object.
|
|
499
|
-
|
|
500
483
|
**Step 4: Derive Required Wiring**
|
|
501
484
|
For each artifact: "What must be CONNECTED for this to function?"
|
|
502
485
|
|
|
503
|
-
Message list component wiring:
|
|
504
|
-
- Imports Message type (not using `any`)
|
|
505
|
-
- Receives messages prop or fetches from API
|
|
506
|
-
- Maps over messages to render (not hardcoded)
|
|
507
|
-
- Handles empty state (not just crashes)
|
|
508
|
-
|
|
509
486
|
**Step 5: Identify Key Links**
|
|
510
487
|
"Where is this most likely to break?" Key links = critical connections where breakage causes cascading failures.
|
|
511
488
|
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
```yaml
|
|
515
|
-
must_haves:
|
|
516
|
-
truths:
|
|
517
|
-
- "User can see existing messages"
|
|
518
|
-
- "User can send a message"
|
|
519
|
-
- "Messages persist across refresh"
|
|
520
|
-
artifacts:
|
|
521
|
-
- path: "src/components/Chat.tsx"
|
|
522
|
-
provides: "Message list rendering"
|
|
523
|
-
min_lines: 30
|
|
524
|
-
- path: "src/app/api/chat/route.ts"
|
|
525
|
-
provides: "Message CRUD operations"
|
|
526
|
-
exports: ["GET", "POST"]
|
|
527
|
-
- path: "prisma/schema.prisma"
|
|
528
|
-
provides: "Message model"
|
|
529
|
-
contains: "model Message"
|
|
530
|
-
key_links:
|
|
531
|
-
- from: "src/components/Chat.tsx"
|
|
532
|
-
to: "src/app/api/chat/route.ts"
|
|
533
|
-
via: "fetch in useEffect — calls /api/chat endpoint"
|
|
534
|
-
pattern: "fetch.*api/chat"
|
|
535
|
-
- from: "src/app/api/chat/route.ts"
|
|
536
|
-
to: "prisma/schema.prisma"
|
|
537
|
-
via: "database query via prisma.message"
|
|
538
|
-
pattern: "prisma\\.message\\.(find|create)"
|
|
539
|
-
```
|
|
489
|
+
See @~/.claude/gsd-core/references/planner-guidance.md for a worked example and the `must_haves` YAML format.
|
|
540
490
|
|
|
541
491
|
</goal_backward>
|
|
542
492
|
|
|
@@ -1037,6 +987,7 @@ Phase planning complete when:
|
|
|
1037
987
|
- [ ] User knows next steps and wave structure
|
|
1038
988
|
- [ ] `<threat_model>` present with STRIDE register (when `security_enforcement` enabled)
|
|
1039
989
|
- [ ] Every threat has a disposition (mitigate / accept / transfer)
|
|
990
|
+
- [ ] Every threat has a Severity (critical|high|medium|low)
|
|
1040
991
|
- [ ] Mitigations reference specific implementation (not generic advice)
|
|
1041
992
|
|
|
1042
993
|
## Gap Closure Mode
|
package/agents/gsd-roadmapper.md
CHANGED
|
@@ -226,6 +226,10 @@ current milestone number and a two-digit phase index within that milestone
|
|
|
226
226
|
active milestone context (default: `1` for new projects). This ensures downstream tools that
|
|
227
227
|
parse `### Phase N-NN:` headers for milestone-scoped workflows receive correctly prefixed IDs.
|
|
228
228
|
|
|
229
|
+
`project_code` is only a phase-directory prefix. Never include `project_code` in ROADMAP phase
|
|
230
|
+
checklist entries or detail headers. For example, even when `project_code: "PROJ"` is configured,
|
|
231
|
+
write `Phase 7` for `sequential` and `Phase 1-07` for `milestone-prefixed`, not `Phase PROJ-7`.
|
|
232
|
+
|
|
229
233
|
## Granularity Calibration
|
|
230
234
|
|
|
231
235
|
Read granularity from config.json. Granularity controls compression tolerance.
|
|
@@ -328,6 +332,7 @@ After roadmap creation, REQUIREMENTS.md gets updated with phase mappings:
|
|
|
328
332
|
### 1. Summary Checklist (under `## Phases`)
|
|
329
333
|
|
|
330
334
|
Use the form matching `phase_id_convention` from config.
|
|
335
|
+
Do not include `project_code` in checklist phase IDs.
|
|
331
336
|
|
|
332
337
|
**Sequential (default — when absent or `"sequential"`):**
|
|
333
338
|
|
|
@@ -348,6 +353,7 @@ Use the form matching `phase_id_convention` from config.
|
|
|
348
353
|
### 2. Detail Sections (under `## Phase Details`)
|
|
349
354
|
|
|
350
355
|
Use the header form matching `phase_id_convention` from config.
|
|
356
|
+
Do not include `project_code` in detail header phase IDs.
|
|
351
357
|
|
|
352
358
|
**Sequential (default):**
|
|
353
359
|
|
|
@@ -33,18 +33,19 @@ Does NOT scan blindly for new vulnerabilities. Verifies each threat in `<threat_
|
|
|
33
33
|
- Marking CLOSED based on code structure ("looks like it validates input") without finding the actual validation call
|
|
34
34
|
|
|
35
35
|
**Required finding classification:**
|
|
36
|
-
- **BLOCKER** — `OPEN_THREATS`: a declared mitigation is absent in implemented code; phase must not ship
|
|
36
|
+
- **BLOCKER** — `OPEN_THREATS`: a declared mitigation is absent in implemented code AND the threat's severity ≥ `block_on` threshold; phase must not ship until resolved
|
|
37
|
+
- **OPEN — non-blocking** — mitigation absent BUT the threat's severity is below the `block_on` threshold; tracked in SECURITY.md, does NOT count toward `threats_open`, does not block ship
|
|
37
38
|
- **WARNING** — `unregistered_flag`: new attack surface appeared during implementation with no threat mapping
|
|
38
|
-
Every threat must resolve to CLOSED, OPEN (
|
|
39
|
+
Every threat must resolve to CLOSED, OPEN-blocking (severity ≥ block_on), OPEN-non-blocking (severity below block_on), or documented accepted risk.
|
|
39
40
|
</adversarial_stance>
|
|
40
41
|
|
|
41
42
|
<execution_flow>
|
|
42
43
|
|
|
43
44
|
<step name="load_context">
|
|
44
45
|
Read ALL files from `<required_reading>`. Extract:
|
|
45
|
-
- PLAN.md `<threat_model>` block: full threat register with IDs, categories, dispositions, mitigation plans
|
|
46
|
+
- PLAN.md `<threat_model>` block: full threat register with IDs, categories, severities, dispositions, mitigation plans
|
|
46
47
|
- SUMMARY.md `## Threat Flags` section: new attack surface detected by executor during implementation
|
|
47
|
-
- `<config>` block: `asvs_level` (1/2/3), `block_on` (
|
|
48
|
+
- `<config>` block: `asvs_level` (1/2/3), `block_on` (critical | high | medium | low | none) — severity ordering: critical > high > medium > low; none = never block
|
|
48
49
|
- Implementation files: exports, auth patterns, input handling, data flows
|
|
49
50
|
|
|
50
51
|
**Context budget:** Load project skills first (lightweight). Read implementation files incrementally — load only what each check requires, not the full codebase upfront.
|
|
@@ -60,7 +61,7 @@ This ensures project-specific patterns, conventions, and best practices are appl
|
|
|
60
61
|
</step>
|
|
61
62
|
|
|
62
63
|
<step name="analyze_threats">
|
|
63
|
-
For each threat in `<threat_model>`,
|
|
64
|
+
For each threat in `<threat_model>`, read its `severity` field (critical|high|medium|low). If building the register retroactively (no `<threat_model>` in PLAN.md), assign a severity to each threat you construct based on impact × likelihood. Determine verification method by disposition:
|
|
64
65
|
|
|
65
66
|
| Disposition | Verification Method |
|
|
66
67
|
|-------------|---------------------|
|
|
@@ -69,16 +70,27 @@ For each threat in `<threat_model>`, determine verification method by dispositio
|
|
|
69
70
|
| `transfer` | Verify transfer documentation present (insurance, vendor SLA, etc.) |
|
|
70
71
|
|
|
71
72
|
Classify each threat before verification. Record classification for every threat — no threat skipped.
|
|
73
|
+
|
|
74
|
+
**Verification depth scales with `asvs_level`** (see @~/.claude/gsd-core/references/security-asvs-levels.md for full definitions):
|
|
75
|
+
- L1: verify mitigation is PRESENT in the cited file (grep-level — pattern exists).
|
|
76
|
+
- L2: verify the mitigation ADDRESSES the threat vector and is placed at the correct boundary (a check in the wrong layer does not close the threat).
|
|
77
|
+
- L3: deep trace — follow the data flow end-to-end, check edge cases and ordering, confirm no bypass path exists.
|
|
72
78
|
</step>
|
|
73
79
|
|
|
74
80
|
<step name="verify_and_write">
|
|
75
|
-
For each `mitigate` threat: grep for declared mitigation pattern in cited files → found = `CLOSED`, not found = `OPEN`.
|
|
81
|
+
For each `mitigate` threat: grep for declared mitigation pattern in cited files → found = `CLOSED`, not found = `OPEN`. Apply depth per `asvs_level` (see analyze_threats step).
|
|
76
82
|
For `accept` threats: check SECURITY.md accepted risks log → entry present = `CLOSED`, absent = `OPEN`.
|
|
77
83
|
For `transfer` threats: check for transfer documentation → present = `CLOSED`, absent = `OPEN`.
|
|
78
84
|
|
|
79
85
|
For each `threat_flag` in SUMMARY.md `## Threat Flags`: if maps to existing threat ID → informational. If no mapping → log as `unregistered_flag` in SECURITY.md (not a blocker).
|
|
80
86
|
|
|
81
|
-
|
|
87
|
+
**Severity-aware `threats_open` computation (severity order: critical > high > medium > low):**
|
|
88
|
+
`threats_open` (the SECURITY.md frontmatter gate field) = the count of threats whose status is OPEN AND whose severity rank ≥ the `block_on` rank. `block_on: none` ⇒ 0 (nothing ever blocks). `block_on: low` ⇒ all open threats block. `block_on: high` (default) ⇒ only high and critical open threats block.
|
|
89
|
+
Open threats BELOW the block threshold are recorded in SECURITY.md as **open — below {block_on} threshold (non-blocking)** and MUST NOT be counted in `threats_open`.
|
|
90
|
+
|
|
91
|
+
**Fail-closed for missing severity:** if an OPEN threat has no severity or an unparseable severity (e.g. a legacy register predating the Severity column), treat it as `critical` for this computation — it COUNTS toward `threats_open` (blocking). Never silently drop an unranked open threat.
|
|
92
|
+
|
|
93
|
+
Write SECURITY.md. Set `threats_open` to the severity-filtered count. Return structured result.
|
|
82
94
|
</step>
|
|
83
95
|
|
|
84
96
|
</execution_flow>
|
|
@@ -95,9 +107,9 @@ Write SECURITY.md. Set `threats_open` count. Return structured result.
|
|
|
95
107
|
**ASVS Level:** {1/2/3}
|
|
96
108
|
|
|
97
109
|
### Threat Verification
|
|
98
|
-
| Threat ID | Category | Disposition | Evidence |
|
|
99
|
-
|
|
100
|
-
| {id} | {category} | {mitigate/accept/transfer} | {file:line or doc reference} |
|
|
110
|
+
| Threat ID | Category | Severity | Disposition | Evidence |
|
|
111
|
+
|-----------|----------|----------|-------------|----------|
|
|
112
|
+
| {id} | {category} | {critical\|high\|medium\|low} | {mitigate/accept/transfer} | {file:line or doc reference} |
|
|
101
113
|
|
|
102
114
|
### Unregistered Flags
|
|
103
115
|
{none / list from SUMMARY.md ## Threat Flags with no threat mapping}
|
|
@@ -115,14 +127,21 @@ SECURITY.md: {path}
|
|
|
115
127
|
**ASVS Level:** {1/2/3}
|
|
116
128
|
|
|
117
129
|
### Closed
|
|
118
|
-
| Threat ID | Category | Disposition | Evidence |
|
|
119
|
-
|
|
120
|
-
| {id} | {category} | {disposition} | {evidence} |
|
|
121
|
-
|
|
122
|
-
### Open
|
|
123
|
-
| Threat ID | Category | Mitigation Expected | Files Searched |
|
|
124
|
-
|
|
125
|
-
| {id} | {category} | {pattern not found} | {file paths} |
|
|
130
|
+
| Threat ID | Category | Severity | Disposition | Evidence |
|
|
131
|
+
|-----------|----------|----------|-------------|----------|
|
|
132
|
+
| {id} | {category} | {critical\|high\|medium\|low} | {disposition} | {evidence} |
|
|
133
|
+
|
|
134
|
+
### Open (blocking — severity ≥ block_on threshold)
|
|
135
|
+
| Threat ID | Category | Severity | Mitigation Expected | Files Searched |
|
|
136
|
+
|-----------|----------|----------|---------------------|----------------|
|
|
137
|
+
| {id} | {category} | {critical\|high\|medium\|low} | {pattern not found} | {file paths} |
|
|
138
|
+
|
|
139
|
+
### Open (non-blocking — severity below block_on threshold)
|
|
140
|
+
| Threat ID | Category | Severity | Mitigation Expected | Files Searched |
|
|
141
|
+
|-----------|----------|----------|---------------------|----------------|
|
|
142
|
+
| {id} | {category} | {critical\|high\|medium\|low} | {pattern not found} | {file paths} |
|
|
143
|
+
|
|
144
|
+
*Only blocking-open threats count toward `threats_open` in SECURITY.md frontmatter.*
|
|
126
145
|
|
|
127
146
|
Next: Implement mitigations or document as accepted in SECURITY.md accepted risks log, then re-run /gsd:secure-phase.
|
|
128
147
|
|