Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
210 commits
Select commit Hold shift + click to select a range
2bd8b57
chore: update session runtime
senamakel Aug 31, 2026
9f4b9d3
chore(debug): update debug module
senamakel Aug 31, 2026
4f555c3
chore: update debug module
senamakel Aug 31, 2026
8b8cbbf
fix(debug): render tool specs from borrowed references
senamakel Aug 31, 2026
38e0ce8
chore(debug): update prompt size handling
senamakel Aug 31, 2026
e5a0ffa
chore(debug): expose prompt size module and types
senamakel Aug 31, 2026
c470240
feat(agent): add prompt size diagnostic command
senamakel Aug 31, 2026
cd3138e
chore(scripts): update prompt budget check
senamakel Aug 31, 2026
7290de1
chore(vendor): update tinyagents submodule
senamakel Aug 31, 2026
c77b28a
fix(scripts): make prompt budget check executable
senamakel Aug 31, 2026
1265caa
chore(vendor): update tinyagents
senamakel Aug 31, 2026
a507be8
feat(prompts): add cache tiers for prompt sections
senamakel Aug 31, 2026
447808b
feat(prompts): classify sections by cache tier
senamakel Aug 31, 2026
e400388
fix(prompts): remove
senamakel Aug 31, 2026
4af66c0
feat(prompts): assign cache tiers to prompt sections
senamakel Aug 31, 2026
589338c
feat(prompts): add tiered prompt cache breakpoints
senamakel Aug 31, 2026
8899fa4
feat(prompts): export tiered prompt type
senamakel Aug 31, 2026
e192737
feat(agent): add prompt cache breakpoints to chat messages
senamakel Aug 31, 2026
caabebb
feat(agent): preserve system prompt cache breakpoints
senamakel Aug 31, 2026
01d6049
feat(context): expose tiered system prompt cache boundaries
senamakel Aug 31, 2026
cb8a5fb
feat(session): preserve tiered system prompt breakpoints
senamakel Aug 31, 2026
a5a0581
fix(agent): initialize cache breakpoints on chat messages
senamakel Aug 31, 2026
20dab0e
test(prompts): cover cache tier ordering and breakpoints
senamakel Aug 31, 2026
8a11c12
test(prompts): isolate tier tests from tool prompt output
senamakel Aug 31, 2026
9435801
test: initialize cache breakpoints in transcript fixtures
senamakel Aug 31, 2026
d99bfaf
test(prompts): update AGENTS.md ordering assertion
senamakel Aug 31, 2026
095ad09
test(agent): cover cache breakpoint message conversion
senamakel Aug 31, 2026
d7766f2
feat(tools): expose tool exposure type
senamakel Aug 31, 2026
3c354c2
feat(tools): export the tool exposure type
senamakel Aug 31, 2026
207a31e
chore(meta): update tool search implementation
senamakel Aug 31, 2026
ca1a6a6
feat(tools): expose the meta module
senamakel Aug 31, 2026
1c7232a
feat(tools): defer schemas for selectively exposed tools
senamakel Aug 31, 2026
90592de
fix(tools): preserve tool search when filtering deferred tools
senamakel Aug 31, 2026
6ed798d
fix(session): update deferred tool helper path
senamakel Aug 31, 2026
77d166d
fix(meta): bind deferred tools to the search index
senamakel Aug 31, 2026
8650987
feat(tools): add deferred tool search support
senamakel Aug 31, 2026
f2d533e
test(meta): bind search indexes before querying
senamakel Aug 31, 2026
15603e1
perf(stock): defer market data tool exposure
senamakel Aug 31, 2026
05ff84d
fix(stock-prices): bring tool exposure trait into scope
senamakel Aug 31, 2026
8d1f010
feat(debug): support config path overrides for prompt dumps
senamakel Aug 31, 2026
12996f2
feat(agent): add hermetic prompt-size mode
senamakel Aug 31, 2026
e6ee12d
fix(cli): use installed config for dump-prompt
senamakel Aug 31, 2026
af7993e
chore(prompt-budget): recalibrate hermetic prompt size limits
senamakel Aug 31, 2026
bdd1412
chore(vendor): bump tinyagents for cache breakpoints + ToolExposure
senamakel Aug 31, 2026
428f585
feat(todo): add plan approval decision operation
senamakel Aug 31, 2026
cb9f6cd
refactor(todos): hide superseded tools from the wire
senamakel Aug 31, 2026
31cfd94
fix(todos): import tool exposure trait
senamakel Aug 31, 2026
7b5fd0b
chore(meta): update collapse implementation
senamakel Aug 31, 2026
9a501e8
feat(meta): expose action collapse helpers
senamakel Aug 31, 2026
db2602f
fix(meta): rank all permission levels explicitly
senamakel Aug 31, 2026
ec18d56
test(meta): use read-only permissions in collapse tests
senamakel Aug 31, 2026
5c36a6a
chore: update collapsed cron tools
senamakel Aug 31, 2026
db90a0a
feat(cron): expose a unified scheduler tool
senamakel Aug 31, 2026
7884384
refactor(cron): verify collapsed actions stay hidden
senamakel Aug 31, 2026
61618e7
feat(tools): expose collapsed scheduler tool
senamakel Aug 31, 2026
cee0aa3
fix(ops): classify the collapsed cron tool as automation
senamakel Aug 31, 2026
b8b9a89
chore: update collapsed memory tool
senamakel Aug 31, 2026
0a83f04
feat(memory): expose unified memory tool
senamakel Aug 31, 2026
b531245
fix(memory): import tool exposure trait in memory tools
senamakel Aug 31, 2026
0bb1c6b
fix(memory): filter collapsed actions by capability
senamakel Aug 31, 2026
4ba6f6c
feat(memory): register the collapsed memory tool
senamakel Aug 31, 2026
64b5f50
refactor(agent-registry): consolidate agent tool declarations
senamakel Aug 31, 2026
118f4b6
chore: files changed src/openhuman/agent/registry/agents/loader.rs
senamakel Aug 31, 2026
8d1f7af
chore: files changed src/openhuman/agent/registry/agents/archivist/ag…
senamakel Aug 31, 2026
6a244f3
chore: files changed src/openhuman/agent/registry/agents/context_scou…
senamakel Aug 31, 2026
c3978c6
chore: files changed src/openhuman/agent/registry/agents/archivist/ag…
senamakel Aug 31, 2026
6473173
chore: files changed src/openhuman/agent/registry/agents/loader.rs,sr…
senamakel Aug 31, 2026
09f5c09
chore: files changed src/openhuman/agent/registry/agents/loader.rs
senamakel Aug 31, 2026
ed5d17d
chore: files changed src/openhuman/flows/agents/flow_discovery/agent.…
senamakel Aug 31, 2026
a9b51c7
chore: files changed src/openhuman/agent/registry/agents/archivist/ag…
senamakel Aug 31, 2026
f1871ea
chore: files changed src/openhuman/agent/harness/session/builder/sett…
senamakel Aug 31, 2026
0f1e723
chore: files changed scripts/prompt-budget.limits
senamakel Aug 31, 2026
c0615be
chore: files changed src/openhuman/agent/registry/agents/loader.rs
senamakel Aug 31, 2026
dde491e
chore: files changed src/openhuman/flows/agents/workflow_builder/prom…
senamakel Aug 31, 2026
a8344a6
test(node-contracts): add tests for prompt index completeness
senamakel Aug 31, 2026
a5dd2a2
chore: files changed src/openhuman/flows/node_contracts.rs
senamakel Aug 31, 2026
ac410d5
chore: files changed scripts/prompt-budget.limits
senamakel Aug 31, 2026
56a7fec
chore: files changed src/openhuman/flows/agents/workflow_builder/prom…
senamakel Aug 31, 2026
f974cff
chore: files changed scripts/prompt-budget.limits
senamakel Aug 31, 2026
77d2762
chore: files changed src/openhuman/flows/node_contracts.rs
senamakel Aug 31, 2026
7ab2cda
chore: files changed src/openhuman/flows/mod.rs,src/openhuman/flows/n…
senamakel Aug 31, 2026
c2d5793
chore: files changed src/openhuman/flows/tools.rs
senamakel Aug 31, 2026
e1d939d
chore: files changed scripts/check-prompt-budget.sh
senamakel Aug 31, 2026
acf73c1
chore: files changed scripts/prompt-budget.limits
senamakel Aug 31, 2026
4b6840f
chore: files changed src/openhuman/flows/node_contracts.rs
senamakel Aug 31, 2026
116b57e
chore: files changed src/openhuman/skills/bundled/mod.rs
senamakel Aug 31, 2026
e812614
chore: files changed src/openhuman/skills/bundled/mod_tests.rs
senamakel Aug 31, 2026
d7a76c4
chore: files changed src/openhuman/flows/agents/workflow_builder/prom…
senamakel Aug 31, 2026
0be7744
chore: files changed src/openhuman/flows/skills/flow-authoring/WORKFL…
senamakel Aug 31, 2026
38f44b8
chore: files changed src/openhuman/flows/skills/mod.rs
senamakel Aug 31, 2026
7e654c4
chore: files changed src/openhuman/flows/mod.rs,src/openhuman/skills/…
senamakel Aug 31, 2026
a36b23c
chore: files changed src/openhuman/flows/mod.rs
senamakel Aug 31, 2026
30296eb
chore: files changed src/openhuman/skills/ops_create.rs,src/openhuman…
senamakel Aug 31, 2026
00e5f6a
chore: files changed src/openhuman/skills/ops.rs,src/openhuman/skills…
senamakel Aug 31, 2026
ec6c885
chore: files changed src/openhuman/config/workspace/ops.rs,src/openhu…
senamakel Aug 31, 2026
7ba67d3
chore: files changed src/openhuman/config/workspace/ops.rs,src/openhu…
senamakel Aug 31, 2026
8974eb1
chore: files changed src/openhuman/util/bm25.rs
senamakel Aug 31, 2026
428c35e
chore: files changed src/openhuman/tools/impl/meta/tool_search.rs,src…
senamakel Aug 31, 2026
d70336f
chore: files changed src/openhuman/tools/impl/meta/tool_search.rs
senamakel Aug 31, 2026
8e0c872
chore: files changed src/openhuman/util/bm25.rs
senamakel Aug 31, 2026
78e72e7
chore: files changed src/openhuman/skills/bundled/mod_tests.rs,src/op…
senamakel Aug 31, 2026
a477093
chore: files changed src/openhuman/util/bm25.rs
senamakel Aug 31, 2026
138ed16
chore: files changed src/openhuman/skills/search.rs
senamakel Aug 31, 2026
3f7662b
chore: files changed src/openhuman/skills/mod.rs,src/openhuman/skills…
senamakel Aug 31, 2026
aaa6072
feat(skills): add ranked skill search tool
senamakel Aug 31, 2026
8c5388c
chore: files changed src/openhuman/skills/tools.rs
senamakel Aug 31, 2026
209358e
chore: files changed src/openhuman/agent/registry/agents/orchestrator…
senamakel Aug 31, 2026
b57071b
chore: files changed src/openhuman/skills/search.rs,src/openhuman/ski…
senamakel Aug 31, 2026
40425a4
chore: files changed src/openhuman/agent/registry/agents/orchestrator…
senamakel Aug 31, 2026
049dacc
chore: files changed src/openhuman/util/bm25.rs
senamakel Aug 31, 2026
0a5c851
chore: files changed src/openhuman/skills/search.rs,src/openhuman/ski…
senamakel Aug 31, 2026
9b46cb5
fix(bm25): filter stopwords before ranking
senamakel Aug 31, 2026
a38c69c
chore: files changed src/openhuman/flows/skills/flow-authoring/WORKFL…
senamakel Aug 31, 2026
8008f9b
chore: files changed src/openhuman/flows/agents/workflow_builder/prom…
senamakel Aug 31, 2026
fa39c63
chore: files changed src/openhuman/flows/agents/workflow_builder/prom…
senamakel Aug 31, 2026
44be73b
chore: files changed src/openhuman/agent/registry/agents/loader.rs
senamakel Aug 31, 2026
2883de8
chore: files changed src/openhuman/tools/toolpacks/registry.rs
senamakel Aug 31, 2026
6acf181
chore: files changed src/openhuman/tools/toolpacks/registry.rs
senamakel Aug 31, 2026
6e2880a
chore: files changed src/openhuman/agent/registry/agents/orchestrator…
senamakel Aug 31, 2026
8941ec0
chore: files changed scripts/prompt-budget.limits
senamakel Aug 31, 2026
302a976
chore: files changed src/openhuman/skills/bundled/mod_tests.rs
senamakel Aug 31, 2026
95350b8
chore: files changed scripts/prompt-budget.limits
senamakel Aug 31, 2026
f3d2b55
chore: files changed AGENTS.md
senamakel Aug 31, 2026
d0a6df2
chore: files changed src/openhuman/tools/toolpacks/tests.rs
senamakel Aug 31, 2026
5848c2c
chore: files changed src/openhuman/agent/message_convert.rs,src/openh…
senamakel Aug 31, 2026
8a36628
refactor(debug): simplify section sort using sort_by_key
senamakel Aug 31, 2026
adf93e9
chore: files changed src/core/runtime/builder.rs,src/openhuman/platfo…
senamakel Aug 31, 2026
93718c2
chore: files changed src/openhuman/agent/debug/mod.rs
senamakel Aug 31, 2026
eac089e
chore: files changed scripts/prompt-budget.limits,src/openhuman/flows…
senamakel Aug 31, 2026
8c6a3a0
chore: files changed src/openhuman/agent/orchestration/tools/collapse…
senamakel Aug 31, 2026
819e973
chore: files changed src/openhuman/agent/orchestration/tools/archetyp…
senamakel Aug 31, 2026
582e98e
chore: files changed src/openhuman/agent/orchestration/tools/archetyp…
senamakel Aug 31, 2026
5e05943
chore: files changed src/openhuman/agent/orchestration/tools.rs
senamakel Aug 31, 2026
adb7c98
chore: files changed src/openhuman/tools/orchestrator_tools.rs
senamakel Aug 31, 2026
b062a58
chore: files changed src/openhuman/agent/orchestration/tools.rs,src/o…
senamakel Aug 31, 2026
8bb67bc
chore: files changed src/openhuman/agent/orchestration/tools/collapse…
senamakel Aug 31, 2026
324692a
chore: files changed src/openhuman/agent/orchestration/tools/collapse…
senamakel Aug 31, 2026
70b9dcf
chore: files changed src/openhuman/agent/orchestration/tools/collapse…
senamakel Aug 31, 2026
2b98f87
chore: files changed src/openhuman/agent/harness/session/builder/fact…
senamakel Aug 31, 2026
874f4dc
chore: files changed src/openhuman/agent/harness/session/turn/tools.rs
senamakel Aug 31, 2026
61a9871
chore: files changed src/openhuman/tools/orchestrator_tools.rs
senamakel Aug 31, 2026
3641d1f
chore: files changed src/openhuman/tools/orchestrator_tools.rs
senamakel Aug 31, 2026
390eb62
test(orchestrator_tools): include delegate_to in expected tool names
senamakel Aug 31, 2026
971ca4d
docs(orchestrator): clarify direct and delegated tool routing
senamakel Aug 31, 2026
791a111
chore: files changed src/openhuman/tools/orchestrator_tools.rs,src/op…
senamakel Aug 31, 2026
46558fc
chore: files changed src/openhuman/tools/orchestrator_tools.rs
senamakel Aug 31, 2026
29509c6
chore: files changed src/openhuman/tools/orchestrator_tools.rs
senamakel Aug 31, 2026
d2ec967
chore: files changed scripts/prompt-budget.limits
senamakel Aug 31, 2026
950eec5
chore: files changed AGENTS.md
senamakel Aug 31, 2026
57f095e
chore: files changed src/openhuman/agent/harness/session/turn/tools.r…
senamakel Aug 31, 2026
73638ff
chore: files changed src/openhuman/agent/harness/definition.rs
senamakel Sep 1, 2026
6fe60be
chore: files changed src/openhuman/agent/harness/session/builder/fact…
senamakel Sep 1, 2026
0805786
chore: files changed src/openhuman/agent/tinyagents/host/definition_r…
senamakel Sep 1, 2026
40ee745
chore: files changed src/openhuman/agent/harness/session/builder/buil…
senamakel Sep 1, 2026
1668138
chore: files changed src/openhuman/agent/harness/session/builder/buil…
senamakel Sep 1, 2026
8059515
chore: files changed src/openhuman/agent/debug/wire.rs
senamakel Sep 1, 2026
524c89b
chore: files changed src/openhuman/agent/debug/wire_tests.rs
senamakel Sep 1, 2026
4f736e3
chore: files changed src/openhuman/agent/debug/dump_writer.rs,src/ope…
senamakel Sep 1, 2026
74e0aa0
chore: files changed src/core/agent_cli.rs
senamakel Sep 1, 2026
11a112e
chore: files changed src/openhuman/agent/debug/wire.rs
senamakel Sep 1, 2026
83b161e
chore: files changed src/core/agent_cli.rs,src/openhuman/agent/debug/…
senamakel Sep 1, 2026
51f336b
chore: files changed scripts/prompt-budget.limits
senamakel Sep 1, 2026
0359023
chore: files changed src/openhuman/agent/debug/wire.rs
senamakel Sep 1, 2026
b060823
chore: files changed src/openhuman/agent/registry/agents/orchestrator…
senamakel Sep 1, 2026
2302727
chore: files changed scripts/prompt-budget.limits
senamakel Sep 1, 2026
db5456c
chore: files changed src/openhuman/skills/ops_discover.rs,src/openhum…
senamakel Sep 1, 2026
b0c9287
chore: files changed src/openhuman/skills/ops_create.rs
senamakel Sep 1, 2026
316c001
chore: files changed src/openhuman/flows/catalogue.rs
senamakel Sep 1, 2026
6903a3b
chore: files changed src/openhuman/flows/catalogue.rs,src/openhuman/f…
senamakel Sep 1, 2026
e491794
chore: files changed src/openhuman/flows/catalogue.rs
senamakel Sep 1, 2026
df27c7c
chore: files changed src/openhuman/agent/registry/agents/orchestrator…
senamakel Sep 1, 2026
5dd54a4
chore: files changed src/openhuman/agent/registry/agents/orchestrator…
senamakel Sep 1, 2026
977aebf
chore: files changed src/openhuman/agent/registry/agents/orchestrator…
senamakel Sep 1, 2026
ea9c3b2
chore: files changed src/openhuman/skills/search.rs
senamakel Sep 1, 2026
3354a41
chore: files changed src/openhuman/skills/search.rs
senamakel Sep 1, 2026
dcad85e
chore: files changed src/openhuman/agent/harness/session/builder/fact…
senamakel Sep 1, 2026
e5e0ba8
chore: files changed src/openhuman/flows/catalogue_tests.rs
senamakel Sep 1, 2026
64c89d3
chore: files changed src/openhuman/flows/catalogue_tests.rs
senamakel Sep 1, 2026
d8d5407
chore: files changed src/openhuman/flows/catalogue_tests.rs
senamakel Sep 1, 2026
b6b85b2
chore: files changed src/openhuman/flows/catalogue_tests.rs
senamakel Sep 1, 2026
4e2b779
chore: files changed src/openhuman/agent/registry/agents/orchestrator…
senamakel Sep 1, 2026
e4a270a
chore: files changed src/openhuman/flows/catalogue_tests.rs
senamakel Sep 1, 2026
3d09a79
chore: files changed src/openhuman/flows/store.rs,src/openhuman/flows…
senamakel Sep 3, 2026
662350e
chore: files changed src/openhuman/flows/store.rs
senamakel Sep 3, 2026
7476c1b
feat(flows): accept description when creating a flow
senamakel Sep 3, 2026
702e6a4
chore: files changed src/openhuman/flows/builder_tools.rs,src/openhum…
senamakel Sep 3, 2026
c265745
chore: files changed src/openhuman/flows/store.rs
senamakel Sep 3, 2026
fd757cc
chore: files changed src/openhuman/flows/store.rs
senamakel Sep 3, 2026
78653ca
chore: files changed src/openhuman/flows/ops.rs
senamakel Sep 3, 2026
877cd49
chore: files changed src/openhuman/flows/builder_tools.rs,src/openhum…
senamakel Sep 3, 2026
0aaa796
chore: files changed src/openhuman/flows/ops.rs
senamakel Sep 3, 2026
df4a923
chore: files changed src/openhuman/flows/builder_tools.rs
senamakel Sep 3, 2026
c39945b
chore: files changed src/openhuman/flows/medulla_bridge.rs
senamakel Sep 3, 2026
92ae816
chore: files changed src/openhuman/flows/catalogue.rs
senamakel Sep 3, 2026
947cb6d
chore: files changed src/openhuman/flows/schemas.rs
senamakel Sep 3, 2026
acf370d
chore: files changed src/openhuman/flows/catalogue_tests.rs
senamakel Sep 3, 2026
64c1a25
chore: files changed src/openhuman/flows/builder_tools_tests.rs,src/o…
senamakel Sep 3, 2026
c928961
chore: files changed src/openhuman/flows/medulla_bridge_tests.rs,src/…
senamakel Sep 3, 2026
72c9145
chore: files changed src/openhuman/flows/bus.rs,src/openhuman/flows/m…
senamakel Sep 3, 2026
6f61060
chore: files changed src/openhuman/flows/memory_tools.rs
senamakel Sep 3, 2026
348b43f
chore: files changed src/openhuman/flows/tinyflows/caps/ops.rs,src/op…
senamakel Sep 3, 2026
3db6757
chore: files changed src/openhuman/flows/catalogue_tests.rs
senamakel Sep 3, 2026
0d36aab
chore: files changed src/openhuman/flows/store_tests.rs
senamakel Sep 3, 2026
2463738
chore: files changed app/src/services/api/flowsApi.ts
senamakel Sep 3, 2026
b0ec7a6
chore: files changed app/src/pages/__tests__/FlowCanvasPage.test.tsx
senamakel Sep 3, 2026
e6c5904
chore: files changed app/src/pages/FlowsPage.test.tsx
senamakel Sep 3, 2026
e0a9492
test(flows): add description to test fixture
senamakel Sep 3, 2026
409345a
chore: files changed src/openhuman/flows/builder_tools_tests.rs,src/o…
senamakel Sep 3, 2026
1b26650
chore: files changed src/openhuman/flows/schemas.rs
senamakel Sep 3, 2026
18b02a3
chore: files changed app/src/services/api/flowsApi.ts
senamakel Sep 3, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 80 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -480,6 +480,69 @@ the wrong index. `tests/orchestrator_thread_list_wiring.rs`, which existed to
pin that fix, was deleted with the tool. If threads need a chat route again, the
cheap fix is a single read-only `thread_list` rather than restoring the family.

