@mono-agent/agent-app 0.1.0 → 0.2.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/dist/app-config.d.ts +14 -1
- package/dist/app-config.d.ts.map +1 -1
- package/dist/app-config.js +79 -1
- package/dist/app-config.js.map +1 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +5 -3
- package/dist/app.js.map +1 -1
- package/dist/cli.d.ts +11 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +67 -5
- package/dist/cli.js.map +1 -1
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +31 -1
- package/dist/doctor.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/install-skill.d.ts +21 -0
- package/dist/install-skill.d.ts.map +1 -0
- package/dist/install-skill.js +52 -0
- package/dist/install-skill.js.map +1 -0
- package/package.json +16 -15
- package/skills/mono-agent-composer/SKILL.md +82 -0
- package/skills/mono-agent-composer/references/config-blueprint.md +233 -0
- package/skills/mono-agent-composer/references/discovery-questions.md +137 -0
- package/skills/mono-agent-composer/references/feature-coverage.md +80 -0
- package/skills/mono-agent-composer/references/package-map.md +136 -0
- package/skills/mono-agent-composer/references/validation.md +94 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Feature Coverage
|
|
2
|
+
|
|
3
|
+
Every framework capability and how a composed agent reaches it. Use this to answer "can the config do X?" without guessing: `config` = a `mono-agent.config.json` key (env var override always exists), `cli` = a `mono-agent` CLI flag/command, `auto` = always on when the app runs, `code` = programmatic escape hatch only, `dev` = development/test tooling. The repo's `docs/feature-registry.md` is the long-form source of truth.
|
|
4
|
+
|
|
5
|
+
## Runtime
|
|
6
|
+
|
|
7
|
+
| Capability | Coverage | Where |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| Model backends: claude (sdk/cli), codex (cli), pi sdk providers (OpenAI, Copilot, OpenRouter, Ollama, ...) | config | `runtime.model` |
|
|
10
|
+
| Backup models on retryable provider failure | config | `runtime.fallbackModels` |
|
|
11
|
+
| Execution mode (sdk/cli), effort, max turns, workspace | config | `runtime.executionMode`, `runtime.effort`, `runtime.maxTurns`, `runtime.workspace` |
|
|
12
|
+
| Tool-permission posture for CLI backends | config | `runtime.permissionMode` |
|
|
13
|
+
| Reasoning summary verbosity | config | `runtime.reasoningSummary` |
|
|
14
|
+
| Continuous provider sessions with idle eviction | config | `runtime.session.{mode,idleTimeoutMs}` |
|
|
15
|
+
| Local providers (Ollama / LM Studio / OpenAI-compatible) | config | `providers.local[]` |
|
|
16
|
+
| Pi OAuth credentials | config | `providers.piAuthPath` |
|
|
17
|
+
| Context compaction, tool-output bloat guard, cost tracking | auto | built into every run |
|
|
18
|
+
| Structured output (JSON schema), live input steering | code | harness `runtimeOptions` |
|
|
19
|
+
| Tool approval gates (risk tiers, timeouts, always-allow) | code | `createMonoRuntime({ onToolApprovalRequest, ... })` — needs a host UI |
|
|
20
|
+
| OpenAI Agents SDK backend / fully custom runtime | code | `startMonoAgentApp({ runtime })` |
|
|
21
|
+
|
|
22
|
+
## Context, skills, memory
|
|
23
|
+
|
|
24
|
+
| Capability | Coverage | Where |
|
|
25
|
+
| --- | --- | --- |
|
|
26
|
+
| Identity + optional soul documents | config | `context.identityPath`, `context.soulPath` |
|
|
27
|
+
| Selected skills from a skills root | config | `context.skillsRoot`, `context.selectedSkills` |
|
|
28
|
+
| Per-skill byte cap | config | `context.skillMaxBytes` |
|
|
29
|
+
| Conversation history (in-memory, capped) | auto | sized from `runtime.maxTurns`; custom store via code |
|
|
30
|
+
| Markdown memory (single-file / per-conversation, capped) | config | `memory.mode: "markdown"`, `path`, `maxBytes`, `scope` |
|
|
31
|
+
| Journal memory (daily notes always in context) | config | `memory.mode: "journal"`, `path` |
|
|
32
|
+
| Host summaries appended after runs | config | `memory.writeMode: "append-host-summary"` |
|
|
33
|
+
| Entity graph + salience digest in context (journal) | config | automatic; path override `memory.graphPath` |
|
|
34
|
+
| MCP recall tools (`memory_read_day`, `memory_list_days`, `memory_grep`, `memory_search`, `entity_get`) | config | `memory.tools.enabled` |
|
|
35
|
+
| Model-initiated notes (`journal_append`) | config | `memory.tools.allowJournalAppend` |
|
|
36
|
+
| Semantic `memory_search` (Ollama nomic-embed-text or OpenAI embeddings; keyword fallback when unset) | config | `memory.embeddings.{provider,model,endpoint,apiKey,apiKeyEnv}` |
|
|
37
|
+
| Consolidation tools (`entity_upsert`, `memory_reindex`) | code | exposed by `@mono-agent/memory-mcp`, not in the default allowlist |
|
|
38
|
+
|
|
39
|
+
## Tools, MCP, sandbox
|
|
40
|
+
|
|
41
|
+
| Capability | Coverage | Where |
|
|
42
|
+
| --- | --- | --- |
|
|
43
|
+
| Fail-closed tool policy (empty allowlist = no tools) | auto | default |
|
|
44
|
+
| Tool allow/deny lists (deny wins) | config | `tools.allowedTools`, `tools.disallowedTools` |
|
|
45
|
+
| MCP servers (stdio/sse/http) from a JSON file | config | `tools.mcpConfigPath` |
|
|
46
|
+
| Sandbox on/off + srt engine | config | `sandbox.mode` |
|
|
47
|
+
| Network policy (none/localhost/allowlist/all) | config | `sandbox.network.{mode,allowlist}` |
|
|
48
|
+
| Filesystem scopes (readable/writable roots, deny-write globs) | config | `sandbox.readableRoots`, `sandbox.writableRoots`, `sandbox.denyWrite` |
|
|
49
|
+
| Fallback behavior when srt is unavailable | config | `sandbox.fallback`, `sandbox.unsafeAllowHostProcess` |
|
|
50
|
+
| Request-scoped policies only tighten, never widen | auto | harness merge |
|
|
51
|
+
|
|
52
|
+
## Channels
|
|
53
|
+
|
|
54
|
+
| Capability | Coverage | Where |
|
|
55
|
+
| --- | --- | --- |
|
|
56
|
+
| Webhook (sync/async HTTP invoke + status polling) | config | `webhook` section |
|
|
57
|
+
| OpenAI-compatible API (/v1/models, /v1/chat/completions, SSE, bearer) | config | `openaiApi` section |
|
|
58
|
+
| Telegram (long polling, chat allowlist) | config | `telegram` section |
|
|
59
|
+
| Slack (Socket Mode, channel allowlist, mention handling) | config | `slack` section |
|
|
60
|
+
| WhatsApp (Baileys, QR login, group mention/any triggers) | config | `whatsapp` section |
|
|
61
|
+
| A2A provider (Agent Card, JSON-RPC + REST, streaming, bearer) | config | `a2a.provider` + `a2a.agent` + `a2a.skill` |
|
|
62
|
+
| A2A consumer settings (remote agent URLs, timeouts) | config + code | `a2a.consumer` holds settings; calls via `createA2AConsumerResponder` |
|
|
63
|
+
| Cron jobs (five-field expressions, timezones, overlap skip) | config | `cron.jobs[]` |
|
|
64
|
+
| Channel message texts / stream tuning (welcome, debounce, ...) | code | channel driver overrides |
|
|
65
|
+
| Custom transports | code | implement `ChannelDriver`, pass via `startMonoAgentApp({ drivers })` |
|
|
66
|
+
|
|
67
|
+
## Observability, operator surfaces, composition
|
|
68
|
+
|
|
69
|
+
| Capability | Coverage | Where |
|
|
70
|
+
| --- | --- | --- |
|
|
71
|
+
| JSONL run artifacts (events + summaries, secrets redacted) | config | `artifacts.dir` |
|
|
72
|
+
| Trace-source registry (heartbeat manifests for dashboards) | config | `traceability.{registryDir,sourceId,sourceLabel,heartbeatMs,staleAfterMs}` |
|
|
73
|
+
| Operator console (browser settings editor, traceability views, live config re-apply, bearer token) | config + cli | `console.{enabled,port}`; `--port`, `--no-console` |
|
|
74
|
+
| Terminal chat (TUI with transcript + redacted config pane) | cli | `mono-agent-tui --config ./mono-agent.config.json` |
|
|
75
|
+
| Scaffold / validate / start / install-skill | cli | `mono-agent init|validate|start|install-skill` |
|
|
76
|
+
| `.env` auto-loading | cli | automatic; `--env-file <path>` |
|
|
77
|
+
| Explicit failure objects (no fake success) | auto | harness |
|
|
78
|
+
| Per-request runtime options, custom memory/history stores | code | `createConfiguredAgentResponder` options |
|
|
79
|
+
| Multi-agent delegation (`ask_collaborator` loopback MCP tool) | code | `@mono-agent/agent-orchestrator` |
|
|
80
|
+
| Eval scenarios/suites (trajectory + judge assertions) | dev | `@mono-agent/agent-evals`, live runs via `MONO_AGENT_EVAL_LIVE=1` |
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# Package Composition Map
|
|
2
|
+
|
|
3
|
+
Use this map to select the smallest mono-agent package set for a host. Package categories are logical ownership boundaries; the physical workspace layout stays flat under `packages/<package-name>`.
|
|
4
|
+
|
|
5
|
+
## App Join (default)
|
|
6
|
+
|
|
7
|
+
`@mono-agent/agent-app` is the config-first host: it loads `mono-agent.config.json`, builds the responder through `agent-host`, and drives every configured channel plus the operator console and traceability. It ships the `mono-agent` CLI (`init`, `validate`, `start`) and is the only publishable package allowed to compose communication adapters.
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
import { startMonoAgentApp } from "@mono-agent/agent-app";
|
|
11
|
+
|
|
12
|
+
const app = await startMonoAgentApp({ cwd: process.cwd() });
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Reach below it (the joins that follow) only when config cannot express the host.
|
|
16
|
+
|
|
17
|
+
## Core Join
|
|
18
|
+
|
|
19
|
+
Every real host needs these concepts:
|
|
20
|
+
|
|
21
|
+
| Need | Package | Owns | Does not own |
|
|
22
|
+
| --- | --- | --- | --- |
|
|
23
|
+
| Shared request/response shape | `@mono-agent/agent-contracts` | `AgentResponder`, request, response, stream, cancellation contracts | Prompt building, runtime execution, transport |
|
|
24
|
+
| Core config | `@mono-agent/config` | Runtime, context, memory, tools, artifact, traceability settings | Adapter credentials, chat allowlists |
|
|
25
|
+
| Runtime facade | `@mono-agent/runtime-adapter` | Model refs, execution-mode validation, local provider runtime options | Prompts, adapters, memory |
|
|
26
|
+
| Configured responder | `@mono-agent/agent-host` | Turns `MonoAgentConfig` into runtime, harness, and responder | Polling chats, serving APIs, adapter settings |
|
|
27
|
+
|
|
28
|
+
Minimal local host:
|
|
29
|
+
|
|
30
|
+
```ts
|
|
31
|
+
import { loadMonoAgentConfigWithSources } from "@mono-agent/config";
|
|
32
|
+
import { createConfiguredAgentResponder } from "@mono-agent/agent-host";
|
|
33
|
+
|
|
34
|
+
const config = await loadMonoAgentConfigWithSources({
|
|
35
|
+
env: process.env,
|
|
36
|
+
cwd: process.cwd(),
|
|
37
|
+
jsonPath: "./mono-agent.config.json",
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const responder = createConfiguredAgentResponder({ config });
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Context And Skill Join
|
|
44
|
+
|
|
45
|
+
Use this path when the agent needs identity, selected skills, history, and optional memory:
|
|
46
|
+
|
|
47
|
+
| Need | Package | Use |
|
|
48
|
+
| --- | --- | --- |
|
|
49
|
+
| Prompt assembly | `@mono-agent/context` | Load identity/SOUL/skills/history/memory into deterministic prompt context |
|
|
50
|
+
| Selected skill bodies | `@mono-agent/skills` | Load only configured skills from `<skillsRoot>/<name>/SKILL.md` |
|
|
51
|
+
| Markdown memory | `@mono-agent/memory-md` | Read capped memory blocks and optionally append host summaries |
|
|
52
|
+
| Daily journal memory | `@mono-agent/memory-journal` | Keep a today note in context and persist continuous local journaling |
|
|
53
|
+
| Entity graph memory | `@mono-agent/memory-graph` | Store local JSONL entities, relations, and observations (`memory.graphPath`) |
|
|
54
|
+
| Searchable memory | `@mono-agent/memory-search` | Chunk and semantically search local memory with embeddings (`memory.embeddings`) |
|
|
55
|
+
| Runtime memory tools | `@mono-agent/memory-mcp` | Expose memory tools over MCP when the runtime should query memory itself (`memory.tools`); also ships host-side `entity_upsert`/`memory_reindex` consolidation tools |
|
|
56
|
+
|
|
57
|
+
Mono-agent selected skills are not auto-selected by description. The host chooses `context.selectedSkills`, and the harness loads those exact bodies.
|
|
58
|
+
|
|
59
|
+
## Execution Join
|
|
60
|
+
|
|
61
|
+
Use `@mono-agent/agent-harness` directly when a host needs custom runtime, memory, history, recorder, or request-scoped runtime options. Use `@mono-agent/agent-host` when config-driven composition is enough.
|
|
62
|
+
|
|
63
|
+
`@mono-agent/agent-harness` owns:
|
|
64
|
+
|
|
65
|
+
- loading identity/context files
|
|
66
|
+
- loading selected skill bodies
|
|
67
|
+
- reading memory blocks
|
|
68
|
+
- invoking the runtime
|
|
69
|
+
- recording run events and summaries
|
|
70
|
+
- appending conversation history
|
|
71
|
+
- optionally appending deterministic host summaries to memory
|
|
72
|
+
- returning explicit failure objects instead of fake success
|
|
73
|
+
|
|
74
|
+
## Tools And MCP Join
|
|
75
|
+
|
|
76
|
+
Use `@mono-agent/tool-policy` for fail-closed tool/MCP policy normalization:
|
|
77
|
+
|
|
78
|
+
```ts
|
|
79
|
+
import { createToolPolicy, toolPolicyToRuntimeOptions } from "@mono-agent/tool-policy";
|
|
80
|
+
|
|
81
|
+
const policy = createToolPolicy({
|
|
82
|
+
allowedTools: ["Read", "Grep"],
|
|
83
|
+
disallowedTools: ["WebFetch"],
|
|
84
|
+
mcpConfigPath: "./mcp.json",
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
const runtimeOptions = toolPolicyToRuntimeOptions(policy);
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Do not grant broad tool access as a fallback. If the requested task needs tools, ask for the narrow allowlist or MCP config path.
|
|
91
|
+
|
|
92
|
+
## Adapter Join
|
|
93
|
+
|
|
94
|
+
Communication adapters are edge packages. They accept an `AgentResponder` and own only their transport-specific config and safety rules.
|
|
95
|
+
|
|
96
|
+
| Surface | Package | First smoke |
|
|
97
|
+
| --- | --- | --- |
|
|
98
|
+
| Telegram | `@mono-agent/telegram-adapter` | Allowed chat sends a message |
|
|
99
|
+
| Slack | `@mono-agent/slack-adapter` | Allowed channel or DM gets a streamed reply |
|
|
100
|
+
| WhatsApp | `@mono-agent/whatsapp-adapter` | Allowed sender/group trigger produces a reply |
|
|
101
|
+
| OpenAI-compatible API | `@mono-agent/openai-api-adapter` | `curl /v1/models` and `/v1/chat/completions` |
|
|
102
|
+
| A2A provider/consumer | `@mono-agent/a2a-adapter` | Send text to the Agent Card URL |
|
|
103
|
+
| Webhook | `@mono-agent/webhook-adapter` | `curl` the configured invocation path |
|
|
104
|
+
| Cron | `@mono-agent/cron-adapter` | One scheduled or manually triggered invocation |
|
|
105
|
+
|
|
106
|
+
Adapters must not import the harness, runtime adapter, memory packages, or other adapters. `@mono-agent/agent-app` composes them from config; custom hosts and demos may compose them directly.
|
|
107
|
+
|
|
108
|
+
## Operator And Observability Join
|
|
109
|
+
|
|
110
|
+
Use:
|
|
111
|
+
|
|
112
|
+
- `@mono-agent/operator-console` for local browser settings and traceability (`console` config section; per-boot bearer token; saves re-apply live).
|
|
113
|
+
- `@mono-agent/tui` for local terminal chat and redacted read-only config (`mono-agent-tui --config ./mono-agent.config.json`).
|
|
114
|
+
- `@mono-agent/observability` for JSONL event artifacts, summaries, and trace-source registration.
|
|
115
|
+
|
|
116
|
+
Traceability is local-first. A running host registers a source manifest; the operator console reads artifacts by `(sourceId, runId)` so duplicate run ids do not collide.
|
|
117
|
+
|
|
118
|
+
## Evaluation Join
|
|
119
|
+
|
|
120
|
+
Use `@mono-agent/agent-evals` to define end-to-end scenarios against a responder or harness: final-text assertions, trajectory/tool-call matching, cost/turn/duration budgets, and custom judges, with local JSON/markdown artifacts. Live-provider scenarios are skipped unless `MONO_AGENT_EVAL_LIVE=1`.
|
|
121
|
+
|
|
122
|
+
## Multi-Agent Join
|
|
123
|
+
|
|
124
|
+
Use `@mono-agent/agent-orchestrator` when one runtime should call named collaborator responders through a bounded MCP tool. Keep collaborator selection in the orchestrator layer, not inside A2A. A2A remains direct discovery and text/task communication.
|
|
125
|
+
|
|
126
|
+
## Runtime Join
|
|
127
|
+
|
|
128
|
+
Use `@mono-agent/runtime-adapter` unless the host has a custom runtime implementation that already satisfies `MonoRuntimeLike`.
|
|
129
|
+
|
|
130
|
+
Supported model reference families:
|
|
131
|
+
|
|
132
|
+
- `codex:<model>` with CLI execution
|
|
133
|
+
- `claude:<model>` with SDK or CLI execution
|
|
134
|
+
- `pi:<provider>:<model>` with SDK execution, including local providers such as Ollama
|
|
135
|
+
|
|
136
|
+
Provider credentials belong in the provider/runtime environment, not in committed config.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Validation
|
|
2
|
+
|
|
3
|
+
Use validation that matches the chosen composition path. Do not claim the host works from a typecheck alone.
|
|
4
|
+
|
|
5
|
+
## Config Validation (default path)
|
|
6
|
+
|
|
7
|
+
In the user's agent folder:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
mono-agent validate
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
The report covers core config, runtime support for the primary and every fallback model, identity/skills/memory/MCP paths, the sandbox policy, the operator console section, and every channel (`ok` / `waiting` / `off` / `error`). Exit 0 means the folder is ready to start. Fix every `[error]`; `[waiting]` channels are simply unconfigured.
|
|
14
|
+
|
|
15
|
+
Then start and confirm the status lines:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
mono-agent start
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Every channel the user asked for must report `running` with its endpoint facts; anything `failed` is a blocker, not a footnote.
|
|
22
|
+
|
|
23
|
+
## Documentation Validation
|
|
24
|
+
|
|
25
|
+
To confirm a skills folder is indexable (replace `<skillsRoot>` with the
|
|
26
|
+
agent's configured skills root, e.g. `./skills`):
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
node --input-type=module - <<'EOF'
|
|
30
|
+
import { loadSkillIndexFromDirectory } from '@mono-agent/context';
|
|
31
|
+
|
|
32
|
+
const skills = await loadSkillIndexFromDirectory('<skillsRoot>');
|
|
33
|
+
console.log(JSON.stringify(skills, null, 2));
|
|
34
|
+
EOF
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Expected:
|
|
38
|
+
|
|
39
|
+
- Every selected skill appears in the index.
|
|
40
|
+
- The description is the first plain paragraph from its `SKILL.md`.
|
|
41
|
+
- The `mainFile` points at `<skillsRoot>/<skill-name>/SKILL.md`.
|
|
42
|
+
|
|
43
|
+
## Repo Validation
|
|
44
|
+
|
|
45
|
+
Run the narrow checks for doc-only changes:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
pnpm run check:architecture
|
|
49
|
+
pnpm run typecheck
|
|
50
|
+
git diff --check
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
If code or config behavior changes, add the relevant package tests:
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
pnpm --filter @mono-agent/<package> run test
|
|
57
|
+
pnpm --filter @mono-agent/<package> run build
|
|
58
|
+
pnpm --filter @mono-agent/<package> run typecheck
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
For broad host or demo changes, run the full workspace gate:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
pnpm run build
|
|
65
|
+
pnpm test
|
|
66
|
+
pnpm run build:demo
|
|
67
|
+
pnpm run typecheck:demo
|
|
68
|
+
pnpm run test:demo
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Smoke Tests By Surface
|
|
72
|
+
|
|
73
|
+
| Surface | Smoke |
|
|
74
|
+
| --- | --- |
|
|
75
|
+
| TUI | Start the host and complete one local prompt. |
|
|
76
|
+
| Telegram | Send one allowed chat message and verify the reply. |
|
|
77
|
+
| Slack | Send one allowed DM or channel message and verify formatting. |
|
|
78
|
+
| WhatsApp | Send one allowed sender/group trigger and verify the reply. |
|
|
79
|
+
| OpenAI API | `curl /v1/models` and `/v1/chat/completions`. |
|
|
80
|
+
| A2A | Send text to the Agent Card URL with `sendA2AMessage()`. |
|
|
81
|
+
| Webhook | `curl` the invocation path and inspect the response body/status. |
|
|
82
|
+
| Cron | Run a one-off scheduled invocation or wait for one tick. |
|
|
83
|
+
| Operator console | Open Settings and Traceability; confirm redaction and a visible run artifact. |
|
|
84
|
+
| Journal memory tools | Ask the agent to recall yesterday (`memory_read_day`/`memory_grep` should appear in the run artifact). |
|
|
85
|
+
| Semantic memory search | With `memory.embeddings` set (Ollama: `ollama pull nomic-embed-text` first), ask a paraphrased question about an old note and confirm `memory_search` returns it. |
|
|
86
|
+
|
|
87
|
+
## Failure Handling
|
|
88
|
+
|
|
89
|
+
Report failures as explicit blockers or follow-up work. Do not present:
|
|
90
|
+
|
|
91
|
+
- a missing runtime as a successful fallback
|
|
92
|
+
- disabled tools as a successful MCP integration
|
|
93
|
+
- a fake adapter request as a product-runtime smoke
|
|
94
|
+
- a redacted or skipped secret as proof that the live adapter works
|