forgedock 1.0.5 → 1.0.6

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.
@@ -0,0 +1,152 @@
1
+ [
2
+ {
3
+ "name": "priority:P0",
4
+ "color": "B60205",
5
+ "description": "Critical priority — production broken, data loss, security breach. Managed by ForgeDock."
6
+ },
7
+ {
8
+ "name": "priority:P1",
9
+ "color": "D93F0B",
10
+ "description": "High priority — major feature broken, no workaround. Managed by ForgeDock."
11
+ },
12
+ {
13
+ "name": "priority:P2",
14
+ "color": "FBCA04",
15
+ "description": "Medium priority — impaired functionality, workaround exists. Managed by ForgeDock."
16
+ },
17
+ {
18
+ "name": "priority:P3",
19
+ "color": "C2E0C6",
20
+ "description": "Low priority — minor issue or polish. Managed by ForgeDock."
21
+ },
22
+ {
23
+ "name": "workflow:investigating",
24
+ "color": "1D76DB",
25
+ "description": "Pipeline: investigation phase in progress. Managed by ForgeDock."
26
+ },
27
+ {
28
+ "name": "workflow:ready-to-build",
29
+ "color": "0075CA",
30
+ "description": "Pipeline: investigation complete, ready for build. Managed by ForgeDock."
31
+ },
32
+ {
33
+ "name": "workflow:building",
34
+ "color": "0052CC",
35
+ "description": "Pipeline: implementation in progress. Managed by ForgeDock."
36
+ },
37
+ {
38
+ "name": "workflow:in-review",
39
+ "color": "5319E7",
40
+ "description": "Pipeline: PR created, under review. Managed by ForgeDock."
41
+ },
42
+ {
43
+ "name": "workflow:merged",
44
+ "color": "0E8A16",
45
+ "description": "Pipeline: PR merged, issue closed. Managed by ForgeDock."
46
+ },
47
+ {
48
+ "name": "workflow:decomposed",
49
+ "color": "BFD4F2",
50
+ "description": "Pipeline: decomposed into sub-issues. Managed by ForgeDock."
51
+ },
52
+ {
53
+ "name": "workflow:invalid",
54
+ "color": "CCCCCC",
55
+ "description": "Pipeline: issue closed as invalid after investigation. Managed by ForgeDock."
56
+ },
57
+ {
58
+ "name": "needs-human",
59
+ "color": "E4E669",
60
+ "description": "Pipeline stalled — requires human intervention. Managed by ForgeDock."
61
+ },
62
+ {
63
+ "name": "review-finding",
64
+ "color": "D93F0B",
65
+ "description": "Defect or improvement found during automated PR review. Managed by ForgeDock."
66
+ },
67
+ {
68
+ "name": "needs-validation",
69
+ "color": "FBCA04",
70
+ "description": "Review finding awaiting human validation. Managed by ForgeDock."
71
+ },
72
+ {
73
+ "name": "validated",
74
+ "color": "0E8A16",
75
+ "description": "Review finding confirmed as a real issue. Managed by ForgeDock."
76
+ },
77
+ {
78
+ "name": "false-positive",
79
+ "color": "CCCCCC",
80
+ "description": "Review finding dismissed as a false positive. Managed by ForgeDock."
81
+ },
82
+ {
83
+ "name": "staging-review",
84
+ "color": "1D76DB",
85
+ "description": "Finding from a staging branch review before deploy to main. Managed by ForgeDock."
86
+ },
87
+ {
88
+ "name": "audit-finding",
89
+ "color": "D93F0B",
90
+ "description": "Security or compliance defect found during audit. Managed by ForgeDock."
91
+ },
92
+ {
93
+ "name": "orchestration-metrics",
94
+ "color": "5319E7",
95
+ "description": "Running log of persisted audit-agents efficiency summaries. Managed by ForgeDock."
96
+ },
97
+ {
98
+ "name": "health-report",
99
+ "color": "1D76DB",
100
+ "description": "Pipeline health report issue. Managed by ForgeDock."
101
+ },
102
+ {
103
+ "name": "bug",
104
+ "color": "D73A4A",
105
+ "description": "Something isn't working. Managed by ForgeDock."
106
+ },
107
+ {
108
+ "name": "enhancement",
109
+ "color": "A2EEEF",
110
+ "description": "New feature or request. Managed by ForgeDock."
111
+ },
112
+ {
113
+ "name": "feature",
114
+ "color": "0075CA",
115
+ "description": "New feature implementation. Managed by ForgeDock."
116
+ },
117
+ {
118
+ "name": "refactor",
119
+ "color": "FEF2C0",
120
+ "description": "Code restructuring without behavior change. Managed by ForgeDock."
121
+ },
122
+ {
123
+ "name": "dead-code",
124
+ "color": "E4E669",
125
+ "description": "Unused code to be removed. Managed by ForgeDock."
126
+ },
127
+ {
128
+ "name": "improvement",
129
+ "color": "C5DEF5",
130
+ "description": "Non-bug improvement to existing functionality. Managed by ForgeDock."
131
+ },
132
+ {
133
+ "name": "documentation",
134
+ "color": "0075CA",
135
+ "description": "Documentation addition or update. Managed by ForgeDock."
136
+ },
137
+ {
138
+ "name": "qa",
139
+ "color": "E99695",
140
+ "description": "Quality assurance or testing issue. Managed by ForgeDock."
141
+ },
142
+ {
143
+ "name": "security",
144
+ "color": "B60205",
145
+ "description": "Security vulnerability or hardening. Managed by ForgeDock."
146
+ },
147
+ {
148
+ "name": "performance",
149
+ "color": "F9D0C4",
150
+ "description": "Performance optimization or regression. Managed by ForgeDock."
151
+ }
152
+ ]
@@ -343,9 +343,11 @@ This step posts a structured `<!-- FORGE:AUDIT-AGENTS -->` summary comment to th
343
343
  **Step 4E.1 — Locate or create the tracking issue**:
344
344
 
345
345
  ```bash
346
- # Ensure the label exists before using it (gh issue create fails with GraphQL error if label is absent)
346
+ # Ensure the label exists before using it (gh issue create fails with GraphQL error if label is absent).
347
+ # Color and description match the canonical ForgeDock label manifest (bin/labels.json).
348
+ # Run `npx forgedock labels setup` to bootstrap all managed labels at once.
347
349
  gh label create "orchestration-metrics" -R {FORGE_REPO} \
348
- --color "5319E7" --description "Running log of persisted audit-agents efficiency summaries" \
350
+ --color "5319E7" --description "Running log of persisted audit-agents efficiency summaries. Managed by ForgeDock." \
349
351
  --force 2>/dev/null || true
350
352
 
351
353
  TRACKING_ISSUE=$(gh issue list -R {FORGE_REPO} \
@@ -56,9 +56,9 @@ gh issue list --state closed --json number,title,labels,closedAt \
56
56
  --jq '[.[] | select(.closedAt > "'$(date -u -d '3 days ago' +%Y-%m-%dT%H:%M:%SZ)'")] | length' 2>/dev/null || echo "0"
57
57
 
58
58
  # Open issue count by priority
59
- gh issue list --state open --label P0 --json number --jq 'length'
60
- gh issue list --state open --label P1 --json number --jq 'length'
61
- gh issue list --state open --label P2 --json number --jq 'length'
59
+ gh issue list --state open --label "priority:P0" --json number --jq 'length'
60
+ gh issue list --state open --label "priority:P1" --json number --jq 'length'
61
+ gh issue list --state open --label "priority:P2" --json number --jq 'length'
62
62
 
63
63
  # Stale issues (open, no workflow label, older than 7 days)
64
64
  gh issue list --state open --limit 200 --json number,title,labels,createdAt \
@@ -77,7 +77,7 @@ Store these as `BASELINE` metrics for the cycle report.
77
77
  ### 0B: Check for open P0s
78
78
 
79
79
  ```bash