### Bundled skills — `src/openhuman/skills/bundled/`

A skill can ship **inside the binary**. `BUNDLED` is a `const` table of
`include_str!`'d SKILL.md bundles; `run_workspace_migrations` writes each into
`<workspace>/.openhuman/builtin-skills/<dir>/` at boot, and from there discovery,
`describe_workflow`, `read_workflow_resource` and `run_skill` treat it exactly
like a skill the user installed. There is no second reader and no
`location: None` case downstream.

Five things to know before adding one:

- **It is not an extension point.** The table is compiled in, for the same
reason `modules::registry` is: a table config or RPC could add rows to would
let a remote party place instructions in front of the model. A skill the user
wants comes from `skill_registry_install`.
- **`WorkflowScope::Builtin` is the LOWEST precedence**, below `Legacy`. A user
or project skill of the same name shadows it, so shipping a bundle can never
take a name away from a workspace already using it.
(`a_user_skill_of_the_same_name_shadows_the_builtin` pins this.)
- **Builtin bypasses the per-profile skill allowlist**, like `Profile` does.
The allowlist scopes *user content*; these are neither the user's nor scoped,
and one of them is the reference manual an agent's own prompt points at.
`tools::is_builtin_skill` is the single place that decision lives, and the
exempt set is fixed at compile time.
- **Materialised, not served from memory**, because every consumer downstream
resolves a real path and inherits `read_workflow_resource`'s traversal and
symlink hardening. `install_one` deletes and rewrites a bundle whose digest
moved rather than overwriting file-by-file — a stale reference page left
behind would keep answering reads after the skill stopped shipping it — and
writes the digest LAST, so an interrupted install is redone.
- **Boot, not `init_workspace`.** That RPC is a one-shot an existing workspace
never runs again, so a shipped page would reach nobody after an upgrade.

