oris-skills 2.2.2 → 3.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.
- package/.cursor-plugin/plugin.json +2 -3
- package/CHANGELOG.md +24 -6
- package/README.md +23 -59
- package/docs/architecture.md +15 -11
- package/docs/distribution.md +3 -3
- package/docs/maintainer-guide.md +4 -4
- package/docs/user-guide.md +12 -20
- package/package.json +3 -6
- package/references/conventions.md +23 -13
- package/references/devops.md +58 -0
- package/references/devops.schema.json +54 -0
- package/references/doc-policy.md +5 -5
- package/references/research.md +45 -0
- package/references/settings.md +11 -5
- package/references/settings.schema.json +10 -0
- package/scripts/flow/oris-flow-devops.mjs +77 -0
- package/scripts/flow/oris-flow-layout.mjs +0 -16
- package/scripts/flow/oris-flow-scan.mjs +32 -317
- package/scripts/flow/oris-gitignore.mjs +1 -5
- package/scripts/install/install-user-skills.mjs +17 -3
- package/scripts/install/oris-mcp.mjs +68 -0
- package/scripts/install/uninstall-user-skills.mjs +2 -29
- package/scripts/oris-skills.mjs +0 -47
- package/scripts/tests/run-all-tests.mjs +3 -9
- package/scripts/tests/test-cleanliness.mjs +54 -0
- package/scripts/tests/test-install-mcp.mjs +66 -0
- package/scripts/tests/test-oris-flow-devops.mjs +64 -0
- package/scripts/tests/test-oris-flow-scan.mjs +21 -91
- package/scripts/tests/test-routing-lifecycle.mjs +22 -53
- package/scripts/tests/test-schemas.mjs +17 -31
- package/scripts/tests/test-skill-style.mjs +5 -2
- package/skills/oris-flow/SKILL.md +10 -6
- package/skills/oris-flow/references/architecture.md +1 -1
- package/skills/oris-flow/references/commit.md +46 -0
- package/skills/oris-flow/references/criteria.md +2 -2
- package/skills/oris-flow/references/discover.md +2 -2
- package/skills/oris-flow/references/fix.md +7 -3
- package/skills/oris-flow/references/help.md +1 -6
- package/skills/oris-flow/references/implement.md +5 -3
- package/skills/oris-flow/references/new.md +6 -6
- package/skills/oris-flow/references/plan.md +7 -2
- package/skills/oris-flow/references/pr.md +44 -0
- package/skills/oris-flow/references/setup.md +28 -35
- package/skills/oris-flow/references/verify.md +4 -5
- package/agents/oris-loop-debriefer.md +0 -30
- package/agents/oris-loop-doctor.md +0 -32
- package/agents/oris-loop-executor.md +0 -35
- package/agents/oris-loop-verifier.md +0 -35
- package/references/loop-adapter.schema.json +0 -93
- package/references/loop-contract.md +0 -126
- package/references/loop.schema.json +0 -156
- package/references/repo-map.md +0 -51
- package/references/repo-map.schema.json +0 -213
- package/scripts/flow/oris-flow-clean-runtime.mjs +0 -182
- package/scripts/install/generate-agent-adapters.mjs +0 -81
- package/scripts/loop/oris-loop-bootstrap.mjs +0 -383
- package/scripts/loop/oris-loop-bundle.mjs +0 -22
- package/scripts/loop/oris-loop-chat.mjs +0 -396
- package/scripts/loop/oris-loop-demo.mjs +0 -171
- package/scripts/loop/oris-loop-document.mjs +0 -196
- package/scripts/loop/oris-loop-dry-run.mjs +0 -114
- package/scripts/loop/oris-loop-fixtures.mjs +0 -149
- package/scripts/loop/oris-loop-list.mjs +0 -81
- package/scripts/loop/oris-loop-paths.mjs +0 -232
- package/scripts/loop/oris-loop-run.mjs +0 -301
- package/scripts/loop/oris-loop-stop.mjs +0 -358
- package/scripts/loop/oris-loop-templates.mjs +0 -80
- package/scripts/loop/oris-loop-verify.mjs +0 -205
- package/scripts/tests/test-agent-adapters.mjs +0 -70
- package/scripts/tests/test-oris-1-0-cleanliness.mjs +0 -58
- package/scripts/tests/test-oris-flow-clean-runtime.mjs +0 -75
- package/scripts/tests/test-oris-loop-bootstrap.mjs +0 -94
- package/scripts/tests/test-oris-loop-document.mjs +0 -148
- package/scripts/tests/test-oris-loop-list.mjs +0 -74
- package/scripts/tests/test-oris-loop-run.mjs +0 -71
- package/scripts/tests/test-oris-loop-smoke.mjs +0 -120
- package/scripts/tests/test-oris-loop-stop.mjs +0 -432
- package/skills/oris-flow/references/loop-craft.md +0 -59
- package/skills/oris-flow/references/loop-improve.md +0 -32
- package/skills/oris-flow/references/loop-run.md +0 -47
- package/skills/oris-flow/references/loop.md +0 -56
- package/skills/oris-flow/templates/debriefer.md +0 -19
- package/skills/oris-flow/templates/doctor.md +0 -22
- package/skills/oris-flow/templates/executor.md +0 -25
- package/skills/oris-flow/templates/orchestrator.md +0 -36
- package/skills/oris-flow/templates/verifier.md +0 -24
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Verify
|
|
2
2
|
|
|
3
3
|
Check every acceptance criterion against the REAL product once, with evidence. One pass,
|
|
4
|
-
no
|
|
4
|
+
no ceremony.
|
|
5
5
|
|
|
6
6
|
RULES: `references/conventions.md`. Doc standards: `references/doc-policy.md`.
|
|
7
7
|
|
|
@@ -10,7 +10,7 @@ RULES: `references/conventions.md`. Doc standards: `references/doc-policy.md`.
|
|
|
10
10
|
1. FIND `{tasksRoot}/{task}/acceptance-criteria.md` ({task} per doc-policy). IF missing →
|
|
11
11
|
offer: define criteria first (`skills/oris-flow/references/criteria.md`) | verify against a
|
|
12
12
|
confirmed chat recap | stop.
|
|
13
|
-
2. READ
|
|
13
|
+
2. READ `AGENTS.md` + verification conventions (test commands, run scripts, environments)
|
|
14
14
|
before improvising.
|
|
15
15
|
3. PLAN one check per AC: command, test, API call, or observed behavior.
|
|
16
16
|
|
|
@@ -39,9 +39,8 @@ Date: … | Source: acceptance-criteria.md | Verified by: oris-flow verify route
|
|
|
39
39
|
## Change history (date | source | change | reason)
|
|
40
40
|
```
|
|
41
41
|
|
|
42
|
-
ON fix → enter `skills/oris-flow/references/fix.md` with the failing AC as the bug report
|
|
43
|
-
|
|
44
|
-
`skills/oris-flow/references/loop.md` only when one fix-verify pass is clearly not enough.
|
|
42
|
+
ON fix → enter `skills/oris-flow/references/fix.md` with the failing AC as the bug report;
|
|
43
|
+
re-verify the fixed criteria afterwards, as many fix-verify passes as the user approves.
|
|
45
44
|
|
|
46
45
|
## Never
|
|
47
46
|
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: oris-loop-debriefer
|
|
3
|
-
description: Learns across Oris Loop receipts and tunes the loop prompts (improve.mode auto) or proposes changes (propose). Use after passes complete.
|
|
4
|
-
readonly: false
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
You are the Oris Loop debriefer.
|
|
8
|
-
|
|
9
|
-
Rules:
|
|
10
|
-
|
|
11
|
-
1. Use receipts and referenced evidence only; no durable pattern from a single weak signal.
|
|
12
|
-
2. Separate design problems from execution, environment, verifier, and changed-goal problems.
|
|
13
|
-
3. improve.mode auto: you may rewrite files under the loop's `prompts/` — copy the old file to `history/` first, note the change for the receipt. One improvement per debrief.
|
|
14
|
-
4. improve.mode propose: write the smallest evidence-backed change to `proposals/`; change nothing else.
|
|
15
|
-
5. NEVER touch loop.md scope, limits, permissions, or verification — always a proposal.
|
|
16
|
-
NEVER weaken verification to make passes green — fix the loop, not the bar.
|
|
17
|
-
6. Keep the summary compact.
|
|
18
|
-
|
|
19
|
-
Output:
|
|
20
|
-
|
|
21
|
-
```json
|
|
22
|
-
{
|
|
23
|
-
"role": "debriefer",
|
|
24
|
-
"outcome": "keep|tuned|proposed|execution-issue|environment-blocked|inconclusive",
|
|
25
|
-
"insight": "",
|
|
26
|
-
"changedFiles": [],
|
|
27
|
-
"proposalPath": "",
|
|
28
|
-
"nextAction": ""
|
|
29
|
-
}
|
|
30
|
-
```
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: oris-loop-doctor
|
|
3
|
-
description: Diagnoses Oris Loop run evidence and decides whether to continue, block, ask the user, or propose a minimal loop patch.
|
|
4
|
-
readonly: true
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
You are the Oris Loop Doctor.
|
|
8
|
-
|
|
9
|
-
Rules:
|
|
10
|
-
|
|
11
|
-
1. Diagnose from receipts and verifier evidence, not confidence.
|
|
12
|
-
2. Distinguish loop design issues from execution mistakes, verifier issues,
|
|
13
|
-
environment failures, changed goals, and insufficient evidence.
|
|
14
|
-
3. Do not patch the loop directly.
|
|
15
|
-
4. Propose the smallest loop change only when evidence shows the loop design is
|
|
16
|
-
the problem.
|
|
17
|
-
5. Require approval for changes to scope, authority, commands, paths, stop
|
|
18
|
-
rules, risk, credentials, or external systems.
|
|
19
|
-
|
|
20
|
-
Output:
|
|
21
|
-
|
|
22
|
-
```json
|
|
23
|
-
{
|
|
24
|
-
"role": "doctor",
|
|
25
|
-
"decision": "continue|advance|complete|ask-user|propose-patch|blocked",
|
|
26
|
-
"diagnosis": "",
|
|
27
|
-
"evidence": "",
|
|
28
|
-
"patchSummary": "",
|
|
29
|
-
"approvalRequired": true,
|
|
30
|
-
"nextAction": ""
|
|
31
|
-
}
|
|
32
|
-
```
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: oris-loop-executor
|
|
3
|
-
description: Performs one bounded action for an approved Oris Loop pass. Use only when the orchestrator provides loop scope, current phase, allowed paths, and verification intent.
|
|
4
|
-
readonly: false
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
You are the Oris Loop executor.
|
|
8
|
-
|
|
9
|
-
Rules:
|
|
10
|
-
|
|
11
|
-
1. Verify the task includes `ORIS LOOP ACTIVE`.
|
|
12
|
-
2. Read only the loop definition, context, and files in declared scope.
|
|
13
|
-
3. Perform exactly one bounded action. Re-read the fresh state of every file
|
|
14
|
-
you touch before editing it. The action proves bigger than bounded → stop
|
|
15
|
-
and return blocked with what you found; half-done work is worse than none.
|
|
16
|
-
4. Preserve unrelated user work.
|
|
17
|
-
5. Do not commit, push, deploy, write DevOps, send external messages, expose
|
|
18
|
-
credentials, or edit `.oris-flow/runtime/**`.
|
|
19
|
-
6. Return a compact result with changed files, claim, risk, and suggested
|
|
20
|
-
verifier check. claim = what changed + the exact command or observation
|
|
21
|
-
that proves it.
|
|
22
|
-
|
|
23
|
-
Output:
|
|
24
|
-
|
|
25
|
-
```json
|
|
26
|
-
{
|
|
27
|
-
"role": "executor",
|
|
28
|
-
"state": "claimed|blocked",
|
|
29
|
-
"summary": "",
|
|
30
|
-
"changedFiles": [],
|
|
31
|
-
"claim": "",
|
|
32
|
-
"evidenceHint": "",
|
|
33
|
-
"blocker": ""
|
|
34
|
-
}
|
|
35
|
-
```
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: oris-loop-verifier
|
|
3
|
-
description: Independently verifies an Oris Loop executor claim using declared project evidence. Use after an executor reports a bounded action.
|
|
4
|
-
readonly: true
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
You are the Oris Loop verifier.
|
|
8
|
-
|
|
9
|
-
Rules:
|
|
10
|
-
|
|
11
|
-
1. Do not trust the executor claim without evidence. Run the checks FIRST,
|
|
12
|
-
judge after — a claim you could not check is inconclusive, never pass.
|
|
13
|
-
2. Use the verification command, static check, browser evidence, or review rule
|
|
14
|
-
declared by the loop.
|
|
15
|
-
3. Do not edit product files — you only observe, never fix.
|
|
16
|
-
4. Keep raw logs out of the orchestrator response; point to evidence files when
|
|
17
|
-
available.
|
|
18
|
-
5. Report pass, fail, blocked, or inconclusive.
|
|
19
|
-
|
|
20
|
-
Output:
|
|
21
|
-
|
|
22
|
-
```json
|
|
23
|
-
{
|
|
24
|
-
"role": "verifier",
|
|
25
|
-
"state": "pass|fail|blocked|inconclusive",
|
|
26
|
-
"goalMet": false,
|
|
27
|
-
"summary": "",
|
|
28
|
-
"evidence": "",
|
|
29
|
-
"evidencePath": "",
|
|
30
|
-
"failureSignal": "",
|
|
31
|
-
"nextRecommendation": ""
|
|
32
|
-
}
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
`goalMet` is true only when the loop goal itself is satisfied, not just this pass.
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "https://oris.dev/schemas/oris-loop-adapter-v1.json",
|
|
4
|
-
"title": "Oris Loop Repository Adapter",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"additionalProperties": false,
|
|
7
|
-
"required": ["$schema", "schemaVersion", "repository", "paths", "commands", "preflight"],
|
|
8
|
-
"properties": {
|
|
9
|
-
"$schema": {
|
|
10
|
-
"const": "https://oris.dev/schemas/oris-loop-adapter-v1.json"
|
|
11
|
-
},
|
|
12
|
-
"schemaVersion": {
|
|
13
|
-
"const": 1
|
|
14
|
-
},
|
|
15
|
-
"repository": {
|
|
16
|
-
"type": "string",
|
|
17
|
-
"minLength": 1
|
|
18
|
-
},
|
|
19
|
-
"paths": {
|
|
20
|
-
"type": "object",
|
|
21
|
-
"additionalProperties": false,
|
|
22
|
-
"required": ["runtime", "allowed", "protected"],
|
|
23
|
-
"properties": {
|
|
24
|
-
"taskRoots": {
|
|
25
|
-
"type": "array",
|
|
26
|
-
"uniqueItems": true,
|
|
27
|
-
"items": { "$ref": "#/$defs/relativePath" }
|
|
28
|
-
},
|
|
29
|
-
"runtime": { "$ref": "#/$defs/relativePath" },
|
|
30
|
-
"loops": { "$ref": "#/$defs/relativePath" },
|
|
31
|
-
"allowed": {
|
|
32
|
-
"type": "array",
|
|
33
|
-
"minItems": 1,
|
|
34
|
-
"uniqueItems": true,
|
|
35
|
-
"items": { "$ref": "#/$defs/relativePath" }
|
|
36
|
-
},
|
|
37
|
-
"protected": {
|
|
38
|
-
"type": "array",
|
|
39
|
-
"uniqueItems": true,
|
|
40
|
-
"items": { "$ref": "#/$defs/relativePath" }
|
|
41
|
-
},
|
|
42
|
-
"testDir": { "$ref": "#/$defs/relativePath" }
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
"commands": {
|
|
46
|
-
"type": "object",
|
|
47
|
-
"minProperties": 1,
|
|
48
|
-
"propertyNames": { "pattern": "^[a-z][a-z0-9-]*$" },
|
|
49
|
-
"additionalProperties": { "$ref": "#/$defs/command" }
|
|
50
|
-
},
|
|
51
|
-
"models": {
|
|
52
|
-
"type": "object",
|
|
53
|
-
"description": "Model alias map per repository, e.g. { \"smart\": \"composer-2.5\" }; loop.md can reference aliases",
|
|
54
|
-
"propertyNames": { "pattern": "^[a-z][a-z0-9-]*$" },
|
|
55
|
-
"additionalProperties": { "type": "string", "minLength": 1 }
|
|
56
|
-
},
|
|
57
|
-
"preflight": {
|
|
58
|
-
"type": "object",
|
|
59
|
-
"additionalProperties": false,
|
|
60
|
-
"required": ["minFreeDiskGiB"],
|
|
61
|
-
"properties": {
|
|
62
|
-
"minFreeDiskGiB": {
|
|
63
|
-
"type": "number",
|
|
64
|
-
"minimum": 0
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
},
|
|
69
|
-
"$defs": {
|
|
70
|
-
"relativePath": {
|
|
71
|
-
"type": "string",
|
|
72
|
-
"minLength": 1,
|
|
73
|
-
"not": { "pattern": "(^|[\\\\/])\\.\\.([\\\\/]|$)" }
|
|
74
|
-
},
|
|
75
|
-
"command": {
|
|
76
|
-
"type": "object",
|
|
77
|
-
"additionalProperties": false,
|
|
78
|
-
"required": ["executable", "args", "cwd"],
|
|
79
|
-
"properties": {
|
|
80
|
-
"executable": { "type": "string", "minLength": 1 },
|
|
81
|
-
"args": {
|
|
82
|
-
"type": "array",
|
|
83
|
-
"items": { "type": "string" }
|
|
84
|
-
},
|
|
85
|
-
"cwd": { "$ref": "#/$defs/relativePath" },
|
|
86
|
-
"requiresFreeDiskGiB": {
|
|
87
|
-
"type": "number",
|
|
88
|
-
"minimum": 0
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
}
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
# Oris Loop Contract (v2)
|
|
2
|
-
|
|
3
|
-
An Oris loop is a project-local feedback system: observe → choose ONE bounded action → act → verify with real evidence → record → repeat or stop. It is never permission for work outside its approved scope.
|
|
4
|
-
|
|
5
|
-
## Layout — everything lives in the project
|
|
6
|
-
|
|
7
|
-
```text
|
|
8
|
-
.oris-flow/
|
|
9
|
-
adapter.json repo adapter (paths, commands, model aliases) — `npx oris-skills loop bootstrap`
|
|
10
|
-
loops/{slug}/
|
|
11
|
-
loop.md approved contract (front matter below)
|
|
12
|
-
prompts/ one editable file per ACTIVE role
|
|
13
|
-
orchestrator.md injected each pass by the stop hook (optional; default shipped)
|
|
14
|
-
executor.md required
|
|
15
|
-
verifier.md required
|
|
16
|
-
doctor.md only when roles includes doctor
|
|
17
|
-
debriefer.md only when roles includes debriefer (required for improve.mode: auto)
|
|
18
|
-
context.md living handoff snapshot (facts, next action)
|
|
19
|
-
receipts/ one compact receipt per pass
|
|
20
|
-
proposals/ unapproved improvement patches
|
|
21
|
-
history/ archived loop.md and prompt versions
|
|
22
|
-
runtime/ machine-owned state — agents NEVER edit it
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## loop.md front matter (the runtime contract)
|
|
26
|
-
|
|
27
|
-
```yaml
|
|
28
|
-
---
|
|
29
|
-
schemaVersion: 2
|
|
30
|
-
kind: oris-loop
|
|
31
|
-
name: my-loop # stable slug
|
|
32
|
-
approved: true # set by the user's approval at craft — loop cannot start without it
|
|
33
|
-
phases: [work]
|
|
34
|
-
roles: [executor, verifier] # default; opt in doctor and/or debriefer only when needed
|
|
35
|
-
limits:
|
|
36
|
-
maxIterations: 10
|
|
37
|
-
maxNoProgress: 2 # consecutive passes without verified progress → blocked
|
|
38
|
-
maxMinutes: 240
|
|
39
|
-
models: # per-role: "inherit" | adapter alias | platform model id
|
|
40
|
-
default: inherit
|
|
41
|
-
verifier: inherit # override any role independently
|
|
42
|
-
improve:
|
|
43
|
-
mode: propose # propose | auto (auto = debriefer may rewrite prompts/ between passes)
|
|
44
|
-
permissions:
|
|
45
|
-
allowedPaths: []
|
|
46
|
-
forbiddenActions: [commit, push, deploy, external-message]
|
|
47
|
-
verification:
|
|
48
|
-
commands: []
|
|
49
|
-
evidenceRequired: true
|
|
50
|
-
---
|
|
51
|
-
Goal: one sentence.
|
|
52
|
-
Stop: one sentence.
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
Schema: `references/loop.schema.json`. Body = human summary; prompts live in `prompts/`, never inline.
|
|
56
|
-
`approved: true` marks user approval of goal, scope, prompts, and limits. It never authorizes work outside the loop.
|
|
57
|
-
|
|
58
|
-
## Roles
|
|
59
|
-
|
|
60
|
-
Default roles are **executor + verifier** — enough for most loops. Opt in `doctor` (multi-phase loops with non-trivial stop logic) and `debriefer` (long unattended runs that should learn across passes) via `roles:` in loop.md.
|
|
61
|
-
|
|
62
|
-
| Role | Default | Does | Never |
|
|
63
|
-
|------|---------|------|-------|
|
|
64
|
-
| orchestrator (main chat) | always | reads context, spawns roles, writes receipts, sets state | executor/verifier/doctor work |
|
|
65
|
-
| executor | yes | ONE bounded action per pass | self-verify, exceed scope |
|
|
66
|
-
| verifier | yes | independent evidence check per user criteria; sets `goalMet` when the LOOP goal is satisfied | trust claims, edit product files |
|
|
67
|
-
| doctor | opt-in | decision from evidence: `continue \| advance \| complete \| ask-user \| propose-patch \| blocked` (canonical enum — every doctor prompt uses exactly these) | edit files, patch loop.md |
|
|
68
|
-
| debriefer | opt-in | learn across receipts; tune prompts (auto) or propose (propose) | touch scope/limits/permissions |
|
|
69
|
-
|
|
70
|
-
Without a doctor, the verifier verdict maps to the state directly: `pass` + `goalMet` → complete; `pass`/`fail` → continue; `blocked`/`inconclusive` → ask-user.
|
|
71
|
-
|
|
72
|
-
Every prompt is a file the user can edit; the next pass obeys the edited file. The executor prompt carries the literal gate `ORIS LOOP ACTIVE` — executors refuse tasks without it. Subagent output is a single ```json fenced block; raw logs go to `.oris-flow/runtime/evidence/`. Read-only roles (verifier, doctor) run without write permission in headless mode.
|
|
73
|
-
|
|
74
|
-
## Models
|
|
75
|
-
|
|
76
|
-
`inherit` → the current session's model (no explicit model passed).
|
|
77
|
-
Adapter aliases → `adapter.json` `models: { "smart": "<platform-model-id>" }`; loop.md references the alias, so the same loop.md ports across platforms.
|
|
78
|
-
Anything else → passed through as a platform model id.
|
|
79
|
-
|
|
80
|
-
## Triggers per platform
|
|
81
|
-
|
|
82
|
-
| Platform | Mechanism |
|
|
83
|
-
|----------|-----------|
|
|
84
|
-
| Cursor | `.cursor/hooks.json` stop hook → injects the next pass into the same chat |
|
|
85
|
-
| Claude Code | `.claude/settings.json` Stop hook → `decision: block` continues the same session |
|
|
86
|
-
| Codex / CI | `npx oris-skills loop run` — each role is a separate CLI process |
|
|
87
|
-
|
|
88
|
-
`npx oris-skills loop bootstrap` writes adapter + hooks + wrappers. The injected pass message comes from `prompts/orchestrator.md` (or the shipped default) with `{{placeholders}}` filled from runtime state.
|
|
89
|
-
|
|
90
|
-
## States and outcomes
|
|
91
|
-
|
|
92
|
-
Machine states: `continue` | `advance` | `complete` | `ask-user` | `blocked` | `cancelled`.
|
|
93
|
-
`ask-user` pauses the loop for input or approval — the hook stops resuming until the state is set back to `continue` (or the loop is restarted). It is NOT a failure.
|
|
94
|
-
Receipt results: `Success` | `Clean no-op` | `Blocked` | `Approval required` | `Exhausted` | `No progress`.
|
|
95
|
-
Every `set-state` carries `--progress yes|no` (yes = the verifier confirmed forward movement); `maxNoProgress` consecutive `no` passes force `blocked`.
|
|
96
|
-
Hitting any limit without meeting the goal = `blocked`, NEVER success.
|
|
97
|
-
|
|
98
|
-
## Receipt (per pass)
|
|
99
|
-
|
|
100
|
-
```markdown
|
|
101
|
-
# Oris Loop Receipt
|
|
102
|
-
Loop: <slug> | Pass: <n> | Result: <outcome>
|
|
103
|
-
Scope: <inspected/changed>
|
|
104
|
-
Check: <verification + conditions>
|
|
105
|
-
Evidence:
|
|
106
|
-
- <summary + pointer>
|
|
107
|
-
Actions:
|
|
108
|
-
- <bounded action + outcome>
|
|
109
|
-
Improved: <prompt tuned this pass, or none>
|
|
110
|
-
Next: <next action | approval | blocker | nothing>
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
No secrets, no private reasoning, no full transcripts in receipts.
|
|
114
|
-
|
|
115
|
-
## Self-improvement
|
|
116
|
-
|
|
117
|
-
- `improve.mode: auto` → debriefer may rewrite `prompts/*.md` (archive old file to `history/` first, note the change in the receipt). One improvement per pass, evidence-backed.
|
|
118
|
-
- `improve.mode: propose` → every change lands in `proposals/` until the user approves.
|
|
119
|
-
- BOTH modes: scope, limits, permissions, verification commands change only via approved proposal; previous `loop.md` → `history/loop.vN.md`.
|
|
120
|
-
|
|
121
|
-
## Iteration rules
|
|
122
|
-
|
|
123
|
-
- Re-read fresh state before consequential actions; preserve unrelated user work.
|
|
124
|
-
- Only declared paths, commands, tools, and data policy.
|
|
125
|
-
- NEVER: commit, push, branch, PR, deploy, DevOps writes, external messages, credential exposure — unless the loop explicitly permits that exact action.
|
|
126
|
-
- Real verification before claiming success. Update only `context.md`, receipts, and declared write scopes.
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
-
"$id": "https://oris.dev/schemas/oris-loop-v2.json",
|
|
4
|
-
"title": "Oris Loop document front matter (v2)",
|
|
5
|
-
"type": "object",
|
|
6
|
-
"additionalProperties": true,
|
|
7
|
-
"required": [
|
|
8
|
-
"schemaVersion",
|
|
9
|
-
"kind",
|
|
10
|
-
"name",
|
|
11
|
-
"approved",
|
|
12
|
-
"phases",
|
|
13
|
-
"limits",
|
|
14
|
-
"permissions",
|
|
15
|
-
"verification"
|
|
16
|
-
],
|
|
17
|
-
"properties": {
|
|
18
|
-
"schemaVersion": {
|
|
19
|
-
"const": 2
|
|
20
|
-
},
|
|
21
|
-
"kind": {
|
|
22
|
-
"const": "oris-loop"
|
|
23
|
-
},
|
|
24
|
-
"name": {
|
|
25
|
-
"type": "string",
|
|
26
|
-
"pattern": "^[a-z0-9]+(?:[._-][a-z0-9]+)*$",
|
|
27
|
-
"minLength": 2,
|
|
28
|
-
"maxLength": 80
|
|
29
|
-
},
|
|
30
|
-
"approved": {
|
|
31
|
-
"type": "boolean",
|
|
32
|
-
"description": "true only after the user approved goal, scope, prompts, and limits"
|
|
33
|
-
},
|
|
34
|
-
"models": {
|
|
35
|
-
"type": "object",
|
|
36
|
-
"additionalProperties": true,
|
|
37
|
-
"description": "Per-role model: \"inherit\" (session model), an adapter alias, or a platform model id",
|
|
38
|
-
"properties": {
|
|
39
|
-
"default": { "$ref": "#/$defs/model" },
|
|
40
|
-
"executor": { "$ref": "#/$defs/model" },
|
|
41
|
-
"verifier": { "$ref": "#/$defs/model" },
|
|
42
|
-
"doctor": { "$ref": "#/$defs/model" },
|
|
43
|
-
"debriefer": { "$ref": "#/$defs/model" }
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
-
"improve": {
|
|
47
|
-
"type": "object",
|
|
48
|
-
"additionalProperties": true,
|
|
49
|
-
"properties": {
|
|
50
|
-
"mode": {
|
|
51
|
-
"enum": ["propose", "auto"],
|
|
52
|
-
"description": "auto lets the debriefer rewrite prompts/ between passes; propose requires user approval for every change"
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
"phases": {
|
|
57
|
-
"type": "array",
|
|
58
|
-
"minItems": 1,
|
|
59
|
-
"maxItems": 12,
|
|
60
|
-
"items": {
|
|
61
|
-
"type": "string",
|
|
62
|
-
"pattern": "^[a-z][a-z0-9-]*$"
|
|
63
|
-
}
|
|
64
|
-
},
|
|
65
|
-
"roles": {
|
|
66
|
-
"type": "array",
|
|
67
|
-
"description": "Active roles per pass. Default [executor, verifier]; opt in doctor and/or debriefer. Executor and verifier are always required.",
|
|
68
|
-
"minItems": 2,
|
|
69
|
-
"uniqueItems": true,
|
|
70
|
-
"items": {
|
|
71
|
-
"enum": ["executor", "verifier", "doctor", "debriefer"]
|
|
72
|
-
},
|
|
73
|
-
"allOf": [
|
|
74
|
-
{ "contains": { "const": "executor" } },
|
|
75
|
-
{ "contains": { "const": "verifier" } }
|
|
76
|
-
]
|
|
77
|
-
},
|
|
78
|
-
"limits": {
|
|
79
|
-
"type": "object",
|
|
80
|
-
"required": [
|
|
81
|
-
"maxIterations",
|
|
82
|
-
"maxNoProgress"
|
|
83
|
-
],
|
|
84
|
-
"additionalProperties": true,
|
|
85
|
-
"properties": {
|
|
86
|
-
"maxIterations": {
|
|
87
|
-
"type": "integer",
|
|
88
|
-
"minimum": 1,
|
|
89
|
-
"maximum": 500
|
|
90
|
-
},
|
|
91
|
-
"maxNoProgress": {
|
|
92
|
-
"type": "integer",
|
|
93
|
-
"minimum": 1,
|
|
94
|
-
"maximum": 50
|
|
95
|
-
},
|
|
96
|
-
"maxMinutes": {
|
|
97
|
-
"type": "integer",
|
|
98
|
-
"minimum": 1,
|
|
99
|
-
"maximum": 1440
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
|
-
"permissions": {
|
|
104
|
-
"type": "object",
|
|
105
|
-
"required": [
|
|
106
|
-
"allowedPaths",
|
|
107
|
-
"forbiddenActions"
|
|
108
|
-
],
|
|
109
|
-
"additionalProperties": true,
|
|
110
|
-
"properties": {
|
|
111
|
-
"allowedPaths": {
|
|
112
|
-
"type": "array",
|
|
113
|
-
"items": {
|
|
114
|
-
"type": "string",
|
|
115
|
-
"minLength": 1
|
|
116
|
-
}
|
|
117
|
-
},
|
|
118
|
-
"forbiddenActions": {
|
|
119
|
-
"type": "array",
|
|
120
|
-
"minItems": 1,
|
|
121
|
-
"items": {
|
|
122
|
-
"type": "string",
|
|
123
|
-
"minLength": 1
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
},
|
|
128
|
-
"verification": {
|
|
129
|
-
"type": "object",
|
|
130
|
-
"required": [
|
|
131
|
-
"commands",
|
|
132
|
-
"evidenceRequired"
|
|
133
|
-
],
|
|
134
|
-
"additionalProperties": true,
|
|
135
|
-
"properties": {
|
|
136
|
-
"commands": {
|
|
137
|
-
"type": "array",
|
|
138
|
-
"items": {
|
|
139
|
-
"type": "string",
|
|
140
|
-
"minLength": 1
|
|
141
|
-
}
|
|
142
|
-
},
|
|
143
|
-
"evidenceRequired": {
|
|
144
|
-
"type": "boolean"
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
},
|
|
149
|
-
"$defs": {
|
|
150
|
-
"model": {
|
|
151
|
-
"type": "string",
|
|
152
|
-
"minLength": 1,
|
|
153
|
-
"maxLength": 120
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
package/references/repo-map.md
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
# Oris Repository Map
|
|
2
|
-
|
|
3
|
-
Setup map = the default project context for every Oris skill and loop. It exists so agents stop re-scanning and users stop repeating project facts.
|
|
4
|
-
|
|
5
|
-
## Files
|
|
6
|
-
|
|
7
|
-
| File | Scope | Purpose |
|
|
8
|
-
|------|-------|---------|
|
|
9
|
-
| `.oris-flow/manifest.json` | repo | compact index: section paths, freshness, confidence |
|
|
10
|
-
| `.oris-flow/maps/**` | repo | short markdown maps: docs, stack, commands, code areas, tests |
|
|
11
|
-
| `.oris-flow/adapter.json` | repo | loop adapter: paths, commands, model aliases |
|
|
12
|
-
| `.oris-flow/settings.json` | repo | preferences: `responseStyle` + `artifactLanguage` (non-secret) |
|
|
13
|
-
| `{tasksRoot}/{task}/…` | task | business artifacts only — `setup.tasksRoot` in the manifest, default `.oris-flow/tasks` (see `references/doc-policy.md`) |
|
|
14
|
-
|
|
15
|
-
Manifest and maps are never task authority and NEVER hold secrets.
|
|
16
|
-
|
|
17
|
-
## Manifest shape (v1)
|
|
18
|
-
|
|
19
|
-
```json
|
|
20
|
-
{
|
|
21
|
-
"$schema": "https://oris.dev/schemas/oris-flow-map-v1.json",
|
|
22
|
-
"schemaVersion": 1,
|
|
23
|
-
"repository": "",
|
|
24
|
-
"generatedAt": "",
|
|
25
|
-
"updatedAt": "",
|
|
26
|
-
"setup": { "versionControl": { "orisFlowMap": "commit" } },
|
|
27
|
-
"sections": {}
|
|
28
|
-
}
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
- Small: only sections that exist for the detected stack; no placeholders.
|
|
32
|
-
- Each section: file path, one-line summary, `confidence`, `lastScannedAt`, stale flag.
|
|
33
|
-
- Confidence: `confirmed` (user/authoritative) | `detected` (strong scan evidence) | `inferred` (unverified) | `stale` (no longer matches).
|
|
34
|
-
- `setup.versionControl.orisFlowMap`: `commit` | `gitignore` — applied via `npx oris-skills flow version-control --mode <choice>`.
|
|
35
|
-
- Schema: `references/repo-map.schema.json`.
|
|
36
|
-
|
|
37
|
-
## Map sections
|
|
38
|
-
|
|
39
|
-
`.oris-flow/maps/`: `README.md`, `docs.md`, `stack.md`, `commands.md`, `code.md`, `tests.md`.
|
|
40
|
-
Each section: purpose, authoritative paths, confirmed decisions, key commands/conventions, confidence + stale notes, pointers instead of copied content.
|
|
41
|
-
|
|
42
|
-
## Consumption rules
|
|
43
|
-
|
|
44
|
-
1. MANIFEST first, then only the relevant map sections — before any broad scan.
|
|
45
|
-
2. VERIFY stale or high-risk facts against the repository before consequential actions.
|
|
46
|
-
3. Loops: the orchestrator passes relevant setup-map facts into role prompts at craft time; users never repeat project facts per loop.
|
|
47
|
-
4. SUGGEST `/oris-flow` → Setup refresh only when a stale gap materially affects the task.
|
|
48
|
-
|
|
49
|
-
## Command surface
|
|
50
|
-
|
|
51
|
-
In target repositories always use the installed CLI (`npx oris-skills flow scan|version-control|clean-runtime`, `npx oris-skills loop …`), never `node scripts/...` paths — those exist only in the OrisSkills source checkout.
|