Skip to content

Commit 705dcd9

Browse files
committed
ci: add issue templates, label taxonomy, and label sync workflow
Engine-aware bug/feature/docs issue forms with required version+repro and objective SEV-1..4 severity, the namespaced label taxonomy (type/sev/priority/status/engine/area), and the workflow that syncs labels from .github/labels.yml.
1 parent 5d44064 commit 705dcd9

6 files changed

Lines changed: 447 additions & 0 deletions

File tree

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
name: Bug report
2+
description: Something is broken, incorrect, or lost data. Report a defect in the engine.
3+
title: "<one-line summary of what is broken>"
4+
labels: ["type:bug", "status:needs-triage"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
Thanks for reporting. A good bug report is **reproducible** and pins **exactly when it happened**.
10+
Fill every required field — an issue we cannot reproduce or place in a build cannot be fixed.
11+
12+
- **Security vulnerability?** Do **not** file it here — use a
13+
[private security advisory](https://github.com/NodeDB-Lab/nodedb/security/advisories/new).
14+
- **A usage question, not a defect?** Use
15+
[Discussions](https://github.com/NodeDB-Lab/nodedb/discussions).
16+
17+
- type: input
18+
id: version
19+
attributes:
20+
label: Version / build tested against
21+
description: >
22+
Where it happened. A released tag (`v0.3.0`), or `origin/main @ <short-sha>`
23+
for a source build. `SELECT version();` prints this. Never "latest".
24+
placeholder: "origin/main @ 8e84501a (or v0.3.0)"
25+
validations:
26+
required: true
27+
28+
- type: dropdown
29+
id: deployment
30+
attributes:
31+
label: Deployment mode
32+
options:
33+
- "Origin — single node (local)"
34+
- "Origin — distributed / cluster"
35+
- "NodeDB-Lite — embedded"
36+
- "NodeDB-Lite — WASM (browser)"
37+
- "Not sure"
38+
validations:
39+
required: true
40+
41+
- type: dropdown
42+
id: engines
43+
attributes:
44+
label: Engine(s) involved
45+
description: Select all that apply. Leave at "Not engine-specific / unsure" if it is cross-cutting (SQL, WAL, cluster, pgwire).
46+
multiple: true
47+
options:
48+
- "Not engine-specific / unsure"
49+
- "Document (schemaless)"
50+
- "Document (strict)"
51+
- "Key-Value"
52+
- "Columnar"
53+
- "Timeseries"
54+
- "Spatial"
55+
- "Vector"
56+
- "Array"
57+
- "Graph (overlay)"
58+
- "Full-Text Search (overlay)"
59+
validations:
60+
required: true
61+
62+
- type: textarea
63+
id: summary
64+
attributes:
65+
label: Summary
66+
description: One paragraph — what is wrong, and why it matters. No repro yet.
67+
placeholder: "count(*) on a document collection never decrements after DELETE, so cardinality reads drift permanently above the real row set with no error."
68+
validations:
69+
required: true
70+
71+
- type: textarea
72+
id: repro
73+
attributes:
74+
label: Steps to reproduce
75+
description: >
76+
Exact, minimal, copy-pasteable steps from a fresh data directory — SQL preferred.
77+
Annotate what each step returned. This is the single most important field.
78+
render: sql
79+
placeholder: |
80+
CREATE COLLECTION r (id TEXT PRIMARY KEY, v TEXT) WITH (engine='document_strict');
81+
INSERT INTO r (id, v) VALUES ('a','1'), ('b','2');
82+
SELECT count(*) FROM r; -- 2 (correct)
83+
DELETE FROM r WHERE id = 'a'; -- DELETE 1
84+
SELECT count(*) FROM r; -- 2 <- WRONG, expected 1
85+
validations:
86+
required: true
87+
88+
- type: textarea
89+
id: expected
90+
attributes:
91+
label: Expected behavior
92+
placeholder: "count(*) reflects the live row set — DELETE decrements it. An empty collection returns a single row with 0."
93+
validations:
94+
required: true
95+
96+
- type: textarea
97+
id: actual
98+
attributes:
99+
label: Actual behavior
100+
placeholder: "The counter only ever increments; after the first DELETE it permanently exceeds the real row set, while a scan returns the correct rows."
101+
validations:
102+
required: true
103+
104+
- type: markdown
105+
attributes:
106+
value: |
107+
---
108+
### Severity — answer the facts, then pick the level
109+
110+
Severity is a **technical** measure of impact. It is **not** priority (urgency/scheduling)
111+
— the maintainers set priority at triage based on release context. Answer the questions
112+
below honestly; they determine the level.
113+
114+
- type: checkboxes
115+
id: severity-facts
116+
attributes:
117+
label: What actually happened? (check all that are true)
118+
options:
119+
- label: "Acknowledged/committed data was lost, corrupted, or silently wrong"
120+
- label: "The server crashed, hung, or failed to start"
121+
- label: "A security or isolation boundary was crossed"
122+
- label: "Core functionality is broken with no acceptable workaround"
123+
- label: "A workaround exists (rewrite the query, avoid one path, etc.)"
124+
125+
- type: dropdown
126+
id: severity
127+
attributes:
128+
label: Proposed severity
129+
description: >
130+
Use the facts above. SEV-1: data loss / corruption / security / crash with no workaround.
131+
SEV-2: major functionality broken, no acceptable workaround. SEV-3: feature wrong but
132+
system operational and a workaround exists. SEV-4: minimal impact / cosmetic.
133+
Maintainers confirm or adjust this at triage.
134+
options:
135+
- "SEV-1 — Critical: data loss, corruption, security, or crash; no workaround"
136+
- "SEV-2 — High: major functionality broken; no acceptable workaround"
137+
- "SEV-3 — Medium: feature wrong, but operational and a workaround exists"
138+
- "SEV-4 — Low: minimal / cosmetic"
139+
validations:
140+
required: true
141+
142+
- type: dropdown
143+
id: reproducibility
144+
attributes:
145+
label: Reproducibility
146+
description: A consistently reproducible defect carries more confidence (and usually higher severity) than an intermittent one.
147+
options:
148+
- "Always — every attempt"
149+
- "Intermittent — some attempts"
150+
- "Seen once — could not reproduce again"
151+
validations:
152+
required: true
153+
154+
- type: input
155+
id: regression
156+
attributes:
157+
label: Last known-good version / commit (if a regression)
158+
description: If this worked on an earlier build, the tag or short SHA where it last worked. Leave blank if unknown or never worked.
159+
placeholder: "67c4572d"
160+
validations:
161+
required: false
162+
163+
- type: textarea
164+
id: environment
165+
attributes:
166+
label: Environment & logs
167+
description: OS + arch, notable build flags or `WITH (...)` options, and any relevant server log lines or stack traces.
168+
placeholder: |
169+
Linux x86_64, release build.
170+
Log: "Shutting down..." then on restart: <paste>
171+
validations:
172+
required: false
173+
174+
- type: checkboxes
175+
id: checks
176+
attributes:
177+
label: Before submitting
178+
options:
179+
- label: I searched existing issues and this is not a duplicate.
180+
required: true
181+
- label: I reproduced this on a released tag or a current `main` build (not a stale local branch).
182+
required: true
183+
- label: This is not a security vulnerability (those go to a private advisory).
184+
required: true

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
blank_issues_enabled: false
2+
contact_links:
3+
- name: Security vulnerability (private)
4+
url: https://github.com/NodeDB-Lab/nodedb/security/advisories/new
5+
about: Report security or data-isolation issues privately. Never in a public issue.
6+
- name: Question / discussion
7+
url: https://github.com/NodeDB-Lab/nodedb/discussions
8+
about: Usage questions, design discussion, and "is this a bug?" go here first.
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
name: Documentation issue
2+
description: Something in the docs is wrong, missing, or misleading.
3+
title: "<one-line summary>"
4+
labels: ["type:docs", "status:needs-triage"]
5+
body:
6+
- type: input
7+
id: location
8+
attributes:
9+
label: Where
10+
description: URL or file path of the doc.
11+
placeholder: "https://docs.nodedb... or nodedb/docs/..."
12+
validations:
13+
required: true
14+
15+
- type: textarea
16+
id: problem
17+
attributes:
18+
label: What's wrong
19+
description: What is incorrect, missing, or confusing — and what it should say.
20+
validations:
21+
required: true
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
name: Feature request
2+
description: Propose new capability or a change to existing behavior.
3+
title: "<one-line summary of the proposal>"
4+
labels: ["type:feature", "status:needs-triage"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
Proposals are judged on the **problem**, not the solution. Lead with what you can't do today.
10+
11+
- type: textarea
12+
id: problem
13+
attributes:
14+
label: Problem
15+
description: What are you trying to do that you can't (or can only do painfully) today? Concrete, from real usage.
16+
placeholder: "I run metrics ingestion and need continuous aggregates to survive restart without re-scanning the full retention window."
17+
validations:
18+
required: true
19+
20+
- type: textarea
21+
id: proposal
22+
attributes:
23+
label: Proposed solution
24+
description: What behavior, SQL surface, or API would solve it. Sketch the syntax if relevant.
25+
validations:
26+
required: true
27+
28+
- type: dropdown
29+
id: engines
30+
attributes:
31+
label: Engine / area
32+
multiple: true
33+
options:
34+
- "Not engine-specific / cross-cutting (SQL, cluster, storage)"
35+
- "Document (schemaless)"
36+
- "Document (strict)"
37+
- "Key-Value"
38+
- "Columnar"
39+
- "Timeseries"
40+
- "Spatial"
41+
- "Vector"
42+
- "Array"
43+
- "Graph (overlay)"
44+
- "Full-Text Search (overlay)"
45+
validations:
46+
required: true
47+
48+
- type: textarea
49+
id: alternatives
50+
attributes:
51+
label: Alternatives & workarounds
52+
description: What you do today instead, and why it's insufficient. Prior art in other databases is useful here.
53+
validations:
54+
required: false
55+
56+
- type: checkboxes
57+
id: checks
58+
attributes:
59+
label: Before submitting
60+
options:
61+
- label: I searched existing issues and discussions for this proposal.
62+
required: true

0 commit comments

Comments
 (0)