@windyroad/itil 1.2.0 → 2.0.0-preview.1111
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/.agents/plugins/marketplace.json +12 -0
- package/.claude-plugin/plugin.json +1 -1
- package/.codex-plugin/plugin.json +42 -0
- package/README.md +34 -25
- package/agents/hang-off-check.md +34 -34
- package/bin/install.mjs +71 -5
- package/bin/wr-itil-catchup-scan +4 -4
- package/bin/wr-itil-check-deferred-placeholder-staleness +4 -4
- package/bin/wr-itil-check-fail-soft-skip-discipline +4 -4
- package/bin/wr-itil-check-fix-rfc-trace +4 -4
- package/bin/wr-itil-check-locale-discipline +4 -4
- package/bin/wr-itil-check-outbound-responses-staleness +4 -4
- package/bin/wr-itil-check-problems-readme-budget +4 -4
- package/bin/wr-itil-check-rfc-has-stories +4 -4
- package/bin/wr-itil-check-rfc-stories-ratified +4 -4
- package/bin/wr-itil-check-ticket-jtbd-ratification +4 -4
- package/bin/wr-itil-check-upstream-cache-staleness +4 -4
- package/bin/wr-itil-check-upstream-responses +4 -4
- package/bin/wr-itil-classify-readme-drift +4 -4
- package/bin/wr-itil-derive-release-vehicle +4 -4
- package/bin/wr-itil-detect-unratified-stories-maps +4 -4
- package/bin/wr-itil-effort-tally +4 -4
- package/bin/wr-itil-enumerate-postrelease-kv-candidates +4 -4
- package/bin/wr-itil-evaluate-relevance +4 -4
- package/bin/wr-itil-mark-create-gate +4 -4
- package/bin/wr-itil-mark-story-oversight-confirmed +4 -4
- package/bin/wr-itil-migrate-problems-layout +4 -4
- package/bin/wr-itil-migrate-story-status-mirror +4 -4
- package/bin/wr-itil-next-rfc-id +4 -4
- package/bin/wr-itil-plugin-exercise-index +4 -4
- package/bin/wr-itil-plugin-maturity-populate +4 -4
- package/bin/wr-itil-plugin-maturity-render +4 -4
- package/bin/wr-itil-plugin-validate-ci-gate +4 -4
- package/bin/wr-itil-reconcile-readme +4 -4
- package/bin/wr-itil-reconcile-rfcs +4 -4
- package/bin/wr-itil-reconcile-stories +4 -4
- package/bin/wr-itil-reconcile-story-maps +4 -4
- package/bin/wr-itil-render-story-map +4 -4
- package/bin/wr-itil-resolve-governance-plugin-dirs +4 -4
- package/bin/wr-itil-skill-invocations +4 -4
- package/bin/wr-itil-story-map-edit +4 -4
- package/bin/wr-itil-story-map-query +4 -4
- package/bin/wr-itil-update-jtbd-references-section +4 -4
- package/bin/wr-itil-update-problem-references-section +4 -4
- package/bin/wr-itil-update-problem-rfcs-section +4 -4
- package/bin/wr-itil-update-rfc-commits-section +4 -4
- package/bin/wr-itil-update-rfc-references-section +4 -4
- package/bin/wr-itil-verify-iter-summary +4 -4
- package/hooks/itil-assistant-output-gate.sh +3 -3
- package/hooks/itil-assistant-output-review.sh +5 -5
- package/hooks/itil-bash-polling-antipattern-detect.sh +11 -11
- package/hooks/itil-changeset-discipline.sh +24 -24
- package/hooks/itil-claude-space-protection.sh +21 -14
- package/hooks/itil-codex-dispatch.sh +164 -0
- package/hooks/itil-commit-trailer-transition-advisory.sh +11 -11
- package/hooks/itil-correction-detect.sh +8 -8
- package/hooks/itil-deferral-cadence-gate.sh +23 -23
- package/hooks/itil-fictional-defer-detect.sh +16 -16
- package/hooks/itil-fix-title-lifecycle-advisory.sh +11 -11
- package/hooks/itil-mid-loop-ask-detect.sh +14 -14
- package/hooks/itil-no-implement-draft-gate.sh +18 -18
- package/hooks/itil-pending-questions-surface.sh +11 -11
- package/hooks/itil-readme-refresh-discipline.sh +27 -27
- package/hooks/itil-rfc-oversight-nudge.sh +7 -7
- package/hooks/itil-rfc-trailer-advisory.sh +28 -28
- package/hooks/itil-runtime-sid-marker.sh +11 -11
- package/hooks/itil-story-mirror-migration-nudge.sh +7 -7
- package/hooks/lib/block-list.sh +17 -17
- package/hooks/lib/changeset-detect.sh +27 -27
- package/hooks/lib/claude-space-gate.sh +23 -15
- package/hooks/lib/command-detect.sh +12 -12
- package/hooks/lib/create-gate.sh +9 -39
- package/hooks/lib/detectors.sh +12 -12
- package/hooks/lib/readme-refresh-detect.sh +51 -51
- package/hooks/lib/runtime-sid.sh +12 -12
- package/hooks/lib/session-id.sh +28 -28
- package/hooks/lib/session-marker.sh +1 -1
- package/hooks/lib/staging-detect.sh +13 -13
- package/hooks/manage-problem-enforce-create.sh +16 -27
- package/hooks/p057-staging-trap-detect.sh +18 -18
- package/hooks/pre-publish-intake-gate.sh +5 -5
- package/hooks/staleness-check.sh +6 -6
- package/hooks-codex/hooks.json +57 -0
- package/lib/check-deferred-placeholder-staleness.sh +10 -10
- package/lib/check-outbound-responses-staleness.sh +2 -2
- package/lib/check-upstream-cache-staleness.sh +2 -2
- package/lib/derive-first-dispatch.sh +19 -19
- package/lib/enumerate-postrelease-kv-candidates.sh +18 -18
- package/lib/migrate-problems-layout.sh +12 -12
- package/lib/story-oversight.sh +27 -27
- package/package.json +16 -3
- package/scripts/catchup-scan.sh +25 -25
- package/scripts/check-fail-soft-skip-discipline.sh +10 -10
- package/scripts/check-fix-rfc-trace.sh +8 -8
- package/scripts/check-locale-discipline.sh +13 -13
- package/scripts/check-problems-readme-budget.sh +12 -12
- package/scripts/check-rfc-has-stories.sh +7 -7
- package/scripts/check-rfc-rejected-alternatives.sh +11 -11
- package/scripts/check-rfc-stories-ratified.sh +9 -9
- package/scripts/check-ticket-jtbd-ratification.sh +10 -10
- package/scripts/check-upstream-responses.sh +22 -22
- package/scripts/classify-readme-drift.sh +13 -13
- package/scripts/codex-agent.mjs +104 -0
- package/scripts/derive-release-vehicle.sh +23 -23
- package/scripts/detect-unoversighted-rfcs.sh +3 -3
- package/scripts/detect-unratified-stories-maps.sh +5 -5
- package/scripts/effort-tally.sh +10 -10
- package/scripts/evaluate-relevance.sh +16 -16
- package/scripts/mark-create-gate.sh +4 -4
- package/scripts/mark-story-oversight-confirmed.sh +14 -14
- package/scripts/migrate-story-status-mirror.sh +6 -6
- package/scripts/next-rfc-id.sh +5 -5
- package/scripts/plugin-exercise-index.sh +26 -26
- package/scripts/plugin-maturity-populate.sh +38 -38
- package/scripts/plugin-maturity-render.sh +26 -26
- package/scripts/plugin-validate-ci-gate.sh +14 -14
- package/scripts/reconcile-readme.sh +23 -23
- package/scripts/reconcile-rfcs.sh +13 -13
- package/scripts/reconcile-stories.sh +12 -12
- package/scripts/reconcile-story-maps.sh +6 -6
- package/scripts/render-story-map.mjs +24 -24
- package/scripts/render-story-map.sh +3 -3
- package/scripts/resolve-governance-plugin-dirs.sh +10 -10
- package/scripts/run-check-deferred-placeholder-staleness.sh +3 -3
- package/scripts/run-check-outbound-responses-staleness.sh +3 -3
- package/scripts/run-check-upstream-cache-staleness.sh +3 -3
- package/scripts/run-enumerate-postrelease-kv-candidates.sh +3 -3
- package/scripts/run-migrate-problems-layout.sh +3 -3
- package/scripts/skill-invocations.sh +29 -29
- package/scripts/story-map-edit.mjs +6 -6
- package/scripts/story-map-edit.sh +3 -3
- package/scripts/story-map-query.mjs +8 -8
- package/scripts/story-map-query.sh +3 -3
- package/scripts/update-jtbd-references-section.sh +8 -8
- package/scripts/update-problem-references-section.sh +12 -12
- package/scripts/update-problem-rfcs-section.sh +9 -9
- package/scripts/update-rfc-commits-section.sh +7 -7
- package/scripts/update-rfc-references-section.sh +3 -3
- package/scripts/update-story-references-section.sh +5 -5
- package/scripts/verify-iter-summary.sh +3 -3
- package/skills/capture-problem/REFERENCE.md +33 -33
- package/skills/capture-problem/SKILL.md +108 -108
- package/skills/capture-problem/agents/openai.yaml +3 -0
- package/skills/capture-rfc/SKILL.md +21 -323
- package/skills/capture-rfc/agents/openai.yaml +3 -0
- package/skills/capture-story/SKILL.md +65 -65
- package/skills/capture-story/agents/openai.yaml +3 -0
- package/skills/capture-story-map/SKILL.md +31 -31
- package/skills/capture-story-map/agents/openai.yaml +3 -0
- package/skills/check-upstream-responses/SKILL.md +38 -38
- package/skills/check-upstream-responses/agents/openai.yaml +3 -0
- package/skills/close-incident/SKILL.md +25 -25
- package/skills/close-incident/agents/openai.yaml +3 -0
- package/skills/link-incident/SKILL.md +22 -22
- package/skills/link-incident/agents/openai.yaml +3 -0
- package/skills/list-incidents/SKILL.md +9 -9
- package/skills/list-incidents/agents/openai.yaml +3 -0
- package/skills/list-problems/SKILL.md +17 -17
- package/skills/list-problems/agents/openai.yaml +3 -0
- package/skills/list-stories/SKILL.md +23 -23
- package/skills/list-stories/agents/openai.yaml +3 -0
- package/skills/list-story-maps/SKILL.md +9 -9
- package/skills/list-story-maps/agents/openai.yaml +3 -0
- package/skills/manage-incident/SKILL.md +59 -59
- package/skills/manage-incident/agents/openai.yaml +3 -0
- package/skills/manage-problem/SKILL.md +222 -222
- package/skills/manage-problem/agents/openai.yaml +3 -0
- package/skills/manage-rfc/SKILL.md +62 -62
- package/skills/manage-rfc/agents/openai.yaml +3 -0
- package/skills/manage-story/SKILL.md +49 -49
- package/skills/manage-story/agents/openai.yaml +3 -0
- package/skills/manage-story-map/SKILL.md +30 -30
- package/skills/manage-story-map/agents/openai.yaml +3 -0
- package/skills/mitigate-incident/SKILL.md +40 -40
- package/skills/mitigate-incident/agents/openai.yaml +3 -0
- package/skills/reconcile-readme/SKILL.md +28 -28
- package/skills/reconcile-readme/agents/openai.yaml +3 -0
- package/skills/reconcile-stories/SKILL.md +17 -17
- package/skills/reconcile-stories/agents/openai.yaml +3 -0
- package/skills/reconcile-story-maps/SKILL.md +11 -11
- package/skills/reconcile-story-maps/agents/openai.yaml +3 -0
- package/skills/report-upstream/SKILL.md +73 -73
- package/skills/report-upstream/agents/openai.yaml +3 -0
- package/skills/restore-incident/SKILL.md +28 -28
- package/skills/restore-incident/agents/openai.yaml +3 -0
- package/skills/review-problems/SKILL.md +129 -129
- package/skills/review-problems/agents/openai.yaml +3 -0
- package/skills/scaffold-intake/SKILL.md +26 -26
- package/skills/scaffold-intake/agents/openai.yaml +3 -0
- package/skills/transition-problem/SKILL.md +85 -85
- package/skills/transition-problem/agents/openai.yaml +3 -0
- package/skills/transition-problems/SKILL.md +69 -69
- package/skills/transition-problems/agents/openai.yaml +3 -0
- package/skills/update-upstream/SKILL.md +97 -97
- package/skills/update-upstream/agents/openai.yaml +3 -0
- package/skills/work-problem/SKILL.md +42 -42
- package/skills/work-problem/agents/openai.yaml +3 -0
- package/skills/work-problems/SKILL.md +327 -327
- package/skills/work-problems/agents/openai.yaml +3 -0
- package/skills-codex/capture-problem/REFERENCE.md +139 -0
- package/skills-codex/capture-problem/SKILL.md +438 -0
- package/skills-codex/capture-problem/agents/openai.yaml +3 -0
- package/skills-codex/capture-rfc/SKILL.md +45 -0
- package/skills-codex/capture-rfc/agents/openai.yaml +3 -0
- package/skills-codex/capture-story/SKILL.md +407 -0
- package/skills-codex/capture-story/agents/openai.yaml +3 -0
- package/skills-codex/capture-story-map/SKILL.md +286 -0
- package/skills-codex/capture-story-map/agents/openai.yaml +3 -0
- package/skills-codex/check-upstream-responses/SKILL.md +160 -0
- package/skills-codex/check-upstream-responses/agents/openai.yaml +3 -0
- package/skills-codex/close-incident/SKILL.md +192 -0
- package/skills-codex/close-incident/agents/openai.yaml +3 -0
- package/skills-codex/link-incident/SKILL.md +173 -0
- package/skills-codex/link-incident/agents/openai.yaml +3 -0
- package/skills-codex/list-incidents/SKILL.md +92 -0
- package/skills-codex/list-incidents/agents/openai.yaml +3 -0
- package/skills-codex/list-problems/SKILL.md +126 -0
- package/skills-codex/list-problems/agents/openai.yaml +3 -0
- package/skills-codex/list-stories/SKILL.md +170 -0
- package/skills-codex/list-stories/agents/openai.yaml +3 -0
- package/skills-codex/list-story-maps/SKILL.md +104 -0
- package/skills-codex/list-story-maps/agents/openai.yaml +3 -0
- package/skills-codex/manage-incident/SKILL.md +378 -0
- package/skills-codex/manage-incident/agents/openai.yaml +3 -0
- package/skills-codex/manage-problem/SKILL.md +1180 -0
- package/skills-codex/manage-problem/agents/openai.yaml +3 -0
- package/skills-codex/manage-rfc/SKILL.md +314 -0
- package/skills-codex/manage-rfc/agents/openai.yaml +3 -0
- package/skills-codex/manage-story/SKILL.md +284 -0
- package/skills-codex/manage-story/agents/openai.yaml +3 -0
- package/skills-codex/manage-story-map/SKILL.md +198 -0
- package/skills-codex/manage-story-map/agents/openai.yaml +3 -0
- package/skills-codex/mitigate-incident/SKILL.md +239 -0
- package/skills-codex/mitigate-incident/agents/openai.yaml +3 -0
- package/skills-codex/reconcile-readme/SKILL.md +175 -0
- package/skills-codex/reconcile-readme/agents/openai.yaml +3 -0
- package/skills-codex/reconcile-stories/SKILL.md +124 -0
- package/skills-codex/reconcile-stories/agents/openai.yaml +3 -0
- package/skills-codex/reconcile-story-maps/SKILL.md +81 -0
- package/skills-codex/reconcile-story-maps/agents/openai.yaml +3 -0
- package/skills-codex/report-upstream/SKILL.md +716 -0
- package/skills-codex/report-upstream/agents/openai.yaml +3 -0
- package/skills-codex/restore-incident/SKILL.md +216 -0
- package/skills-codex/restore-incident/agents/openai.yaml +3 -0
- package/skills-codex/review-problems/SKILL.md +524 -0
- package/skills-codex/review-problems/agents/openai.yaml +3 -0
- package/skills-codex/scaffold-intake/SKILL.md +209 -0
- package/skills-codex/scaffold-intake/agents/openai.yaml +3 -0
- package/skills-codex/scaffold-intake/templates/CONTRIBUTING.md.tmpl +31 -0
- package/skills-codex/scaffold-intake/templates/SECURITY.md.tmpl +39 -0
- package/skills-codex/scaffold-intake/templates/SUPPORT.md.tmpl +32 -0
- package/skills-codex/scaffold-intake/templates/config.yml.tmpl +8 -0
- package/skills-codex/scaffold-intake/templates/problem-report.yml.tmpl +114 -0
- package/skills-codex/transition-problem/SKILL.md +371 -0
- package/skills-codex/transition-problem/agents/openai.yaml +3 -0
- package/skills-codex/transition-problems/SKILL.md +310 -0
- package/skills-codex/transition-problems/agents/openai.yaml +3 -0
- package/skills-codex/update-upstream/SKILL.md +583 -0
- package/skills-codex/update-upstream/agents/openai.yaml +3 -0
- package/skills-codex/work-problem/SKILL.md +160 -0
- package/skills-codex/work-problem/agents/openai.yaml +3 -0
- package/skills-codex/work-problems/SKILL.md +58 -0
- package/skills-codex/work-problems/agents/openai.yaml +3 -0
- package/templates/story-map.css +1 -1
- package/bin/wr-itil-mark-rfc-capture-gate +0 -51
- package/scripts/mark-rfc-capture-gate.sh +0 -32
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wr-itil:scaffold-intake
|
|
3
|
+
description: Scaffold the four OSS intake surfaces (.github/ISSUE_TEMPLATE/, SECURITY.md, SUPPORT.md, CONTRIBUTING.md) for a downstream project that adopts @windyroad/itil. Idempotent, foreground-synchronous, and respects the "Gate Marker Lifecycle: TTL + Drift, Not Stop-Hook Reset" architecture rule marker semantics. Implements the contract in the "Scaffold downstream OSS intake — skill + layered triggers" architecture rule.
|
|
4
|
+
allowed-tools: Read, Write, Edit, Bash, Glob, Grep, request_user_input
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
<!-- Generated from the runtime-neutral skill source. Do not edit. -->
|
|
8
|
+
|
|
9
|
+
> Codex runtime note: use `request_user_input` only where this contract
|
|
10
|
+
> explicitly requires a human decision. Resolve `<itil-plugin-root>` from
|
|
11
|
+
> this installed `SKILL.md`: it is two directories above the skill
|
|
12
|
+
> directory. Run bundled commands from `<itil-plugin-root>/bin/`; do not
|
|
13
|
+
> search the adopter repository or rely on those commands being on `PATH`.
|
|
14
|
+
> Spawn `wr-itil:hang-off-check` with the native Codex subagent tool, wait
|
|
15
|
+
> for it, and close that same agent.
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# Scaffold Intake — Downstream OSS Intake Skill
|
|
19
|
+
|
|
20
|
+
Scaffold the five intake files every project in the Windy Road ecosystem needs to receive structured problem reports and route security disclosure properly:
|
|
21
|
+
|
|
22
|
+
- `.github/ISSUE_TEMPLATE/config.yml`
|
|
23
|
+
- `.github/ISSUE_TEMPLATE/problem-report.yml`
|
|
24
|
+
- `SECURITY.md`
|
|
25
|
+
- `SUPPORT.md`
|
|
26
|
+
- `CONTRIBUTING.md`
|
|
27
|
+
|
|
28
|
+
Templates are seeded from this repo's the "Problem 066: Intake templates split bug / feature instead of a problem-first template — misaligned with ITIL problem management" problem-corrected problem-first intake set and are substituted with per-project values for project name, repository URL, plugin list, and security-contact path.
|
|
29
|
+
|
|
30
|
+
This skill implements the contract in [the "Scaffold downstream OSS intake — skill + layered triggers" architecture rule](../../../../docs/decisions/036-scaffold-downstream-oss-intake.proposed.md) (Scaffold downstream OSS intake — skill + layered triggers). It is the reciprocal of [`/wr-itil:report-upstream`](../report-upstream/SKILL.md) — that skill files reports against upstream intake; this skill creates the intake surface so a downstream project can be a target.
|
|
31
|
+
|
|
32
|
+
## Pattern
|
|
33
|
+
|
|
34
|
+
This skill is **foreground-synchronous** per [the "Governance skill invocation patterns — foreground + background with deferred-question resumption" architecture rule](../../../../docs/decisions/032-governance-skill-invocation-patterns.proposed.md) (Governance skill invocation patterns). Scaffolding writes files into the project that the user normally wants to review before they commit; the wrapped-pattern subagent shape would defeat that review. The skill commits its own work per [the "Governance Skills Commit Their Own Completed Work" architecture rule](../../../../docs/decisions/014-governance-skills-commit-their-own-work.proposed.md).
|
|
35
|
+
|
|
36
|
+
## Invocation
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
/wr-itil:scaffold-intake [--dry-run] [--force] [--project-name <name>] [--project-url <url>] [--security-contact <path>] [--ci]
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
| Flag | Effect |
|
|
43
|
+
|---|---|
|
|
44
|
+
| `--dry-run` | Preview the files that would be scaffolded; no writes. |
|
|
45
|
+
| `--force` | Overwrite present files after a diff-and-replace prompt. Off by default — present files are reported as "already present" and skipped. |
|
|
46
|
+
| `--project-name <name>` | Override auto-detected project name (default: `package.json` `name`, fallback to repo dirname). |
|
|
47
|
+
| `--project-url <url>` | Override auto-detected repository URL (default: `package.json` `repository.url`, fallback to `git remote get-url origin`). |
|
|
48
|
+
| `--security-contact <path>` | Override the security-disclosure path written into SECURITY.md (default: `Use GitHub Security Advisories`). |
|
|
49
|
+
| `--ci` | Also emit `.github/workflows/intake-check.yml` (Trigger 3, optional). |
|
|
50
|
+
|
|
51
|
+
## Steps
|
|
52
|
+
|
|
53
|
+
### 1. Detect project metadata
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
PROJECT_NAME=$(node -p "require('./package.json').name" 2>/dev/null || basename "$PWD")
|
|
57
|
+
PROJECT_URL=$(node -p "require('./package.json').repository?.url || ''" 2>/dev/null \
|
|
58
|
+
| sed -E 's|^git\+||; s|\.git$||' \
|
|
59
|
+
|| git remote get-url origin 2>/dev/null \
|
|
60
|
+
|| echo "")
|
|
61
|
+
YEAR=$(date +%Y)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
`--project-name` and `--project-url` flags override the auto-detected values when supplied. `package.json` shapes vary across adopters; if detection produces empty values, surface a clear error suggesting the override flags rather than substituting an empty token.
|
|
65
|
+
|
|
66
|
+
Plugin list: enumerate installed `@windyroad/*` packages from `.codex-plugin/plugin.json` (if present) or from `package.json` dev-dependencies. Used for the SUPPORT.md "affected plugin or component" enumeration.
|
|
67
|
+
|
|
68
|
+
### 2. Enumerate target paths
|
|
69
|
+
|
|
70
|
+
Required intake files (per the "Scaffold downstream OSS intake — skill + layered triggers" architecture rule Detection step 5):
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
.github/ISSUE_TEMPLATE/config.yml
|
|
74
|
+
.github/ISSUE_TEMPLATE/problem-report.yml
|
|
75
|
+
SECURITY.md
|
|
76
|
+
SUPPORT.md
|
|
77
|
+
CONTRIBUTING.md
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
For each path: classify as **missing**, **present-and-current** (template-substituted output matches existing file content), or **present-and-outdated** (existing differs from substituted template).
|
|
81
|
+
|
|
82
|
+
### 3. request_user_input: which files to scaffold (foreground only)
|
|
83
|
+
|
|
84
|
+
In foreground (interactive) mode, fire `request_user_input` per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 1 with options scoped to the missing set:
|
|
85
|
+
|
|
86
|
+
- **Scaffold all missing** — write every absent template, skip present files.
|
|
87
|
+
- **Scaffold with review** — preview each substituted template before writing.
|
|
88
|
+
- **Dry-run** — preview only, no writes.
|
|
89
|
+
- **Cancel** — exit without action.
|
|
90
|
+
|
|
91
|
+
If `--force` is set AND outdated-present files exist, the prompt offers a fifth option for diff-and-replace per file. Architect direction (2026-04-26): keep the prompt one-shot when missing list is small; per-file prompts only when the user explicitly opts into review.
|
|
92
|
+
|
|
93
|
+
### 4. Substitute templates and write files
|
|
94
|
+
|
|
95
|
+
Templates live in `templates/` adjacent to this SKILL.md. Substitution is mustache-style — no runtime dependency:
|
|
96
|
+
|
|
97
|
+
| Token | Value source |
|
|
98
|
+
|---|---|
|
|
99
|
+
| `{{project_name}}` | Detected or `--project-name` flag. |
|
|
100
|
+
| `{{project_url}}` | Detected or `--project-url` flag. |
|
|
101
|
+
| `{{plugin_list}}` | Comma-separated installed `@windyroad/*` plugins. |
|
|
102
|
+
| `{{security_contact}}` | Detected from existing SECURITY.md (when only that file is present); else `--security-contact` flag; fallback `Use GitHub Security Advisories`. |
|
|
103
|
+
| `{{year}}` | `date +%Y` at scaffold time. |
|
|
104
|
+
|
|
105
|
+
`sed` substitution sketch (idempotent, no runtime tooling):
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
sed \
|
|
109
|
+
-e "s|{{project_name}}|$PROJECT_NAME|g" \
|
|
110
|
+
-e "s|{{project_url}}|$PROJECT_URL|g" \
|
|
111
|
+
-e "s|{{plugin_list}}|$PLUGIN_LIST|g" \
|
|
112
|
+
-e "s|{{security_contact}}|$SECURITY_CONTACT|g" \
|
|
113
|
+
-e "s|{{year}}|$YEAR|g" \
|
|
114
|
+
templates/SECURITY.md.tmpl > SECURITY.md
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
For each missing file: substitute, write to the target path, report the write + a short diff to stdout.
|
|
118
|
+
|
|
119
|
+
For each present-and-current file: report "already present — skipped" without modification.
|
|
120
|
+
|
|
121
|
+
For each present-and-outdated file: when `--force` is set, offer diff-and-replace; otherwise skip with a clear note that `--force` would update it.
|
|
122
|
+
|
|
123
|
+
### 5. Mark scaffold as done
|
|
124
|
+
|
|
125
|
+
After successful write:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
mkdir -p .codex
|
|
129
|
+
: > .codex/.intake-scaffold-done
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
The marker suppresses Trigger-1 first-run prompts in subsequent `/wr-itil:manage-problem` and `/wr-itil:work-problems` invocations. the "Gate Marker Lifecycle: TTL + Drift, Not Stop-Hook Reset" architecture rule marker semantics — persistent (no TTL), file-presence is the policy signal, deletable to reset.
|
|
133
|
+
|
|
134
|
+
### 6. Commit per the "Governance Skills Commit Their Own Completed Work" architecture rule
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
git add .github/ISSUE_TEMPLATE/ SECURITY.md SUPPORT.md CONTRIBUTING.md .codex/.intake-scaffold-done
|
|
138
|
+
git -c commit.gpgsign=false commit -m "docs: scaffold OSS intake (ISSUE_TEMPLATE, SECURITY, SUPPORT, CONTRIBUTING)"
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
Follow the project's existing commit-gate flow: the commit triggers `wr-risk-scorer:pipeline` per the "Governance Skills Commit Their Own Completed Work" architecture rule; remediation suggestions are applied per the "Auto-apply scorer remediations to reach within appetite — open action-class vocabulary" architecture rule if residual exceeds appetite.
|
|
142
|
+
|
|
143
|
+
## Idempotency
|
|
144
|
+
|
|
145
|
+
The skill is idempotent by construction:
|
|
146
|
+
|
|
147
|
+
- Present files are skipped unless `--force`.
|
|
148
|
+
- Re-running the skill on a fully-scaffolded project produces no diff.
|
|
149
|
+
- The done marker prevents the host first-run prompt from re-firing.
|
|
150
|
+
|
|
151
|
+
## Rule 6 audit (per the "Governance skill invocation patterns — foreground + background with deferred-question resumption" architecture rule)
|
|
152
|
+
|
|
153
|
+
Every `request_user_input` branch this skill uses must enumerate its AFK fail-safe per the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6. The audit table below documents each branch:
|
|
154
|
+
|
|
155
|
+
| request_user_input branch | Resolution |
|
|
156
|
+
|---|---|
|
|
157
|
+
| Step 3: "Which files to scaffold?" (foreground invocation) | Foreground-synchronous — user is in-session; `request_user_input` fires normally. |
|
|
158
|
+
| Step 4: "Overwrite outdated present file with updated template?" (with `--force`) | Foreground-synchronous; same as Step 3. |
|
|
159
|
+
| First-run prompt fired from `/wr-itil:manage-problem` or `/wr-itil:work-problems` (foreground invocation) | Foreground-synchronous per the hosting skill's pattern. |
|
|
160
|
+
| First-run prompt fired from an AFK orchestrator iteration | **Fail-safe (Rule 6)**: do NOT fire `request_user_input` and do NOT auto-scaffold. Append a single one-line "pending intake scaffold" note to the orchestrator's iteration report; defer the prompt to the user's next interactive session. the ": Progress the Backlog While I'm Away" user outcome forbids the agent from making this judgement call. |
|
|
161
|
+
|
|
162
|
+
## Trigger surfaces (layered)
|
|
163
|
+
|
|
164
|
+
The skill is reachable via three trigger surfaces, layered so a soft prompt fires weeks before the hard publish stop. the "Scaffold downstream OSS intake — skill + layered triggers" architecture rule specifies the exact contract.
|
|
165
|
+
|
|
166
|
+
### Trigger 1: First-run prompt from manage-problem / work-problems
|
|
167
|
+
|
|
168
|
+
When `/wr-itil:manage-problem` or `/wr-itil:work-problems` fires in a foreground session, the host skill's preamble checks:
|
|
169
|
+
|
|
170
|
+
- Is `.github/ISSUE_TEMPLATE/` missing OR are any of the four other intake files absent?
|
|
171
|
+
- Is `.codex/.intake-scaffold-declined` absent?
|
|
172
|
+
- Is `.codex/.intake-scaffold-done` absent?
|
|
173
|
+
|
|
174
|
+
When all three checks pass, the host emits a one-shot `request_user_input` prompt with three options — **Scaffold now**, **Not now (ask again next session)**, **Decline (never prompt in this project)**. On "Decline", write `.codex/.intake-scaffold-declined` and never re-prompt unless the user deletes the marker.
|
|
175
|
+
|
|
176
|
+
**AFK fail-safe**: when the host is invoked from an AFK orchestrator, do NOT fire the prompt. Append a one-line "pending intake scaffold" note to the iteration report and continue. The user catches up on next interactive session.
|
|
177
|
+
|
|
178
|
+
**the "Structured User Interaction for Governance-Skill Decisions" architecture rule Rule 6 universal default (the "AFK iter default when a skill needs to ask a question and request_user_input is unavailable — should queue the question and move to the next iteration (not halt, not silently skip)" problem, 2026-06-06 amendment)**: this IS queue-and-continue — the iteration-report note is the queued surface; the loop advances. Persona-correct for the ": Progress the Backlog While I'm Away" user outcome ("queued for my return, not guessed at"). Not a carve-out — this is the canonical default shape.
|
|
179
|
+
|
|
180
|
+
### Trigger 2: Pre-publish PreToolUse gate (hard stop)
|
|
181
|
+
|
|
182
|
+
`<itil-plugin-root>/hooks/pre-publish-intake-gate.sh` matches `npm publish` and `gh pr merge ... changeset-release/*` and denies if any of the five intake files are missing AND the decline marker is absent AND `INTAKE_BYPASS` is not set.
|
|
183
|
+
|
|
184
|
+
**Override paths** (in priority order):
|
|
185
|
+
1. `INTAKE_BYPASS=1 npm publish` — short-circuits the gate before existence check (consistent with `RISK_BYPASS` naming).
|
|
186
|
+
2. `.codex/.intake-scaffold-declined` marker — explicit opt-out.
|
|
187
|
+
3. Run `/wr-itil:scaffold-intake` to remove the cause.
|
|
188
|
+
|
|
189
|
+
### Trigger 3: Optional CI check (deferred to v2)
|
|
190
|
+
|
|
191
|
+
`--ci` flag emits `.github/workflows/intake-check.yml` asserting the four files exist on every PR. Not shipped by default; layered ADD-on for adopters with GitHub Actions.
|
|
192
|
+
|
|
193
|
+
## Idempotent re-runs and template drift
|
|
194
|
+
|
|
195
|
+
When this repo's intake files evolve (e.g., a future the "Problem 066: Intake templates split bug / feature instead of a problem-first template — misaligned with ITIL problem management" problem-style reform), downstream adopters' previously-scaffolded files stay frozen. Re-running the skill at any time picks up the diff: the present-and-outdated branch reports each file's diff and, with `--force`, performs diff-and-replace. Template drift policy (when this should fire automatically) is out of scope for v1 — see the "Scaffold downstream OSS intake — skill + layered triggers" architecture rule Reassessment Criteria.
|
|
196
|
+
|
|
197
|
+
## Related
|
|
198
|
+
|
|
199
|
+
- [the "Scaffold downstream OSS intake — skill + layered triggers" architecture rule](../../../../docs/decisions/036-scaffold-downstream-oss-intake.proposed.md) — design record (driver decision).
|
|
200
|
+
- [the "Cross-project problem-reporting contract — `report-upstream` skill in `@windyroad/itil`" architecture rule](../../../../docs/decisions/024-cross-project-problem-reporting-contract.proposed.md) — sibling skill (`/wr-itil:report-upstream`); reciprocal pair.
|
|
201
|
+
- [the "Governance skill invocation patterns — foreground + background with deferred-question resumption" architecture rule](../../../../docs/decisions/032-governance-skill-invocation-patterns.proposed.md) — foreground-synchronous pattern + Rule 6 audit requirement.
|
|
202
|
+
- [the "Structured User Interaction for Governance-Skill Decisions" architecture rule](../../../../docs/decisions/013-structured-user-interaction-for-governance-decisions.proposed.md) — Rule 1 (interactive prompt) + Rule 6 (AFK fail-safe).
|
|
203
|
+
- [the "Gate Marker Lifecycle: TTL + Drift, Not Stop-Hook Reset" architecture rule](../../../../docs/decisions/009-gate-marker-lifecycle.proposed.md) — marker lifecycle (the `.intake-scaffold-{done,declined}` markers).
|
|
204
|
+
- [the "Governance Skills Commit Their Own Completed Work" architecture rule](../../../../docs/decisions/014-governance-skills-commit-their-own-work.proposed.md) — commit discipline.
|
|
205
|
+
- the "Problem 065: No skill scaffolds intake files (ISSUE_TEMPLATE, SECURITY.md, CONTRIBUTING.md, SUPPORT.md) in downstream projects" problem — driver ticket.
|
|
206
|
+
- the "Problem 066: Intake templates split bug / feature instead of a problem-first template — misaligned with ITIL problem management" problem — parent (template seed source); the corrected problem-first intake shape this skill propagates.
|
|
207
|
+
- the "Report a Problem Without Pre-Classifying It" user outcome — primary persona; downstream-project intake coverage.
|
|
208
|
+
- the "Extend the Suite with New Plugins" user outcome — clear patterns for adopters extending the suite.
|
|
209
|
+
- the ": Progress the Backlog While I'm Away" user outcome — AFK fail-safe constraint.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Contributing
|
|
2
|
+
|
|
3
|
+
Thanks for your interest in {{project_name}}. This guide covers how to contribute code, decisions, and bug reports.
|
|
4
|
+
|
|
5
|
+
## Before you start
|
|
6
|
+
|
|
7
|
+
- **Problems**: open an issue first using the **Report a problem** template under `.github/ISSUE_TEMPLATE/`. You do not need to pre-classify it as a bug or a feature -- this project practises ITIL problem management, so triage decides the category. Drive-by PRs without an issue are harder to merge because the problem framing is missing.
|
|
8
|
+
- **Security vulnerabilities**: do not open a public issue. See [SECURITY.md](SECURITY.md).
|
|
9
|
+
- **Usage questions**: use [Discussions]({{project_url}}/discussions), not issues.
|
|
10
|
+
|
|
11
|
+
## Pull requests
|
|
12
|
+
|
|
13
|
+
1. **Branch off the default branch**.
|
|
14
|
+
2. **Make your change** with tests where applicable.
|
|
15
|
+
3. **Open the PR** with a clear description of what is changing and why.
|
|
16
|
+
|
|
17
|
+
### Commit style
|
|
18
|
+
|
|
19
|
+
- Follow Conventional Commits (`feat:`, `fix:`, `docs:`, `chore:`, etc.).
|
|
20
|
+
- Reference problem tickets in the commit message when the work closes one.
|
|
21
|
+
- Sign-off is not required.
|
|
22
|
+
|
|
23
|
+
## Code of conduct
|
|
24
|
+
|
|
25
|
+
Be kind. Engage in good faith. Critique ideas, not people. Maintainers reserve the right to lock or remove discussions, issues, or PRs that derail into personal attacks.
|
|
26
|
+
|
|
27
|
+
## License
|
|
28
|
+
|
|
29
|
+
By contributing, you agree your contributions are licensed under {{project_name}}'s license. See the project root for the canonical LICENSE file.
|
|
30
|
+
|
|
31
|
+
Copyright (c) {{year}} the {{project_name}} contributors.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Reporting a Vulnerability
|
|
4
|
+
|
|
5
|
+
**Do not file a public issue for security vulnerabilities.**
|
|
6
|
+
|
|
7
|
+
{{security_contact}} to disclose privately. Maintainers receive an email; the report stays private until a fix ships.
|
|
8
|
+
|
|
9
|
+
A useful report includes:
|
|
10
|
+
|
|
11
|
+
- The affected version of {{project_name}} (e.g. `{{project_name}}@x.y.z`).
|
|
12
|
+
- The runtime / platform you reproduced on.
|
|
13
|
+
- Reproduction steps that demonstrate the impact.
|
|
14
|
+
- Your assessment of impact (data loss, code execution, escalation, secret leak, etc.).
|
|
15
|
+
- Any suggested fix or mitigation.
|
|
16
|
+
|
|
17
|
+
## What's in scope
|
|
18
|
+
|
|
19
|
+
Code shipped from this repository: {{project_url}}.
|
|
20
|
+
|
|
21
|
+
## What's out of scope
|
|
22
|
+
|
|
23
|
+
- Vulnerabilities in third-party dependencies -- report to their maintainers.
|
|
24
|
+
- Issues that require an attacker to already have local code-execution on the user's machine.
|
|
25
|
+
|
|
26
|
+
## Disclosure timeline
|
|
27
|
+
|
|
28
|
+
We aim to:
|
|
29
|
+
|
|
30
|
+
- **Acknowledge** the report within 7 calendar days.
|
|
31
|
+
- **Provide an initial assessment** (in scope, severity, planned fix) within 14 days.
|
|
32
|
+
- **Ship a fix** within 90 days for confirmed vulnerabilities, with most resolved sooner.
|
|
33
|
+
- **Coordinate disclosure** with the reporter so a public advisory and credit can be published when the fix lands.
|
|
34
|
+
|
|
35
|
+
If we cannot meet a 90-day timeline, we will say so in the advisory thread before the deadline.
|
|
36
|
+
|
|
37
|
+
## Credit
|
|
38
|
+
|
|
39
|
+
Reporters who follow this private-disclosure path are credited in the published advisory unless they ask to remain anonymous.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Getting Help
|
|
2
|
+
|
|
3
|
+
Where to go depends on what you need:
|
|
4
|
+
|
|
5
|
+
## Usage questions, configuration help, pattern advice
|
|
6
|
+
|
|
7
|
+
[GitHub Discussions]({{project_url}}/discussions). Discussions stay searchable for the next person who hits the same question.
|
|
8
|
+
|
|
9
|
+
Before posting, search existing discussions and the project README.
|
|
10
|
+
|
|
11
|
+
## Report a problem
|
|
12
|
+
|
|
13
|
+
[Open an issue]({{project_url}}/issues/new/choose) using the **Report a problem** template. You do not need to pre-classify it as a bug or feature -- this project practises ITIL problem management, and triage decides whether the root cause is a defect, a missing capability, a documentation gap, or something else. Describe what you observed and let triage decide the category.
|
|
14
|
+
|
|
15
|
+
Include:
|
|
16
|
+
|
|
17
|
+
- A description of what is happening and what you expected
|
|
18
|
+
- Observable symptoms (errors, command output, transcripts, screenshots -- redact secrets)
|
|
19
|
+
- Any workaround you tried, even if it did not help
|
|
20
|
+
- Affected component and version of {{project_name}}
|
|
21
|
+
- Runtime / platform and operating system
|
|
22
|
+
- Minimal reproduction steps or evidence
|
|
23
|
+
|
|
24
|
+
The template prompts for these. Issues without the template fields are slower to triage.
|
|
25
|
+
|
|
26
|
+
## Security vulnerabilities
|
|
27
|
+
|
|
28
|
+
**Do not open a public issue.** {{security_contact}} for private disclosure. See [SECURITY.md](SECURITY.md) for the disclosure timeline and what's in scope.
|
|
29
|
+
|
|
30
|
+
## Project documentation
|
|
31
|
+
|
|
32
|
+
Start with the README at the root of {{project_url}} for project-specific behaviour.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
blank_issues_enabled: false
|
|
2
|
+
contact_links:
|
|
3
|
+
- name: Ask a question (GitHub Discussions)
|
|
4
|
+
url: {{project_url}}/discussions
|
|
5
|
+
about: For usage help, configuration questions, and pattern advice. The issue tracker is for problems -- triage decides whether the root cause is a defect, a missing capability, or something else.
|
|
6
|
+
- name: Report a security vulnerability
|
|
7
|
+
url: {{project_url}}/security/advisories/new
|
|
8
|
+
about: Use GitHub Security Advisories for private disclosure. Do not file a public issue. See SECURITY.md.
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
name: Report a problem
|
|
2
|
+
description: Report a problem with {{project_name}}. You do not need to pre-classify it as a bug or feature -- triage decides.
|
|
3
|
+
title: "[problem] "
|
|
4
|
+
labels: ["problem", "needs-triage"]
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: |
|
|
9
|
+
Thanks for reporting a problem. This project practises ITIL problem management -- you describe what you observed, and triage decides whether the root cause is a defect, a missing capability, a documentation gap, or something else. You do not need to choose in advance.
|
|
10
|
+
|
|
11
|
+
For security vulnerabilities, **do not file here** -- use [GitHub Security Advisories]({{project_url}}/security/advisories/new) instead. For usage questions, use [Discussions]({{project_url}}/discussions).
|
|
12
|
+
|
|
13
|
+
- type: textarea
|
|
14
|
+
id: description
|
|
15
|
+
attributes:
|
|
16
|
+
label: Description
|
|
17
|
+
description: What is happening? What did you expect instead? Describe the observation, not the fix.
|
|
18
|
+
placeholder: |
|
|
19
|
+
e.g. "When I run the tool in a fresh project, it reports no items even though the source data has them. I expected it to list them."
|
|
20
|
+
validations:
|
|
21
|
+
required: true
|
|
22
|
+
|
|
23
|
+
- type: textarea
|
|
24
|
+
id: symptoms
|
|
25
|
+
attributes:
|
|
26
|
+
label: Symptoms
|
|
27
|
+
description: Observable behaviour -- error messages, command output, transcript snippets, screenshots. Redact secrets.
|
|
28
|
+
placeholder: |
|
|
29
|
+
- Command returns exit code 1
|
|
30
|
+
- Output contains "project root not found"
|
|
31
|
+
- ...
|
|
32
|
+
validations:
|
|
33
|
+
required: true
|
|
34
|
+
|
|
35
|
+
- type: textarea
|
|
36
|
+
id: workaround
|
|
37
|
+
attributes:
|
|
38
|
+
label: Workaround
|
|
39
|
+
description: Anything you tried that got you unstuck, even if temporary. "None found" is a valid answer.
|
|
40
|
+
placeholder: |
|
|
41
|
+
Retried after restarting -- same result. No workaround found.
|
|
42
|
+
|
|
43
|
+
- type: input
|
|
44
|
+
id: affected-component
|
|
45
|
+
attributes:
|
|
46
|
+
label: Affected component
|
|
47
|
+
description: Which part of {{project_name}} is involved? "multiple" or "unsure" is a valid answer -- triage will re-scope.
|
|
48
|
+
placeholder: "e.g. CLI / UI / specific module"
|
|
49
|
+
validations:
|
|
50
|
+
required: true
|
|
51
|
+
|
|
52
|
+
- type: input
|
|
53
|
+
id: frequency
|
|
54
|
+
attributes:
|
|
55
|
+
label: Frequency
|
|
56
|
+
description: How often does this happen? (every time, intermittently, once, ...)
|
|
57
|
+
placeholder: "e.g. every time I run the command"
|
|
58
|
+
validations:
|
|
59
|
+
required: true
|
|
60
|
+
|
|
61
|
+
- type: input
|
|
62
|
+
id: version-local-plugin
|
|
63
|
+
attributes:
|
|
64
|
+
label: Local plugin / project version
|
|
65
|
+
description: The version of {{project_name}} you are running. Enter `not detected` if you cannot determine the version.
|
|
66
|
+
placeholder: "x.y.z"
|
|
67
|
+
validations:
|
|
68
|
+
required: true
|
|
69
|
+
|
|
70
|
+
- type: input
|
|
71
|
+
id: version-upstream-package
|
|
72
|
+
attributes:
|
|
73
|
+
label: Upstream package version
|
|
74
|
+
description: If the problem involves a non-{{project_name}} upstream package, the package name and version. Enter `not applicable` or `not detected` if neither.
|
|
75
|
+
placeholder: "<pkg>@<version>"
|
|
76
|
+
|
|
77
|
+
- type: input
|
|
78
|
+
id: version-codex
|
|
79
|
+
attributes:
|
|
80
|
+
label: Codex CLI version
|
|
81
|
+
description: Output of `codex --version`. Enter `not detected` if not running through Codex.
|
|
82
|
+
placeholder: "1.x.x"
|
|
83
|
+
|
|
84
|
+
- type: input
|
|
85
|
+
id: version-node
|
|
86
|
+
attributes:
|
|
87
|
+
label: Node version
|
|
88
|
+
description: Output of `node --version`. Enter `not detected` if Node is not part of the failure path.
|
|
89
|
+
placeholder: "v20.11.0"
|
|
90
|
+
|
|
91
|
+
- type: input
|
|
92
|
+
id: version-os
|
|
93
|
+
attributes:
|
|
94
|
+
label: Operating system
|
|
95
|
+
description: Output of `uname -srm` (POSIX) or platform-equivalent. Enter `not detected` if you cannot determine.
|
|
96
|
+
placeholder: "Darwin 25.3.0 arm64"
|
|
97
|
+
validations:
|
|
98
|
+
required: true
|
|
99
|
+
|
|
100
|
+
- type: textarea
|
|
101
|
+
id: evidence
|
|
102
|
+
attributes:
|
|
103
|
+
label: Evidence
|
|
104
|
+
description: Minimal reproduction steps, transcript links, screenshots, or related prior discussions. Feeds the investigation tasks triage will open.
|
|
105
|
+
placeholder: |
|
|
106
|
+
1. Clone the repo
|
|
107
|
+
2. Run the failing command
|
|
108
|
+
3. Observe output
|
|
109
|
+
|
|
110
|
+
- type: textarea
|
|
111
|
+
id: additional
|
|
112
|
+
attributes:
|
|
113
|
+
label: Additional context
|
|
114
|
+
description: Anything else relevant -- related tickets, prior art, a hypothesis you already formed.
|