80
- gh issue list --state open --label P0 --json number,title --jq '.[] | "#\(.number) \(.title)"'
80
+ gh issue list --state open --label "priority:P0" --json number,title --jq '.[] | "#\(.number) \(.title)"'
81
81
  ```
82
82
 
83
83
  If any P0 issues exist:
@@ -334,7 +334,7 @@ Pick the top `FIX_LIMIT` issues by this priority:
334
334
  ```bash
335
335
  # Get candidates
336
336
  gh issue list --state open --label "bug" --limit 50 --json number,title,labels,createdAt \
337
- --jq 'sort_by(.labels | map(select(.name | startswith("P"))) | .[0].name) | .[:{FIX_LIMIT}] | .[] | "#\(.number) \(.title)"'
337
+ --jq 'sort_by(.labels | map(select(.name | startswith("priority:P"))) | .[0].name) | .[:{FIX_LIMIT}] | .[] | "#\(.number) \(.title)"'
338
338
  ```
339
339
 
340
340
  ### 4B: Present fix plan to user
@@ -39,7 +39,7 @@ You are the pipeline's incident response coordinator. When production goes down
39
39
  gh issue view {NUMBER} --json number,title,body,labels,state,comments,assignees,createdAt
40
40
 
41
41
  # If "active" — find most recent open P0
42
- gh issue list --state open --label "P0" --limit 5 --json number,title,createdAt,labels \
42
+ gh issue list --state open --label "priority:P0" --limit 5 --json number,title,createdAt,labels \
43
43
  --jq 'sort_by(.createdAt) | reverse | .[0]'
44
44
  ```
45
45
 
@@ -738,7 +738,7 @@ for FINDING_NUM in {spawned_finding_numbers}; do
738
738
  FINDING_DATA=$(gh issue view $FINDING_NUM -R {GH_REPO} --json labels,title,body \
739
739
  --jq '{labels: [.labels[].name], title: .title, body: .body}')
740
740
 
741
- PRIORITY=$(echo "$FINDING_DATA" | jq -r '.labels[] | select(startswith("P")) | .' | head -1)
741
+ PRIORITY=$(echo "$FINDING_DATA" | jq -r '.labels[] | select(startswith("priority:P")) | ltrimstr("priority:")' | head -1)
742
742
  TITLE=$(echo "$FINDING_DATA" | jq -r '.title')
743
743
 
744
744
  # Heuristic 1: Generation check — source issue has review-finding label (always defer, even for P1/P2)
