@cleocode/skills 2026.3.76 → 2026.4.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/package.json
CHANGED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
---
|
|
2
|
+
kind: protocol
|
|
3
|
+
version: 1
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# CANT equivalent of subagent-protocol-base.md
|
|
7
|
+
# T198 prototype: Structured protocol definition with typed constraints.
|
|
8
|
+
|
|
9
|
+
protocol subagent-base:
|
|
10
|
+
description: "RFC 2119 protocol for all CLEO subagents"
|
|
11
|
+
version: "1.2.0"
|
|
12
|
+
|
|
13
|
+
# --- Required Tokens ---
|
|
14
|
+
|
|
15
|
+
tokens:
|
|
16
|
+
required:
|
|
17
|
+
TASK_ID: pattern("^T[0-9]+$")
|
|
18
|
+
DATE: date
|
|
19
|
+
TOPIC_SLUG: pattern("^[a-z0-9-]+$")
|
|
20
|
+
optional:
|
|
21
|
+
EPIC_ID: pattern("^T[0-9]+$") = ""
|
|
22
|
+
SESSION_ID: string = ""
|
|
23
|
+
OUTPUT_DIR: path = ".cleo/agent-outputs"
|
|
24
|
+
MANIFEST_PATH: path = "${OUTPUT_DIR}/MANIFEST.jsonl"
|
|
25
|
+
computed:
|
|
26
|
+
OUTPUT_PATH: path = "${OUTPUT_DIR}/${DATE}_${TOPIC_SLUG}.md"
|
|
27
|
+
RESEARCH_ID: string = "${TOPIC_SLUG}-${DATE}"
|
|
28
|
+
|
|
29
|
+
# --- Output Requirements ---
|
|
30
|
+
|
|
31
|
+
constraints [output]:
|
|
32
|
+
OUT-001: MUST write findings to "${OUTPUT_PATH}"
|
|
33
|
+
OUT-002: MUST append ONE entry to pipeline manifest via pipeline.manifest.append
|
|
34
|
+
OUT-003: MUST return ONLY one of: "[Type] complete/partial/blocked. See pipeline manifest."
|
|
35
|
+
OUT-004: MUST NOT return output content in response body
|
|
36
|
+
|
|
37
|
+
# --- Lifecycle Requirements ---
|
|
38
|
+
|
|
39
|
+
constraints [lifecycle]:
|
|
40
|
+
LIFE-001: MUST call tasks.start before beginning any work
|
|
41
|
+
LIFE-002: MUST call tasks.complete after writing output and manifest
|
|
42
|
+
LIFE-003: MUST NOT call tasks.complete without having written an output file
|
|
43
|
+
|
|
44
|
+
# --- Behavior Requirements ---
|
|
45
|
+
|
|
46
|
+
constraints [behavior]:
|
|
47
|
+
BEH-001: MUST NOT fabricate information — use memory.find first
|
|
48
|
+
BEH-002: MUST check success field on every LAFS response before proceeding
|
|
49
|
+
BEH-003: SHOULD link memory observations to task via memory.link
|
|
50
|
+
BEH-004: MUST NOT use deprecated operations (memory.brain.*, tasks.exists)
|
|
51
|
+
|
|
52
|
+
# --- Manifest Requirements ---
|
|
53
|
+
|
|
54
|
+
constraints [manifest]:
|
|
55
|
+
MAN-001: MUST write output file before appending manifest entry
|
|
56
|
+
MAN-002: MUST set manifest status to enum("complete", "partial", "blocked")
|
|
57
|
+
MAN-003: SHOULD include needs_followup array when status is "partial"
|
|
58
|
+
MAN-004: MUST use pipeline.manifest.append — MUST NOT write MANIFEST.jsonl directly
|
|
59
|
+
|
|
60
|
+
# --- Lifecycle Phases ---
|
|
61
|
+
|
|
62
|
+
phase initialize:
|
|
63
|
+
step 1: "Read task details via tasks.show ${TASK_ID}"
|
|
64
|
+
step 2: "Start task via tasks.start ${TASK_ID}"
|
|
65
|
+
LIFE-001: MUST call tasks.start before beginning any work
|
|
66
|
+
|
|
67
|
+
phase execute:
|
|
68
|
+
step 1: "Follow injected skill protocol for current RCASD-IVTR+C stage"
|
|
69
|
+
step 2: "Write output to ${OUTPUT_PATH}"
|
|
70
|
+
BEH-001: MUST NOT fabricate information
|
|
71
|
+
|
|
72
|
+
phase output:
|
|
73
|
+
step 1: "Write output file to ${OUTPUT_PATH}"
|
|
74
|
+
step 2: "Append manifest entry via pipeline.manifest.append"
|
|
75
|
+
step 3: "Complete task via tasks.complete ${TASK_ID}"
|
|
76
|
+
MAN-001: MUST write output file before appending manifest entry
|
|
77
|
+
LIFE-002: MUST call tasks.complete after writing output
|
|
78
|
+
|
|
79
|
+
phase return:
|
|
80
|
+
step 1: "Return one-line summary message only"
|
|
81
|
+
OUT-003: MUST return "summary message only"
|
|
82
|
+
OUT-004: MUST NOT return content in response body
|
|
83
|
+
|
|
84
|
+
# --- Error Handling ---
|
|
85
|
+
|
|
86
|
+
anti_patterns:
|
|
87
|
+
- pattern: "Returning full content in response"
|
|
88
|
+
problem: "Bloats orchestrator context window"
|
|
89
|
+
solution: "Write to output file, return one-line summary"
|
|
90
|
+
- pattern: "Writing pretty-printed JSON to manifest"
|
|
91
|
+
problem: "Multiple lines break JSONL parsers"
|
|
92
|
+
solution: "Use pipeline.manifest.append MCP operation"
|
|
93
|
+
- pattern: "Skipping tasks.start"
|
|
94
|
+
problem: "Protocol violation — LIFE-001"
|
|
95
|
+
solution: "Always call tasks.start before beginning work"
|
|
96
|
+
- pattern: "Using memory.brain.* prefix"
|
|
97
|
+
problem: "Removed in ADR-021 — returns E_INVALID_OPERATION"
|
|
98
|
+
solution: "Use memory.find, memory.observe, memory.link"
|
|
99
|
+
- pattern: "Using tasks.exists"
|
|
100
|
+
problem: "Removed from registry"
|
|
101
|
+
solution: "Use tasks.find with exact: true, check results.length"
|
|
102
|
+
- pattern: "Calling tasks.list without filters"
|
|
103
|
+
problem: "Returns all tasks with notes — huge token cost"
|
|
104
|
+
solution: "Use tasks.find for discovery"
|
|
105
|
+
- pattern: "Appending to MANIFEST.jsonl directly"
|
|
106
|
+
problem: "Legacy file — migrated to SQLite per ADR-027"
|
|
107
|
+
solution: "Use pipeline.manifest.append operation"
|
|
108
|
+
- pattern: "Loading skills via @ at runtime"
|
|
109
|
+
problem: "Cannot resolve outside orchestrator spawn"
|
|
110
|
+
solution: "Skills are injected by orchestrator at spawn time"
|
|
111
|
+
- pattern: "Fabricating data when memory is empty"
|
|
112
|
+
problem: "Hallucination — violates BEH-001"
|
|
113
|
+
solution: "Use memory.find first; if truly unknown, state uncertainty"
|