**What belongs in a bundled skill, and what does not.** `flow-authoring` (in
`src/openhuman/flows/skills/`) holds ~25 KB that used to be `workflow_builder`'s
standing prompt: expression and jq syntax, `memory`/`dedup`/trigger node config,
per-node error handling, how to read a dry run. **A rule that binds stays in the
prompt; a rule you look up moves.** "Propose, never persist" cannot live in a
manual, because a manual only binds a model that chose to open it. This line is
easy to get wrong and is guarded by tests, not review: "prefer the minimal
viable graph" was moved into the skill on the first pass and moved back, because
`standing_prompt_keeps_minimal_graph_warning_alongside_specialist_guidance`
pins it — correctly, since it constrains an instinct the model has before it
would consult anything.

**`skill_search`** (`skills::search`) ranks installed skills by capability, over
the shared BM25 in `util::bm25`. It lives **in** the withheld `skills` toolpack
with `describe_workflow` and `run_skill`: advertised on its own it cost 748 B on
every wildcard agent to produce an id those agents could not act on. The
orchestrator's `## Installed Skills` catalogue is capped at `MAX_LISTED_SKILLS`
(20) and points past the cap at search — the catalogue is a per-turn cost frozen
for the session, so it grows silently with every install.

**`util::bm25` names nothing from `crate::`** and must stay that way; it is the
half of skill discovery that is the same for every host. Two rules there cost a
debugging pass each: the IDF keeps its `+ 1` so a one-document corpus stays
searchable, and because that lets stopwords score, queries are filtered by BOTH
a document-frequency threshold (`df >= max(2, ceil(0.8n))`) and a small
`STOPWORDS` list. Neither alone is enough — with three skills installed, "a"
appeared in exactly one description, making it by frequency the *most*
distinguishing term in "provision a kubernetes cluster", which duly returned a
changelog skill.