@@ -290,9 +290,11 @@ Keep ALL findings (CONFIRMED/LIKELY/POSSIBLE). Deduplicate by file:line (keep hi
290
290
 
291
291
  ### 7C: Ensure Labels
292
292
  ```bash
293
- gh label create "review-finding" --color "D93F0B" --force 2>/dev/null
294
- gh label create "needs-validation" --color "FBCA04" --force 2>/dev/null
295
- gh label create "staging-review" --color "1D76DB" --force 2>/dev/null
293
+ # Colors match the canonical ForgeDock label manifest (bin/labels.json).
294
+ # Run `npx forgedock labels setup` to bootstrap all managed labels at once.
295
+ gh label create "review-finding" --color "D93F0B" --description "Defect or improvement found during automated PR review. Managed by ForgeDock." --force -R {GH_REPO} 2>/dev/null
296
+ gh label create "needs-validation" --color "FBCA04" --description "Review finding awaiting human validation. Managed by ForgeDock." --force -R {GH_REPO} 2>/dev/null
297
+ gh label create "staging-review" --color "1D76DB" --description "Finding from a staging branch review before deploy to main. Managed by ForgeDock." --force -R {GH_REPO} 2>/dev/null
296
298
  ```
297
299
 
298
300
  ### 7D: Milestone Detection
@@ -304,6 +306,50 @@ Check for open review-finding issues at same file:line → skip. Closed issues a
304
306
  ### 7F: Create Issues
305
307
  Sequential creation. Title: `Staging Review: {summary} (staging → main)`. Labels: review-finding, needs-validation, staging-review, P1/P2/P3. Body includes: source branch context (`staging`), code context, evidence, validation checklist.
306
308
 
309
+ **For each finding** (that passes dedup), create issue:
310
+ ```bash
311
+ ISSUE_NUM=$(gh issue create \
312
+ -R {GH_REPO} \
313
+ --title "chore: [summary] (staging review — PR #${PR_NUMBER})" \
314
+ --label "review-finding,needs-validation,staging-review,{priority}" \
315
+ --body "$(cat <<'ISSUE_EOF'
316
+ ## Problem
317
+
318
+ [One sentence: what bug or issue was found. Where it occurs (`file:line`) and what it causes.]
319
+
320
+ **Source**: PR #[PR_NUMBER] — [TITLE]
321
+ **Confidence**: [CONFIRMED/LIKELY/POSSIBLE]
322
+ **Severity**: [CRITICAL/HIGH/MEDIUM/LOW]
323
+ **Review comment**: [permalink to agent comment]
324
+
325
+ ## Affected Files
326
+
327
+ Files that need changes:
328
+ 1. `[file:line]` — [what needs to change to fix this finding]
329
+
330
+ ## Source Branch Context
331
+
332
+ **Code branch**: `staging`
333
+ **Worktree base**: `origin/staging`
334
+
335
+ > When fixing: `git worktree add ../fix-{slug} -b fix/{slug} origin/staging`
336
+
337
+ ## Code Context
338
+ [10 lines around finding]
339
+
340
+ ## Evidence
341
+ [From agent comment]
342
+
343
+ ## Acceptance Criteria
344
+
345
+ - [ ] Finding validated: VALIDATED / FALSE_POSITIVE / INCONCLUSIVE
346
+ - [ ] If VALIDATED: fix implemented and tested on correct branch
347
+ ISSUE_EOF
348
+ )" --json number --jq '.number')
349
+ ```
350
+
351
+ Labels: `review-finding` + `needs-validation` + `staging-review` + priority (`priority:P1` CONFIRMED, `priority:P2` LIKELY, `priority:P3` POSSIBLE).
352
+
307
353
  **No pre-filtering**: Every finding becomes an issue. Validation agents sort out false positives downstream.
308
354
 
309
355
  ### 7G: Add to Project Board
@@ -616,10 +616,12 @@ If still 0: review is clean — skip to Phase 7.
616
616
  ### 6C: Create Issues
617
617
 
618
618
  ```bash
619
- gh label create "review-finding" --color "D93F0B" --force 2>/dev/null
620
- gh label create "needs-validation" --color "FBCA04" --force 2>/dev/null
621
- gh label create "validated" --color "0E8A16" --force 2>/dev/null
622
- gh label create "false-positive" --color "CCCCCC" --force 2>/dev/null
619
+ # Colors match the canonical ForgeDock label manifest (bin/labels.json).
620
+ # Run `npx forgedock labels setup` to bootstrap all managed labels at once.
621
+ gh label create "review-finding" --color "D93F0B" --description "Defect or improvement found during automated PR review. Managed by ForgeDock." --force -R {GH_REPO} 2>/dev/null
622
+ gh label create "needs-validation" --color "FBCA04" --description "Review finding awaiting human validation. Managed by ForgeDock." --force -R {GH_REPO} 2>/dev/null
623
+ gh label create "validated" --color "0E8A16" --description "Review finding confirmed as a real issue. Managed by ForgeDock." --force -R {GH_REPO} 2>/dev/null
624
+ gh label create "false-positive" --color "CCCCCC" --description "Review finding dismissed as a false positive. Managed by ForgeDock." --force -R {GH_REPO} 2>/dev/null
623
625
  ```
624
626
 
625
627
  **Milestone detection:**
@@ -693,7 +695,7 @@ else
693
695
  ' 2>/dev/null | head -1)
694
696
  if [ -n "$REGRESSION" ]; then
695
697
  echo "REGRESSION: Previously fixed in #${REGRESSION} — elevating priority"
696
- # Create with regression warning and P1 priority
698
+ # Create with regression warning and priority:P1 label
697
699
  fi
698
700
  fi
699
701
  ```
@@ -701,7 +703,7 @@ fi
701
703
  **Rules:**
702
704
  - Open `review-finding` issue at same file within ±5 lines → **skip** (do not create duplicate)
703
705
  - Open `review-finding` issue at same file with similar title (3+ shared keywords) → **skip** (likely same finding despite line drift)
704
- - Closed `review-finding` at same file within ±5 lines → create with regression warning, elevate to P1
706
+ - Closed `review-finding` at same file within ±5 lines → create with regression warning, elevate to `priority:P1`
705
707
 
706
708
  **For each finding** (that passes dedup), create issue:
707
709
  ```bash
@@ -757,7 +759,7 @@ ISSUE_EOF
757
759
  )" --json number --jq '.number')
