@stravica-ai/rcf-schemas 0.2.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 +62 -0
- package/LICENSE +202 -0
- package/README.md +165 -0
- package/docs/README.md +37 -0
- package/docs/adr.md +42 -0
- package/docs/build-sequence.md +44 -0
- package/docs/common.md +43 -0
- package/docs/fbs.md +75 -0
- package/docs/file-layout.md +62 -0
- package/docs/id-conventions.md +60 -0
- package/docs/manifest.md +70 -0
- package/docs/prd.md +64 -0
- package/docs/req.md +57 -0
- package/docs/tac.md +49 -0
- package/docs/tad.md +76 -0
- package/docs/test-suite.md +56 -0
- package/docs/user-story.md +61 -0
- package/fixtures/invalid/adr/adr-001-authoring-status.json +13 -0
- package/fixtures/invalid/adr/adr-002-supersededBy-bad-id.json +14 -0
- package/fixtures/invalid/adr/adr-003-missing-tadId.json +12 -0
- package/fixtures/invalid/build-sequence/bs-001-legacy-fbs-array.json +11 -0
- package/fixtures/invalid/build-sequence/bs-002-missing-prdId.json +7 -0
- package/fixtures/invalid/fbs/fbs-001-storyScope-wrapper.json +16 -0
- package/fixtures/invalid/fbs/fbs-002-empty-acIds.json +13 -0
- package/fixtures/invalid/fbs/fbs-003-authoring-status.json +13 -0
- package/fixtures/invalid/fbs/fbs-004-plain-int-acId.json +13 -0
- package/fixtures/invalid/fbs/fbs-005-missing-buildOrder.json +12 -0
- package/fixtures/invalid/fbs/fbs-006-buildOrder-zero.json +13 -0
- package/fixtures/invalid/manifest/manifest-001-userStories-array.json +10 -0
- package/fixtures/invalid/manifest/manifest-002-legacy-buildSequence.json +7 -0
- package/fixtures/invalid/manifest/manifest-003-wrong-version.json +7 -0
- package/fixtures/invalid/prd/prd-001-typoed-status.json +10 -0
- package/fixtures/invalid/prd/prd-002-legacy-requirementIds.json +11 -0
- package/fixtures/invalid/prd/prd-003-missing-objectives.json +9 -0
- package/fixtures/invalid/req/req-001-bad-prefix.json +13 -0
- package/fixtures/invalid/req/req-002-unknown-category.json +13 -0
- package/fixtures/invalid/req/req-003-missing-prdId.json +12 -0
- package/fixtures/invalid/tac/tac-001-empty-responsibilities.json +12 -0
- package/fixtures/invalid/tac/tac-002-bad-dependency-kind.json +15 -0
- package/fixtures/invalid/tac/tac-003-missing-tadId.json +11 -0
- package/fixtures/invalid/tad/tad-001-legacy-componentIds.json +16 -0
- package/fixtures/invalid/tad/tad-002-partial-deployment.json +17 -0
- package/fixtures/invalid/test-suite/ts-001-missing-usId.json +18 -0
- package/fixtures/invalid/test-suite/ts-002-empty-acIds.json +19 -0
- package/fixtures/invalid/test-suite/ts-003-bad-tc-id.json +19 -0
- package/fixtures/invalid/test-suite/ts-004-bad-tc-status.json +19 -0
- package/fixtures/invalid/test-suite/ts-005-bad-test-level.json +12 -0
- package/fixtures/invalid/user-story/us-001-empty-acs.json +14 -0
- package/fixtures/invalid/user-story/us-002-ac-missing-testable.json +19 -0
- package/fixtures/valid/adr/adr-001-minimal.json +13 -0
- package/fixtures/valid/adr/adr-002-comprehensive.json +27 -0
- package/fixtures/valid/adr/adr-003-draft-status.json +13 -0
- package/fixtures/valid/build-sequence/bs-001-minimal.json +8 -0
- package/fixtures/valid/build-sequence/bs-002-comprehensive.json +11 -0
- package/fixtures/valid/fbs/fbs-001-minimal.json +13 -0
- package/fixtures/valid/fbs/fbs-002-comprehensive.json +34 -0
- package/fixtures/valid/manifest/manifest-001-minimal.json +7 -0
- package/fixtures/valid/manifest/manifest-002-with-description.json +8 -0
- package/fixtures/valid/prd/prd-001-minimal.json +12 -0
- package/fixtures/valid/prd/prd-002-comprehensive.json +34 -0
- package/fixtures/valid/req/req-001-minimal.json +13 -0
- package/fixtures/valid/req/req-002-comprehensive.json +15 -0
- package/fixtures/valid/tac/tac-001-minimal.json +15 -0
- package/fixtures/valid/tac/tac-002-comprehensive.json +49 -0
- package/fixtures/valid/tad/tad-001-minimal.json +14 -0
- package/fixtures/valid/tad/tad-002-comprehensive.json +71 -0
- package/fixtures/valid/test-suite/ts-001-minimal.json +19 -0
- package/fixtures/valid/test-suite/ts-002-comprehensive.json +32 -0
- package/fixtures/valid/user-story/us-001-minimal.json +20 -0
- package/fixtures/valid/user-story/us-002-hierarchical-acs.json +40 -0
- package/package.json +44 -0
- package/schemas/adr.schema.json +58 -0
- package/schemas/build-sequence.schema.json +22 -0
- package/schemas/common.schema.json +103 -0
- package/schemas/fbs.schema.json +90 -0
- package/schemas/manifest.schema.json +17 -0
- package/schemas/prd.schema.json +49 -0
- package/schemas/req.schema.json +39 -0
- package/schemas/tac.schema.json +73 -0
- package/schemas/tad.schema.json +162 -0
- package/schemas/test-suite.schema.json +61 -0
- package/schemas/user-story.schema.json +56 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fbsId": "FBS-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"bsId": "BS-001",
|
|
5
|
+
"buildOrder": 1,
|
|
6
|
+
"executionStatus": "notStarted",
|
|
7
|
+
"title": "x",
|
|
8
|
+
"summary": "y",
|
|
9
|
+
"acIds": ["AC-001"],
|
|
10
|
+
"dependsOnFbsIds": [],
|
|
11
|
+
"storyScope": [
|
|
12
|
+
{ "acIds": ["AC-001"] }
|
|
13
|
+
],
|
|
14
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
15
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
16
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fbsId": "FBS-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"bsId": "BS-001",
|
|
5
|
+
"buildOrder": 1,
|
|
6
|
+
"executionStatus": "notStarted",
|
|
7
|
+
"title": "x",
|
|
8
|
+
"summary": "y",
|
|
9
|
+
"acIds": [],
|
|
10
|
+
"dependsOnFbsIds": [],
|
|
11
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
12
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fbsId": "FBS-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"bsId": "BS-001",
|
|
5
|
+
"buildOrder": 1,
|
|
6
|
+
"executionStatus": "approved",
|
|
7
|
+
"title": "x",
|
|
8
|
+
"summary": "y",
|
|
9
|
+
"acIds": ["AC-001"],
|
|
10
|
+
"dependsOnFbsIds": [],
|
|
11
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
12
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fbsId": "FBS-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"bsId": "BS-001",
|
|
5
|
+
"buildOrder": 1,
|
|
6
|
+
"executionStatus": "notStarted",
|
|
7
|
+
"title": "x",
|
|
8
|
+
"summary": "y",
|
|
9
|
+
"acIds": [101],
|
|
10
|
+
"dependsOnFbsIds": [],
|
|
11
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
12
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
13
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fbsId": "FBS-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"bsId": "BS-001",
|
|
5
|
+
"executionStatus": "notStarted",
|
|
6
|
+
"title": "x",
|
|
7
|
+
"summary": "y",
|
|
8
|
+
"acIds": ["AC-001"],
|
|
9
|
+
"dependsOnFbsIds": [],
|
|
10
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
11
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
12
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fbsId": "FBS-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"bsId": "BS-001",
|
|
5
|
+
"buildOrder": 0,
|
|
6
|
+
"executionStatus": "notStarted",
|
|
7
|
+
"title": "x",
|
|
8
|
+
"summary": "y",
|
|
9
|
+
"acIds": ["AC-001"],
|
|
10
|
+
"dependsOnFbsIds": [],
|
|
11
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
12
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
13
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "2.0.0",
|
|
3
|
+
"projectName": "Acme Notes",
|
|
4
|
+
"prd": { "id": "PRD-001", "path": "rcf/prd.json" },
|
|
5
|
+
"tad": { "id": "TAD-001", "path": "rcf/tad.json" },
|
|
6
|
+
"bs": { "id": "BS-001", "path": "rcf/build-sequence.json" },
|
|
7
|
+
"userStories": [
|
|
8
|
+
{ "id": "US-001", "path": "rcf/user-stories/US-001.json" }
|
|
9
|
+
]
|
|
10
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"prdId": "PRD-001",
|
|
3
|
+
"productName": "Acme Notes",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"status": "draft",
|
|
6
|
+
"problemStatement": "x",
|
|
7
|
+
"objectives": ["y"],
|
|
8
|
+
"requirementIds": ["REQ-001"],
|
|
9
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
10
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
11
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "REQUIREMENT-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "x",
|
|
5
|
+
"description": "y",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "z",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"version": "0.1.0",
|
|
10
|
+
"status": "draft",
|
|
11
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
12
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
13
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "REQ-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"title": "x",
|
|
5
|
+
"description": "y",
|
|
6
|
+
"category": "operational",
|
|
7
|
+
"domain": "z",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"version": "0.1.0",
|
|
10
|
+
"status": "draft",
|
|
11
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
12
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
13
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"name": "x",
|
|
8
|
+
"purpose": "y",
|
|
9
|
+
"responsibilities": ["z"],
|
|
10
|
+
"dependencies": [
|
|
11
|
+
{ "name": "thing", "kind": "internal" }
|
|
12
|
+
],
|
|
13
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
14
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
15
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tadId": "TAD-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"status": "draft",
|
|
6
|
+
"systemOverview": {
|
|
7
|
+
"executiveSummary": "x",
|
|
8
|
+
"systemPurpose": "y",
|
|
9
|
+
"architecturalApproach": "z",
|
|
10
|
+
"keyCapabilities": ["w"]
|
|
11
|
+
},
|
|
12
|
+
"componentIds": ["TAC-001"],
|
|
13
|
+
"architecturalDecisionIds": ["ADR-001"],
|
|
14
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
15
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
16
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tadId": "TAD-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"status": "draft",
|
|
6
|
+
"systemOverview": {
|
|
7
|
+
"executiveSummary": "x",
|
|
8
|
+
"systemPurpose": "y",
|
|
9
|
+
"architecturalApproach": "z",
|
|
10
|
+
"keyCapabilities": ["w"]
|
|
11
|
+
},
|
|
12
|
+
"deploymentArchitecture": {
|
|
13
|
+
"topology": "edge"
|
|
14
|
+
},
|
|
15
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
16
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
17
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "TS-001",
|
|
3
|
+
"title": "x",
|
|
4
|
+
"purpose": "y",
|
|
5
|
+
"testLevel": "unit",
|
|
6
|
+
"acIds": ["AC-001"],
|
|
7
|
+
"testCases": [
|
|
8
|
+
{
|
|
9
|
+
"id": "TC-001-a",
|
|
10
|
+
"acId": "AC-001",
|
|
11
|
+
"description": "z",
|
|
12
|
+
"status": "pending"
|
|
13
|
+
}
|
|
14
|
+
],
|
|
15
|
+
"status": "draft",
|
|
16
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "TS-001",
|
|
3
|
+
"usId": "US-001",
|
|
4
|
+
"title": "x",
|
|
5
|
+
"purpose": "y",
|
|
6
|
+
"testLevel": "unit",
|
|
7
|
+
"acIds": [],
|
|
8
|
+
"testCases": [
|
|
9
|
+
{
|
|
10
|
+
"id": "TC-001-a",
|
|
11
|
+
"acId": "AC-001",
|
|
12
|
+
"description": "z",
|
|
13
|
+
"status": "pending"
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"status": "draft",
|
|
17
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
18
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
19
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "TS-001",
|
|
3
|
+
"usId": "US-001",
|
|
4
|
+
"title": "x",
|
|
5
|
+
"purpose": "y",
|
|
6
|
+
"testLevel": "unit",
|
|
7
|
+
"acIds": ["AC-001"],
|
|
8
|
+
"testCases": [
|
|
9
|
+
{
|
|
10
|
+
"id": "TC-1-slug",
|
|
11
|
+
"acId": "AC-001",
|
|
12
|
+
"description": "TC id has fewer than three digits in the TS suffix, which the pattern forbids.",
|
|
13
|
+
"status": "pending"
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"status": "draft",
|
|
17
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
18
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
19
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "TS-001",
|
|
3
|
+
"usId": "US-001",
|
|
4
|
+
"title": "x",
|
|
5
|
+
"purpose": "y",
|
|
6
|
+
"testLevel": "unit",
|
|
7
|
+
"acIds": ["AC-001"],
|
|
8
|
+
"testCases": [
|
|
9
|
+
{
|
|
10
|
+
"id": "TC-001-a",
|
|
11
|
+
"acId": "AC-001",
|
|
12
|
+
"description": "TC status is not in the enum.",
|
|
13
|
+
"status": "approved"
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"status": "draft",
|
|
17
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
18
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
19
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-001",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "x",
|
|
8
|
+
"asA": "y",
|
|
9
|
+
"iWant": "z",
|
|
10
|
+
"soThat": "w",
|
|
11
|
+
"acceptanceCriteria": [],
|
|
12
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
13
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
14
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-001",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "x",
|
|
8
|
+
"asA": "y",
|
|
9
|
+
"iWant": "z",
|
|
10
|
+
"soThat": "w",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-001",
|
|
14
|
+
"description": "missing testable boolean"
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
18
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
19
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "accepted",
|
|
7
|
+
"title": "Use IndexedDB for local note storage",
|
|
8
|
+
"context": "We need a browser-resident store that survives reloads and supports structured queries.",
|
|
9
|
+
"decision": "Adopt IndexedDB via a thin Promise wrapper.",
|
|
10
|
+
"consequences": "Adds a build-time dependency on the wrapper; cheaper than rolling our own.",
|
|
11
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
12
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
13
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-100",
|
|
3
|
+
"prdId": "PRD-100",
|
|
4
|
+
"tadId": "TAD-100",
|
|
5
|
+
"version": "2.0.0",
|
|
6
|
+
"status": "superseded",
|
|
7
|
+
"title": "CRDT library choice for conflict resolution",
|
|
8
|
+
"context": "Multiple devices may edit the same note offline; we need a deterministic merge.",
|
|
9
|
+
"decision": "Adopt Yjs for CRDT primitives, wrapped in a thin domain layer.",
|
|
10
|
+
"consequences": "Adds ~50 KB to the bundle. Removes the bulk of custom conflict-handling code. Locks us to a Yjs-compatible wire format.",
|
|
11
|
+
"alternativesConsidered": [
|
|
12
|
+
{
|
|
13
|
+
"name": "Automerge",
|
|
14
|
+
"summary": "Comparable CRDT library with a different runtime profile.",
|
|
15
|
+
"reasonNotChosen": "Bundle size larger; ecosystem smaller at evaluation time."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"name": "Hand-rolled three-way merge",
|
|
19
|
+
"summary": "Custom merge per field.",
|
|
20
|
+
"reasonNotChosen": "Too much edge-case complexity for a small team."
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"supersededBy": "ADR-101",
|
|
24
|
+
"relatedAdrs": ["ADR-050", "ADR-099"],
|
|
25
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
26
|
+
"updatedAt": "2026-05-01T12:00:00Z"
|
|
27
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"adrId": "ADR-050",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Choose data-serialisation format for note bodies",
|
|
8
|
+
"context": "We need a stable on-disk format for note bodies that supports rich text and citations.",
|
|
9
|
+
"decision": "Draft: proposing markdown-plus-frontmatter with a small custom directive vocabulary.",
|
|
10
|
+
"consequences": "Straightforward to author; tooling ecosystem broad. Requires a directive parser step at render time.",
|
|
11
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
12
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
13
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"bsId": "BS-100",
|
|
3
|
+
"prdId": "PRD-100",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"status": "approved",
|
|
6
|
+
"title": "Stravica Notebook initial delivery",
|
|
7
|
+
"buildPhilosophy": "Vertical slice first; ship a thin end-to-end note creation path before broadening.",
|
|
8
|
+
"generationStrategy": "verticalSlice",
|
|
9
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
10
|
+
"updatedAt": "2026-05-01T12:00:00Z"
|
|
11
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fbsId": "FBS-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"bsId": "BS-001",
|
|
5
|
+
"buildOrder": 1,
|
|
6
|
+
"executionStatus": "notStarted",
|
|
7
|
+
"title": "Persist notes to IndexedDB",
|
|
8
|
+
"summary": "Add an IndexedDB-backed store that captures create/read/update on the Note entity.",
|
|
9
|
+
"acIds": ["AC-001"],
|
|
10
|
+
"dependsOnFbsIds": [],
|
|
11
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
12
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
13
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fbsId": "FBS-100",
|
|
3
|
+
"prdId": "PRD-100",
|
|
4
|
+
"bsId": "BS-100",
|
|
5
|
+
"buildOrder": 4,
|
|
6
|
+
"executionStatus": "inProgress",
|
|
7
|
+
"title": "Sync Worker push endpoint",
|
|
8
|
+
"summary": "Build the Cloudflare Worker /sync/push endpoint that accepts a batch of client deltas and writes them to R2.",
|
|
9
|
+
"approach": "Stateless Worker; deltas are appended as versioned objects in R2 keyed by user id and timestamp. Concurrency handled by R2's strong consistency on PUT-if-match.",
|
|
10
|
+
"acIds": ["AC-101-1", "AC-101-2"],
|
|
11
|
+
"dependsOnFbsIds": ["FBS-099"],
|
|
12
|
+
"contextRequirements": {
|
|
13
|
+
"prdSections": ["sync", "offline"],
|
|
14
|
+
"tadSections": ["integrationArchitecture", "operationalConcerns"],
|
|
15
|
+
"tacIds": ["TAC-100", "TAC-101"],
|
|
16
|
+
"adrIds": ["ADR-100"],
|
|
17
|
+
"existingModules": ["src/sync/r2Adapter.js"],
|
|
18
|
+
"schemas": ["schemas/sync-delta.schema.json"],
|
|
19
|
+
"externalDocs": ["https://developers.cloudflare.com/r2/"],
|
|
20
|
+
"other": ["See FBS-099 for the prior local-store work."]
|
|
21
|
+
},
|
|
22
|
+
"estimatedSize": "medium",
|
|
23
|
+
"estimatedHours": 6,
|
|
24
|
+
"deliverables": [
|
|
25
|
+
"POST /sync/push handler",
|
|
26
|
+
"Unit tests for delta validation",
|
|
27
|
+
"Integration test against local R2 emulator"
|
|
28
|
+
],
|
|
29
|
+
"riskLevel": "medium",
|
|
30
|
+
"domain": "sync",
|
|
31
|
+
"notes": "Watch the 50 ms CPU budget; large delta batches may need chunking.",
|
|
32
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
33
|
+
"updatedAt": "2026-05-01T12:00:00Z"
|
|
34
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "2.0.0",
|
|
3
|
+
"projectName": "Stravica Notebook",
|
|
4
|
+
"description": "Markdown-first notebook with offline-first sync. RCF v2 project.",
|
|
5
|
+
"prd": { "id": "PRD-100", "path": "rcf/prd.json" },
|
|
6
|
+
"tad": { "id": "TAD-100", "path": "rcf/tad.json" },
|
|
7
|
+
"bs": { "id": "BS-100", "path": "rcf/build-sequence.json" }
|
|
8
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{
|
|
2
|
+
"prdId": "PRD-001",
|
|
3
|
+
"productName": "Acme Notes",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"status": "draft",
|
|
6
|
+
"problemStatement": "Users keep losing track of meeting notes scattered across tools.",
|
|
7
|
+
"objectives": [
|
|
8
|
+
"Single home for personal notes across devices."
|
|
9
|
+
],
|
|
10
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
11
|
+
"updatedAt": "2026-01-01T00:00:00Z"
|
|
12
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"prdId": "PRD-100",
|
|
3
|
+
"productName": "Stravica Notebook",
|
|
4
|
+
"version": "1.2.3",
|
|
5
|
+
"status": "approved",
|
|
6
|
+
"executiveSummary": "A markdown-first notebook that syncs across devices and supports first-class linking between notes.",
|
|
7
|
+
"problemStatement": "Knowledge workers maintain notes across many tools; cross-tool linking, search, and offline access are unsolved.",
|
|
8
|
+
"targetUsers": [
|
|
9
|
+
"Knowledge workers",
|
|
10
|
+
"Researchers",
|
|
11
|
+
"Software engineers"
|
|
12
|
+
],
|
|
13
|
+
"inScope": [
|
|
14
|
+
"Markdown editing",
|
|
15
|
+
"Wiki-style linking",
|
|
16
|
+
"Multi-device sync",
|
|
17
|
+
"Full-text search"
|
|
18
|
+
],
|
|
19
|
+
"outOfScope": [
|
|
20
|
+
"Real-time collaborative editing",
|
|
21
|
+
"Mobile-native clients in v1"
|
|
22
|
+
],
|
|
23
|
+
"objectives": [
|
|
24
|
+
"Capture is friction-free",
|
|
25
|
+
"Retrieval beats ten-second target",
|
|
26
|
+
"Offline-first behaviour by default"
|
|
27
|
+
],
|
|
28
|
+
"constraints": [
|
|
29
|
+
"Single-developer maintenance budget",
|
|
30
|
+
"Apache 2.0 license"
|
|
31
|
+
],
|
|
32
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
33
|
+
"updatedAt": "2026-03-15T10:30:00Z"
|
|
34
|
+
}
|