r2s 0.2.1__tar.gz

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.
r2s-0.2.1/CHANGELOG.md ADDED
@@ -0,0 +1,101 @@
1
+ # Changelog
2
+
3
+ All notable changes to **r2s** are recorded here with **full Git commit SHAs**.
4
+ Verify any entry:
5
+
6
+ ```bash
7
+ git cat-file -t <sha> # expect: commit
8
+ git log -1 --oneline <sha>
9
+ ```
10
+
11
+ Style: [Keep a Changelog](https://keepachangelog.com/).
12
+
13
+ ---
14
+
15
+ ## [Unreleased]
16
+
17
+ ## [0.2.1] — 2026-09-20
18
+
19
+ ### Added
20
+ - First production PyPI publish via Trusted Publishing (`v0.2.1` GitHub Release)
21
+
22
+ ### Changed
23
+ - Package version bump 0.2.0 → 0.2.1 (0.2.0 remains on TestPyPI)
24
+
25
+
26
+ **Packaging PR #10 merge tip:** `dc824bcee62f6f9ec92ee6755f2ebe4fa8317588`
27
+
28
+ ### Added
29
+ - PyPI packaging metadata (0.2.0), Trusted Publishing workflow, packaged schemas for wheel installs
30
+ - `docs/publishing.md` Trusted Publishing checklist
31
+
32
+ **main tip (after identity harden):** `4bdb13527ad0531e86fd86515f606908d267adb8`
33
+
34
+ Public hardening tracked in GitHub Issues (social preview, release tags, etc.).
35
+
36
+ ---
37
+
38
+ ## [0.2.0] — 2026-09-20 — reference runtime
39
+
40
+ | | SHA |
41
+ |-|-----|
42
+ | Tip (outcome log) | `2133fb986be9c015179f9aedb1203b0f61d13000` |
43
+ | Merge (PR #1) | `8eb906635969c28b5d4fa8893587f4452f63a951` |
44
+ | Runtime feature | `0f60af7911fd361bdc1549f05a63f399d84712eb` |
45
+ | Build-artifact ignore | `72f1fb9875f4586ca0ad3ac4e59a046031d4bd75` |
46
+ | PR | https://github.com/ao3575911/r2s/pull/1 |
47
+
48
+ ### Added
49
+ - Python package `r2s` (`score`, `should_kill`, `rank`, `handoff`, `load_board` / `load_card`)
50
+ - CLI + pytest GitHub Actions workflow
51
+ - Cycle 1 ship outcome (`examples/outcome.runtime.example.json`)
52
+
53
+ ### Changed
54
+ - Ignore egg-info build artifacts
55
+
56
+ ### Verified object types
57
+ ```text
58
+ 8eb906635969c28b5d4fa8893587f4452f63a951 merge
59
+ 0f60af7911fd361bdc1549f05a63f399d84712eb feat runtime
60
+ 72f1fb9875f4586ca0ad3ac4e59a046031d4bd75 chore
61
+ 2133fb986be9c015179f9aedb1203b0f61d13000 outcome log
62
+ ```
63
+
64
+ ---
65
+
66
+ ## [0.1.0] — 2026-09-20 — spec contract
67
+
68
+ | | SHA |
69
+ |-|-----|
70
+ | Initial spec tree | `9ca117eaa83d2abc18d2d233eb12f6ac6ce21af6` |
71
+ | Brand / README / MIT | `a96fd16ff8a461b0fb6d43b5686edfe8a6041613` |
72
+ | Cycle 0 outcome + cycle 1 handoff draft | `8b5e0f65c275645be0fbc699ff22a69e53167711` |
73
+
74
+ ### Added
75
+ - JSON Schemas: card, board, handoff, outcome, scoring
76
+ - `docs/SPEC.md`, examples, MIT license
77
+ - Brand assets + professional README
78
+ - Cycle 0 ship outcome; cycle 1 runtime handoff packet
79
+
80
+ ### Verified object types
81
+ ```text
82
+ 9ca117eaa83d2abc18d2d233eb12f6ac6ce21af6 initial
83
+ a96fd16ff8a461b0fb6d43b5686edfe8a6041613 brand harden
84
+ 8b5e0f65c275645be0fbc699ff22a69e53167711 cycle 0 outcome
85
+ ```
86
+
87
+ ---
88
+
89
+ ## Identity
90
+
91
+ | Field | Value |
92
+ |-------|--------|
93
+ | Repository | https://github.com/ao3575911/r2s |
94
+ | Default branch | `main` |
95
+ | Owner | [ao3575911](https://github.com/ao3575911) |
96
+ | License | MIT |
97
+ | Normative contract | `docs/SPEC.md` + `schemas/` |
98
+ | Brand mark | ↻ |
99
+ | Changelog | this file (SHA-verified) |
100
+ | Security | `SECURITY.md` |
101
+
r2s-0.2.1/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Adam O'Connor (ao3575911)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
r2s-0.2.1/MANIFEST.in ADDED
@@ -0,0 +1,6 @@
1
+ include LICENSE
2
+ include README.md
3
+ include CHANGELOG.md
4
+ include SECURITY.md
5
+ recursive-include src/r2s/schemas *.schema.json
6
+ recursive-include schemas *.schema.json
r2s-0.2.1/PKG-INFO ADDED
@@ -0,0 +1,117 @@
1
+ Metadata-Version: 2.4
2
+ Name: r2s
3
+ Version: 0.2.1
4
+ Summary: Reference runtime for the r2s research-to-ship JSON Schema contract
5
+ Author: ao3575911
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://github.com/ao3575911/r2s
8
+ Project-URL: Repository, https://github.com/ao3575911/r2s
9
+ Project-URL: Changelog, https://github.com/ao3575911/r2s/blob/main/CHANGELOG.md
10
+ Project-URL: Issues, https://github.com/ao3575911/r2s/issues
11
+ Project-URL: Documentation, https://github.com/ao3575911/r2s/blob/main/docs/SPEC.md
12
+ Keywords: json-schema,research,handoff,ranking,specification
13
+ Classifier: Development Status :: 4 - Beta
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.11
17
+ Classifier: Programming Language :: Python :: 3.12
18
+ Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Topic :: Software Development :: Libraries
20
+ Classifier: Typing :: Typed
21
+ Requires-Python: >=3.11
22
+ Description-Content-Type: text/markdown
23
+ License-File: LICENSE
24
+ Requires-Dist: jsonschema<5,>=4.22
25
+ Requires-Dist: referencing<1,>=0.35
26
+ Provides-Extra: dev
27
+ Requires-Dist: pytest<9,>=8; extra == "dev"
28
+ Requires-Dist: build<2,>=1.2; extra == "dev"
29
+ Requires-Dist: twine<7,>=5; extra == "dev"
30
+ Dynamic: license-file
31
+
32
+ <p align="center">
33
+ <img src="docs/brand/icon.png" alt="r2s" width="96" height="96" />
34
+ </p>
35
+
36
+ <h1 align="center">r2s</h1>
37
+
38
+ <p align="center">
39
+ <strong>↻ research → rank → ship</strong><br />
40
+ JSON Schema contract for turning research signals into repo and library work.
41
+ </p>
42
+
43
+ <p align="center">
44
+ <img src="docs/brand/loop.gif" alt="sense → rank → handoff → ship" width="640" />
45
+ </p>
46
+
47
+ <p align="center">
48
+ <a href="docs/SPEC.md"><img src="https://img.shields.io/badge/spec-v0.1.0-5eead4?style=flat-square" alt="spec v0.1.0" /></a>
49
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-0f1115?style=flat-square" alt="MIT" /></a>
50
+ <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/changelog-SHA%20verified-5eead4?style=flat-square" alt="changelog" /></a>
51
+ <img src="https://img.shields.io/badge/runtime-Python%203.11%2B-8b949e?style=flat-square" alt="Python runtime" />
52
+ </p>
53
+
54
+ ---
55
+
56
+ ## What this is
57
+
58
+ **r2s** is a small, versioned contract — not an agent and not a framework.
59
+
60
+ You normalize research into **cards**, **rank** them with an explicit score, emit a fixed **handoff** for whoever builds, then record an **outcome** so the next cycle is smarter.
61
+
62
+ **v0.1.0** is the schema contract; **v0.2.0** adds a thin Python reference runtime. Both obey `docs/SPEC.md`. Public history with full commit SHAs: [`CHANGELOG.md`](CHANGELOG.md).
63
+
64
+ ## Quick start
65
+
66
+ 1. Read the normative rules: [`docs/SPEC.md`](docs/SPEC.md)
67
+ 2. Copy [`examples/board.example.json`](examples/board.example.json)
68
+ 3. Validate with any JSON Schema Draft 2020-12 validator against [`schemas/`](schemas/)
69
+
70
+ ## Loop
71
+
72
+ | Stage | Artifact | Role |
73
+ |-------|----------|------|
74
+ | Sense | `card` | Normalize a research signal |
75
+ | Rank | `board` + scoring rules | Order work; kill weak cards |
76
+ | Handoff | `handoff` | 7-part ship packet for implementers |
77
+ | Ship / learn | `outcome` | Close the loop |
78
+
79
+ **Score**
80
+
81
+ ```text
82
+ S = (novelty × evidence_strength × usability × dependency_fit)
83
+ / (hours + compute_cost + blast_radius)
84
+ ```
85
+
86
+ Kill when usability or dependency fit ≈ 0, or `target_repo` is missing at design+.
87
+
88
+ ## Layout
89
+
90
+ ```text
91
+ schemas/ card · board · handoff · outcome · scoring
92
+ docs/SPEC.md normative rules
93
+ docs/brand/ icon · social · README loop GIF
94
+ examples/ worked board + handoff (this repo as the sample)
95
+ ```
96
+
97
+ ## Brand
98
+
99
+ | | |
100
+ |-|-|
101
+ | Mark | stacked cards → chevron (cyan on charcoal) |
102
+ | Emoji | ↻ |
103
+ | Accent | `#5eead4` on `#0f1115` |
104
+
105
+ ## Security
106
+
107
+ Card fields are **untrusted data**. Validators must not execute claim or evidence strings. This repo holds no credentials and no network clients.
108
+
109
+ ## Changelog & identity
110
+
111
+ Ship history is **SHA-verified** in [`CHANGELOG.md`](CHANGELOG.md). Security posture: [`SECURITY.md`](SECURITY.md).
112
+
113
+ Current `main` tip at publish of this note is recorded in the changelog Unreleased/latest section after each merge.
114
+
115
+ ## License
116
+
117
+ [MIT](LICENSE)
r2s-0.2.1/README.md ADDED
@@ -0,0 +1,86 @@
1
+ <p align="center">
2
+ <img src="docs/brand/icon.png" alt="r2s" width="96" height="96" />
3
+ </p>
4
+
5
+ <h1 align="center">r2s</h1>
6
+
7
+ <p align="center">
8
+ <strong>↻ research → rank → ship</strong><br />
9
+ JSON Schema contract for turning research signals into repo and library work.
10
+ </p>
11
+
12
+ <p align="center">
13
+ <img src="docs/brand/loop.gif" alt="sense → rank → handoff → ship" width="640" />
14
+ </p>
15
+
16
+ <p align="center">
17
+ <a href="docs/SPEC.md"><img src="https://img.shields.io/badge/spec-v0.1.0-5eead4?style=flat-square" alt="spec v0.1.0" /></a>
18
+ <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-0f1115?style=flat-square" alt="MIT" /></a>
19
+ <a href="CHANGELOG.md"><img src="https://img.shields.io/badge/changelog-SHA%20verified-5eead4?style=flat-square" alt="changelog" /></a>
20
+ <img src="https://img.shields.io/badge/runtime-Python%203.11%2B-8b949e?style=flat-square" alt="Python runtime" />
21
+ </p>
22
+
23
+ ---
24
+
25
+ ## What this is
26
+
27
+ **r2s** is a small, versioned contract — not an agent and not a framework.
28
+
29
+ You normalize research into **cards**, **rank** them with an explicit score, emit a fixed **handoff** for whoever builds, then record an **outcome** so the next cycle is smarter.
30
+
31
+ **v0.1.0** is the schema contract; **v0.2.0** adds a thin Python reference runtime. Both obey `docs/SPEC.md`. Public history with full commit SHAs: [`CHANGELOG.md`](CHANGELOG.md).
32
+
33
+ ## Quick start
34
+
35
+ 1. Read the normative rules: [`docs/SPEC.md`](docs/SPEC.md)
36
+ 2. Copy [`examples/board.example.json`](examples/board.example.json)
37
+ 3. Validate with any JSON Schema Draft 2020-12 validator against [`schemas/`](schemas/)
38
+
39
+ ## Loop
40
+
41
+ | Stage | Artifact | Role |
42
+ |-------|----------|------|
43
+ | Sense | `card` | Normalize a research signal |
44
+ | Rank | `board` + scoring rules | Order work; kill weak cards |
45
+ | Handoff | `handoff` | 7-part ship packet for implementers |
46
+ | Ship / learn | `outcome` | Close the loop |
47
+
48
+ **Score**
49
+
50
+ ```text
51
+ S = (novelty × evidence_strength × usability × dependency_fit)
52
+ / (hours + compute_cost + blast_radius)
53
+ ```
54
+
55
+ Kill when usability or dependency fit ≈ 0, or `target_repo` is missing at design+.
56
+
57
+ ## Layout
58
+
59
+ ```text
60
+ schemas/ card · board · handoff · outcome · scoring
61
+ docs/SPEC.md normative rules
62
+ docs/brand/ icon · social · README loop GIF
63
+ examples/ worked board + handoff (this repo as the sample)
64
+ ```
65
+
66
+ ## Brand
67
+
68
+ | | |
69
+ |-|-|
70
+ | Mark | stacked cards → chevron (cyan on charcoal) |
71
+ | Emoji | ↻ |
72
+ | Accent | `#5eead4` on `#0f1115` |
73
+
74
+ ## Security
75
+
76
+ Card fields are **untrusted data**. Validators must not execute claim or evidence strings. This repo holds no credentials and no network clients.
77
+
78
+ ## Changelog & identity
79
+
80
+ Ship history is **SHA-verified** in [`CHANGELOG.md`](CHANGELOG.md). Security posture: [`SECURITY.md`](SECURITY.md).
81
+
82
+ Current `main` tip at publish of this note is recorded in the changelog Unreleased/latest section after each merge.
83
+
84
+ ## License
85
+
86
+ [MIT](LICENSE)
r2s-0.2.1/SECURITY.md ADDED
@@ -0,0 +1,19 @@
1
+ # Security
2
+
3
+ ## Trust model
4
+
5
+ Card fields (claim, evidence refs, notes) are **untrusted data**. Validators and the reference runtime must not execute or fetch them.
6
+
7
+ ## Reporting
8
+
9
+ Open a private security advisory on this GitHub repository, or contact the owner via GitHub.
10
+
11
+ ## Supply chain
12
+
13
+ - Pin runtime dependencies in `pyproject.toml`
14
+ - Prefer Dependabot security updates once enabled (see open issues)
15
+ - Secret scanning and push protection are enabled on the repo
16
+
17
+ ## Verified commits
18
+
19
+ Public ship points are listed with full SHAs in [`CHANGELOG.md`](CHANGELOG.md). Confirm with `git cat-file -t <sha>`.
@@ -0,0 +1,50 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68", "wheel"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "r2s"
7
+ version = "0.2.1"
8
+ description = "Reference runtime for the r2s research-to-ship JSON Schema contract"
9
+ readme = "README.md"
10
+ requires-python = ">=3.11"
11
+ license = "MIT"
12
+ authors = [{ name = "ao3575911" }]
13
+ keywords = ["json-schema", "research", "handoff", "ranking", "specification"]
14
+ classifiers = [
15
+ "Development Status :: 4 - Beta",
16
+ "Intended Audience :: Developers",
17
+ "Programming Language :: Python :: 3",
18
+ "Programming Language :: Python :: 3.11",
19
+ "Programming Language :: Python :: 3.12",
20
+ "Programming Language :: Python :: 3.13",
21
+ "Topic :: Software Development :: Libraries",
22
+ "Typing :: Typed",
23
+ ]
24
+ dependencies = [
25
+ "jsonschema>=4.22,<5",
26
+ "referencing>=0.35,<1",
27
+ ]
28
+
29
+ [project.optional-dependencies]
30
+ dev = ["pytest>=8,<9", "build>=1.2,<2", "twine>=5,<7"]
31
+
32
+ [project.urls]
33
+ Homepage = "https://github.com/ao3575911/r2s"
34
+ Repository = "https://github.com/ao3575911/r2s"
35
+ Changelog = "https://github.com/ao3575911/r2s/blob/main/CHANGELOG.md"
36
+ Issues = "https://github.com/ao3575911/r2s/issues"
37
+ Documentation = "https://github.com/ao3575911/r2s/blob/main/docs/SPEC.md"
38
+
39
+ [project.scripts]
40
+ r2s = "r2s.cli:main"
41
+
42
+ [tool.setuptools.packages.find]
43
+ where = ["src"]
44
+
45
+ [tool.setuptools.package-data]
46
+ r2s = ["schemas/*.schema.json"]
47
+
48
+ [tool.pytest.ini_options]
49
+ testpaths = ["tests"]
50
+ pythonpath = ["src"]
@@ -0,0 +1,29 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ao3575911.github.io/r2s/schemas/board.schema.json",
4
+ "title": "R2S Board",
5
+ "description": "Hypothesis board: a set of cards plus ranking policy.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "version",
10
+ "cards"
11
+ ],
12
+ "properties": {
13
+ "version": {
14
+ "type": "string",
15
+ "const": "0.1.0"
16
+ },
17
+ "max_active_builds": {
18
+ "type": "integer",
19
+ "minimum": 1,
20
+ "default": 2
21
+ },
22
+ "cards": {
23
+ "type": "array",
24
+ "items": {
25
+ "$ref": "card.schema.json"
26
+ }
27
+ }
28
+ }
29
+ }
@@ -0,0 +1,174 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ao3575911.github.io/r2s/schemas/card.schema.json",
4
+ "title": "R2S Card",
5
+ "description": "Normalized research signal for the research-to-ship loop.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "id",
10
+ "claim",
11
+ "evidence",
12
+ "novelty",
13
+ "evidence_strength",
14
+ "usability",
15
+ "dependency_fit",
16
+ "hours",
17
+ "compute_cost",
18
+ "blast_radius",
19
+ "status"
20
+ ],
21
+ "properties": {
22
+ "id": {
23
+ "type": "string",
24
+ "minLength": 1,
25
+ "description": "Stable card id (slug)."
26
+ },
27
+ "claim": {
28
+ "type": "string",
29
+ "minLength": 1,
30
+ "description": "One sentence the eventual code must make true."
31
+ },
32
+ "evidence": {
33
+ "type": "array",
34
+ "minItems": 0,
35
+ "items": {
36
+ "type": "object",
37
+ "additionalProperties": false,
38
+ "required": [
39
+ "kind",
40
+ "ref"
41
+ ],
42
+ "properties": {
43
+ "kind": {
44
+ "type": "string",
45
+ "enum": [
46
+ "paper",
47
+ "repo",
48
+ "doc",
49
+ "spike",
50
+ "outcome",
51
+ "other"
52
+ ]
53
+ },
54
+ "ref": {
55
+ "type": "string",
56
+ "minLength": 1
57
+ },
58
+ "note": {
59
+ "type": "string"
60
+ }
61
+ }
62
+ }
63
+ },
64
+ "earn_path": {
65
+ "type": "object",
66
+ "additionalProperties": false,
67
+ "properties": {
68
+ "who_pays": {
69
+ "type": "string"
70
+ },
71
+ "wedge": {
72
+ "type": "string"
73
+ },
74
+ "cheapest_test": {
75
+ "type": "string"
76
+ }
77
+ }
78
+ },
79
+ "target_repo": {
80
+ "type": "string",
81
+ "pattern": "^[^/\\s]+/[^/\\s]+$",
82
+ "description": "owner/name when status is design or later."
83
+ },
84
+ "novelty": {
85
+ "type": "number",
86
+ "minimum": 0,
87
+ "maximum": 1
88
+ },
89
+ "evidence_strength": {
90
+ "type": "number",
91
+ "minimum": 0,
92
+ "maximum": 1
93
+ },
94
+ "usability": {
95
+ "type": "number",
96
+ "minimum": 0,
97
+ "maximum": 1
98
+ },
99
+ "dependency_fit": {
100
+ "type": "number",
101
+ "minimum": 0,
102
+ "maximum": 1
103
+ },
104
+ "hours": {
105
+ "type": "number",
106
+ "exclusiveMinimum": 0
107
+ },
108
+ "compute_cost": {
109
+ "type": "number",
110
+ "minimum": 0
111
+ },
112
+ "blast_radius": {
113
+ "type": "number",
114
+ "minimum": 0
115
+ },
116
+ "status": {
117
+ "type": "string",
118
+ "enum": [
119
+ "sense",
120
+ "design",
121
+ "build",
122
+ "ship",
123
+ "learn",
124
+ "killed"
125
+ ]
126
+ },
127
+ "kill_reason": {
128
+ "type": "string"
129
+ },
130
+ "notes": {
131
+ "type": "string"
132
+ }
133
+ },
134
+ "allOf": [
135
+ {
136
+ "if": {
137
+ "properties": {
138
+ "status": {
139
+ "enum": [
140
+ "design",
141
+ "build",
142
+ "ship"
143
+ ]
144
+ }
145
+ },
146
+ "required": [
147
+ "status"
148
+ ]
149
+ },
150
+ "then": {
151
+ "required": [
152
+ "target_repo"
153
+ ]
154
+ }
155
+ },
156
+ {
157
+ "if": {
158
+ "properties": {
159
+ "status": {
160
+ "const": "killed"
161
+ }
162
+ },
163
+ "required": [
164
+ "status"
165
+ ]
166
+ },
167
+ "then": {
168
+ "required": [
169
+ "kill_reason"
170
+ ]
171
+ }
172
+ }
173
+ ]
174
+ }
@@ -0,0 +1,60 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://ao3575911.github.io/r2s/schemas/handoff.schema.json",
4
+ "title": "R2S Handoff Packet",
5
+ "description": "Fixed 7-part ship handoff for Builder (or any implementer).",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "repo",
10
+ "claim",
11
+ "api_sketch",
12
+ "non_goals",
13
+ "acceptance",
14
+ "security_notes",
15
+ "first_pr_scope"
16
+ ],
17
+ "properties": {
18
+ "card_id": {
19
+ "type": "string"
20
+ },
21
+ "repo": {
22
+ "type": "string",
23
+ "pattern": "^[^/\\s]+/[^/\\s]+$"
24
+ },
25
+ "claim": {
26
+ "type": "string",
27
+ "minLength": 1
28
+ },
29
+ "api_sketch": {
30
+ "type": "string",
31
+ "minLength": 1,
32
+ "description": "Public surface the outside world sees (for a spec repo: schemas and docs paths)."
33
+ },
34
+ "non_goals": {
35
+ "type": "array",
36
+ "items": {
37
+ "type": "string"
38
+ },
39
+ "minItems": 1
40
+ },
41
+ "acceptance": {
42
+ "type": "array",
43
+ "items": {
44
+ "type": "string"
45
+ },
46
+ "minItems": 1
47
+ },
48
+ "security_notes": {
49
+ "type": "array",
50
+ "items": {
51
+ "type": "string"
52
+ },
53
+ "minItems": 1
54
+ },
55
+ "first_pr_scope": {
56
+ "type": "string",
57
+ "minLength": 1
58
+ }
59
+ }
60
+ }