758
760
  ```
759
761
 
760
- Labels: `review-finding` + `needs-validation` + priority (`P1` CONFIRMED, `P2` LIKELY, `P3` POSSIBLE).
762
+ Labels: `review-finding` + `needs-validation` + priority (`priority:P1` CONFIRMED, `priority:P2` LIKELY, `priority:P3` POSSIBLE).
761
763
 
762
764
  **Add to project board:**
763
765
  ```bash
@@ -192,7 +192,7 @@ fi
192
192
 
193
193
  ```bash
194
194
  gh issue create --title "fix: {original_title} (reverted — needs new approach)" \
195
- --label "bug,P1" \
195
+ --label "bug,priority:P1" \
196
196
  --body "$(cat <<'BODY_EOF'
197
197
  ## Problem
198
198
 
@@ -7,7 +7,7 @@ argument-hint: [--repo <prefix>] [--phase 1|2|3|4|all] [--dry-run]
7
7
 
8
8
  **Input**: $ARGUMENTS
9
9
 
10
- You are the security posture auditor. Run a scripted 4-phase checklist against the **current state** of the target repository (not a PR diff). Each check uses bash/grep against repo files. Confirmed findings are posted as GitHub issues in the target repo, labeled `security,audit-finding,P1/P2/P3`.
10
+ You are the security posture auditor. Run a scripted 4-phase checklist against the **current state** of the target repository (not a PR diff). Each check uses bash/grep against repo files. Confirmed findings are posted as GitHub issues in the target repo, labeled `security,audit-finding,priority:P1/priority:P2/priority:P3`.
11
11
 
12
12
  This command is designed to be run:
13
13
  - **Manually** after a pen test engagement
@@ -119,7 +119,7 @@ done
119
119
 
120
120
  **Confirm**: For each hit, verify the port is NOT a web-facing port (80, 443, 8080, 3000). Ports like 6432 (PgBouncer), 6379 (Redis), 5432 (Postgres), 27017 (MongoDB) bound to `0.0.0.0` are confirmed findings.
121
121
 
122
- **Severity**: P1 if no external firewall documented; P2 otherwise.
122
+ **Severity**: `priority:P1` if no external firewall documented; `priority:P2` otherwise.
123
123
 
124
124
  **Issue title**: `security: {SERVICE} port {PORT} bound to 0.0.0.0 — exposed beyond localhost`
125
125
 
@@ -142,7 +142,7 @@ done
142
142
 
143
143
  **Confirm**: Check if the Dockerfile is for a long-running service (not a one-shot build image). If service container with no USER → confirmed finding.
144
144
 
145
- **Severity**: P2 (standard finding; exploitability depends on runtime isolation).
145
+ **Severity**: `priority:P2` (standard finding; exploitability depends on runtime isolation).
146
146
 
147
147
  **Issue title**: `security: {SERVICE} Dockerfile has no USER directive — runs as root`
148
148
 
@@ -167,7 +167,7 @@ done
167
167
 
168
168
  **Manual review**: Check for `POSTGRES_PASSWORD` and `requirepass` in compose environment sections. Flag any service using a blank/trivial password as a documented value.
169
169
 
170
- **Severity**: P3 for dev compose; P1 if the compose file is used in production.
170
+ **Severity**: `priority:P3` for dev compose; `priority:P1` if the compose file is used in production.
171
171
 
172
172
  **Issue title**: `security: {SERVICE} in {FILE} has no authentication configured`
173
173
 
@@ -198,7 +198,7 @@ done
198
198
 
199
199
  **Confirm**: Verify the flagged step is indeed a security scanner step (not a notification or deploy step). Confirmed if scanner produces failure exit codes that are being swallowed.
200
200
 
201
- **Severity**: P2 (scanner present but findings are silently ignored).
201
+ **Severity**: `priority:P2` (scanner present but findings are silently ignored).
202
202
 
203
203
  **Issue title**: `security: {SCANNER} step in {WORKFLOW} has continue-on-error: true — findings silently ignored`
204
204
 
@@ -219,7 +219,7 @@ done
219
219
 
220
220
  **Confirm**: Distinguish intentional comments (documentation) from disabled access control rules. Confirmed if the commented line is a functional directive that would restrict access.
221
221
 
222
- **Severity**: P1 if the endpoint is publicly accessible; P2 otherwise.
222
+ **Severity**: `priority:P1` if the endpoint is publicly accessible; `priority:P2` otherwise.
223
223
 
224
224
  **Issue title**: `security: commented-out access control in {FILE} — {DIRECTIVE} disabled`
225
225
 
@@ -242,7 +242,7 @@ done
242
242
 
243
243
  **Confirm**: Verify the CSP header applies to the production site (not just dev/storybook). Check if a nonce-based approach is already in use (nonce + unsafe-inline is still a finding but lower severity).
244
244
 
245
- **Severity**: P2 (XSS protection materially weakened).
245
+ **Severity**: `priority:P2` (XSS protection materially weakened).
246
246
 
247
247
  **Issue title**: `security: CSP script-src includes unsafe-inline in {FILE} — XSS protection bypassed`
248
248
 
@@ -261,9 +261,9 @@ for f in $HEADER_FILES; do
261
261
  done
262
262
  ```
