@kylecheng3146/agent-ops 0.0.1

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.
Files changed (115) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +83 -0
  3. package/SECURITY.md +22 -0
  4. package/dist/packages/cli/src/args.js +322 -0
  5. package/dist/packages/cli/src/bin.js +290 -0
  6. package/dist/packages/cli/src/cli.js +80 -0
  7. package/dist/packages/cli/src/commands/config.js +8 -0
  8. package/dist/packages/cli/src/commands/doctor.js +32 -0
  9. package/dist/packages/cli/src/commands/index.js +16 -0
  10. package/dist/packages/cli/src/commands/init.js +65 -0
  11. package/dist/packages/cli/src/commands/review.js +71 -0
  12. package/dist/packages/cli/src/commands/task.js +141 -0
  13. package/dist/packages/cli/src/commands/trust.js +48 -0
  14. package/dist/packages/cli/src/commands/uninstall.js +58 -0
  15. package/dist/packages/cli/src/commands/update.js +58 -0
  16. package/dist/packages/cli/src/commands/verify.js +108 -0
  17. package/dist/packages/cli/src/output.js +53 -0
  18. package/dist/packages/cli/src/plan-output.js +28 -0
  19. package/dist/packages/cli/src/wizard.js +75 -0
  20. package/dist/runtime/src/adapters/claude/config.js +109 -0
  21. package/dist/runtime/src/adapters/claude/events.js +8 -0
  22. package/dist/runtime/src/adapters/claude/input.js +38 -0
  23. package/dist/runtime/src/adapters/claude/output.js +30 -0
  24. package/dist/runtime/src/adapters/codex/config.js +93 -0
  25. package/dist/runtime/src/adapters/codex/events.js +8 -0
  26. package/dist/runtime/src/adapters/codex/input.js +41 -0
  27. package/dist/runtime/src/adapters/codex/output.js +24 -0
  28. package/dist/runtime/src/config/explain.js +34 -0
  29. package/dist/runtime/src/config/load.js +25 -0
  30. package/dist/runtime/src/config/merge.js +170 -0
  31. package/dist/runtime/src/config/migrate.js +61 -0
  32. package/dist/runtime/src/contracts.js +1 -0
  33. package/dist/runtime/src/discovery/go.js +145 -0
  34. package/dist/runtime/src/discovery/index.js +40 -0
  35. package/dist/runtime/src/discovery/make.js +162 -0
  36. package/dist/runtime/src/discovery/node.js +175 -0
  37. package/dist/runtime/src/discovery/python.js +163 -0
  38. package/dist/runtime/src/discovery/rust.js +159 -0
  39. package/dist/runtime/src/discovery/types.js +1 -0
  40. package/dist/runtime/src/fs/hash.js +19 -0
  41. package/dist/runtime/src/fs/managed-block.js +90 -0
  42. package/dist/runtime/src/fs/manifest.js +24 -0
  43. package/dist/runtime/src/fs/mutation-worker.js +185 -0
  44. package/dist/runtime/src/fs/paths.js +96 -0
  45. package/dist/runtime/src/fs/transaction.js +498 -0
  46. package/dist/runtime/src/guardrails/destructive.js +207 -0
  47. package/dist/runtime/src/guardrails/evaluate.js +9 -0
  48. package/dist/runtime/src/guardrails/exceptions.js +49 -0
  49. package/dist/runtime/src/guardrails/secrets.js +97 -0
  50. package/dist/runtime/src/guardrails/types.js +9 -0
  51. package/dist/runtime/src/hooks/dispatch.js +78 -0
  52. package/dist/runtime/src/hooks/events.js +1 -0
  53. package/dist/runtime/src/hooks/hook-entry.js +19 -0
  54. package/dist/runtime/src/hooks/normalize.js +59 -0
  55. package/dist/runtime/src/hooks/output.js +12 -0
  56. package/dist/runtime/src/hooks/shell.js +138 -0
  57. package/dist/runtime/src/hooks/stop-verify.js +70 -0
  58. package/dist/runtime/src/install/apply.js +70 -0
  59. package/dist/runtime/src/install/doctor.js +196 -0
  60. package/dist/runtime/src/install/harness.js +87 -0
  61. package/dist/runtime/src/install/ownership.js +84 -0
  62. package/dist/runtime/src/install/plan.js +257 -0
  63. package/dist/runtime/src/install/profiles.js +28 -0
  64. package/dist/runtime/src/install/types.js +1 -0
  65. package/dist/runtime/src/install/uninstall.js +206 -0
  66. package/dist/runtime/src/install/update.js +123 -0
  67. package/dist/runtime/src/logging/local-log.js +158 -0
  68. package/dist/runtime/src/registry/npm.js +141 -0
  69. package/dist/runtime/src/review/claude-runner.js +4 -0
  70. package/dist/runtime/src/review/codex-runner.js +4 -0
  71. package/dist/runtime/src/review/packet.js +10 -0
  72. package/dist/runtime/src/review/result.js +24 -0
  73. package/dist/runtime/src/review/roles.js +3 -0
  74. package/dist/runtime/src/review/runner.js +45 -0
  75. package/dist/runtime/src/schema/validate.js +584 -0
  76. package/dist/runtime/src/security/permissions.js +654 -0
  77. package/dist/runtime/src/security/redact.js +41 -0
  78. package/dist/runtime/src/security/trust.js +209 -0
  79. package/dist/runtime/src/task/render.js +43 -0
  80. package/dist/runtime/src/task/service.js +235 -0
  81. package/dist/runtime/src/task/store.js +265 -0
  82. package/dist/runtime/src/verify/change-surface.js +86 -0
  83. package/dist/runtime/src/verify/evidence.js +89 -0
  84. package/dist/runtime/src/verify/fingerprint.js +67 -0
  85. package/dist/runtime/src/verify/scope.js +69 -0
  86. package/dist/runtime/src/verify/service.js +217 -0
  87. package/dist/runtime/src/verify/spawn.js +326 -0
  88. package/dist/runtime/src/verify/test-count.js +148 -0
  89. package/docs/en/spec/README.md +13 -0
  90. package/docs/en/spec/acceptance-and-evidence.md +21 -0
  91. package/docs/en/spec/delegation.md +21 -0
  92. package/docs/en/spec/guardrails.md +21 -0
  93. package/docs/en/spec/harness-adapters.md +21 -0
  94. package/docs/en/spec/judgment.md +21 -0
  95. package/docs/en/spec/loop-engineering.md +23 -0
  96. package/docs/en/spec/maintenance.md +21 -0
  97. package/docs/en/spec/review.md +21 -0
  98. package/docs/en/spec/troubleshooting.md +21 -0
  99. package/docs/zh-TW/spec/README.md +13 -0
  100. package/docs/zh-TW/spec/acceptance-and-evidence.md +23 -0
  101. package/docs/zh-TW/spec/delegation.md +23 -0
  102. package/docs/zh-TW/spec/guardrails.md +23 -0
  103. package/docs/zh-TW/spec/harness-adapters.md +23 -0
  104. package/docs/zh-TW/spec/judgment.md +23 -0
  105. package/docs/zh-TW/spec/loop-engineering.md +23 -0
  106. package/docs/zh-TW/spec/maintenance.md +23 -0
  107. package/docs/zh-TW/spec/review.md +23 -0
  108. package/docs/zh-TW/spec/troubleshooting.md +23 -0
  109. package/package.json +41 -0
  110. package/schemas/config.schema.json +231 -0
  111. package/schemas/evidence.schema.json +115 -0
  112. package/schemas/manifest.schema.json +116 -0
  113. package/schemas/task.schema.json +59 -0
  114. package/templates/common/AGENTS.block.md +3 -0
  115. package/templates/common/CLAUDE.block.md +3 -0
