Skip to content

Commit 9465da9

Browse files
committed
fix: python 3.12+
1 parent 7c4d4a3 commit 9465da9

5 files changed

Lines changed: 26 additions & 163 deletions

File tree

.spec-driver/memory/mem.concept.spec-driver.requirement-lifecycle.md

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ name: Requirement Lifecycle Guidance
44
kind: memory
55
status: active
66
memory_type: concept
7-
updated: "2026-03-05"
8-
verified: "2026-03-05"
7+
updated: "2026-03-18"
8+
verified: "2026-03-18"
99
tags: [spec-driver, lifecycle, requirements, coverage]
1010
summary: "Agent-facing model for requirement lifecycle, coverage statuses, and traceability grounded in current implementation."
1111
scope:
@@ -39,6 +39,21 @@ provenance:
3939
- Coverage status and requirement status are distinct enums; do not mix them.
4040
- See `supekku/about/lifecycle.md` for code-truth details.
4141

42+
## Recognised Requirement Syntax
43+
44+
Sync extracts requirements from spec body lines matching these formats:
45+
46+
- **Bullet (primary):** `- **FR-001**: Title` or `- **SPEC-100.FR-001**: Title`
47+
- **Heading (backlog dotted):** `### FR-016.001: Title`
48+
49+
The label inside `**bold**` must be bare — ID only, no description or em-dash
50+
title. For example, `**FR-001 — Workspace resolution**:` will **not** match.
51+
52+
Optional inline category and tags are supported after the label:
53+
`- **FR-001**(category)[tag1, tag2]: Title`
54+
55+
The separator after the label/bold may be `:`, `-`, ``, or ``.
56+
4257
## Canonical Status Sets
4358

4459
- Requirement lifecycle: `pending`, `in-progress`, `active`, `retired`.

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.8.0
1+
0.8.1

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ authors = [
88
readme = "README.md"
99
long_description_content_type = "text/markdown"
1010
license = { text = "MIT" }
11-
requires-python = ">=3.10"
11+
requires-python = ">=3.12"
1212
dependencies = [
1313
"jinja2>=3.1.0",
1414
"pyyaml>=6.0.3",

supekku/scripts/lib/requirements/registry.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -541,7 +541,9 @@ def _validate_extraction(
541541
if len(extracted) == 0:
542542
print(
543543
f"WARNING: Spec {spec.id} ({spec.kind}) has 0 extracted requirements. "
544-
f"Check requirement format in {spec.path.name}",
544+
f"Expected format: '- **FR-001**: Title' or '- **SPEC-100.FR-001**: Title' "
545+
f"(label inside **bold** must be bare — no description). "
546+
f"Check {spec.path.name}",
545547
file=sys.stderr,
546548
)
547549
logger.warning(
@@ -1254,7 +1256,9 @@ def _records_from_content(
12541256
if requirement_like_lines and extracted_count == 0:
12551257
logger.warning(
12561258
"Spec %s at %s: Found %d requirement-like lines but extracted 0. "
1257-
"First line: %s",
1259+
"Expected format: '- **FR-001**: Title' or '- **SPEC-100.FR-001**: Title'. "
1260+
"The label inside **bold** must be bare (no description). "
1261+
"First unmatched line: %s",
12581262
spec_id,
12591263
spec_path.name,
12601264
len(requirement_like_lines),

0 commit comments

Comments
 (0)