263
263
 
264
- **Confirm**: Check if the header is set in a response (not just read). If set in outbound responses → confirmed finding. Internal-only APIs (not publicly routed) are P3; public APIs are P2.
264
+ **Confirm**: Check if the header is set in a response (not just read). If set in outbound responses → confirmed finding. Internal-only APIs (not publicly routed) are `priority:P3`; public APIs are `priority:P2`.
265
265
 
266
- **Severity**: P2 for public APIs; P3 for internal.
266
+ **Severity**: `priority:P2` for public APIs; `priority:P3` for internal.
267
267
 
268
268
  **Issue title**: `security: {HEADER} response header leaks deployment/version information`
269
269
 
@@ -291,7 +291,7 @@ grep -rn '@router.get\("/health"\|@app.route("/health"\|@router.get\("/metrics"\
291
291
 
292
292
  **Confirm**: Manually verify the route has no authentication dependency. Check if it's behind a network-level gate (traefik middleware, nginx ACL). Confirmed if publicly routable and returns system state.
293
293
 
294
- **Severity**: P2 (information disclosure enables targeted attacks).
294
+ **Severity**: `priority:P2` (information disclosure enables targeted attacks).
295
295
 
296
296
  **Issue title**: `security: unauthenticated {ROUTE} endpoint exposes system state`
297
297
 