@@ -0,0 +1,231 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/kylecheng3146/agent-ops/schemas/config.schema.json",
4
+ "title": "Agent Ops configuration",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schemaVersion",
9
+ "profiles",
10
+ "verification",
11
+ "pathMappings",
12
+ "securityExceptions"
13
+ ],
14
+ "properties": {
15
+ "schemaVersion": {
16
+ "const": 1
17
+ },
18
+ "profiles": {
19
+ "type": "array",
20
+ "uniqueItems": true,
21
+ "items": {
22
+ "enum": ["core", "advisory", "guardrails"]
23
+ }
24
+ },
25
+ "verification": {
26
+ "type": "object",
27
+ "additionalProperties": false,
28
+ "required": ["commands"],
29
+ "properties": {
30
+ "commands": {
31
+ "type": "array",
32
+ "items": {
33
+ "oneOf": [
34
+ {
35
+ "$ref": "#/$defs/directCommand"
36
+ },
37
+ {
38
+ "$ref": "#/$defs/shellCommand"
39
+ }
40
+ ]
41
+ }
42
+ }
43
+ }
44
+ },
45
+ "pathMappings": {
46
+ "type": "array",
47
+ "items": {
48
+ "type": "object",
49
+ "additionalProperties": false,
50
+ "required": ["path", "verifierIds"],
51
+ "properties": {
52
+ "path": {
53
+ "$ref": "#/$defs/relativePath"
54
+ },
55
+ "verifierIds": {
56
+ "type": "array",
57
+ "uniqueItems": true,
58
+ "items": {
59
+ "$ref": "#/$defs/id"
60
+ }
61
+ }
62
+ }
63
+ }
64
+ },
65
+ "securityExceptions": {
66
+ "type": "array",
67
+ "items": {
68
+ "type": "object",
69
+ "additionalProperties": false,
70
+ "required": ["ruleId", "scope", "expiresAt", "reason"],
71
+ "properties": {
72
+ "ruleId": {
73
+ "$ref": "#/$defs/id"
74
+ },
75
+ "scope": {
76
+ "allOf": [
77
+ {
78
+ "$ref": "#/$defs/relativePath"
79
+ },
80
+ {
81
+ "not": {
82
+ "const": "."
83
+ }
84
+ }
85
+ ]
86
+ },
87
+ "expiresAt": {
88
+ "$ref": "#/$defs/timestamp"
89
+ },
90
+ "reason": {
91
+ "$ref": "#/$defs/nonEmptyString"
92
+ }
93
+ }
94
+ }
95
+ }
96
+ },
97
+ "$defs": {
98
+ "id": {
99
+ "type": "string",
100
+ "pattern": "^[a-z][a-z0-9-]{0,127}$"
101
+ },
102
+ "nonEmptyString": {
103
+ "type": "string",
104
+ "pattern": "[^\\s\\u0000]",
105
+ "not": {
106
+ "pattern": "\\u0000"
107
+ }
108
+ },
109
+ "timestamp": {
110
+ "type": "string",
111
+ "format": "date-time",
112
+ "pattern": "^(?!0000-)\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$",
113
+ "$comment": "Runtime uses a case-sensitive RFC 3339 subset with years 0001-9999 and seconds 00-59; leap seconds are intentionally unsupported."
114
+ },
115
+ "relativePath": {
116
+ "type": "string",
117
+ "pattern": "^(?:\\.|(?![A-Za-z]:)(?!/)(?!.*\\\\)(?!.*(?:^|/)\\.{1,2}(?:/|$))[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)*)$",
118
+ "allOf": [
119
+ {
120
+ "not": {
121
+ "pattern": "(?:^|/)(?:[Aa][Uu][Xx]|[Cc][Oo][Mm][1-9]|[Cc][Oo][Nn]|[Ll][Pp][Tt][1-9]|[Nn][Uu][Ll]|[Pp][Rr][Nn])(?:\\.[A-Za-z0-9._-]*)?(?:/|$)"
122
+ }
123
+ },
124
+ {
125
+ "not": {
126
+ "pattern": "(?:^|/)[^/]+\\.(?:/|$)"
127
+ }
128
+ }
129
+ ]
130
+ },
131
+ "evidence": {
132
+ "type": "object",
133
+ "additionalProperties": false,
134
+ "required": ["kind"],
135
+ "properties": {
136
+ "kind": {
137
+ "enum": ["exit-code", "test-count", "file"]
138
+ },
139
+ "minimum": {
140
+ "type": "integer",
141
+ "minimum": 0,
142
+ "maximum": 9007199254740991
143
+ }
144
+ }
145
+ },
146
+ "commandFields": {
147
+ "type": "object",
148
+ "required": ["id", "command", "args", "cwd", "required", "evidence"],
149
+ "properties": {
150
+ "id": {
151
+ "$ref": "#/$defs/id"
152
+ },
153
+ "command": {
154
+ "$ref": "#/$defs/nonEmptyString"
155
+ },
156
+ "args": {
157
+ "type": "array",
158
+ "items": {
159
+ "type": "string",
160
+ "pattern": "^[^\\u0000]*$"
161
+ }
162
+ },
163
+ "cwd": {
164
+ "$ref": "#/$defs/relativePath"
165
+ },
166
+ "required": {
167
+ "type": "boolean"
168
+ },
169
+ "timeoutMs": {
170
+ "type": "integer",
171
+ "minimum": 1,
172
+ "maximum": 2147483647
173
+ },
174
+ "evidence": {
175
+ "$ref": "#/$defs/evidence"
176
+ }
177
+ }
178
+ },
179
+ "directCommand": {
180
+ "allOf": [
181
+ {
182
+ "$ref": "#/$defs/commandFields"
183
+ },
184
+ {
185
+ "type": "object",
186
+ "additionalProperties": false,
187
+ "properties": {
188
+ "id": true,
189
+ "command": true,
190
+ "args": true,
191
+ "cwd": true,
192
+ "required": true,
193
+ "timeoutMs": true,
194
+ "evidence": true,
195
+ "shell": {
196
+ "const": false
197
+ }
198
+ }
199
+ }
200
+ ]
201
+ },
202
+ "shellCommand": {
203
+ "allOf": [
204
+ {
205
+ "$ref": "#/$defs/commandFields"
206
+ },
207
+ {
208
+ "type": "object",
209
+ "additionalProperties": false,
210
+ "required": ["shell", "acknowledgeRisk"],
211
+ "properties": {
212
+ "id": true,
213
+ "command": true,
214
+ "args": true,
215
+ "cwd": true,
216
+ "required": true,
217
+ "timeoutMs": true,
218
+ "evidence": true,
219
+ "shell": {
220
+ "const": true
221
+ },
222
+ "acknowledgeRisk": {
223
+ "const": true
224
+ }
225
+ }
226
+ }
227
+ ]
228
+ }
229
+ },
230
+ "$comment": "Duplicate IDs and verifier reference resolution are semantic constraints enforced by runtime validation."
231
+ }
@@ -0,0 +1,115 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/kylecheng3146/agent-ops/schemas/evidence.schema.json",
4
+ "title": "Agent Ops verification evidence",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "schemaVersion",
9
+ "taskId",
10
+ "criterionId",
11
+ "commandId",
12
+ "argv",
13
+ "cwd",
14
+ "scope",
15
+ "startedAt",
16
+ "finishedAt",
17
+ "exitCode",
18
+ "testCount",
19
+ "toolVersions",
20
+ "configHash"
21
+ ],
22
+ "properties": {
23
+ "schemaVersion": {
24
+ "const": 1
25
+ },
26
+ "taskId": {
27
+ "$ref": "#/$defs/id"
28
+ },
29
+ "criterionId": {
30
+ "$ref": "#/$defs/id"
31
+ },
32
+ "commandId": {
33
+ "$ref": "#/$defs/id"
34
+ },
35
+ "argv": {
36
+ "type": "array",
37
+ "minItems": 1,
38
+ "items": {
39
+ "type": "string",
40
+ "pattern": "^[^\\u0000]*$"
41
+ }
42
+ },
43
+ "cwd": {
44
+ "$ref": "#/$defs/relativePath"
45
+ },
46
+ "scope": {
47
+ "enum": ["project", "user"]
48
+ },
49
+ "startedAt": {
50
+ "$ref": "#/$defs/timestamp"
51
+ },
52
+ "finishedAt": {
53
+ "$ref": "#/$defs/timestamp"
54
+ },
55
+ "exitCode": {
56
+ "type": ["integer", "null"],
57
+ "minimum": 0,
58
+ "maximum": 4294967295
59
+ },
60
+ "testCount": {
61
+ "type": ["integer", "null"],
62
+ "minimum": 0,
63
+ "maximum": 9007199254740991
64
+ },
65
+ "toolVersions": {
66
+ "type": "object",
67
+ "additionalProperties": {
68
+ "$ref": "#/$defs/nonEmptyString"
69
+ }
70
+ },
71
+ "configHash": {
72
+ "$ref": "#/$defs/hash"
73
+ }
74
+ },
75
+ "$defs": {
76
+ "id": {
77
+ "type": "string",
78
+ "pattern": "^[a-z][a-z0-9-]{0,127}$"
79
+ },
80
+ "hash": {
81
+ "type": "string",
82
+ "pattern": "^[a-f0-9]{64}$"
83
+ },
84
+ "nonEmptyString": {
85
+ "type": "string",
86
+ "pattern": "[^\\s\\u0000]",
87
+ "not": {
88
+ "pattern": "\\u0000"
89
+ }
90
+ },
91
+ "timestamp": {
92
+ "type": "string",
93
+ "format": "date-time",
94
+ "pattern": "^(?!0000-)\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:[0-5]\\d(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})$",
95
+ "$comment": "Runtime uses a case-sensitive RFC 3339 subset with years 0001-9999 and seconds 00-59; leap seconds are intentionally unsupported."
96
+ },
97
+ "relativePath": {
98
+ "type": "string",
99
+ "pattern": "^(?:\\.|(?![A-Za-z]:)(?!/)(?!.*\\\\)(?!.*(?:^|/)\\.{1,2}(?:/|$))[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)*)$",
100
+ "allOf": [
101
+ {
102
+ "not": {
103
+ "pattern": "(?:^|/)(?:[Aa][Uu][Xx]|[Cc][Oo][Mm][1-9]|[Cc][Oo][Nn]|[Ll][Pp][Tt][1-9]|[Nn][Uu][Ll]|[Pp][Rr][Nn])(?:\\.[A-Za-z0-9._-]*)?(?:/|$)"
104
+ }
105
+ },
106
+ {
107
+ "not": {
108
+ "pattern": "(?:^|/)[^/]+\\.(?:/|$)"
109
+ }
110
+ }
111
+ ]
112
+ }
113
+ },
114
+ "$comment": "Timestamp ordering is a semantic constraint enforced by runtime validation."
115
+ }
@@ -0,0 +1,116 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/kylecheng3146/agent-ops/schemas/manifest.schema.json",
4
+ "title": "Agent Ops installation manifest",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schemaVersion", "scope", "harness", "artifacts", "markers"],
8
+ "properties": {
9
+ "schemaVersion": {
10
+ "const": 1
11
+ },
12
+ "scope": {
13
+ "enum": ["project", "user"]
14
+ },
15
+ "harness": {
16
+ "enum": ["codex", "claude", "both"]
17
+ },
18
+ "artifacts": {
19
+ "type": "array",
20
+ "items": {
21
+ "$ref": "#/$defs/managedPath"
22
+ }
23
+ },
24
+ "markers": {
25
+ "type": "array",
26
+ "items": {
27
+ "$ref": "#/$defs/managedMarker"
28
+ }
29
+ }
30
+ },
31
+ "$defs": {
32
+ "id": {
33
+ "type": "string",
34
+ "pattern": "^[a-z][a-z0-9-]{0,127}$"
35
+ },
36
+ "hash": {
37
+ "type": "string",
38
+ "pattern": "^[a-f0-9]{64}$"
39
+ },
40
+ "relativePath": {
41
+ "type": "string",
42
+ "pattern": "^(?!\\.$)(?![A-Za-z]:)(?!/)(?!.*\\\\)(?!.*(?:^|/)\\.{1,2}(?:/|$))[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)*$",
43
+ "allOf": [
44
+ {
45
+ "not": {
46
+ "pattern": "(?:^|/)(?:[Aa][Uu][Xx]|[Cc][Oo][Mm][1-9]|[Cc][Oo][Nn]|[Ll][Pp][Tt][1-9]|[Nn][Uu][Ll]|[Pp][Rr][Nn])(?:\\.[A-Za-z0-9._-]*)?(?:/|$)"
47
+ }
48
+ },
49
+ {
50
+ "not": {
51
+ "pattern": "(?:^|/)[^/]+\\.(?:/|$)"
52
+ }
53
+ }
54
+ ]
55
+ },
56
+ "managedPath": {
57
+ "type": "object",
58
+ "additionalProperties": false,
59
+ "required": ["id", "path", "hash", "owner"],
60
+ "properties": {
61
+ "id": {
62
+ "$ref": "#/$defs/id"
63
+ },
64
+ "path": {
65
+ "$ref": "#/$defs/relativePath"
66
+ },
67
+ "hash": {
68
+ "$ref": "#/$defs/hash"
69
+ },
70
+ "owner": {
71
+ "const": "agent-ops"
72
+ }
73
+ }
74
+ },
75
+ "managedMarker": {
76
+ "type": "object",
77
+ "additionalProperties": false,
78
+ "required": [
79
+ "id",
80
+ "path",
81
+ "hash",
82
+ "owner",
83
+ "startMarker",
84
+ "endMarker"
85
+ ],
86
+ "properties": {
87
+ "id": {
88
+ "$ref": "#/$defs/id"
89
+ },
90
+ "path": {
91
+ "$ref": "#/$defs/relativePath"
92
+ },
93
+ "hash": {
94
+ "$ref": "#/$defs/hash"
95
+ },
96
+ "owner": {
97
+ "const": "agent-ops"
98
+ },
99
+ "startMarker": {
100
+ "$ref": "#/$defs/nonEmptyString"
101
+ },
102
+ "endMarker": {
103
+ "$ref": "#/$defs/nonEmptyString"
104
+ }
105
+ }
106
+ },
107
+ "nonEmptyString": {
108
+ "type": "string",
109
+ "pattern": "[^\\s\\u0000]",
110
+ "not": {
111
+ "pattern": "\\u0000"
112
+ }
113
+ }
114
+ },
115
+ "$comment": "Cross-collection path ownership uniqueness is a semantic constraint enforced by runtime validation."
116
+ }
@@ -0,0 +1,59 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/kylecheng3146/agent-ops/schemas/task.schema.json",
4
+ "title": "Agent Ops task",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schemaVersion", "id", "title", "criteria"],
8
+ "properties": {
9
+ "schemaVersion": {
10
+ "const": 1
11
+ },
12
+ "id": {
13
+ "$ref": "#/$defs/id"
14
+ },
15
+ "title": {
16
+ "$ref": "#/$defs/nonEmptyString"
17
+ },
18
+ "criteria": {
19
+ "type": "array",
20
+ "minItems": 2,
21
+ "maxItems": 5,
22
+ "items": {
23
+ "type": "object",
24
+ "additionalProperties": false,
25
+ "required": ["id", "description", "verifierIds"],
26
+ "properties": {
27
+ "id": {
28
+ "$ref": "#/$defs/id"
29
+ },
30
+ "description": {
31
+ "$ref": "#/$defs/nonEmptyString"
32
+ },
33
+ "verifierIds": {
34
+ "type": "array",
35
+ "minItems": 1,
36
+ "uniqueItems": true,
37
+ "items": {
38
+ "$ref": "#/$defs/id"
39
+ }
40
+ }
41
+ }
42
+ }
43
+ }
44
+ },
45
+ "$defs": {
46
+ "id": {
47
+ "type": "string",
48
+ "pattern": "^[a-z][a-z0-9-]{0,127}$"
49
+ },
50
+ "nonEmptyString": {
51
+ "type": "string",
52
+ "pattern": "[^\\s\\u0000]",
53
+ "not": {
54
+ "pattern": "\\u0000"
55
+ }
56
+ }
57
+ },
58
+ "$comment": "Criterion ID uniqueness is a semantic constraint enforced by runtime validation."
59
+ }
@@ -0,0 +1,3 @@
1
+ ## Loop Engineering
2
+
3
+ Use `.agent-ops/AGENTS.md` as the canonical Loop Engineering specification for this project.
@@ -0,0 +1,3 @@
1
+ ## Loop Engineering
2
+
3
+ Use `.agent-ops/CLAUDE.md` as the canonical Loop Engineering specification for this project.