hstack 0.16.0 → 0.17.0
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/CHANGELOG.md +37 -0
- package/README.md +73 -163
- package/VERSION +1 -1
- package/dist/commands/doctor.js +18 -8
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.js +7 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/update.js +9 -2
- package/dist/commands/update.js.map +1 -1
- package/dist/lib/descriptions.js +10 -17
- package/dist/lib/descriptions.js.map +1 -1
- package/dist/lib/wire.js +166 -138
- package/dist/lib/wire.js.map +1 -1
- package/dist/manifest.js +41 -29
- package/dist/manifest.js.map +1 -1
- package/package.json +3 -4
- package/template/.claude/agents/adversarial-reviewer.md +42 -50
- package/template/.claude/agents/app-architect.md +44 -96
- package/template/.claude/agents/data-architect.md +46 -89
- package/template/.claude/agents/test-strategist.md +39 -68
- package/template/.claude/skills/hstack-adr-new/SKILL.md +23 -73
- package/template/.claude/skills/hstack-adversarial-review/SKILL.md +46 -152
- package/template/.claude/skills/hstack-adversarial-review/references/finding-categories.md +80 -103
- package/template/.claude/skills/hstack-app-architecture/SKILL.md +43 -68
- package/template/.claude/skills/hstack-commit/SKILL.md +27 -68
- package/template/.claude/skills/hstack-data-architecture/SKILL.md +34 -56
- package/template/.claude/skills/hstack-promote/SKILL.md +55 -0
- package/template/.claude/skills/hstack-story/SKILL.md +58 -0
- package/template/.claude/skills/hstack-test-audit/SKILL.md +64 -0
- package/template/.claude/skills/hstack-wrap/SKILL.md +48 -0
- package/template/.claude/skills/hstack-wrap/references/pr-description.md +45 -0
- package/template/KERNEL.md +75 -318
- package/template/templates/adr.md +2 -18
- package/template/templates/app-architecture.md +38 -50
- package/template/templates/data-architecture.md +38 -89
- package/template/templates/infrastructure.md +54 -148
- package/template/templates/roadmap.md +6 -12
- package/template/templates/story.md +7 -13
- package/template/templates/tech-debt.md +2 -37
- package/template/templates/tech-stack.md +2 -12
- package/template/.claude/agents/data-specialist.md +0 -81
- package/template/.claude/agents/implementer.md +0 -97
- package/template/.claude/agents/kernel-fit-analyst.md +0 -129
- package/template/.claude/agents/planner.md +0 -75
- package/template/.claude/agents/product-discovery.md +0 -129
- package/template/.claude/agents/product-manager.md +0 -76
- package/template/.claude/agents/researcher.md +0 -87
- package/template/.claude/agents/security-reviewer.md +0 -88
- package/template/.claude/agents/spec-author.md +0 -89
- package/template/.claude/agents/stack-architect.md +0 -108
- package/template/.claude/agents/ui-ux-briefer.md +0 -75
- package/template/.claude/agents/verifier.md +0 -81
- package/template/.claude/skills/hstack-branch/SKILL.md +0 -76
- package/template/.claude/skills/hstack-brownfield-init/SKILL.md +0 -131
- package/template/.claude/skills/hstack-change-new/SKILL.md +0 -84
- package/template/.claude/skills/hstack-change-plan/SKILL.md +0 -108
- package/template/.claude/skills/hstack-configure/SKILL.md +0 -99
- package/template/.claude/skills/hstack-coord/SKILL.md +0 -95
- package/template/.claude/skills/hstack-data-review/SKILL.md +0 -93
- package/template/.claude/skills/hstack-finalize/SKILL.md +0 -140
- package/template/.claude/skills/hstack-flag/SKILL.md +0 -99
- package/template/.claude/skills/hstack-greenfield-init/SKILL.md +0 -148
- package/template/.claude/skills/hstack-help/SKILL.md +0 -153
- package/template/.claude/skills/hstack-implement/SKILL.md +0 -155
- package/template/.claude/skills/hstack-kernel-fit-promote/SKILL.md +0 -125
- package/template/.claude/skills/hstack-kernel-fit-scan/SKILL.md +0 -142
- package/template/.claude/skills/hstack-kernel-fit-scan/references/slack-setup.md +0 -42
- package/template/.claude/skills/hstack-kernel-fit-triage/SKILL.md +0 -121
- package/template/.claude/skills/hstack-module-spec/SKILL.md +0 -78
- package/template/.claude/skills/hstack-product-discovery/SKILL.md +0 -75
- package/template/.claude/skills/hstack-research/SKILL.md +0 -115
- package/template/.claude/skills/hstack-scaffold/SKILL.md +0 -113
- package/template/.claude/skills/hstack-security-review/SKILL.md +0 -95
- package/template/.claude/skills/hstack-ship/SKILL.md +0 -119
- package/template/.claude/skills/hstack-stack-decide/SKILL.md +0 -81
- package/template/.claude/skills/hstack-story-draft/SKILL.md +0 -92
- package/template/.claude/skills/hstack-tech-debt-new/SKILL.md +0 -95
- package/template/.claude/skills/hstack-tech-debt-resolve/SKILL.md +0 -123
- package/template/.claude/skills/hstack-tech-debt-stale/SKILL.md +0 -86
- package/template/.claude/skills/hstack-tech-debt-wontfix/SKILL.md +0 -77
- package/template/.claude/skills/hstack-telemetry/SKILL.md +0 -73
- package/template/.claude/skills/hstack-test-plan/SKILL.md +0 -159
- package/template/.claude/skills/hstack-ui-brief/SKILL.md +0 -81
- package/template/.claude/skills/hstack-verify/SKILL.md +0 -128
- package/template/scripts/compute-merge-readiness.mjs +0 -780
- package/template/scripts/coord/coord_scan.py +0 -681
- package/template/scripts/run-gates.sh +0 -388
- package/template/scripts/telemetry/__init__.py +0 -6
- package/template/scripts/telemetry/insights/__init__.py +0 -0
- package/template/scripts/telemetry/insights/contract_drift.py +0 -137
- package/template/scripts/telemetry/insights/kernel_fit.py +0 -438
- package/template/scripts/telemetry/insights/overengineering.py +0 -115
- package/template/scripts/telemetry/insights/quality_outcomes.py +0 -131
- package/template/scripts/telemetry/insights/token_economics.py +0 -302
- package/template/scripts/telemetry/insights/workflow_shape.py +0 -198
- package/template/scripts/telemetry/parsers/__init__.py +0 -0
- package/template/scripts/telemetry/parsers/bodies.py +0 -87
- package/template/scripts/telemetry/parsers/commits.py +0 -219
- package/template/scripts/telemetry/parsers/frontmatter.py +0 -322
- package/template/scripts/telemetry/parsers/sidecars.py +0 -61
- package/template/scripts/telemetry/parsers/transcripts.py +0 -294
- package/template/scripts/telemetry/render.py +0 -460
- package/template/scripts/telemetry/report.py +0 -150
- package/template/scripts/telemetry/run_kernel_fit.py +0 -95
- package/template/scripts/telemetry/session_id.py +0 -139
- package/template/scripts/validate-spec.mjs +0 -3303
- package/template/templates/adversarial-review.md +0 -54
- package/template/templates/bootstrap.md +0 -105
- package/template/templates/change-spec.md +0 -82
- package/template/templates/ci-cd.md +0 -41
- package/template/templates/coord-message.md +0 -56
- package/template/templates/data-review.md +0 -54
- package/template/templates/discovery/brainstorm.md +0 -69
- package/template/templates/discovery/forcing-questions.md +0 -76
- package/template/templates/discovery/project-brief.md +0 -53
- package/template/templates/figma-handoff.md +0 -38
- package/template/templates/glossary.md +0 -20
- package/template/templates/hardening-checklist.md +0 -73
- package/template/templates/incident-runbook.md +0 -57
- package/template/templates/kernel-fit-finding.md +0 -63
- package/template/templates/kernel-fit-flag.md +0 -52
- package/template/templates/module-spec.md +0 -49
- package/template/templates/persona.md +0 -38
- package/template/templates/plan.md +0 -53
- package/template/templates/product-brief.md +0 -56
- package/template/templates/security-review.md +0 -63
- package/template/templates/telemetry-sidecar.md +0 -227
- package/template/templates/test-plan.md +0 -119
- package/template/templates/threat-model.md +0 -54
- package/template/templates/ui-brief.md +0 -49
- package/template/templates/verification.md +0 -63
- package/template/templates/vision.md +0 -34
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: hardening-checklist
|
|
3
|
-
type: hardening-checklist
|
|
4
|
-
status: drafted # drafted | current | needs-refresh | archived
|
|
5
|
-
owner: <git-handle>
|
|
6
|
-
last-quarterly-review: <YYYY-MM-DD>
|
|
7
|
-
layer-count: 10
|
|
8
|
-
created: <YYYY-MM-DD>
|
|
9
|
-
updated: <YYYY-MM-DD>
|
|
10
|
-
schema-version: 1
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
_One section per layer. Each layer enumerates items with: item id, what it asserts, evidence required, not-applicable conditions. This is the artifact `security-review.md` scores against item-by-item. Validator rule HC-01: every layer that appears in a security-review `scores` map must exist as a section here._
|
|
14
|
-
|
|
15
|
-
## data-at-rest
|
|
16
|
-
|
|
17
|
-
### Item HC-DAR-01: <assertion>
|
|
18
|
-
**Evidence required.**
|
|
19
|
-
**Not-applicable when.**
|
|
20
|
-
|
|
21
|
-
## data-in-transit
|
|
22
|
-
|
|
23
|
-
### Item HC-DIT-01: <assertion>
|
|
24
|
-
**Evidence required.**
|
|
25
|
-
**Not-applicable when.**
|
|
26
|
-
|
|
27
|
-
## authn
|
|
28
|
-
|
|
29
|
-
### Item HC-AN-01: <assertion>
|
|
30
|
-
**Evidence required.**
|
|
31
|
-
**Not-applicable when.**
|
|
32
|
-
|
|
33
|
-
## authz-rls
|
|
34
|
-
|
|
35
|
-
### Item HC-AZ-01: <assertion>
|
|
36
|
-
**Evidence required.**
|
|
37
|
-
**Not-applicable when.**
|
|
38
|
-
|
|
39
|
-
## tenant-isolation
|
|
40
|
-
|
|
41
|
-
### Item HC-TI-01: <assertion>
|
|
42
|
-
**Evidence required.**
|
|
43
|
-
**Not-applicable when.**
|
|
44
|
-
|
|
45
|
-
## input-validation
|
|
46
|
-
|
|
47
|
-
### Item HC-IV-01: <assertion>
|
|
48
|
-
**Evidence required.**
|
|
49
|
-
**Not-applicable when.**
|
|
50
|
-
|
|
51
|
-
## output-encoding
|
|
52
|
-
|
|
53
|
-
### Item HC-OE-01: <assertion>
|
|
54
|
-
**Evidence required.**
|
|
55
|
-
**Not-applicable when.**
|
|
56
|
-
|
|
57
|
-
## secrets-handling
|
|
58
|
-
|
|
59
|
-
### Item HC-SH-01: <assertion>
|
|
60
|
-
**Evidence required.**
|
|
61
|
-
**Not-applicable when.**
|
|
62
|
-
|
|
63
|
-
## agent-prompt-injection
|
|
64
|
-
|
|
65
|
-
### Item HC-API-01: <assertion>
|
|
66
|
-
**Evidence required.**
|
|
67
|
-
**Not-applicable when.**
|
|
68
|
-
|
|
69
|
-
## audit-logging
|
|
70
|
-
|
|
71
|
-
### Item HC-AL-01: <assertion>
|
|
72
|
-
**Evidence required.**
|
|
73
|
-
**Not-applicable when.**
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: incident-runbook
|
|
3
|
-
type: incident-runbook
|
|
4
|
-
status: drafted # drafted | current | needs-refresh | archived
|
|
5
|
-
owner: <git-handle>
|
|
6
|
-
git-ignored: true # this file MUST be gitignored; sensitive content
|
|
7
|
-
last-quarterly-review: <YYYY-MM-DD>
|
|
8
|
-
created: <YYYY-MM-DD>
|
|
9
|
-
updated: <YYYY-MM-DD>
|
|
10
|
-
schema-version: 1
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
<!--
|
|
14
|
-
WARNING: This file contains sensitive operational content (auth provider details, revocation endpoints,
|
|
15
|
-
customer communication templates, phone tree). It MUST be gitignored. Per architecture amendment A7,
|
|
16
|
-
the file lives locally and is synced to an out-of-band destination configured in hstack/config.yaml as
|
|
17
|
-
`incident-runbook.sync-target`. Auto-commit does not apply to this file. The init Skill must add the
|
|
18
|
-
entry to .gitignore as part of bootstrap.
|
|
19
|
-
-->
|
|
20
|
-
|
|
21
|
-
## Kill switches
|
|
22
|
-
|
|
23
|
-
_Feature flags and how to flip them, ordered by blast radius. Most-dangerous-first._
|
|
24
|
-
|
|
25
|
-
-
|
|
26
|
-
|
|
27
|
-
## Revocation flows
|
|
28
|
-
|
|
29
|
-
_Per third-party: Stripe, Supabase, Pipedream, MCPs. Steps to revoke a session, an OAuth token, an API key._
|
|
30
|
-
|
|
31
|
-
### Stripe
|
|
32
|
-
|
|
33
|
-
### Supabase
|
|
34
|
-
|
|
35
|
-
### Pipedream
|
|
36
|
-
|
|
37
|
-
### MCPs
|
|
38
|
-
|
|
39
|
-
## Customer communication
|
|
40
|
-
|
|
41
|
-
_Copy templates per severity (P0 / P1 / P2). Channels (in-app, email, status page)._
|
|
42
|
-
|
|
43
|
-
### P0 template
|
|
44
|
-
|
|
45
|
-
### P1 template
|
|
46
|
-
|
|
47
|
-
### P2 template
|
|
48
|
-
|
|
49
|
-
## Escalation contacts
|
|
50
|
-
|
|
51
|
-
_Owner phone tree. Mark each entry with privacy boundary (work-hours OK / 24-7 OK)._
|
|
52
|
-
|
|
53
|
-
-
|
|
54
|
-
|
|
55
|
-
## Post-incident
|
|
56
|
-
|
|
57
|
-
_Runbook for the followup ADR or tech-debt write-up. Pointer to ADR template._
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: KF-<NNNN>-<slug>
|
|
3
|
-
type: kernel-fit-finding
|
|
4
|
-
status: open # open | acknowledged | dismissed | promoted | superseded | archived
|
|
5
|
-
owner: null # git-handle of the triager; null until first triage
|
|
6
|
-
pattern: <KF-P1 | KF-P2 | KF-P3 | …> # detector pattern that fired; enumerated in scripts/telemetry/insights/kernel_fit.py
|
|
7
|
-
confidence: medium # high | medium | low
|
|
8
|
-
detected-by: kernel-fit-analyst
|
|
9
|
-
detected-via: detector # detector | flag — `detector` (default) when the finding came from kernel_fit.py pattern matching; `flag` when the finding originated from a /hstack:flag pin (ADR-0005). For folded-in findings (flag signal merged into an existing detector-finding), `detected-via` remains `detector` because the originating signal was the detector pattern.
|
|
10
|
-
detected-at: <ISO-8601 timestamp>
|
|
11
|
-
evidence-row-count: 0 # integer; must equal len(evidence-rows) per KF-01
|
|
12
|
-
evidence-rows: [] # YAML array of {change|adr|td, signal} dicts; one entry per row counted above
|
|
13
|
-
related-findings: [] # KF ids — prior or adjacent findings on the same kernel surface
|
|
14
|
-
promoted-to: null # `adr:<ADR-NNNN-slug>` | `tech-debt:<TD-NNNN-slug>` | null; reciprocal with the target artifact's `promoted-from-kernel-fit`; required when status: promoted
|
|
15
|
-
dismissed-reason: null # required when status: dismissed (KF-05); says what about the finding is wrong, specifically enough to be re-evaluated later
|
|
16
|
-
superseded-by: null # KF id when status: superseded
|
|
17
|
-
created: <YYYY-MM-DD>
|
|
18
|
-
updated: <YYYY-MM-DD>
|
|
19
|
-
schema-version: 1
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## Title
|
|
23
|
-
|
|
24
|
-
_Short noun phrase naming the kernel-fit gap. Example: "Category-A claim spans production paths — engineer likely meant Category B."_
|
|
25
|
-
|
|
26
|
-
## Pattern fired
|
|
27
|
-
|
|
28
|
-
_Name the detector pattern (KF-P1 / KF-P2 / KF-P3 / …) and one paragraph describing what the detector found. Quote the pattern's defining condition from `kernel_fit.py` if helpful._
|
|
29
|
-
|
|
30
|
-
## Evidence
|
|
31
|
-
|
|
32
|
-
_Per evidence row, a 2–3 sentence prose summary with at least one inline citation (change-id, ADR-id, TD-id, commit-sha, kernel section). KF-01 requires `len(evidence-rows)` in frontmatter to equal `evidence-row-count`; the prose here must cite each row at least once. No prose without a citation._
|
|
33
|
-
|
|
34
|
-
1. ...
|
|
35
|
-
2. ...
|
|
36
|
-
|
|
37
|
-
## Kernel surface implicated
|
|
38
|
-
|
|
39
|
-
_Single-sentence pointer to the kernel section, template, validator rule, or Skill flow that the finding suggests revising. Examples: "`template/KERNEL.md § Frontmatter contract` — the `internal-tooling` field"; "`template/templates/change-spec.md` frontmatter — `surfaces` enum"; "`/hstack:adversarial-review` precondition check at SKILL.md line 61"._
|
|
40
|
-
|
|
41
|
-
## Proposed direction
|
|
42
|
-
|
|
43
|
-
_One paragraph. Name a direction the kernel revision could take — split a flag, add an enum case, add a Skill precondition, amend a section. This is NOT a full ADR — that work is done by `spec-author` if and when the engineer invokes `/hstack:kernel-fit-promote`. Keep this as a sketch, not a specification._
|
|
44
|
-
|
|
45
|
-
## Counter-explanations (challenge prompt — mandatory)
|
|
46
|
-
|
|
47
|
-
_Two reasons this finding might NOT warrant a kernel change. If you cannot produce two, the analyst auto-downgrades `confidence` to `low` per KF-03. The challenge defends against false-positives the same way `## Consequences` § "name two consequences that look bad" defends ADRs._
|
|
48
|
-
|
|
49
|
-
1. ...
|
|
50
|
-
2. ...
|
|
51
|
-
|
|
52
|
-
## Confidence rationale
|
|
53
|
-
|
|
54
|
-
_One paragraph defending the `confidence` enum value against the validator rules. `high` requires `evidence-row-count >= 3` AND ≥2 distinct change-specs cited (KF-02). `medium` is the conservative default. `low` carries no notification and is appropriate when evidence is thin or the challenge prompts substantially weaken the finding._
|
|
55
|
-
|
|
56
|
-
## Triage Log
|
|
57
|
-
|
|
58
|
-
_Populated by `/hstack:kernel-fit-triage` and `/hstack:kernel-fit-promote` as the finding's status transitions. Section is empty until the first transition out of `open`._
|
|
59
|
-
|
|
60
|
-
- `status: open → acknowledged` on `<YYYY-MM-DD>` by `<owner>`. Triggered by `/hstack:kernel-fit-triage <id> --action acknowledge`.
|
|
61
|
-
- `status: open → dismissed` on `<YYYY-MM-DD>` by `<owner>`. Reason: `<dismissed-reason>`.
|
|
62
|
-
- `status: acknowledged → promoted` on `<YYYY-MM-DD>` by `<owner>`. Promoted to: `<promoted-to>`. Triggered by `/hstack:kernel-fit-promote <id> --slug <adr-slug>`.
|
|
63
|
-
- `status: open → superseded` on `<YYYY-MM-DD>` by the next `kernel-fit-analyst` run. Superseded by: `<superseded-by>`.
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: flag-<YYYYMMDD>T<HHMMSS>-<session-id-short>
|
|
3
|
-
type: kernel-fit-flag
|
|
4
|
-
status: pending # pending | processed
|
|
5
|
-
session-id: <claude-code-session-uuid> # FL-01: non-null at pin-time
|
|
6
|
-
session-transcript-path: <abs-path-to-jsonl> # FL-01: non-null at pin-time
|
|
7
|
-
branch: <current-branch> # FL-01: non-null at pin-time
|
|
8
|
-
head: <current-HEAD-sha> # FL-01: non-null at pin-time
|
|
9
|
-
workspace: <abs-path-to-cwd> # FL-01: non-null at pin-time
|
|
10
|
-
timestamp: <ISO-8601 timestamp at pin> # FL-01: non-null at pin-time
|
|
11
|
-
pre-compaction-message-count: <integer> # FL-01: non-null at pin-time; analyst uses this to detect truncation between pin and scan
|
|
12
|
-
hint: null # one-word string from --hint arg; null when no arg given
|
|
13
|
-
classification: null # FL-02: non-null when status: processed; one of friction | missing-guardrail | kernel-vs-practice-mismatch | not-actionable | transcript-truncated
|
|
14
|
-
classification-rationale: null # FL-02: non-null when status: processed; one-line analyst note
|
|
15
|
-
folded-into: null # KF-NNNN-<slug> when the analyst folded the signal into an existing finding
|
|
16
|
-
emitted-as: null # KF-NNNN-<slug> when the analyst emitted a fresh finding from this pin
|
|
17
|
-
created: <YYYY-MM-DD>
|
|
18
|
-
updated: <YYYY-MM-DD>
|
|
19
|
-
schema-version: 1
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
<!--
|
|
23
|
-
A kernel-fit-flag is a frontmatter-only pin. There is no body. Engineer
|
|
24
|
-
interpretation of the friction is deliberately excluded — the analyst reads
|
|
25
|
-
the transcript window and forms its own classification at processing time.
|
|
26
|
-
|
|
27
|
-
Validator rules (`node hstack/scripts/validate-spec.mjs <path>`; the pin itself
|
|
28
|
-
lands regardless — see `/hstack:flag` § does NOT halt on):
|
|
29
|
-
|
|
30
|
-
- FL-01: at pin-time (status: pending) every field marked above as
|
|
31
|
-
"non-null at pin-time" must be populated. `hint` may be null; the four
|
|
32
|
-
analyst-owned fields (classification, classification-rationale,
|
|
33
|
-
folded-into, emitted-as) must remain null until processing.
|
|
34
|
-
|
|
35
|
-
- FL-02: at processing-time (status: processed) `classification` and
|
|
36
|
-
`classification-rationale` must both be non-null. When the classification
|
|
37
|
-
produced a finding, exactly one of `folded-into` or `emitted-as` is non-null
|
|
38
|
-
(never both). When the classification did not produce a finding (closed as
|
|
39
|
-
`not-actionable` or `transcript-truncated`), both remain null.
|
|
40
|
-
|
|
41
|
-
Pins are immutable from the engineer's perspective. The only legal writes
|
|
42
|
-
after creation are by the kernel-fit-analyst at processing time, setting the
|
|
43
|
-
four analyst-owned fields and flipping status to processed. The engineer
|
|
44
|
-
cannot edit a pin to add commentary — that would re-open the contamination
|
|
45
|
-
surface the analyst guards against. To add context, re-flag in a follow-up
|
|
46
|
-
turn (a new pin with a different timestamp).
|
|
47
|
-
|
|
48
|
-
Pins live at hstack/kernel-fit/flags/pending/ before processing and at
|
|
49
|
-
hstack/kernel-fit/flags/processed/ after. The directory is gitignored in
|
|
50
|
-
the consuming repo — see ADR-0005 for the rationale and the trade-off
|
|
51
|
-
(provenance gap unique to this artifact type).
|
|
52
|
-
-->
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: <module-key> # equals the module key in hstack/config.yaml
|
|
3
|
-
type: module-spec
|
|
4
|
-
status: drafted # drafted | current | needs-refresh | archived
|
|
5
|
-
owner: <git-handle>
|
|
6
|
-
paths: [] # required; canonical module-to-paths mapping (globs)
|
|
7
|
-
last-refreshed: <YYYY-MM-DD>
|
|
8
|
-
created: <YYYY-MM-DD>
|
|
9
|
-
updated: <YYYY-MM-DD>
|
|
10
|
-
schema-version: 1
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## Purpose
|
|
14
|
-
|
|
15
|
-
_What this module is responsible for. 2–4 sentences. Author may grep `paths` to verify._
|
|
16
|
-
|
|
17
|
-
## Public Surface
|
|
18
|
-
|
|
19
|
-
_Exports, routes, RPCs the module exposes outward. Bullets._
|
|
20
|
-
|
|
21
|
-
-
|
|
22
|
-
|
|
23
|
-
## Data Owned
|
|
24
|
-
|
|
25
|
-
_Tables, columns, and indexes this module is the canonical owner of. Bullets._
|
|
26
|
-
|
|
27
|
-
-
|
|
28
|
-
|
|
29
|
-
## External Dependencies
|
|
30
|
-
|
|
31
|
-
_Other modules, third-party services, MCPs this module depends on. Bullets._
|
|
32
|
-
|
|
33
|
-
-
|
|
34
|
-
|
|
35
|
-
## Invariants
|
|
36
|
-
|
|
37
|
-
_Challenge prompt: what would a careless refactor in this module break that the tests would not catch? Minimum 3 bullets (validator rule MS-03)._
|
|
38
|
-
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
|
|
43
|
-
## Known Tech-Debt and ADRs
|
|
44
|
-
|
|
45
|
-
_Pointers._
|
|
46
|
-
|
|
47
|
-
## Refresh Policy
|
|
48
|
-
|
|
49
|
-
_What triggers a refresh and what the refresh entails. One paragraph. The 60-day `needs-refresh` cron flags this spec if untouched._
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: persona-<slug>
|
|
3
|
-
type: persona
|
|
4
|
-
status: drafted # drafted | current | needs-refresh | archived
|
|
5
|
-
owner: <git-handle>
|
|
6
|
-
anchored-on: <design-partner-slug>
|
|
7
|
-
created: <YYYY-MM-DD>
|
|
8
|
-
updated: <YYYY-MM-DD>
|
|
9
|
-
schema-version: 1
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Role
|
|
13
|
-
|
|
14
|
-
_Title and seniority._
|
|
15
|
-
|
|
16
|
-
## Context
|
|
17
|
-
|
|
18
|
-
_Tools they use today. Team size. KPI they are measured against._
|
|
19
|
-
|
|
20
|
-
## Jobs-to-be-done
|
|
21
|
-
|
|
22
|
-
_Bullets._
|
|
23
|
-
|
|
24
|
-
-
|
|
25
|
-
|
|
26
|
-
## Edge constraints
|
|
27
|
-
|
|
28
|
-
_Anything unusual: compliance, time zone, locale, accessibility, device class._
|
|
29
|
-
|
|
30
|
-
-
|
|
31
|
-
|
|
32
|
-
## Anti-pattern
|
|
33
|
-
|
|
34
|
-
_What this persona explicitly is not. Helps prevent persona drift on future stories._
|
|
35
|
-
|
|
36
|
-
## Anchored design partner
|
|
37
|
-
|
|
38
|
-
_Name and contact rhythm. Private — keep this section out of any export. When persona store is in repo, the file housing this section should be in `.gitignore` (see hstack/config.yaml personas-location)._
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: <parent-change-id>-plan
|
|
3
|
-
type: plan
|
|
4
|
-
status: draft # draft | ready | in-progress | completed | archived
|
|
5
|
-
owner: <git-handle>
|
|
6
|
-
parent-change: <change-spec-id>
|
|
7
|
-
steps-completed: [] # populated by `implementer` as phases finish
|
|
8
|
-
blocked-on: null # phase id when an interactive blocker stops progress
|
|
9
|
-
oversized-plan-justification: null # required when phase count > 12
|
|
10
|
-
created: <YYYY-MM-DD>
|
|
11
|
-
updated: <YYYY-MM-DD>
|
|
12
|
-
schema-version: 1
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## Roadmap Alignment
|
|
16
|
-
|
|
17
|
-
_One line, written by the planner against `hstack/context/roadmap.md`: does this change serve a Now/Next item, and does any phase foreclose a Next/Later item? When the roadmap is missing, not `current`, or `updated` > 90 days ago, write `n/a — roadmap stale/missing (<detail>)`. Advisory — never a gate._
|
|
18
|
-
|
|
19
|
-
## Phase Overview
|
|
20
|
-
|
|
21
|
-
_Table of phases. Three columns max._
|
|
22
|
-
|
|
23
|
-
| step-id | summary | depends-on |
|
|
24
|
-
| --- | --- | --- |
|
|
25
|
-
| phase-1- | | none |
|
|
26
|
-
|
|
27
|
-
## Per-Phase Detail
|
|
28
|
-
|
|
29
|
-
_One subsection per phase. 4–8 phases typical. >12 requires `oversized-plan-justification` in frontmatter._
|
|
30
|
-
|
|
31
|
-
### phase-1-
|
|
32
|
-
|
|
33
|
-
**Purpose.** _One sentence._
|
|
34
|
-
|
|
35
|
-
**Files Touched.** _Subset of `change-spec.in-scope`. Bullets._
|
|
36
|
-
|
|
37
|
-
-
|
|
38
|
-
|
|
39
|
-
**Test Strategy.** _Pointer to the test-plan section(s) this phase satisfies. Format: `test-plan §<section> — <one-line summary>`. The phase lands the tests named in the referenced section; do not restate or invent tests here. If this phase's work is exclusively non-test (e.g., a migration whose tests live in a later phase), state that explicitly and name the downstream phase that closes the loop._
|
|
40
|
-
|
|
41
|
-
**Risk.** _One sentence on what could go wrong locally._
|
|
42
|
-
|
|
43
|
-
**Verifier Expectations.** _What `verifier` must observe to mark this phase passed. References both this plan's Test Strategy and the test-plan sections the phase satisfies._
|
|
44
|
-
|
|
45
|
-
## Cross-Phase Risks
|
|
46
|
-
|
|
47
|
-
_Challenge prompt: what could go wrong across phase boundaries that no single phase catches? 1–3 bullets._
|
|
48
|
-
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
## Rollback
|
|
52
|
-
|
|
53
|
-
_What to do if a partial rollout in production breaks something. 2–4 sentences._
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: product-brief
|
|
3
|
-
type: product-brief
|
|
4
|
-
status: draft # draft | current | needs-refresh | archived
|
|
5
|
-
owner: <git-handle>
|
|
6
|
-
technique-used: <brainstorm | forcing-questions | project-brief>
|
|
7
|
-
derived-from: [] # always empty — product-brief is Phase 1, no upstream
|
|
8
|
-
downstream: [vision, roadmap, personas, glossary]
|
|
9
|
-
created: <YYYY-MM-DD>
|
|
10
|
-
updated: <YYYY-MM-DD>
|
|
11
|
-
schema-version: 1
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
## Underlying Pain
|
|
15
|
-
|
|
16
|
-
_What the user actually struggles with on a Tuesday morning, in concrete terms. Not "users want X" — "this specific person spends 20 minutes doing Y and misses Z." One paragraph, 4–8 sentences. The forcing-prompt reframes should have moved this away from the founder's first articulation; the result lands here._
|
|
17
|
-
|
|
18
|
-
## Target User
|
|
19
|
-
|
|
20
|
-
_A named, specific user (not "users", not "customers") with a workday vignette. Includes role, company-size band, tools they use today, the workflow this product enters. If multiple personas matter for v1, name them all — but each must pass the concreteness floor._
|
|
21
|
-
|
|
22
|
-
## Value Proposition
|
|
23
|
-
|
|
24
|
-
_What this product delivers to the named user, in their language. One paragraph. Distinct from features — this is the outcome they buy._
|
|
25
|
-
|
|
26
|
-
## Smallest Useful Wedge
|
|
27
|
-
|
|
28
|
-
_The minimum shippable surface that delivers real value to the named user. Forcing-prompt answer: "Would the named user still pay for this if you shipped only the wedge and nothing else?" Yes required; if no, the wedge is too large or the user is wrong._
|
|
29
|
-
|
|
30
|
-
## Success Criteria
|
|
31
|
-
|
|
32
|
-
_Concrete, measurable, time-bound. "Maya saves 10 minutes per QBR prep within 4 weeks of activation" not "users love it." At least one criterion; more is better._
|
|
33
|
-
|
|
34
|
-
## Explicitly NOT
|
|
35
|
-
|
|
36
|
-
_Two-bullet minimum. The boundaries of the product. What this is NOT, what it does NOT do, what populations it does NOT serve. Required, never optional — over-broad scoping is the #1 product failure mode._
|
|
37
|
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
|
|
41
|
-
## Open Risks
|
|
42
|
-
|
|
43
|
-
_The things that could make this product fail. The forcing-prompt "What would you have to believe to be wrong about this?" answer lands here. At least one risk; more is better._
|
|
44
|
-
|
|
45
|
-
## Forcing-Prompt Answers
|
|
46
|
-
|
|
47
|
-
_Evidence that the three required reframes ran. Logged inline as confirmation the probes were not skipped. The headings below are the canonical wording — record what was actually asked when a reframe was fitted to this product._
|
|
48
|
-
|
|
49
|
-
**Who specifically pays for this?**
|
|
50
|
-
_The named user / buyer plus the rationale ("Director of CS, because retention is their KPI")._
|
|
51
|
-
|
|
52
|
-
**What's the smallest useful wedge?**
|
|
53
|
-
_The wedge plus the rationale ("Change-awareness alone, because the rest of the workflow is downstream of it")._
|
|
54
|
-
|
|
55
|
-
**What would you have to believe to be wrong about this?**
|
|
56
|
-
_The belief plus the falsifiability angle ("That CS reps will trust LLM-generated summaries — wrong if they require human-curated context")._
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
id: <parent-change-id>-security-review
|
|
3
|
-
type: security-review
|
|
4
|
-
status: draft # draft | in-progress | passed | concerns-acknowledged | failed | superseded
|
|
5
|
-
owner: <git-handle>
|
|
6
|
-
parent-change: <change-spec-id>
|
|
7
|
-
scoring-mode: llm-scored # v1; v2 introduces 'executed'
|
|
8
|
-
scores:
|
|
9
|
-
data-at-rest: not-applicable # pass | concerns | fail | not-applicable
|
|
10
|
-
data-in-transit: not-applicable
|
|
11
|
-
authn: not-applicable
|
|
12
|
-
authz-rls: not-applicable
|
|
13
|
-
tenant-isolation: not-applicable
|
|
14
|
-
input-validation: not-applicable
|
|
15
|
-
output-encoding: not-applicable
|
|
16
|
-
secrets-handling: not-applicable
|
|
17
|
-
agent-prompt-injection: not-applicable
|
|
18
|
-
audit-logging: not-applicable
|
|
19
|
-
concerns-acknowledged-by: null # handle required when any score is `concerns`
|
|
20
|
-
threat-model-delta-required: false # true when surfaces touches agent | auth | api | db
|
|
21
|
-
challenge-prompts-answered: 0 # must equal 3 to pass
|
|
22
|
-
created: <YYYY-MM-DD>
|
|
23
|
-
updated: <YYYY-MM-DD>
|
|
24
|
-
schema-version: 1
|
|
25
|
-
---
|
|
26
|
-
|
|
27
|
-
## Surfaces Touched
|
|
28
|
-
|
|
29
|
-
_Pointer to change-spec `surfaces`. One sentence per surface._
|
|
30
|
-
|
|
31
|
-
## Hardening Items Scored
|
|
32
|
-
|
|
33
|
-
_For every applicable checklist item, a one-paragraph rationale for the score. Bias toward CONCERNS rather than PASS when evidence is thin._
|
|
34
|
-
|
|
35
|
-
### data-at-rest
|
|
36
|
-
|
|
37
|
-
### data-in-transit
|
|
38
|
-
|
|
39
|
-
### authz-rls
|
|
40
|
-
|
|
41
|
-
### tenant-isolation
|
|
42
|
-
|
|
43
|
-
### input-validation
|
|
44
|
-
|
|
45
|
-
### audit-logging
|
|
46
|
-
|
|
47
|
-
## Threat-Model Delta
|
|
48
|
-
|
|
49
|
-
_Required when `threat-model-delta-required: true`. One paragraph delta against the current threat-model.md. Refuse to score until this is non-empty when surfaces require it._
|
|
50
|
-
|
|
51
|
-
## Challenge Prompts
|
|
52
|
-
|
|
53
|
-
_All three required. Each answer must be at least one paragraph. The questions below are the canonical wording — adapt one to the change under review when the adaptation probes harder, and record what was actually asked in the heading. Keep the `(a)` / `(b)` / `(c)` prefixes: SR-02 locates the answers by them._
|
|
54
|
-
|
|
55
|
-
### (a) What attack vector did the In-Scope diff create that is NOT covered by the hardening checklist? If none, justify.
|
|
56
|
-
|
|
57
|
-
### (b) Which tenant_isolation guarantee does this change depend on? Cite the line of code that enforces it.
|
|
58
|
-
|
|
59
|
-
### (c) What part of this change would behave incorrectly under a malicious payload that the test suite does not cover?
|
|
60
|
-
|
|
61
|
-
## Open Concerns
|
|
62
|
-
|
|
63
|
-
_When any score is `concerns`: what acknowledgement is required and by whom. Ack must be human-confirmed by `owner` before status: concerns-acknowledged._
|