@@ -326,7 +326,7 @@ grep -rn "new Map\(\)" "$REPO_PATH/web" --include="*.ts" --include="*.tsx" --inc
326
326
 
327
327
  **Confirm**: Verify the rate limiter is not backed by Redis, a database, or a distributed cache. Confirmed if per-process store with no TTL-based external backend.
328
328
 
329
- **Severity**: P2 (rate limit bypass possible in scaled deployments).
329
+ **Severity**: `priority:P2` (rate limit bypass possible in scaled deployments).
330
330
 
331
331
  **Issue title**: `security: in-memory rate limiter in {FILE} has no cross-replica enforcement`
332
332
 
@@ -363,9 +363,9 @@ grep -rn "document\.cookie\s*=\|res\.cookie(" "$REPO_PATH/web" --include="*.ts"
363
363
  done
364
364
  ```
365
365
 
366
- **Confirm**: Verify the cookie stores user-controlled data or authentication state. Internal-only cookies (debug flags, feature flags with no sensitive data) are P3. Auth/session cookies without flags are P1.
366
+ **Confirm**: Verify the cookie stores user-controlled data or authentication state. Internal-only cookies (debug flags, feature flags with no sensitive data) are `priority:P3`. Auth/session cookies without flags are `priority:P1`.
367
367
 
368
- **Severity**: P1 for auth/session tokens; P2 for user-controlled data; P3 for non-sensitive cookies.
368
+ **Severity**: `priority:P1` for auth/session tokens; `priority:P2` for user-controlled data; `priority:P3` for non-sensitive cookies.
369
369
 
370
370
  **Issue title**: `security: {COOKIE_NAME} cookie missing {FLAGS} — vulnerable to XSS/CSRF/MITM`
371
371
 
@@ -395,7 +395,7 @@ grep -rn '||\s*["'"'"'][a-zA-Z0-9]\{4,\}["'"'"']\|default.*password\|default.*se
395
395
 
396
396
  **Confirm**: Verify the fallback value is a real credential (not a placeholder like `""` or `"REPLACE_ME"` which would fail explicitly). Confirmed if a non-trivial value would silently succeed authentication.
397
397
 
398
- **Severity**: P1 if the credential protects a production service; P2 otherwise.
398
+ **Severity**: `priority:P1` if the credential protects a production service; `priority:P2` otherwise.
399
399
 
400
400
  **Issue title**: `security: credential placeholder fallback in {FILE} — {VAR} defaults to hardcoded value`
401
401
 
@@ -445,7 +445,7 @@ done
445
445
 
446
446
  **Confirm**: Verify the event type appears in a handler dispatch (not just a comment). Confirmed if the event would change user entitlements or financial state but has no handler.
447
447
 
448
- **Severity**: P1 for events that affect billing state (subscription.deleted, payment_failed, dispute); P2 for informational events.
448
+ **Severity**: `priority:P1` for events that affect billing state (subscription.deleted, payment_failed, dispute); `priority:P2` for informational events.
449
449
 
450
450
  **Issue title**: `security: Stripe event {EVENT_TYPE} not handled in {FILE} — financial state may diverge`
451
451
 
@@ -466,7 +466,7 @@ grep -rn "pre_reserve\|prereserve\|reserve_credits\|MAX_COST\|max_cost\|PRE_RESE
466
466
 
467
467
  **Manual review required**: Compare the pre-reserve amount against the maximum operation cost for the highest-tier model. If pre-reserve < max possible cost, users can overdraw.
468
468
 
469
- **Severity**: P2 (financial loss; users can consume credits they don't have).
469
+ **Severity**: `priority:P2` (financial loss; users can consume credits they don't have).
470
470
 
471
471
  **Issue title**: `security: pre-reservation credit cap {AMOUNT} is below maximum operation cost {MAX_COST}`
472
472
 
@@ -483,8 +483,8 @@ After all phases complete, produce a summary table:
483
483
 
484
484
  | # | Phase | Finding | File | Severity | Status |
485
485
  |---|-------|---------|------|----------|--------|
486
- | 1 | 1A | Port binding | docker-compose.prod.yml:12 | P1 | CONFIRMED |
487
- | 2 | 1B | No USER directive | services/worker/Dockerfile | P2 | CONFIRMED |
486
+ | 1 | 1A | Port binding | docker-compose.prod.yml:12 | priority:P1 | CONFIRMED |
487
+ | 2 | 1B | No USER directive | services/worker/Dockerfile | priority:P2 | CONFIRMED |
488
488
  ...
489
489
  ```