**Skills runtime**: the QuickJS per-skill VM engine is gone. `src/openhuman/skills/` holds skill metadata/tool descriptors; execution of installed `SKILL.md` workflows lives in `src/openhuman/skills/runtime/` (starts/cancels runs, hosts the `skill_executor` agent, reuses `runtime::node`/`runtime::python`, which are clients for the `tinyruntime` module).

### Tool calling lives in tinyagents — `src/openhuman/agent/dispatcher.rs` is a seam
Expand Down Expand Up @@ -665,6 +728,23 @@ So `GroupMode` has three states, not two:

`Off` is the state that could not be said before, and it is the one an embedder reaches for most — absence beats a registered tool that fails, the same reasoning the `flows` compile gate already documents. Enforcement is two-sited and mirrors the existing filters: `Off` drops the tool in `all_tools_with_runtime`'s post-filter block (a third `retain`, right after the `DomainSet` and memory-capability ones), and `Withheld` is what `strip_packed_from_visible` acts on. **The three narrow, they never widen** — `Advertised` cannot conjure a tool that a Cargo gate compiled out or that the ambient `DomainSet` dropped.

### Three ways a tool leaves the wire, and how to pick

The fixed per-turn prefix is the system prompt plus every advertised tool schema. Three mechanisms shrink the second half, and they are **not** interchangeable — the criterion is how often a turn needs the capability:

| Mechanism | Cost when needed | Use for |
| --- | --- | --- |
| **Collapse** (`memory`, `cron`, `delegate_to`, `delegate_to_integrations_agent`) | none — one extra enum field on a call being made anyway | families a turn needs *often*, or that are near-identical to each other |
| **Pack** (`load_skill` / `use_skill`) | one round trip, per pack per conversation | capabilities most turns never touch — crypto, MCP setup, the `.pptx` writer |
| **Defer** (`ToolExposure::Deferred` + `tool_search`) | one round trip, per tool | a long tail on a wildcard belt, where the *group* is not the natural unit |

**A family of near-identical schemas hides from both ratchets, and that is how the biggest one survived.** `ArchetypeDelegationTool::parameters_schema` is a `json!` literal that never reads `self`, so all 16 synthesised delegates carried a byte-identical envelope: 17,746 B, **41% of the orchestrator's whole tool budget**, was one object sixteen times. Every individual tool sat under `check-prompt-budget.sh`'s 1,600 B attention threshold, so nothing flagged it, and the per-agent total shows a number without a cause. When looking for the next one, **group by schema body, not by size**.

Two rules fell out of doing that collapse, both learned from regressions that measurement caught and review did not:

- **Hiding a member is not enough on a `Named` belt.** `ToolExposure::Hidden` is applied by `strip_deferred_from_visible`, which deliberately runs **only for a wildcard belt** — a hand-written `[tools] named` list is already an answer to "what should this agent see". But synthesised delegates are force-inserted into that list by `factory.rs` and again by `refresh_delegation_tools`, so marking them Hidden changed nothing and the first version of the collapse made the budget go **up** (43,153 → 52,513 B). Both insertion points now skip a Hidden tool. That is the right place: those names were never chosen by a human, so skipping one takes nothing an author asked for.
- **A collapse must never widen what a pack narrowed.** Folding the delegates into one tool silently re-advertised seven routes the pack table withholds (`do_crypto`, `setup_mcp_server`, `use_mcp_server`, `setup_skills`, `run_skill`, `build_workflow`, `discover_workflows`). Each one stopped being a tool — so `strip_packed_from_visible` had nothing to remove — and came back as a *string inside another tool's schema*, where no visible-set subtraction reaches it. `toolpacks::is_withheld_from` is the predicate for exactly this case. **Check it whenever a surface moves from "a tool" to "a value"**: enum members, description tables and generated catalogues are all advertised surface that the `visible` set cannot police.

