stable-harness 0.0.7 → 0.0.9

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 (39) hide show
  1. package/README.md +10 -0
  2. package/docs/0.1.0-p0-runtime-control-plane-plan.zh.md +171 -0
  3. package/docs/0.1.0-retry-policy.zh.md +87 -0
  4. package/docs/0.1.0-stable-runtime-development-roadmap.zh.md +393 -0
  5. package/docs/0.1.0-tool-guard-benchmark.zh.md +42 -0
  6. package/docs/adapter-contract.md +199 -0
  7. package/docs/architecture/backend-comparison.md +41 -0
  8. package/docs/architecture/runtime-events.md +263 -0
  9. package/docs/architecture/runtime-events.zh.md +248 -0
  10. package/docs/architecture/system-architecture.zh.md +435 -0
  11. package/docs/compatibility-matrix.md +139 -0
  12. package/docs/engineering-rules.md +111 -0
  13. package/docs/evaluation/0.1.0-bfcl-targeted-model-matrix.zh.md +1632 -0
  14. package/docs/evaluation/0.1.0-bfcl-targeted-review-matrix.zh.md +1952 -0
  15. package/docs/evaluation/0.1.0-bfcl-tool-guard.zh.md +1427 -0
  16. package/docs/granite-tool-calling-comparison.zh.md +206 -0
  17. package/docs/guides/getting-started.md +126 -0
  18. package/docs/guides/index.md +40 -0
  19. package/docs/guides/integration-guide.md +126 -0
  20. package/docs/guides/operator-runbook.md +153 -0
  21. package/docs/guides/workspace-authoring.md +212 -0
  22. package/docs/implementation-blueprint.md +233 -0
  23. package/docs/memory/0.1.0-memory-design.zh.md +719 -0
  24. package/docs/memory/0.1.0-step-09-deepagents-native-memory.zh.md +146 -0
  25. package/docs/memory/0.1.0-step-09-langmem-shaped-provider.zh.md +169 -0
  26. package/docs/memory/0.1.0-step-09-memory-adapter-projection.zh.md +123 -0
  27. package/docs/memory/0.1.0-step-09-memory-contract.zh.md +169 -0
  28. package/docs/memory/0.1.0-step-09-memory-governance-approval.zh.md +143 -0
  29. package/docs/memory/0.1.0-step-09-memory-lifecycle-hooks.zh.md +150 -0
  30. package/docs/memory/0.1.0-step-09-memory-maintenance-boundary.zh.md +118 -0
  31. package/docs/memory/0.1.0-step-09-memory-persistence-boundary.zh.md +118 -0
  32. package/docs/product/adoption-playbook.md +145 -0
  33. package/docs/product/market-positioning.md +137 -0
  34. package/docs/product-boundary.md +258 -0
  35. package/docs/protocols/http-runtime.md +37 -0
  36. package/docs/protocols/langgraph-compatible.md +107 -0
  37. package/docs/protocols/openai-compatible.md +121 -0
  38. package/docs/tooling/0.1.0-bettercall-tool-quality.zh.md +231 -0
  39. package/package.json +3 -1
