@crouton-kit/crouter 0.3.28 → 0.3.29
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/dist/build-root.js +4 -2
- package/dist/builtin-memory/crouter-development/marketplaces.md +7 -6
- package/dist/builtin-memory/crouter-development/personas/base-prompt.md +1 -1
- package/dist/builtin-memory/crouter-development/personas/orchestrator-prompt.md +1 -1
- package/dist/builtin-memory/crouter-development/personas.md +1 -1
- package/dist/builtin-memory/crouter-development/plugins.md +20 -18
- package/dist/builtin-memory/design.md +1 -1
- package/dist/builtin-memory/development.md +1 -1
- package/dist/builtin-memory/internal/INDEX.md +1 -1
- package/dist/builtin-memory/internal/examples/INDEX.md +1 -1
- package/dist/builtin-memory/internal/examples/imessage-assistant.md +2 -2
- package/dist/builtin-memory/internal/nodes-and-canvas.md +1 -1
- package/dist/builtin-memory/internal/storage-tiers.md +1 -1
- package/dist/builtin-memory/planning.md +1 -1
- package/dist/builtin-memory/spec.md +6 -4
- package/dist/builtin-personas/orchestration-kernel.md +4 -5
- package/dist/builtin-personas/runtime-base.md +5 -4
- package/dist/builtin-personas/spec/PERSONA.md +8 -4
- package/dist/builtin-personas/spec/orchestrator.md +5 -3
- package/dist/builtin-personas/spec/requirements/PERSONA.md +10 -0
- package/dist/builtin-views/canvas/core.mjs +586 -0
- package/dist/builtin-views/canvas/text.mjs +58 -0
- package/dist/builtin-views/canvas/tui.mjs +165 -0
- package/dist/builtin-views/canvas/web.jsx +120 -0
- package/dist/builtin-views/git-pr/core.mjs +673 -0
- package/dist/builtin-views/git-pr/text.mjs +84 -0
- package/dist/builtin-views/git-pr/tui.mjs +302 -0
- package/dist/builtin-views/git-pr/web.jsx +216 -0
- package/dist/builtin-views/inbox/_lib/render.mjs +1 -3
- package/dist/builtin-views/inbox/core.mjs +1273 -0
- package/dist/builtin-views/inbox/text.mjs +73 -0
- package/dist/builtin-views/inbox/tui.mjs +312 -0
- package/dist/builtin-views/inbox/web.jsx +188 -0
- package/dist/builtin-views/linkedin/core.mjs +906 -0
- package/dist/builtin-views/linkedin/text.mjs +69 -0
- package/dist/builtin-views/linkedin/tui.mjs +427 -0
- package/dist/builtin-views/linkedin/web.jsx +206 -0
- package/dist/builtin-views/workspace-sidebar/core.mjs +621 -0
- package/dist/builtin-views/workspace-sidebar/text.mjs +53 -0
- package/dist/builtin-views/workspace-sidebar/tui.mjs +142 -0
- package/dist/builtin-views/workspace-sidebar/web.jsx +109 -0
- package/dist/cli.js +3 -3
- package/dist/clients/attach/__tests__/action-parity.test.js +48 -0
- package/dist/clients/attach/__tests__/clipboard-image.test.js +76 -0
- package/dist/clients/attach/__tests__/editor-newline.test.js +57 -0
- package/dist/clients/attach/__tests__/git-info.test.js +31 -0
- package/dist/clients/attach/__tests__/onrequest-wired.test.js +20 -0
- package/dist/clients/attach/__tests__/slash-quit-copy.test.js +42 -0
- package/dist/clients/attach/__tests__/titled-editor.test.js +39 -0
- package/dist/clients/attach/attach-cmd.js +282 -46
- package/dist/clients/attach/auth-pickers.d.ts +9 -0
- package/dist/clients/attach/auth-pickers.js +194 -0
- package/dist/clients/attach/canvas-panels.d.ts +4 -2
- package/dist/clients/attach/canvas-panels.js +45 -17
- package/dist/clients/attach/chat-view.d.ts +27 -2
- package/dist/clients/attach/chat-view.js +98 -9
- package/dist/clients/attach/clipboard-image.d.ts +47 -8
- package/dist/clients/attach/clipboard-image.js +150 -26
- package/dist/clients/attach/clipboard-text.d.ts +3 -0
- package/dist/clients/attach/clipboard-text.js +39 -0
- package/dist/clients/attach/config-load.d.ts +54 -7
- package/dist/clients/attach/config-load.js +99 -3
- package/dist/clients/attach/context-message.d.ts +12 -0
- package/dist/clients/attach/context-message.js +72 -0
- package/dist/clients/attach/git-info.d.ts +20 -0
- package/dist/clients/attach/git-info.js +44 -0
- package/dist/clients/attach/graph-overlay.d.ts +13 -4
- package/dist/clients/attach/graph-overlay.js +59 -19
- package/dist/clients/attach/input-controller.d.ts +75 -13
- package/dist/clients/attach/input-controller.js +305 -67
- package/dist/clients/attach/pickers.d.ts +58 -0
- package/dist/clients/attach/pickers.js +171 -0
- package/dist/clients/attach/slash-commands.d.ts +22 -0
- package/dist/clients/attach/slash-commands.js +91 -25
- package/dist/clients/attach/titled-editor.d.ts +33 -0
- package/dist/clients/attach/titled-editor.js +84 -0
- package/dist/clients/attach/view-socket.d.ts +18 -1
- package/dist/clients/attach/view-socket.js +70 -1
- package/dist/clients/web/dev-server.d.ts +7 -0
- package/dist/clients/web/dev-server.js +59 -0
- package/dist/clients/web/events.d.ts +14 -0
- package/dist/clients/web/events.js +151 -0
- package/dist/clients/web/server.d.ts +18 -0
- package/dist/clients/web/server.js +450 -0
- package/dist/clients/web/web-cmd.d.ts +2 -0
- package/dist/clients/web/web-cmd.js +120 -0
- package/dist/commands/canvas.js +1 -2
- package/dist/commands/chord.js +1 -1
- package/dist/commands/dashboard.js +5 -1
- package/dist/commands/memory/__tests__/lint-schema.test.js +6 -6
- package/dist/commands/memory/lint.js +14 -2
- package/dist/commands/memory/read.js +2 -2
- package/dist/commands/memory/shared.d.ts +7 -1
- package/dist/commands/memory/shared.js +18 -3
- package/dist/commands/memory/write.js +8 -4
- package/dist/commands/memory.js +4 -4
- package/dist/commands/node.d.ts +1 -1
- package/dist/commands/node.js +64 -65
- package/dist/commands/pkg.js +1 -2
- package/dist/commands/revive.js +11 -3
- package/dist/commands/sys/sync.d.ts +1 -0
- package/dist/commands/sys/sync.js +187 -0
- package/dist/commands/sys.js +3 -2
- package/dist/commands/view-cycle.js +2 -2
- package/dist/commands/view-list.js +8 -8
- package/dist/commands/view-new.js +21 -17
- package/dist/commands/view-pick.js +1 -1
- package/dist/commands/view-run.js +35 -14
- package/dist/commands/view.js +8 -6
- package/dist/commands/workspace.d.ts +2 -0
- package/dist/commands/workspace.js +161 -0
- package/dist/core/__tests__/broker-double-spawn.test.d.ts +1 -0
- package/dist/core/__tests__/broker-double-spawn.test.js +143 -0
- package/dist/core/__tests__/broker-fork-seam.test.d.ts +1 -0
- package/dist/core/__tests__/broker-fork-seam.test.js +102 -0
- package/dist/core/__tests__/broker-sdk-wiring.test.js +2 -0
- package/dist/core/__tests__/child-death-wake.test.js +56 -111
- package/dist/core/__tests__/close.test.js +14 -20
- package/dist/core/__tests__/context-intro.test.js +19 -19
- package/dist/core/__tests__/daemon-boot.test.js +30 -23
- package/dist/core/__tests__/draw-style.test.js +1 -1
- package/dist/core/__tests__/error-stall-recycle.test.d.ts +1 -0
- package/dist/core/__tests__/error-stall-recycle.test.js +141 -0
- package/dist/core/__tests__/fixtures/fake-engine.d.ts +17 -1
- package/dist/core/__tests__/fixtures/fake-engine.js +22 -2
- package/dist/core/__tests__/fixtures/fake-pi-host.js +2 -2
- package/dist/core/__tests__/focuses.test.js +25 -13
- package/dist/core/__tests__/fork.test.js +22 -5
- package/dist/core/__tests__/full/broker-control-preempt.test.d.ts +1 -0
- package/dist/core/__tests__/full/broker-control-preempt.test.js +61 -0
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.d.ts +1 -0
- package/dist/core/__tests__/full/broker-model-changed-broadcast.test.js +57 -0
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.d.ts +1 -0
- package/dist/core/__tests__/full/broker-navigate-tree-rewelcome.test.js +80 -0
- package/dist/core/__tests__/full/broker-pane-resolution.test.js +90 -0
- package/dist/core/__tests__/full/cascade-close.test.js +22 -8
- package/dist/core/__tests__/full/detach-focus.test.js +66 -169
- package/dist/core/__tests__/helpers/harness.d.ts +6 -9
- package/dist/core/__tests__/helpers/harness.js +19 -36
- package/dist/core/__tests__/human-node-not-supervised.test.d.ts +1 -0
- package/dist/core/__tests__/human-node-not-supervised.test.js +83 -0
- package/dist/core/__tests__/lifecycle.test.js +1 -19
- package/dist/core/__tests__/live-mutation-verbs.test.js +5 -5
- package/dist/core/__tests__/memory-resolver.test.js +1 -1
- package/dist/core/__tests__/on-read-dedup-resume.test.js +2 -2
- package/dist/core/__tests__/refresh-stall-recycle.test.d.ts +1 -0
- package/dist/core/__tests__/refresh-stall-recycle.test.js +88 -0
- package/dist/core/__tests__/relaunch-root.test.d.ts +1 -0
- package/dist/core/__tests__/relaunch-root.test.js +114 -0
- package/dist/core/__tests__/reset.test.js +19 -79
- package/dist/core/__tests__/steer-note.test.js +9 -7
- package/dist/core/__tests__/tmux-surface.test.js +13 -7
- package/dist/core/bootstrap.d.ts +0 -3
- package/dist/core/bootstrap.js +1 -143
- package/dist/core/canvas/browse/__tests__/model.test.js +86 -1
- package/dist/core/canvas/browse/__tests__/render.test.js +2 -1
- package/dist/core/canvas/browse/app.js +131 -8
- package/dist/core/canvas/browse/model.d.ts +23 -5
- package/dist/core/canvas/browse/model.js +68 -13
- package/dist/core/canvas/browse/render.d.ts +7 -1
- package/dist/core/canvas/browse/render.js +178 -47
- package/dist/core/canvas/canvas.js +1 -1
- package/dist/core/canvas/focuses.d.ts +4 -4
- package/dist/core/canvas/focuses.js +7 -7
- package/dist/core/canvas/nav-model.js +8 -7
- package/dist/core/canvas/render.d.ts +68 -9
- package/dist/core/canvas/render.js +195 -61
- package/dist/core/canvas/types.d.ts +16 -23
- package/dist/core/config.js +1 -4
- package/dist/core/memory-resolver.js +43 -5
- package/dist/core/runtime/bearings.d.ts +1 -1
- package/dist/core/runtime/bearings.js +8 -8
- package/dist/core/runtime/branded-host.d.ts +16 -0
- package/dist/core/runtime/branded-host.js +127 -0
- package/dist/core/runtime/broker-protocol.d.ts +212 -6
- package/dist/core/runtime/broker.d.ts +4 -1
- package/dist/core/runtime/broker.js +494 -58
- package/dist/core/runtime/close.d.ts +12 -2
- package/dist/core/runtime/close.js +37 -16
- package/dist/core/runtime/front-door.js +6 -14
- package/dist/core/runtime/host.d.ts +14 -34
- package/dist/core/runtime/host.js +14 -50
- package/dist/core/runtime/launch.d.ts +12 -9
- package/dist/core/runtime/launch.js +27 -15
- package/dist/core/runtime/lifecycle.d.ts +1 -1
- package/dist/core/runtime/lifecycle.js +15 -19
- package/dist/core/runtime/nodes.d.ts +0 -55
- package/dist/core/runtime/nodes.js +6 -74
- package/dist/core/runtime/placement.d.ts +91 -335
- package/dist/core/runtime/placement.js +262 -840
- package/dist/core/runtime/promote.d.ts +2 -0
- package/dist/core/runtime/promote.js +24 -6
- package/dist/core/runtime/recap.d.ts +8 -0
- package/dist/core/runtime/recap.js +107 -0
- package/dist/core/runtime/recycle.js +25 -61
- package/dist/core/runtime/reset.d.ts +43 -37
- package/dist/core/runtime/reset.js +131 -218
- package/dist/core/runtime/revive.d.ts +9 -29
- package/dist/core/runtime/revive.js +40 -139
- package/dist/core/runtime/spawn.d.ts +15 -16
- package/dist/core/runtime/spawn.js +165 -194
- package/dist/core/runtime/surface-bg.d.ts +11 -0
- package/dist/core/runtime/surface-bg.js +68 -0
- package/dist/core/runtime/tmux.d.ts +13 -50
- package/dist/core/runtime/tmux.js +33 -87
- package/dist/core/scope.d.ts +1 -2
- package/dist/core/scope.js +1 -5
- package/dist/core/skill-sync/__tests__/dry-run-wrote-count.test.d.ts +1 -0
- package/dist/core/skill-sync/__tests__/dry-run-wrote-count.test.js +57 -0
- package/dist/core/skill-sync/builtins.d.ts +42 -0
- package/dist/core/skill-sync/builtins.js +112 -0
- package/dist/core/skill-sync/claude-plugins.d.ts +23 -0
- package/dist/core/skill-sync/claude-plugins.js +71 -0
- package/dist/core/skill-sync/engine.d.ts +42 -0
- package/dist/core/skill-sync/engine.js +633 -0
- package/dist/core/skill-sync/export.d.ts +23 -0
- package/dist/core/skill-sync/export.js +86 -0
- package/dist/core/skill-sync/manifest.d.ts +64 -0
- package/dist/core/skill-sync/manifest.js +181 -0
- package/dist/core/skill-sync/profile.d.ts +76 -0
- package/dist/core/skill-sync/profile.js +173 -0
- package/dist/core/skill-sync/snapshot.d.ts +57 -0
- package/dist/core/skill-sync/snapshot.js +120 -0
- package/dist/core/substrate/index.d.ts +1 -1
- package/dist/core/substrate/index.js +1 -1
- package/dist/core/substrate/injected-store.js +3 -3
- package/dist/core/substrate/on-read.js +68 -6
- package/dist/core/substrate/render.d.ts +8 -11
- package/dist/core/substrate/render.js +29 -43
- package/dist/core/substrate/schema.d.ts +10 -3
- package/dist/core/substrate/schema.js +6 -3
- package/dist/core/tui/host.d.ts +12 -4
- package/dist/core/tui/host.js +280 -149
- package/dist/core/view/bridge.d.ts +10 -0
- package/dist/core/view/bridge.js +31 -0
- package/dist/core/view/chrome.d.ts +9 -0
- package/dist/core/view/chrome.js +22 -0
- package/dist/core/view/contract.d.ts +171 -0
- package/dist/core/view/contract.js +23 -0
- package/dist/core/view/loader.d.ts +31 -0
- package/dist/core/view/loader.js +188 -0
- package/dist/core/view/transport-local.d.ts +7 -0
- package/dist/core/view/transport-local.js +70 -0
- package/dist/core/view/transport.d.ts +4 -0
- package/dist/core/view/transport.js +15 -0
- package/dist/daemon/crtrd.d.ts +38 -27
- package/dist/daemon/crtrd.js +303 -376
- package/dist/daemon/manage.js +6 -1
- package/dist/index.js +1 -1
- package/dist/pi-extensions/__tests__/canvas-stophook-agentend.test.js +28 -20
- package/dist/pi-extensions/canvas-context-intro.js +4 -4
- package/dist/pi-extensions/canvas-doc-substrate.js +16 -16
- package/dist/pi-extensions/canvas-nav.js +5 -0
- package/dist/pi-extensions/canvas-recap.d.ts +37 -0
- package/dist/pi-extensions/canvas-recap.js +236 -0
- package/dist/pi-extensions/canvas-resume.js +2 -1
- package/dist/pi-extensions/canvas-stophook.d.ts +14 -12
- package/dist/pi-extensions/canvas-stophook.js +87 -101
- package/dist/pi-extensions/canvas-view.js +2 -1
- package/dist/pi-extensions/widget-order-bus.d.ts +6 -0
- package/dist/pi-extensions/widget-order-bus.js +34 -0
- package/dist/prompts/view.d.ts +2 -2
- package/dist/prompts/view.js +145 -73
- package/dist/types.d.ts +1 -6
- package/dist/types.js +1 -3
- package/dist/web/ViewChrome.d.ts +7 -0
- package/dist/web/ViewChrome.js +28 -0
- package/dist/web/ViewPane.d.ts +39 -0
- package/dist/web/ViewPane.js +48 -0
- package/dist/web/index.d.ts +6 -0
- package/dist/web/index.js +16 -0
- package/dist/web/runtime.d.ts +39 -0
- package/dist/web/runtime.js +133 -0
- package/dist/web/states.d.ts +24 -0
- package/dist/web/states.js +24 -0
- package/dist/web/transport-http.d.ts +5 -0
- package/dist/web/transport-http.js +28 -0
- package/dist/web-client/assets/index-BUvQb4hR.css +2 -0
- package/dist/web-client/assets/index-ClLQXYAE.js +10 -0
- package/dist/web-client/index.html +13 -0
- package/package.json +20 -6
- package/dist/builtin-views/canvas/client.mjs +0 -303
- package/dist/builtin-views/canvas/view.mjs +0 -576
- package/dist/builtin-views/git-pr/client.mjs +0 -440
- package/dist/builtin-views/git-pr/view.mjs +0 -675
- package/dist/builtin-views/inbox/sources/gmail.mjs +0 -965
- package/dist/builtin-views/inbox/sources/linkedin.mjs +0 -427
- package/dist/builtin-views/inbox/view.mjs +0 -889
- package/dist/builtin-views/linkedin/client.mjs +0 -610
- package/dist/builtin-views/linkedin/view.mjs +0 -1171
- package/dist/commands/pkg/bridge.d.ts +0 -1
- package/dist/commands/pkg/bridge.js +0 -137
- package/dist/commands/skill/author.d.ts +0 -3
- package/dist/commands/skill/author.js +0 -140
- package/dist/commands/skill/shared.d.ts +0 -3
- package/dist/commands/skill/shared.js +0 -19
- package/dist/commands/skill.d.ts +0 -2
- package/dist/commands/skill.js +0 -21
- package/dist/commands/tmux-spread.d.ts +0 -2
- package/dist/commands/tmux-spread.js +0 -144
- package/dist/core/__tests__/full/daemon-liveness-pane.full.test.js +0 -292
- package/dist/core/__tests__/full/placement-focus.test.js +0 -309
- package/dist/core/__tests__/full/placement-reconcile.test.js +0 -212
- package/dist/core/__tests__/full/placement-revive.test.js +0 -238
- package/dist/core/__tests__/full/placement-teardown.test.js +0 -297
- package/dist/core/__tests__/home-session.test.js +0 -186
- package/dist/core/__tests__/relaunch.test.js +0 -335
- package/dist/core/bridge-map.d.ts +0 -19
- package/dist/core/bridge-map.js +0 -73
- package/dist/core/tui/contract.d.ts +0 -83
- package/dist/core/tui/contract.js +0 -8
- package/dist/core/tui/loader.d.ts +0 -16
- package/dist/core/tui/loader.js +0 -94
- package/dist/prompts/skill.d.ts +0 -2
- package/dist/prompts/skill.js +0 -650
- /package/dist/{core/__tests__/full/daemon-liveness-pane.full.test.d.ts → clients/attach/__tests__/action-parity.test.d.ts} +0 -0
- /package/dist/{core/__tests__/full/placement-focus.test.d.ts → clients/attach/__tests__/clipboard-image.test.d.ts} +0 -0
- /package/dist/{core/__tests__/full/placement-reconcile.test.d.ts → clients/attach/__tests__/editor-newline.test.d.ts} +0 -0
- /package/dist/{core/__tests__/full/placement-revive.test.d.ts → clients/attach/__tests__/git-info.test.d.ts} +0 -0
- /package/dist/{core/__tests__/full/placement-teardown.test.d.ts → clients/attach/__tests__/onrequest-wired.test.d.ts} +0 -0
- /package/dist/{core/__tests__/home-session.test.d.ts → clients/attach/__tests__/slash-quit-copy.test.d.ts} +0 -0
- /package/dist/{core/__tests__/relaunch.test.d.ts → clients/attach/__tests__/titled-editor.test.d.ts} +0 -0
package/dist/build-root.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { defineRoot } from './core/command.js';
|
|
2
|
-
import { registerSkill } from './commands/skill.js';
|
|
3
2
|
import { registerMemory } from './commands/memory.js';
|
|
4
3
|
import { registerPkg } from './commands/pkg.js';
|
|
5
4
|
import { registerHuman } from './commands/human.js';
|
|
@@ -9,6 +8,8 @@ import { registerNode } from './commands/node.js';
|
|
|
9
8
|
import { registerCanvas } from './commands/canvas.js';
|
|
10
9
|
import { registerView } from './commands/view.js';
|
|
11
10
|
import { registerAttach } from './clients/attach/attach-cmd.js';
|
|
11
|
+
import { registerWorkspace } from './commands/workspace.js';
|
|
12
|
+
import { registerWeb } from './clients/web/web-cmd.js';
|
|
12
13
|
/** Assemble the full crtr command tree. Root owns only the tagline; every
|
|
13
14
|
* subtree declares its own root representation via its rootEntry, and every
|
|
14
15
|
* branch assembles its child listing from the child defs (each child owns its
|
|
@@ -20,7 +21,6 @@ export function buildRoot() {
|
|
|
20
21
|
tagline: 'crtr: agentic planning runtime.',
|
|
21
22
|
globals: [],
|
|
22
23
|
subtrees: [
|
|
23
|
-
registerSkill(),
|
|
24
24
|
registerMemory(),
|
|
25
25
|
registerPkg(),
|
|
26
26
|
registerHuman(),
|
|
@@ -31,6 +31,8 @@ export function buildRoot() {
|
|
|
31
31
|
registerCanvas(),
|
|
32
32
|
registerView(),
|
|
33
33
|
registerAttach(),
|
|
34
|
+
registerWorkspace(),
|
|
35
|
+
registerWeb(),
|
|
34
36
|
],
|
|
35
37
|
});
|
|
36
38
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
kind:
|
|
2
|
+
kind: knowledge
|
|
3
3
|
when-and-why-to-read: When creating a crtr marketplace or contributing plugins
|
|
4
4
|
to one, this skill should be read.
|
|
5
5
|
short-form: How to author a crtr marketplace — marketplace.json index, plugin
|
|
@@ -36,7 +36,7 @@ If you have one plugin, ship it standalone. Promote to a marketplace later.
|
|
|
36
36
|
└── plugins/
|
|
37
37
|
├── plugin-a/
|
|
38
38
|
│ ├── .crouter-plugin/plugin.json
|
|
39
|
-
│ └──
|
|
39
|
+
│ └── memory/...
|
|
40
40
|
└── plugin-b/
|
|
41
41
|
└── ...
|
|
42
42
|
```
|
|
@@ -108,18 +108,19 @@ The crouter-official-marketplace repo's `.github/workflows/auto-bump.yml` is the
|
|
|
108
108
|
cd <marketplace-repo>
|
|
109
109
|
|
|
110
110
|
# Create the plugin (see [[crouter-development/plugins]] for plugin layout)
|
|
111
|
-
mkdir -p plugins/my-new-plugin/.crouter-plugin plugins/my-new-plugin/
|
|
111
|
+
mkdir -p plugins/my-new-plugin/.crouter-plugin plugins/my-new-plugin/memory
|
|
112
112
|
$EDITOR plugins/my-new-plugin/.crouter-plugin/plugin.json
|
|
113
113
|
|
|
114
|
-
# Add at least one
|
|
115
|
-
|
|
114
|
+
# Add at least one doc (`crtr memory write -h` is the authoring + routing guide)
|
|
115
|
+
$EDITOR plugins/my-new-plugin/memory/first-skill.md
|
|
116
116
|
|
|
117
117
|
# Add the plugin to the marketplace index
|
|
118
118
|
$EDITOR .crouter-marketplace/marketplace.json
|
|
119
119
|
# (append to plugins[] with name, initial version, source, description)
|
|
120
120
|
|
|
121
121
|
# Validate
|
|
122
|
-
crtr sys doctor
|
|
122
|
+
crtr sys doctor # manifest + structure
|
|
123
|
+
crtr memory lint # doc frontmatter
|
|
123
124
|
|
|
124
125
|
# Commit — CI bumps versions if you've wired up auto-bump
|
|
125
126
|
git add -A
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
kind:
|
|
2
|
+
kind: knowledge
|
|
3
3
|
when-and-why-to-read: When creating a crtr plugin, packaging skills for
|
|
4
4
|
distribution, or debugging install/resolution, this skill should be read.
|
|
5
5
|
short-form: How to author a crtr plugin — plugin.json manifest, directory
|
|
@@ -7,18 +7,17 @@ short-form: How to author a crtr plugin — plugin.json manifest, directory
|
|
|
7
7
|
packaging skills for distribution, or debugging install/resolution.
|
|
8
8
|
system-prompt-visibility: name
|
|
9
9
|
file-read-visibility: none
|
|
10
|
-
needs-refinement: true
|
|
11
10
|
---
|
|
12
11
|
|
|
13
12
|
# Authoring crtr plugins
|
|
14
13
|
|
|
15
|
-
A **plugin** is a directory shipping
|
|
14
|
+
A **plugin** is a directory shipping substrate docs (knowledge and preferences) and other artifact types like `rules/` and `agents/`. Plugins are how you package that content for sharing across machines, projects, and people.
|
|
16
15
|
|
|
17
16
|
Audience: LLM agents creating or maintaining a crtr plugin.
|
|
18
17
|
|
|
19
18
|
## When you need a plugin (vs scope-owned skills)
|
|
20
19
|
|
|
21
|
-
Scope-owned
|
|
20
|
+
Scope-owned docs live at `~/.crouter/memory/` (user) or `<project>/.crouter/memory/` (project). They're personal and per-machine/per-repo.
|
|
22
21
|
|
|
23
22
|
Reach for a **plugin** when:
|
|
24
23
|
- You want to share skills across multiple projects or with other people.
|
|
@@ -33,12 +32,14 @@ If it's a one-off note for yourself, scope-owned skills are simpler. Promote to
|
|
|
33
32
|
<plugin-name>/
|
|
34
33
|
├── .crouter-plugin/
|
|
35
34
|
│ └── plugin.json # manifest — required
|
|
36
|
-
└──
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
└── memory/
|
|
36
|
+
├── <name>.md # a kind:knowledge or kind:preference doc
|
|
37
|
+
└── <area>/
|
|
38
|
+
├── INDEX.md # optional — a dir surfaces as one entry at its INDEX rung
|
|
39
|
+
└── <name>.md
|
|
39
40
|
```
|
|
40
41
|
|
|
41
|
-
The `<plugin-name>` directory IS the plugin. The manifest's `name` field must match the directory name (install renames if needed).
|
|
42
|
+
The `<plugin-name>` directory IS the plugin. The manifest's `name` field must match the directory name (install renames if needed). Sibling dirs (`rules/`, `agents/`, and future `commands/`, `hooks/`) hold the other artifact types.
|
|
42
43
|
|
|
43
44
|
## The manifest
|
|
44
45
|
|
|
@@ -97,20 +98,21 @@ Three ways a plugin lands in a scope:
|
|
|
97
98
|
## Local development loop
|
|
98
99
|
|
|
99
100
|
```bash
|
|
100
|
-
# Scaffold dir + manifest + first
|
|
101
|
-
mkdir -p my-plugin/.crouter-plugin my-plugin/
|
|
101
|
+
# Scaffold dir + manifest + first doc
|
|
102
|
+
mkdir -p my-plugin/.crouter-plugin my-plugin/memory
|
|
102
103
|
$EDITOR my-plugin/.crouter-plugin/plugin.json # write the manifest
|
|
103
104
|
cd my-plugin
|
|
104
|
-
|
|
105
|
+
$EDITOR my-plugin/memory/my-first-skill.md # author the doc — `crtr memory write -h` is the frontmatter + routing guide
|
|
105
106
|
|
|
106
107
|
# Symlink for fast iteration — no clone, edits land immediately
|
|
107
108
|
ln -s $(pwd) ~/.crouter/plugins/my-plugin
|
|
108
109
|
|
|
109
110
|
# Verify
|
|
110
111
|
crtr pkg plugin inspect list # my-plugin appears
|
|
111
|
-
crtr pkg plugin inspect show my-plugin # lists its
|
|
112
|
-
crtr memory
|
|
113
|
-
crtr sys doctor # validates manifest
|
|
112
|
+
crtr pkg plugin inspect show my-plugin # lists its docs
|
|
113
|
+
crtr memory read my-plugin/my-first-skill # resolve it under the plugin namespace
|
|
114
|
+
crtr sys doctor # validates the manifest
|
|
115
|
+
crtr memory lint # validates doc frontmatter
|
|
114
116
|
```
|
|
115
117
|
|
|
116
118
|
When ready to share: push to a git remote; anyone can `crtr pkg plugin manage install <url> --scope user`.
|
|
@@ -131,7 +133,7 @@ Standard semver:
|
|
|
131
133
|
|
|
132
134
|
`crtr pkg plugin manage disable <name>` flips the per-scope config without removing files. Disabled plugins are hidden from `crtr memory list` and don't resolve via `crtr memory read <name>`. Re-enable with `crtr pkg plugin manage enable <name>`.
|
|
133
135
|
|
|
134
|
-
Individual skills inside an enabled plugin
|
|
136
|
+
Individual skills inside an enabled plugin are hidden by setting their frontmatter visibility rungs to `none` (or a gate that fails), not by a command — see `crtr memory write -h`.
|
|
135
137
|
|
|
136
138
|
## What goes in a plugin
|
|
137
139
|
|
|
@@ -150,11 +152,11 @@ If your skill conceptually depends on another plugin's skill, link via `## Relat
|
|
|
150
152
|
|
|
151
153
|
## Validation
|
|
152
154
|
|
|
153
|
-
`crtr sys doctor` checks
|
|
155
|
+
`crtr sys doctor` checks each plugin's manifest:
|
|
154
156
|
- Manifest exists and is valid JSON.
|
|
155
157
|
- Manifest `name` matches the directory name.
|
|
156
|
-
|
|
157
|
-
- Sibling artifact dirs (`commands/`, `hooks
|
|
158
|
+
|
|
159
|
+
`crtr memory lint` checks the docs under `memory/`: frontmatter parses, valid `kind`, both visibility rungs set. Run `crtr memory write -h` for the authoring + routing guide. Sibling artifact dirs (`rules/`, `agents/`, `commands/`, `hooks/`) are validated by their respective specs as those land.
|
|
158
160
|
|
|
159
161
|
## Cross-publishing with Claude Code
|
|
160
162
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
kind:
|
|
2
|
+
kind: knowledge
|
|
3
3
|
when-and-why-to-read: When you hit a question about how the crtr runtime itself works — how nodes and the canvas behave, where state lives on disk, or how the primitives compose into real systems — this index should be read because it routes you to the runtime's own operational documentation, so you act from the canonical model instead of inferring it from command help.
|
|
4
4
|
short-form: internal/ is the runtime's self-documentation — operational guides to nodes/canvas and the storage tiers, plus worked example compositions. Open it when you need to understand how crtr works.
|
|
5
5
|
system-prompt-visibility: preview
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
kind:
|
|
2
|
+
kind: knowledge
|
|
3
3
|
when-and-why-to-read: When you want a worked end-to-end composition of crouter primitives — not what one command does but how several combine into a real standing system — open this dir because it holds complete example builds, each verified against the actual runtime and OS mechanics.
|
|
4
4
|
short-form: Worked examples composing crouter primitives into complete systems (like pi's examples/ dir). Currently — the iMessage assistant node.
|
|
5
5
|
system-prompt-visibility: name
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
kind:
|
|
2
|
+
kind: knowledge
|
|
3
3
|
when-and-why-to-read: When you are building a standing assistant node bridged to an external channel — iMessage, email, a chat service — this example should be read because it composes the crouter primitives (resident root node, custom persona, event-driven wake via node msg, project-scope memory) into a working OpenClaw-style design, with the macOS chat.db/osascript mechanics verified.
|
|
4
4
|
short-form: Worked example — an always-on iMessage assistant built from crouter primitives. Resident root node + launchd watcher → node msg wakes + chat.db reads + osascript sends + substrate memory.
|
|
5
5
|
system-prompt-visibility: name
|
|
@@ -36,7 +36,7 @@ You are the standing iMessage assistant. Initialize: read your persona's wake lo
|
|
|
36
36
|
EOF
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
`--root` makes it independent and resident — top-level on the canvas, no parent to report to, never forced to finish.
|
|
39
|
+
`--root` makes it independent and resident — top-level on the canvas, no parent to report to, never forced to finish. Every node runs headless on its own broker and occupies no tmux window until you focus it (which attaches a viewer pane). Record the returned node id for the watcher.
|
|
40
40
|
|
|
41
41
|
## 3. Wake: event-driven, not polled
|
|
42
42
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
kind:
|
|
2
|
+
kind: knowledge
|
|
3
3
|
when-and-why-to-read: When you are operating the canvas — spawning or steering nodes, deciding how work reports up, recovering a dormant or crashed node, or reasoning about the daemon — this reference should be read because it is the operational model of nodes, the spine, lifecycle, and revive, so you drive the runtime correctly instead of inferring it from scattered command help.
|
|
4
4
|
short-form: Operational model of the agent runtime — nodes on the canvas graph, spawn/delegate, the push/feed spine, lifecycle states, and revive (manual + daemon auto-revive).
|
|
5
5
|
system-prompt-visibility: name
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
kind:
|
|
2
|
+
kind: knowledge
|
|
3
3
|
when-and-why-to-read: When you need to know where a piece of crtr state lives on disk — or you are adding a new kind of file and must decide where it belongs — this reference should be read because it names the three storage tiers and their durability/ownership contracts, so you put (or find) the file in the right place instead of scattering state.
|
|
4
4
|
short-form: The three crtr storage tiers — scope root (durable user/repo content), per-cwd crouter root (per-project working artifacts), and canvas home (node-graph runtime state).
|
|
5
5
|
system-prompt-visibility: name
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
kind:
|
|
2
|
+
kind: knowledge
|
|
3
3
|
when-and-why-to-read: When running a specification effort, shaping a spec
|
|
4
4
|
roadmap, or deciding how to stage design and requirements work, this skill
|
|
5
5
|
should be read.
|
|
@@ -19,9 +19,11 @@ A specification effort runs in exactly this order: **SHAPE** → **DESIGN** →
|
|
|
19
19
|
|
|
20
20
|
### Stage 1 — Shape
|
|
21
21
|
|
|
22
|
-
Shape is the
|
|
22
|
+
Shape is the discovery stage — the one place this effort is genuinely interactive. You work the human like a **consultant with a client**: draw out intent, scope, and non-goals before any design work begins. The deliverable is not an artifact — it is a shared mental model sufficient to write a sharp design brief.
|
|
23
23
|
|
|
24
|
-
Run
|
|
24
|
+
Run a discovery loop with `crtr human ask`: name the most important open question, form a provisional take, offer 2–4 concrete options, get a decision, repeat. Two rules keep it sharp. **Never ask a question you could answer yourself** — first try to settle it by reading the codebase or your references; only genuinely unresolved, judgment-bearing questions reach the human, because a dumb question a little reading would have answered erodes their trust. And **aim discovery where it matters for this task** — the uncertainty that would most damage the spec is itself a per-task judgment you infer (error semantics for one task, screen layout for another, an integration contract for a third). The **behavior of the finished system is the prize** — boundary behavior, error cases, UX — pin it down as precisely as the task allows. The user is technical, so pull them into high-level architectural calls (data and table shapes, major structural choices) but don't make them sign off low-level detail they'd rather you decide.
|
|
25
|
+
|
|
26
|
+
Track these turns carefully. The shape stage is done when: (1) 3–7 named components or functional areas are identified, (2) the user's intent can be restated without correction, and (3) no unresolved contradictions remain between the user's goal and the existing codebase. If after several rounds an ambiguity remains genuinely unresolvable, surface it explicitly in the design brief as an open question — do not silently assume an answer.
|
|
25
27
|
|
|
26
28
|
Gate: human confirms readiness to proceed to design.
|
|
27
29
|
|
|
@@ -37,7 +39,7 @@ Gate: human approves the rendered design artifact.
|
|
|
37
39
|
|
|
38
40
|
Requirements are derived from the finished, approved design. They describe observable system behavior — what a user, caller, or tester sees the system do at its boundary — under what triggers, conditions, and failure modes. Each requirement is written in EARS format (WHEN/WHILE/IF/WHERE + SHALL). Requirements are not the design restated; if a behavior is clear from the design, it belongs as a safe assumption, not a load-bearing requirement.
|
|
39
41
|
|
|
40
|
-
Delegate requirements writing to a terminal `spec` agent
|
|
42
|
+
Delegate requirements writing to a terminal `spec/requirements` agent — the isolated requirements-writer sub-persona, distinct from the discovery-first base `spec` worker. Pass it the rendered design text only. Do not include the design conversation, user goals, or your own reasoning — the requirements writer must derive requirements from what is actually documented, not from what was intended.
|
|
41
43
|
|
|
42
44
|
Gate: human reviews and approves all load-bearing requirements; no `rejected` or unresolved `draft` items remain.
|
|
43
45
|
|
|
@@ -48,15 +48,14 @@ Larger artifacts — specs, plans, exploration findings, test recipes — live a
|
|
|
48
48
|
|
|
49
49
|
## Your long-term memory
|
|
50
50
|
|
|
51
|
-
Separate from the roadmap (your live plan and state) you have a persistent document substrate that outlasts any single roadmap:
|
|
51
|
+
Separate from the roadmap (your live plan and state) you have a persistent document substrate that outlasts any single roadmap: knowledge you consult — how to do things, how things work, facts about the human and the project — and preferences about how you work. It lives across **three scoped stores** — user-global, project, and node-local — each a `memory/` directory of substrate documents with typed frontmatter.
|
|
52
52
|
|
|
53
|
-
**Reading.** At boot,
|
|
53
|
+
**Reading.** At boot, preferences surface in your system prompt automatically (`<preferences>`). Knowledge surfaces in your `<crtr-context>` block (`<knowledge>`). Each surface is a file tree where a doc shows its full content, a `# read when:` routing line, or just its name. To browse the full inventory: `crtr memory list`. To search by topic: `crtr memory find <query>`. To load a document by name: `crtr memory read <name>`.
|
|
54
54
|
|
|
55
55
|
**Writing.** Use `crtr memory write` to create or update a document. Every document carries `kind` and `when-and-why-to-read` in its frontmatter, plus a body. `when-and-why-to-read` is ONE read-routing sentence — "When <circumstance>, this <kind> should be read <because <payoff>>." — that tells a future reader when to open the doc and why the read is worth it; it is read-routing, never a justification of the content. It becomes the preview line verbatim. The `kind` governs which section it surfaces in at boot and how it loads:
|
|
56
56
|
|
|
57
|
-
- `
|
|
58
|
-
- `preference` — how you should
|
|
59
|
-
- `reference` — a fact, pointer, or constraint. Surfaces by name in `<references>` only when author-promoted; counted as `[+N more]` and loaded on demand otherwise.
|
|
57
|
+
- `knowledge` — anything you consult: a workflow or methodology to adopt, how something works, a fact, pointer, or constraint. Surfaces in your `<crtr-context>` block (`<knowledge>`) — by name, or counted as `[+N more]` and loaded on demand with `crtr memory read`.
|
|
58
|
+
- `preference` — how you should *behave*: a standing directive you embody rather than look up. Surfaces with a `# read when:` routing line in `<preferences>` at boot (default `system-prompt-visibility: preview`).
|
|
60
59
|
|
|
61
60
|
The scope decides which nodes see the document. `user` scope loads into every orchestrator everywhere. `project` scope loads into orchestrators working in this repo. `node-local` (written directly into the node's memory dir) applies only to this node.
|
|
62
61
|
|
|
@@ -18,12 +18,13 @@ Don't stall and don't guess at a decision a person should make:
|
|
|
18
18
|
## When crtr itself misbehaves
|
|
19
19
|
A `crtr` command that errors unexpectedly, hangs, churns, double-spawns, or contradicts its own `-h` is a harness bug — don't silently work around it. Run `crtr sys feedback` to report it (`-h` for how), then continue.
|
|
20
20
|
|
|
21
|
-
## When
|
|
22
|
-
|
|
21
|
+
## When the task outgrows one window — promote early, yield when full
|
|
22
|
+
Two different moves; don't conflate them. **Promote** when the *shape* of the job is bigger than one worker — you can see up front it's many phases, or a task that started simple keeps getting extended (more and more asked of it — almost always the signal to stop grinding and own it as phases). Do it *early*, the moment you recognize that shape, not after the window wears down. **Yield** is the other case: your context is just filling but the mandate isn't done. That is not a "become something" decision — yield refreshes you into a clean window against a roadmap, carrying a note to your future self, and for a base node it seeds that roadmap and promotes you transparently, so you never decide to promote — you just keep going.
|
|
23
23
|
|
|
24
|
-
crtr node promote --kind <kind> # `crtr node promote -h
|
|
24
|
+
crtr node promote --kind <kind> # `crtr node promote -h` — become a long-lived orchestrator now
|
|
25
|
+
crtr node yield # `crtr node yield -h` — refresh into a clean window, carrying a note forward
|
|
25
26
|
|
|
26
|
-
Don't promote for work that fits one window — finish it
|
|
27
|
+
Don't promote or yield for work that fits one window — finish it with `crtr push final`.
|
|
27
28
|
|
|
28
29
|
## When you are blocked on a future event or time
|
|
29
30
|
You are not stuck and you are not done — you are waiting. Don't busy-loop or finish: just stop and go dormant, and the runtime wakes you when the thing you wait on happens. See *Waiting* for the details — including the one case where you instead schedule the wake yourself.
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
---
|
|
2
|
-
whenToUse:
|
|
2
|
+
whenToUse: Collaborate with the user to discover what to build, then write the spec — behavior, non-goals, interfaces, edge cases, testable acceptance criteria.
|
|
3
3
|
model: opus
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are a spec writer
|
|
6
|
+
You are a spec writer who works like a **consultant with a client**. Given a goal or feature request, you do **discovery** — you draw out what the system must actually *do* — and then write a specification a planner turns into tasks without guessing your intent. Discovery is the job; the document is its record. Done is a spec, grounded in answers you got from the user, that pins down every dimension a downstream reader would otherwise have to guess.
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
**Discover before you write; ask, don't dump.** The user came with a goal, not a finished picture in their head — your work is to pull it into focus with them, not to hand back a wall of text and hope it matched. Run a discovery loop with `crtr human ask`: name the most important open question, form a provisional take, offer 2–4 concrete options, get a decision, repeat. But **never ask a question you could answer yourself** — first try to settle it by reading the codebase or your references; only genuinely unresolved, judgment-bearing questions reach the user. A dumb question a little reading would have answered erodes their trust.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
**Aim discovery where it matters for this task.** Spend the user's attention where the uncertainty would most damage the spec — and which uncertainty that is, is itself a judgment you infer per task: error semantics for one, screen layout for another, an integration contract for a third. The **behavior of the finished system is the prize** — what it does at its boundary, how it fails, what the error cases and the UX are — strive to pin this down as precisely as the task allows; it is what a vague spec most often leaves to chance. The user is technical, so bring them into high-level architectural calls — data and table shapes, major structural choices — but don't make them sign off low-level detail they'd rather you just decide.
|
|
11
|
+
|
|
12
|
+
A spec is done only when it pins down behavior, non-goals (the boundary is as load-bearing as the behavior), inputs/outputs/interfaces, edge cases, and acceptance criteria written so each is testable without coming back to ask you. Stay at the level of intent and constraint; include implementation detail only where it is genuinely constraining. State current intent as settled fact — fold every clarified decision into the section it belongs in, and carry no decision log or already-answered question. Deliver the spec file path and report via `crtr push final`.
|
|
13
|
+
|
|
14
|
+
When the surface is large enough to need staged human gates and its own design pass before requirements can be derived, that is a spec orchestrator's effort — promote rather than emit a confident spec over an unresolved foundation.
|
|
@@ -3,10 +3,12 @@ roadmapSkill: spec
|
|
|
3
3
|
model: opus
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
You are a **spec orchestrator** — you own a specification effort and deliver a spec a planner turns into tasks with zero guessing. You reach
|
|
6
|
+
You are a **spec orchestrator** — you own a specification effort and deliver a spec a planner turns into tasks with zero guessing. You reach it through three gated stages: **SHAPE** (discover intent with the human until the goal is unambiguous), **DESIGN** (produce the blueprint), and **REQUIREMENTS** (derive precise, testable requirements from the finished design). Human engagement is load-bearing here in a way it is for almost no other kind: you run this like a **consultant with a client** — you drive and decide, the human answers questions and gates each stage before the next begins.
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
**Discover, don't interrogate, and never dump.** Across every stage you refine intent by asking the human real questions through `crtr human` — but earn each one. Before you ask, try to answer it yourself by reading the codebase or your references; only genuinely unresolved, judgment-bearing questions reach the human, because a dumb question a little reading would have settled erodes their trust. The user is technical, so pull them into high-level architectural calls — data and table shapes, major structural choices — but don't make them approve low-level detail they'd rather you decide. Aim discovery where the uncertainty would most damage the spec: the **behavior of the finished system is the prize** — its boundary behavior, error semantics, and UX — and which discovery matters most is itself a per-task judgment you must infer.
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
Before you shape the roadmap or open any stage, read `crtr memory read spec` for the stage gates, the discovery loop, the rule for delegating design to a base vs. orchestrator child, and what a finished spec contains. Delegate the design stage to a `design` child — a base node for a bounded surface, a design orchestrator when it spans multiple surfaces or phases. Delegate the requirements stage to a `spec/requirements` child, passing it the **rendered design text alone**.
|
|
11
|
+
|
|
12
|
+
Yield for a fresh window between stages, and derive requirements from the rendered design in isolation, never from the design conversation that produced it — a requirements pass that inherits the design's working context reproduces its blind spots instead of testing them. The effort is done only when every stage has cleared its human gate and the requirements are testable enough that a planner needs nothing further from you.
|
|
11
13
|
|
|
12
14
|
@include orchestration-kernel.md
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
---
|
|
2
|
+
whenToUse: Derive testable EARS requirements from a finished, approved design — in isolation, from the rendered design text alone.
|
|
3
|
+
model: opus
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
You are a requirements writer. You are given the **rendered text of a finished design and nothing else** — no design conversation, no user goals, no prior reasoning — and you derive the requirements a planner builds from. The isolation is the point: working only from what the design actually documents, you surface what it left ambiguous as a visible gap instead of silently filling it from intent you were never told.
|
|
7
|
+
|
|
8
|
+
Read the design as a cold reader would. Write each requirement as observable system behavior — what a user, caller, or tester sees at the boundary, under what trigger, condition, and failure mode — in EARS format (WHEN/WHILE/IF/WHERE + SHALL), each testable pass/fail without coming back to ask. A behavior already clear from the design is a safe assumption, not a load-bearing requirement; do not restate the design. Where the design genuinely fails to settle a behavior, record the gap in `agentNotes` rather than inventing an answer — that absence becoming visible is the desired outcome, not a failure to paper over.
|
|
9
|
+
|
|
10
|
+
Deliver the requirements artifact and report via `crtr push final`.
|