**Packs now carry an `owners` list, and a pack is skipped entirely for its owner.** This is new with the raw-tool packs and was not needed before: the original packs held only synthesised `delegate_*` tools, which exist on the orchestrator alone. A pack over raw tools is different — `settings_agent` exists precisely to run `config_*` / `health_*` / `service_*`, so withholding the `system` pack from it would put a `load_skill` round trip in front of the first call of every one of its turns and hide nothing that was idle. Its whole belt *is* the pack. `strip_packed_from_visible` therefore takes the agent id.

**`DomainGroup` tracks family directories 1:1.** After the domain reorg (#5328) each variant names a `src/openhuman/` family, so the runtime axis stopped sweeping half the surface into the `Platform` catch-all. Groups: the harness families (`Agent`, `Memory`, `Threads`, `Config`, `Security`), the compile-gate families (`Flows`, `Skills`, `Mcp`, `Channels`, `Web3`, `Voice`, `Media`, `Medulla`), the families carved out of `Platform` (`Inference`, `Integrations`, `Automation` = cron, `Runtimes` = runtime + sandbox, `Desktop`, `Hosted`, `Relay` = tinyplace, `Modules` = the native module host), and `Platform` itself — now only the kernel surfaces with no family of their own (`platform/`, `tools/`, `http_host/`, `test_support/`).
Expand Down
1 change: 1 addition & 0 deletions app/src/components/flows/FlowListRow.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ function makeFlow(overrides: Partial<Flow> = {}): Flow {
return {
id: 'flow-1',
name: 'Daily digest',
description: '',
enabled: true,
graph: { nodes: [], edges: [] },
created_at: '2026-01-01T00:00:00Z',
Expand Down
1 change: 1 addition & 0 deletions app/src/pages/FlowsPage.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ function makeFlow(overrides: Partial<Flow> = {}): Flow {
return {
id: 'flow-1',
name: 'Daily digest',
description: '',
enabled: true,
graph: { nodes: [], edges: [] },
created_at: '2026-01-01T00:00:00Z',
Expand Down
1 change: 1 addition & 0 deletions app/src/pages/__tests__/FlowCanvasPage.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ function makeFlow(overrides: Partial<Flow> = {}): Flow {
return {
id: 'test-id',
name: 'Daily digest',
description: '',
enabled: true,
graph: {
schema_version: 1,
Expand Down
26 changes: 18 additions & 8 deletions app/src/services/api/flowsApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,15 @@ export interface Flow {
id: string;
/** Human-readable name shown in the Workflows UI. */
name: string;
/**
* One line saying what this automation is for.
*
* Empty is normal and must be rendered as such, not as a missing value:
* every flow saved before this field existed has none, and the canvas does
* not require one. Surfaced in the agent's skills catalogue, where an empty
* description falls back to describing the graph's shape.
*/
description: string;
/** Whether this flow may currently be triggered/run. */
enabled: boolean;
/** The validated, migrated workflow graph — opaque to this client. */
Expand Down Expand Up @@ -237,6 +246,8 @@ export interface FlowConnection {
/** Optional fields for {@link updateFlow}. Omitted fields are left untouched. */
interface FlowUpdate {
name?: string;
/** Omit to leave the stored description untouched; `''` clears it. */
description?: string;
graph?: unknown;
requireApproval?: boolean;
/**
Expand Down Expand Up @@ -373,16 +384,14 @@ function unwrapCliEnvelope<T>(payload: unknown): T {
export async function createFlow(
name: string,
graph: unknown,
requireApproval?: boolean
requireApproval?: boolean,
description?: string
): Promise<Flow> {
log('createFlow: request name=%s requireApproval=%s', name, requireApproval ?? 'default');
const response = await callCoreRpc<unknown>({
method: 'openhuman.flows_create',
params:
requireApproval === undefined
? { name, graph }
: { name, graph, require_approval: requireApproval },
});
const params: Record<string, unknown> = { name, graph };
if (requireApproval !== undefined) params.require_approval = requireApproval;
if (description !== undefined) params.description = description;
const response = await callCoreRpc<unknown>({ method: 'openhuman.flows_create', params });
const flow = unwrapCliEnvelope<Flow>(response);
log('createFlow: response id=%s name=%s enabled=%s', flow.id, flow.name, flow.enabled);
return flow;
Expand Down Expand Up @@ -650,6 +659,7 @@ export async function updateFlow(id: string, update: FlowUpdate): Promise<Flow>
);
const params: Record<string, unknown> = { id };
if (update.name !== undefined) params.name = update.name;
if (update.description !== undefined) params.description = update.description;
if (update.graph !== undefined) params.graph = update.graph;
if (update.requireApproval !== undefined) params.require_approval = update.requireApproval;
if (update.expectedVersion !== undefined) params.expected_version = update.expectedVersion;
Expand Down
Loading