@@ -0,0 +1,143 @@
1
+ # 0.1.0 Step 09.4 Memory Governance And Approval
2
+
3
+ ## 目标
4
+
5
+ 本步骤把 memory policy 的 `review` 决策接入 governance approval queue。模型和上游 agent 仍只能提出 memory candidate,runtime policy 决定是否存储、拒绝或进入审批。
6
+
7
+ ## 新增 Interface
8
+
9
+ ```text
10
+ @stable-harness/governance
11
+ ├─ ApprovalRequest
12
+ │ ├─ id
13
+ │ ├─ kind: tool_invocation | memory_write
14
+ │ ├─ reason
15
+ │ ├─ status: pending | approved | rejected
16
+ │ ├─ requestId / sessionId / agentId
17
+ │ ├─ subject
18
+ │ ├─ createdAt
19
+ │ └─ resolvedAt
20
+
21
+ └─ ApprovalQueue
22
+ ├─ create(input)
23
+ ├─ list(status?)
24
+ └─ resolve(id, status)
25
+ ```
26
+
27
+ core runtime 新增:
28
+
29
+ ```text
30
+ createStableHarnessRuntime
31
+ └─ approvals?: ApprovalQueue
32
+
33
+ RuntimeEvent
34
+ └─ runtime.memory.approval.requested
35
+ ```
36
+
37
+ ## 行为
38
+
39
+ 当 `RuntimeMemoryStore.submitCandidate()` 返回:
40
+
41
+ ```text
42
+ decision.action === "review"
43
+ ```
44
+
45
+ 并且 runtime 配置了 `approvals` queue 时,core runtime 会创建:
46
+
47
+ ```text
48
+ ApprovalRequest.kind = memory_write
49
+ ApprovalRequest.status = pending
50
+ ApprovalRequest.subject = { candidate, decision }
51
+ ```
52
+
53
+ 随后发出:
54
+
55
+ ```text
56
+ runtime.memory.approval.requested
57
+ ```
58
+
59
+ ## Sequence Diagram
60
+
61
+ ```mermaid
62
+ sequenceDiagram
63
+ participant Runtime
64
+ participant Memory as RuntimeMemoryStore
65
+ participant Policy as MemoryPolicy
66
+ participant Approvals as ApprovalQueue
67
+
68
+ Runtime->>Memory: submitCandidate(candidate)
69
+ Memory->>Policy: decide(candidate)
70
+ Policy-->>Memory: decision(review)
71
+ Memory-->>Runtime: candidate + decision
72
+ Runtime->>Runtime: emit runtime.memory.candidate.submitted
73
+ Runtime->>Approvals: create(memory_write)
74
+ Approvals-->>Runtime: ApprovalRequest(pending)
75
+ Runtime->>Runtime: emit runtime.memory.approval.requested
76
+ ```
77
+
78
+ ## Flow Chart
79
+
80
+ ```mermaid
81
+ flowchart TD
82
+ A["MemoryCandidate"] --> B["MemoryPolicy decision"]
83
+ B --> C{"decision.action"}
84
+ C -->|store| D["Create MemoryRecord"]
85
+ C -->|reject| E["Audit rejection"]
86
+ C -->|review| F{"ApprovalQueue configured?"}
87
+ F -->|no| G["Emit candidate submitted only"]
88
+ F -->|yes| H["Create pending memory_write approval"]
89
+ H --> I["Emit runtime.memory.approval.requested"]
90
+ ```
91
+
92
+ ## 边界
93
+
94
+ 不做:
95
+
96
+ - 不自动 approve memory。
97
+ - 不在 approval 通过前写入 sensitive/restricted durable memory。
98
+ - 不把 approval queue 变成 tool execution framework。
99
+ - 不添加任何下游业务规则。
100
+
101
+ ## Verification
102
+
103
+ 本步骤新增测试覆盖:
104
+
105
+ - restricted memory candidate 进入 `review`。
106
+ - runtime 创建 `memory_write` approval request。
107
+ - approval request 状态为 `pending`。
108
+ - runtime 发出 `runtime.memory.approval.requested` event。
109
+
110
+ 验证命令:
111
+
112
+ ```text
113
+ npm run check
114
+ npm run check:rules
115
+ npm test
116
+ ```
117
+
118
+ ## 下游验证
119
+
120
+ 本步骤已完成 EasyNet 真实验证:
121
+
122
+ ```text
123
+ cd /Users/boqiangliang/project/easynet
124
+ npm test
125
+ npm run test:botbotgo:full
126
+ ```
127
+
128
+ 真实验证结果:
129
+
130
+ - `npm test` 通过:18 个 contract tests,7 个 real integration tests。
131
+ - `test:botbotgo:full` 通过:8/8 matrix cases。
132
+ - full matrix 明确使用 EasyNet package-local `node_modules/.bin/botbotgo`。
133
+ - 真实模型路径为 EasyNet 配置的远端 Ollama `granite4.1:3b`。
134
+ - 覆盖 owner:orchestra、software、qa、ops、release、research、secretary、k8s。
135
+ - 覆盖真实工具/数据路径:finance stock report、source analysis、disk investigation、Git/GitHub Actions、Kubernetes readonly investigation、CLI routing。
136
+
137
+ ## 下一步
138
+
139
+ 下一步是 `Step 09.5 Memory Persistence Boundary`:
140
+
141
+ - 定义 durable store adapter interface。
142
+ - 保持 in-memory store 为测试实现。
143
+ - 不把 vector index 作为 source of truth。
@@ -0,0 +1,150 @@
1
+ # 0.1.0 Step 09.2 Memory Lifecycle Hooks
2
+
3
+ ## 目标
4
+
5
+ 本步骤把长期记忆从独立 store contract 接入 core runtime lifecycle。接入方式是可选的、typed 的、显式的,不改变 DeepAgents 或其他上游 backend 的执行语义。
6
+
7
+ 核心原则:
8
+
9
+ - 没有传入 `memory` store 时,runtime 行为和事件序列保持不变。
10
+ - 有 `memory` store 时,runtime 可以执行 recall 和 candidate submission。
11
+ - recall 结果只作为 runtime event 输出,不自动注入 adapter prompt。
12
+ - durable memory 写入必须来自显式 `request.memory.candidates`,runtime 不从模型输出里猜测要记什么。
13
+ - policy 决策仍由 `@stable-harness/memory` 负责。
14
+
15
+ ## 新增 Interface
16
+
17
+ ```text
18
+ createStableHarnessRuntime
19
+ └─ memory?: RuntimeMemoryStore
20
+
21
+ RuntimeRequest
22
+ └─ memory?: RuntimeRequestMemory
23
+ ├─ namespace?
24
+ ├─ recall?: false | { query?, limit? }
25
+ └─ candidates?: RuntimeMemoryCandidateInput[]
26
+
27
+ RuntimeEvent
28
+ ├─ runtime.memory.lifecycle
29
+ ├─ runtime.memory.recall.completed
30
+ └─ runtime.memory.candidate.submitted
31
+ ```
32
+
33
+ ## Lifecycle Hooks
34
+
35
+ 当前实现三个 hook:
36
+
37
+ ```text
38
+ read-before-plan
39
+ read-before-finalize
40
+ write-after-run
41
+ ```
42
+
43
+ 语义如下:
44
+
45
+ - `read-before-plan`:runtime 准备执行 adapter 前进行 recall。
46
+ - `read-before-finalize`:adapter 返回后、request completed 前发出 finalize 生命周期事件。
47
+ - `write-after-run`:只在 request 显式携带 memory candidates 时提交候选。
48
+
49
+ ## Sequence Diagram
50
+
51
+ ```mermaid
52
+ sequenceDiagram
53
+ participant Client
54
+ participant Runtime
55
+ participant Memory as RuntimeMemoryStore
56
+ participant Adapter as Backend Adapter
57
+
58
+ Client->>Runtime: request(input, memory config)
59
+ Runtime->>Runtime: emit runtime.request.started
60
+ Runtime->>Runtime: emit runtime.memory.lifecycle(read-before-plan)
61
+ Runtime->>Memory: recall(namespace, query)
62
+ Memory-->>Runtime: records + compressed context
63
+ Runtime->>Runtime: emit runtime.memory.recall.completed
64
+ Runtime->>Adapter: run(request)
65
+ Adapter-->>Runtime: output
66
+ Runtime->>Runtime: emit runtime.memory.lifecycle(read-before-finalize)
67
+ alt explicit candidates provided
68
+ Runtime->>Runtime: emit runtime.memory.lifecycle(write-after-run)
69
+ Runtime->>Memory: submitCandidate(candidate)
70
+ Memory-->>Runtime: decision + optional record
71
+ Runtime->>Runtime: emit runtime.memory.candidate.submitted
72
+ end
73
+ Runtime->>Runtime: emit runtime.request.completed
74
+ Runtime-->>Client: response
75
+ ```
76
+
77
+ ## Flow Chart
78
+
79
+ ```mermaid
80
+ flowchart TD
81
+ A["Runtime request"] --> B{"memory store configured?"}
82
+ B -->|no| C["Run adapter normally"]
83
+ B -->|yes| D["Emit read-before-plan"]
84
+ D --> E{"request.memory.recall is false?"}
85
+ E -->|yes| C
86
+ E -->|no| F["Recall by namespace and query"]
87
+ F --> G["Emit runtime.memory.recall.completed"]
88
+ G --> C
89
+ C --> H["Adapter output"]
90
+ H --> I["Emit read-before-finalize"]
91
+ I --> J{"explicit candidates?"}
92
+ J -->|no| K["runtime.request.completed"]
93
+ J -->|yes| L["Emit write-after-run"]
94
+ L --> M["submitCandidate through policy"]
95
+ M --> N["Emit runtime.memory.candidate.submitted"]
96
+ N --> K
97
+ ```
98
+
99
+ ## 为什么不自动注入 Adapter
100
+
101
+ 自动把 recall context 注入 prompt 会让 `stable-harness` 开始参与 agent execution semantics。这个责任属于上游 backend adapter,例如 DeepAgents、OpenAI Agents SDK 或 Gemini SDK。
102
+
103
+ 正确边界是:
104
+
105
+ - core runtime 负责 lifecycle、events、policy、store、audit。
106
+ - adapter 负责把 runtime memory projection 翻译为上游框架认可的输入。
107
+ - workspace config 或 request metadata 明确决定是否启用 projection。
108
+
109
+ ## Verification
110
+
111
+ 本步骤新增测试覆盖:
112
+
113
+ - 有 memory store 时发出 lifecycle events。
114
+ - recall 事件包含 record id 和 compressed context。
115
+ - adapter 输入和输出不被 memory recall 改写。
116
+ - sensitive candidate 进入 `review`,不直接生成 record。
117
+
118
+ 本步骤验证命令:
119
+
120
+ ```text
121
+ npm run check
122
+ npm run check:rules
123
+ npm test
124
+ ```
125
+
126
+ 下游 EasyNet 已完成真实验证:
127
+
128
+ ```text
129
+ cd /Users/boqiangliang/project/easynet
130
+ npm test
131
+ npm run test:botbotgo:full
132
+ ```
133
+
134
+ 真实验证结果:
135
+
136
+ - `npm test` 通过:18 个 contract tests,7 个 real integration tests。
137
+ - `test:botbotgo:full` 通过:8/8 matrix cases。
138
+ - full matrix 明确使用 EasyNet package-local `node_modules/.bin/botbotgo`。
139
+ - 真实模型路径为 EasyNet 配置的远端 Ollama `granite4.1:3b`。
140
+ - 覆盖 owner:orchestra、software、qa、ops、release、research、secretary、k8s。
141
+ - 覆盖真实工具/数据路径:finance stock report、source analysis、disk investigation、Git/GitHub Actions、Kubernetes readonly investigation、CLI routing。
142
+
143
+ ## 下一步
144
+
145
+ 下一步是 `Step 09.3 Memory Adapter Projection`:
146
+
147
+ - DeepAgents adapter 读取 runtime memory projection。
148
+ - projection 必须由 typed config 显式启用。
149
+ - 可投影为 DeepAgents `memory?: string[]` 或 middleware input。
150
+ - 不把 DeepAgents `/memories/` 暴露为 stable-harness public API。
@@ -0,0 +1,118 @@
1
+ # 0.1.0 Step 09.6 Memory Maintenance Boundary
2
+
3
+ ## 目标
4
+
5
+ 本步骤定义 memory maintenance boundary。维护动作必须是显式 typed operation,不能由 runtime 根据自然语言关键词、业务领域或下游场景自动推断。
6
+
7
+ ## 新增 Interface
8
+
9
+ ```text
10
+ @stable-harness/memory
11
+ ├─ MemoryMaintenanceAction
12
+ │ ├─ mark_stale
13
+ │ ├─ archive
14
+ │ ├─ refresh
15
+ │ └─ supersede
16
+
17
+ ├─ MemoryMaintenanceOperation
18
+ │ ├─ action
19
+ │ ├─ recordId
20
+ │ ├─ reason
21
+ │ └─ replacementRecordId?
22
+
23
+ ├─ MemoryMaintenanceResult
24
+ │ ├─ operation
25
+ │ ├─ record?
26
+ │ ├─ applied
27
+ │ └─ reason
28
+
29
+ └─ applyMemoryMaintenance(store, operations)
30
+ ```
31
+
32
+ ## 行为
33
+
34
+ - `mark_stale`:把 record 标记为 `stale`。
35
+ - `refresh`:把 record 标记为 `active` 并更新确认时间。
36
+ - `archive`:把 record 标记为 `archived`。
37
+ - `supersede`:把旧 record 标记为 `archived`,并记录 `supersededBy`。
38
+
39
+ ## 边界
40
+
41
+ 做:
42
+
43
+ - 只执行调用方提交的 typed operations。
44
+ - 操作结果返回 `applied` 和 reason。
45
+ - 维护动作通过现有 store `update/archive` 执行。
46
+
47
+ 不做:
48
+
49
+ - 不自动判断哪些 memory 过期。
50
+ - 不按业务关键词合并或删除。
51
+ - 不读取下游 agent prompt 来决定维护动作。
52
+ - 不把维护逻辑变成另一个 planner。
53
+
54
+ ## Sequence Diagram
55
+
56
+ ```mermaid
57
+ sequenceDiagram
58
+ participant Operator
59
+ participant Maintenance as applyMemoryMaintenance
60
+ participant Store as RuntimeMemoryStore
61
+
62
+ Operator->>Maintenance: MemoryMaintenanceOperation[]
63
+ loop each operation
64
+ Maintenance->>Store: update/archive(recordId)
65
+ Store-->>Maintenance: MemoryRecord?
66
+ end
67
+ Maintenance-->>Operator: MemoryMaintenanceResult[]
68
+ ```
69
+
70
+ ## Flow Chart
71
+
72
+ ```mermaid
73
+ flowchart TD
74
+ A["Typed maintenance operation"] --> B{"action"}
75
+ B -->|mark_stale| C["update status stale"]
76
+ B -->|refresh| D["update status active"]
77
+ B -->|archive| E["archive record"]
78
+ B -->|supersede| F["archive old record with supersededBy"]
79
+ C --> G["MemoryMaintenanceResult"]
80
+ D --> G
81
+ E --> G
82
+ F --> G
83
+ ```
84
+
85
+ ## Verification
86
+
87
+ 本步骤新增测试覆盖:
88
+
89
+ - `mark_stale` 把 record 置为 `stale`。
90
+ - `refresh` 把 record 恢复为 `active`。
91
+ - `archive` 把 record 置为 `archived`。
92
+
93
+ 验证命令:
94
+
95
+ ```text
96
+ npm run check
97
+ npm run check:rules
98
+ npm test
99
+ ```
100
+
101
+ ## 下游验证
102
+
103
+ 本步骤已完成 EasyNet 真实验证:
104
+
105
+ ```text
106
+ cd /Users/boqiangliang/project/easynet
107
+ npm test
108
+ npm run test:botbotgo:full
109
+ ```
110
+
111
+ 真实验证结果:
112
+
113
+ - `npm test` 通过:18 个 contract tests,7 个 real integration tests。
114
+ - `test:botbotgo:full` 通过:8/8 matrix cases。
115
+ - full matrix 明确使用 EasyNet package-local `node_modules/.bin/botbotgo`。
116
+ - 真实模型路径为 EasyNet 配置的远端 Ollama `granite4.1:3b`。
117
+ - 覆盖 owner:orchestra、software、qa、ops、release、research、secretary、k8s。
118
+ - 覆盖真实工具/数据路径:finance stock report、source analysis、disk investigation、Git/GitHub Actions、Kubernetes readonly investigation、CLI routing。
@@ -0,0 +1,118 @@
1
+ # 0.1.0 Step 09.5 Memory Persistence Boundary
2
+
3
+ ## 目标
4
+
5
+ 本步骤定义 memory persistence boundary。它只负责 durable records 的保存和恢复,不定义数据库选型,不把 vector index 当作 source of truth。
6
+
7
+ ## 新增 Interface
8
+
9
+ ```text
10
+ @stable-harness/memory
11
+ ├─ MemoryStoreSnapshot
12
+ │ ├─ namespace
13
+ │ ├─ records
14
+ │ └─ exportedAt
15
+
16
+ ├─ MemoryPersistenceAdapter
17
+ │ ├─ load(namespace)
18
+ │ └─ save(snapshot)
19
+
20
+ ├─ createMemorySnapshot(store, filter)
21
+ └─ createInMemoryMemoryPersistenceAdapter()
22
+ ```
23
+
24
+ `createInMemoryRuntimeMemoryStore` 新增:
25
+
26
+ ```text
27
+ records?: MemoryRecord[]
28
+ ```
29
+
30
+ 用于从 persistence adapter load 出来的 records hydrate 一个新的 runtime memory store。
31
+
32
+ ## 边界
33
+
34
+ 做:
35
+
36
+ - structured `MemoryRecord` 是 source of truth。
37
+ - persistence adapter 只保存和恢复 records。
38
+ - snapshot 带 namespace 和 exportedAt。
39
+ - in-memory persistence adapter 只用于测试和本地开发。
40
+
41
+ 不做:
42
+
43
+ - 不实现 SQLite/Qdrant/LibSQL 具体后端。
44
+ - 不把 vector store 作为主存储。
45
+ - 不让 persistence adapter 参与 recall ranking。
46
+ - 不让 persistence adapter 改写 memory policy。
47
+
48
+ ## Sequence Diagram
49
+
50
+ ```mermaid
51
+ sequenceDiagram
52
+ participant Store as RuntimeMemoryStore
53
+ participant Snapshot as createMemorySnapshot
54
+ participant Adapter as MemoryPersistenceAdapter
55
+ participant NewStore as Hydrated Store
56
+
57
+ Store->>Snapshot: list(namespace filter)
58
+ Snapshot-->>Adapter: MemoryStoreSnapshot
59
+ Adapter->>Adapter: save(snapshot)
60
+ Adapter-->>NewStore: load(namespace)
61
+ NewStore->>NewStore: hydrate records
62
+ ```
63
+
64
+ ## Flow Chart
65
+
66
+ ```mermaid
67
+ flowchart TD
68
+ A["RuntimeMemoryStore records"] --> B["createMemorySnapshot"]
69
+ B --> C["MemoryStoreSnapshot"]
70
+ C --> D["MemoryPersistenceAdapter.save"]
71
+ D --> E["MemoryPersistenceAdapter.load"]
72
+ E --> F["createInMemoryRuntimeMemoryStore records"]
73
+ F --> G["recall/list/update/archive"]
74
+ ```
75
+
76
+ ## Verification
77
+
78
+ 本步骤新增测试覆盖:
79
+
80
+ - store 导出 snapshot。
81
+ - persistence adapter 保存 snapshot。
82
+ - 新的 in-memory store 从 loaded records hydrate。
83
+ - hydrated store 可以 recall 原记录。
84
+
85
+ 验证命令:
86
+
87
+ ```text
88
+ npm run check
89
+ npm run check:rules
90
+ npm test
91
+ ```
92
+
93
+ ## 下游验证
94
+
95
+ 本步骤已完成 EasyNet 真实验证:
96
+
97
+ ```text
98
+ cd /Users/boqiangliang/project/easynet
99
+ npm test
100
+ npm run test:botbotgo:full
101
+ ```
102
+
103
+ 真实验证结果:
104
+
105
+ - `npm test` 通过:18 个 contract tests,7 个 real integration tests。
106
+ - `test:botbotgo:full` 通过:8/8 matrix cases。
107
+ - full matrix 明确使用 EasyNet package-local `node_modules/.bin/botbotgo`。
108
+ - 真实模型路径为 EasyNet 配置的远端 Ollama `granite4.1:3b`。
109
+ - 覆盖 owner:orchestra、software、qa、ops、release、research、secretary、k8s。
110
+ - 覆盖真实工具/数据路径:finance stock report、source analysis、disk investigation、Git/GitHub Actions、Kubernetes readonly investigation、CLI routing。
111
+
112
+ ## 下一步
113
+
114
+ 下一步是 `Step 09.6 Memory Maintenance Boundary`:
115
+
116
+ - 定义 stale/archive/merge/supersede 的维护接口。
117
+ - 维护逻辑必须基于 records 和 policy,不基于业务关键词。
118
+ - 继续避免任何 downstream domain heuristic。
@@ -0,0 +1,145 @@
1
+ # Adoption Playbook
2
+
3
+ Stable Harness adoption should start from a concrete runtime problem, not from a
4
+ claim that teams need another agent framework.
5
+
6
+ The message is simple: keep your chosen agent backend, add a stable runtime
7
+ boundary around it.
8
+
9
+ ## Who Should Try It First
10
+
11
+ Good first users:
12
+
13
+ - teams already building with DeepAgents, LangGraph, or OpenAI-compatible tools
14
+ - teams with a working prototype that lacks sessions, traces, approvals, memory
15
+ lifecycle, protocol access, or repeatable deployment
16
+ - teams evaluating small or private models that need better tool-call reliability
17
+ - platform teams that need a common runtime surface across multiple agent apps
18
+ - product teams that need operator UI around requests, events, artifacts, and
19
+ approvals
20
+
21
+ Poor first users:
22
+
23
+ - teams still deciding whether they need agents at all
24
+ - teams looking for a fully hosted end-user product
25
+ - teams that want Stable Harness to replace their backend framework's planning
26
+ semantics
27
+
28
+ ## Entry Points
29
+
30
+ ### 1. Package Trial
31
+
32
+ Goal: let a user see value in five minutes.
33
+
34
+ ```bash
35
+ npx stable-harness init ./my-agent-app
36
+ stable-harness -w ./my-agent-app
37
+ stable-harness -w ./my-agent-app --agent orchestra --tool echo_tool --tool-args-json '{"value":"hello"}'
38
+ ```
39
+
40
+ This proves installability, workspace shape, and gateway execution without
41
+ requiring a full application migration.
42
+
43
+ ### 2. Existing Agent Wrapper
44
+
45
+ Goal: wrap an existing agent app with runtime lifecycle and inspection.
46
+
47
+ Steps:
48
+
49
+ 1. Create workspace YAML for the current agents, tools, and models.
50
+ 2. Keep backend semantics upstream-native.
51
+ 3. Add direct tool smoke tests through Stable Harness.
52
+ 4. Add event trace display or persistence.
53
+ 5. Expose the same runtime through CLI or OpenAI-compatible protocol.
54
+
55
+ ### 3. Tool Reliability Demo
56
+
57
+ Goal: show why the tool gateway matters.
58
+
59
+ Use a small model and a strict tool schema. Compare raw tool-call behavior with
60
+ Stable Harness gateway behavior. The important evidence is not a single final
61
+ answer; it is the runtime trace showing validation, repair, execution, and the
62
+ bounded policy decision.
63
+
64
+ ### 4. Operator Control Plane Demo
65
+
66
+ Goal: show production value beyond agent execution.
67
+
68
+ Demonstrate:
69
+
70
+ - request IDs and sessions
71
+ - runtime event stream
72
+ - tool traces
73
+ - approvals or policy decisions
74
+ - memory lifecycle hooks
75
+ - OpenAI-compatible access to the same workspace
76
+
77
+ ### 5. Framework-Neutral Platform Pilot
78
+
79
+ Goal: make Stable Harness the shared runtime layer across agent applications.
80
+
81
+ Start with two workspaces that use different backend assumptions. Keep shared
82
+ runtime controls in Stable Harness and keep backend-specific behavior behind
83
+ adapter config.
84
+
85
+ ## Messaging
86
+
87
+ Use this positioning:
88
+
89
+ > Stable Harness is a stable runtime and operator control plane for agent
90
+ > applications. It lets you keep DeepAgents, LangGraph, or another backend while
91
+ > adding YAML inventory, sessions, events, governance, memory lifecycle, tool
92
+ > repair, and protocol access.
93
+
94
+ Avoid this positioning:
95
+
96
+ - "a better agent framework"
97
+ - "a replacement for LangGraph"
98
+ - "automatic agent correctness"
99
+ - "magic tool calling"
100
+
101
+ ## Documentation Funnel
102
+
103
+ For new users:
104
+
105
+ 1. README
106
+ 2. Getting started
107
+ 3. Workspace authoring
108
+ 4. Integration guide
109
+ 5. Operator runbook
110
+
111
+ For technical evaluators:
112
+
113
+ 1. Product boundary
114
+ 2. Compatibility matrix
115
+ 3. Adapter contract
116
+ 4. Protocol docs
117
+ 5. Engineering rules
118
+
119
+ For buyers or internal champions:
120
+
121
+ 1. Adoption playbook
122
+ 2. Market positioning
123
+ 3. Tool reliability evidence
124
+ 4. Operator runbook
125
+ 5. Release evidence
126
+
127
+ ## Proof Points To Publish
128
+
129
+ - npm package install smoke
130
+ - minimal workspace init
131
+ - direct tool-call run
132
+ - OpenAI-compatible facade run
133
+ - small-model tool-call repair examples
134
+ - one real downstream workspace integration
135
+ - runtime trace screenshots or logs
136
+ - compatibility matrix by backend and protocol
137
+
138
+ ## What To Build Next For Adoption
139
+
140
+ - copy-paste examples for common model providers
141
+ - short videos or terminal GIFs for init and tool-call smoke
142
+ - hosted documentation site generated from `docs/`
143
+ - example workspaces for DeepAgents, LangGraph workflow, and OpenAI-compatible
144
+ facade
145
+ - CI template that runs workspace validation and package smoke tests