490
490
 
@@ -492,12 +492,14 @@ If `--dry-run` was passed, print the table and STOP. Do not create issues.
492
492
 
493
493
  ### 5B: Ensure labels exist in target repo
494
494
 
495
- Before creating any issues, ensure all required labels exist:
495
+ Before creating any issues, ensure all required labels exist. Colors match the canonical ForgeDock label manifest (`bin/labels.json`). Run `npx forgedock labels setup` to bootstrap all managed labels at once.
496
496
 
497
497
  ```bash
498
- for label in "security" "audit-finding" "P1" "P2" "P3"; do
499
- gh label create "$label" --color "d73a4a" --force -R "{GH_REPO}" 2>/dev/null || true
500
- done
498
+ gh label create "security" --color "B60205" --description "Security vulnerability or hardening. Managed by ForgeDock." --force -R "{GH_REPO}" 2>/dev/null || true
499
+ gh label create "audit-finding" --color "D93F0B" --description "Security or compliance defect found during audit. Managed by ForgeDock." --force -R "{GH_REPO}" 2>/dev/null || true
500
+ gh label create "priority:P1" --color "D93F0B" --description "High priority — major feature broken, no workaround. Managed by ForgeDock." --force -R "{GH_REPO}" 2>/dev/null || true
501
+ gh label create "priority:P2" --color "FBCA04" --description "Medium priority — impaired functionality, workaround exists. Managed by ForgeDock." --force -R "{GH_REPO}" 2>/dev/null || true
502
+ gh label create "priority:P3" --color "C2E0C6" --description "Low priority — minor issue or polish. Managed by ForgeDock." --force -R "{GH_REPO}" 2>/dev/null || true
501
503
  ```
502
504
 
503
505
  ### 5C: Create GitHub issues for CONFIRMED findings
@@ -559,9 +561,9 @@ gh issue comment "{CALLER_ISSUE}" -R {FORGE_REPO} --body "$(cat <<'COMMENT_EOF'
559
561
 
560
562
  | Severity | Count |
561
563
  |----------|-------|
562
- | P1 | {P1_COUNT} |
563
- | P2 | {P2_COUNT} |
564
- | P3 | {P3_COUNT} |
564
+ | priority:P1 | {P1_COUNT} |
565
+ | priority:P2 | {P2_COUNT} |
566
+ | priority:P3 | {P3_COUNT} |
565
567
 
566
568
  ### Issues Created
567
569
 
@@ -217,7 +217,7 @@ Create issues in the affected repos:
217
217
  # For satellite repos (separate GitHub repos):
218
218
  gh issue create -R {TARGET_REPO} \
219
219
  --title "feat(sync): {description of what API change needs to be reflected}" \
220
- --label "feature,P2" \
220
+ --label "feature,priority:P2" \
221
221
  --body "$(cat <<'BODY_EOF'
222
222
  ## Problem
223
223
 
@@ -254,7 +254,7 @@ BODY_EOF
254
254
  # For monorepo issues (SDKs, packages inside a single repo):
255
255
  gh issue create \
256
256
  --title "feat(sync): {description of what API change needs to be reflected}" \
257
- --label "feature,P2" \
257
+ --label "feature,priority:P2" \
258
258
  --body "$(cat <<'BODY_EOF'
259
259
  ## Problem
260
260