6 Commits
Author SHA1 Message Date
admin a6fe199ba7 Extract Implementer clarification into handoff guidance
Check instruction packages / check (push) Failing after 2s
2026-11-13 16:24:50 -05:00
anodyine 82c070df41 Merge pull request 'Extract planning procedure into planner-scope v0.8.0' (#13) from planning-1028 into main
Check instruction packages / check (push) Successful in 4s
2026-11-13 16:13:36 -05:00
admin 64164444e6 Correct release verification and document claim schema
Check instruction packages / check (pull_request) Successful in 4s
Check instruction packages / check (push) Successful in 3s
2026-11-13 16:03:24 -05:00
admin 2d7bf2404a Align maintained package fixture with planner scope release
Check instruction packages / check (push) Successful in 3s
Check instruction packages / check (pull_request) Successful in 4s
2026-11-13 13:51:48 -05:00
admin f42eba659d Extend planner scope with replaceable checklist and presentation
Check instruction packages / check (push) Failing after 2s
2026-11-13 13:48:44 -05:00
anodyine b4666bbda1 Merge pull request 'Add role-scoped investigation skills (v0.7.0)' (#12) from investigation-1027 into main
Check instruction packages / check (push) Successful in 3s
Reviewed-on: #12
2026-11-13 11:46:25 -05:00
9 changed files with 113 additions and 16 deletions

No files matched your search

+3 -3
View File
@@ -7,8 +7,8 @@ Public source for RelayView-maintained instruction-only role skills and an illus
| Directory | Status | Role / step | Version |
| --- | --- | --- | --- |
| `packages/{planner,implementer,reviewer}-investigation` | Maintained automatic guidance | One matching role / step each | 0.7.0 |
| `packages/planner-scope` | Maintained default | Planner / planning | 0.2.0 |
| `packages/implementer-handoff` | Maintained default | Implementer / implementation | 0.2.0 |
| `packages/planner-scope` | Maintained default | Planner / planning | 0.8.1 |
| `packages/implementer-handoff` | Maintained default | Implementer / implementation | 0.9.0 |
| `packages/issue-designer-default` | Maintained default | Designer / design | 0.6.1 |
| `packages/designer-wayfinder`, `designer-grilling` | Optional manual guidance | Designer / design | 0.6.0 |
| `packages/designer-prototype` | Optional manual guidance | Designer / design | 0.6.2 |
@@ -35,7 +35,7 @@ Public source for RelayView-maintained instruction-only role skills and an illus
| `packages/c4-diff` | Optional guidance | Reviewer / review | 0.3.0 |
| `examples/starter-planner` | Illustrative starter; not a production default | Planner / planning | 0.1.0 |
Only named releases of maintained packages receive RelayView compatibility testing and maintenance. Optional guidance requires explicit role assignment; the Planner and Implementer defaults remain available alongside the pinned Issue Designer default. User forks are maintained by their publishers. This release uses the instruction package schema version 1 admitted by RelayView's Community MVP. It contains only `SKILL.md`, declared `.md`/`.txt` resources, and `relayview-skill.json` within each package. Scripts, executable files, undeclared files, and requested permissions fail checks and owner admission. There is no fixed release calendar: maintained packages are versioned when their content or compatibility changes. A breaking owner contract requires a new compatible maintained release before the product depends on it.
Only named releases of maintained packages receive RelayView compatibility testing and maintenance. Optional guidance requires explicit role assignment; the Planner and Implementer defaults remain available alongside the pinned Issue Designer default. User forks are maintained by their publishers. Instruction packages use schema version 1, or schema version 2 for a Planner package declaring owner-validated `issueClaim` metadata. Schema 2 accepts a nullable target status label; the owner enforces the claim transition after proved implementation handoff. It contains only `SKILL.md`, declared `.md`/`.txt` resources, and `relayview-skill.json` within each package. Scripts, executable files, undeclared files, and requested permissions fail checks and owner admission. There is no fixed release calendar: maintained packages are versioned when their content or compatibility changes. A breaking owner contract requires a new compatible maintained release before the product depends on it.
## A named set in RelayView
+2 -2
View File
@@ -3,12 +3,12 @@ name: implementer-handoff
description: Reconcile verified implementation documentation and prepare review content during implementation.
metadata:
relayview-display-name: Implementer handoff
relayview-version: 0.2.0
relayview-version: 0.9.0
---
# Implementer handoff
During the assigned implementation step, keep the repository's current-behavior documentation aligned with the code and checks you actually completed. Read the project's documentation rules and the relevant existing contract before editing it. Use the [handoff guide](handoff.md) for the documentation disposition and review content.
During the assigned implementation step, keep the repository's current-behavior documentation aligned with the code and checks you actually completed. Read the project's documentation rules and the relevant existing contract before editing it. Use the [handoff guide](handoff.md) for implementation clarification, documentation disposition and review content.
Prepare a concise, attributable review handoff when the assigned workflow gives you a place to submit one. Identify the exact candidate, focused checks and their observed results, any manual evidence and its observer, unresolved limitations, and the documentation disposition. A command attempted is not a check passed; report failures and stale evidence explicitly.
+6
View File
@@ -1,5 +1,11 @@
# Handoff guide
## Implementation and clarification
Read the relevant files and make focused changes. Use the assigned investigation method for repository discovery; this handoff method owns clarification and report preparation.
Ask the planner for more information when blocked after reasonable investigation. If the final contract appears wrong, explain the mismatch clearly, make the safest local correction if obvious within the authoritative scope, and validate it. Clarification methods guide communication; scope changes require owner authority.
## Documentation
- Update the current-behavior contract only for behavior verified on the candidate. Keep proposed work clearly proposed.
@@ -2,18 +2,18 @@
"schemaVersion": 1,
"source": {
"kind": "first-party",
"reference": "v0.2.0"
"reference": "v0.9.0"
},
"role": "implementer",
"step": "implementation",
"files": [
{
"path": "SKILL.md",
"sha256": "bfeafa2d7780fe2c0bb4206ab9a03acd12804347ceb0f3ffb3e06e1be514c852"
"sha256": "a826d49f478018190539843022b83c11e7a034fa3597edcc85b8a57c65ac434d"
},
{
"path": "handoff.md",
"sha256": "303c3e792cf0e8da6215e6eeb69f5a2f1f2bd0b67db016160d9e83a970ad95d3"
"sha256": "17a32948aeb0e0359c92924219e6c328f3422773d5d878ffbcf0bf2f07a99aeb"
}
]
}
+3 -1
View File
@@ -3,7 +3,7 @@ name: planner-scope
description: Check assigned issue scope, neighboring work, and verification before drafting a Plan.
metadata:
relayview-display-name: Planner scope
relayview-version: 0.2.0
relayview-version: 0.8.1
---
# Planner scope
@@ -13,3 +13,5 @@ When drafting the assigned Plan, identify the requested behavior, its boundary,
If the owner supplies an admitted work-item identity, use the assigned read tools to inspect it. Preserve source attribution; an issue description is a request, not evidence that its proposed behavior exists. Where tracker access is unavailable, state the missing context instead of guessing a work-item identity.
Write the Plan through the owner's assigned planning interface. The Plan is ready when each requested outcome has an implementation boundary and a checkable success or recovery observation. Owner-controlled workflow stages and checks determine execution authority.
For a linked Gitea issue, this package declares the owner's transition from `status/ready-for-agent` to `status/in-progress` after it proves that the exact Plan reached the Implementer. Finalize the Plan through the assigned interface, then use owner-reported handoff and issue-claim outcomes when explaining progress to the Operator. An accepted Plan alone does not establish that claim. A user may replace this skill with a Planner fork whose package declares a different target status or disables the claim; follow the selected package's policy recorded for the task.
+7 -4
View File
@@ -1,19 +1,22 @@
{
"schemaVersion": 1,
"schemaVersion": 2,
"source": {
"kind": "first-party",
"reference": "v0.2.0"
"reference": "v0.8.1"
},
"role": "planner",
"step": "planning",
"issueClaim": {
"statusLabel": "status/in-progress"
},
"files": [
{
"path": "SKILL.md",
"sha256": "31399ba322d8a4d3ed9814e7fd5d54883b4773c5b7dc3a241b8e14f8f7c16072"
"sha256": "94119fd02a634007f44c227e523802d8f8a7249a97a5526b888d8739401645a2"
},
{
"path": "scope.md",
"sha256": "fc365d5f5c90f878992204235f32b1148aa4934a31f8c10eb063292fb64cf248"
"sha256": "abed1a1590273b5f62f1e1f47ba8c92d00693de72c0d5e9b014ed1c911ac0a8e"
}
]
}
+35
View File
@@ -6,3 +6,38 @@
- Distinguish verified current behavior from a proposal.
- Identify one observable success path and one meaningful failure or recovery path.
- Record uncertainty as an open decision; do not turn silence into approval.
Focus on:
- affected files and symbols
- existing patterns and architecture
- invariants and edge cases
- ordering and dependencies between changes
- tests, validation, and likely failure modes
- any assumptions that the implementer must know
- explicitly authorized supporting context that influences behavior
Return a compact structured plan. Prefer YAML-compatible Markdown:
```yaml
objective: ...
constraints:
- ...
steps:
- id: ...
files:
- ...
symbols:
- ...
change: ...
requirements:
- ...
depends_on:
- ...
edge_cases:
- ...
validation:
- ...
open_questions:
- ...
```
+41 -1
View File
@@ -12,6 +12,46 @@ ROOT = Path(__file__).resolve().parents[1]
class PackageTests(unittest.TestCase):
def test_handoff_clarification_method(self):
package = ROOT / "packages/implementer-handoff"
check_package(package)
text = (package / "handoff.md").read_text()
self.assertIn("blocked after reasonable investigation", text)
self.assertIn("scope changes require owner authority", text)
self.assertNotIn("Trace load order", text)
def test_schema_two_claim_policy_bounds(self):
with tempfile.TemporaryDirectory() as directory:
package = Path(directory) / "planner-scope"
shutil.copytree(ROOT / "packages/planner-scope", package)
sidecar = package / "relayview-skill.json"
original = json.loads(sidecar.read_text())
for label in (None, "status/review"):
manifest = dict(original, issueClaim={"statusLabel": label})
sidecar.write_text(json.dumps(manifest))
check_package(package)
for claim in ({}, [], {"statusLabel": "status/ready-for-agent"},
{"statusLabel": 42}, {"statusLabel": "review"},
{"statusLabel": None, "extra": True}):
with self.subTest(claim=claim):
sidecar.write_text(json.dumps(dict(original, issueClaim=claim)))
with self.assertRaises(PackageError):
check_package(package)
for role, step in (("implementer", "implementation"), ("reviewer", "review"), ("designer", "design")):
sidecar.write_text(json.dumps(dict(original, role=role, step=step)))
with self.assertRaises(PackageError):
check_package(package)
def test_planner_scope_presentation_and_claim(self):
package = ROOT / "packages/planner-scope"
check_package(package)
text = (package / "scope.md").read_text()
for phrase in ("affected files and symbols", "invariants and edge cases", "YAML-compatible Markdown", "open_questions:"):
self.assertIn(phrase, text)
self.assertNotIn("follow-up monitor", text)
manifest = json.loads((package / "relayview-skill.json").read_text())
self.assertEqual(manifest["issueClaim"], {"statusLabel": "status/in-progress"})
def test_role_investigation_packages(self):
for role, step in (("planner", "planning"), ("implementer", "implementation"), ("reviewer", "review")):
package = ROOT / "packages" / f"{role}-investigation"
@@ -103,7 +143,7 @@ class PackageTests(unittest.TestCase):
package = ROOT / "packages" / name
manifest = json.loads((package / "relayview-skill.json").read_text())
self.assertEqual((manifest["role"], manifest["step"]), (role, step))
self.assertEqual(manifest["source"], {"kind": "first-party", "reference": "v0.2.0"})
self.assertEqual(manifest["source"], {"kind": "first-party", "reference": "v0.8.1" if name == "planner-scope" else "v0.2.0"})
self.assertIn(resource, [item["path"] for item in manifest["files"]])
self.assertIn(marker, (package / "SKILL.md").read_text() + (package / resource).read_text())
+13 -2
View File
@@ -44,15 +44,26 @@ def check_package(path):
manifest = json.loads(_text(raw_manifest, str(sidecar)))
except (ValueError, TypeError) as error:
_fail(f"{sidecar}: invalid JSON: {error}")
if not isinstance(manifest, dict) or set(manifest) != {"schemaVersion", "source", "role", "step", "files"}:
if not isinstance(manifest, dict) or (
(manifest.get("schemaVersion") == 1 and set(manifest) != {"schemaVersion", "source", "role", "step", "files"}) or
(manifest.get("schemaVersion") == 2 and set(manifest) != {"schemaVersion", "source", "role", "step", "files", "issueClaim"}) or
manifest.get("schemaVersion") not in (1, 2)
):
_fail(f"{path}: unsupported manifest fields")
source = manifest["source"]
if not isinstance(source, dict) or set(source) != {"kind", "reference"}:
_fail(f"{path}: invalid source")
if source["kind"] not in ("first-party", "user") or not isinstance(source["reference"], str) or not re.fullmatch(r"[A-Za-z0-9._:-]{1,128}", source["reference"]):
_fail(f"{path}: invalid source identity")
if manifest["schemaVersion"] != 1 or (manifest["role"], manifest["step"]) not in (("planner", "planning"), ("implementer", "implementation"), ("reviewer", "review"), ("designer", "design")):
if (manifest["role"], manifest["step"]) not in (("planner", "planning"), ("implementer", "implementation"), ("reviewer", "review"), ("designer", "design")):
_fail(f"{path}: incompatible role or step")
if manifest["schemaVersion"] == 2:
claim = manifest["issueClaim"]
label = claim.get("statusLabel") if isinstance(claim, dict) else None
if (manifest["role"], manifest["step"]) != ("planner", "planning") or not isinstance(claim, dict) or set(claim) != {"statusLabel"} or (
label is not None and (not isinstance(label, str) or not re.fullmatch(r"status/[a-z][a-z0-9-]{0,63}", label) or label == "status/ready-for-agent")
):
_fail(f"{path}: invalid issue claim policy")
files = manifest["files"]
if not isinstance(files, list) or not 1 <= len(files) <= 16:
_fail(f"{path}: invalid file list")