Files
mesh-catalog/modules/mesh-knowledge/module.json
T
jschoubben 89d0eb13af Join: merge A6 (wip/registry-a6)
Conflict in mesh-knowledge main.go, the propose tool's description: #609 (79c2fc7f)
names ideas and the research-active-at-most limit, A6 names a research effort's
partial new version; both sentences kept, A6's rule count (31).
2026-11-04 15:12:01 +01:00

393 lines
13 KiB
JSON

{
"module": "mesh-knowledge",
"version": "1",
"slug": "knowledge",
"requires": [
"postgres-database",
"route",
{
"name": "records", "storage": "ledger", "template": "ledger", "options": {"max-mib": 1024},
"types": [
{
"name": "decision",
"schema": {
"kind": {"type": "string"},
"number": {"type": "integer"},
"entry": {"type": "object"},
"version": {"type": "object"},
"pending-sections": {"type": "object"},
"title": {"type": "string"},
"text": {"type": "string"},
"digest": {"type": "string", "digest-of": "text"},
"why": {"type": "string"},
"reason": {"type": "string"}
},
"operations": [
{"name": "reserve", "effect": "set-fields", "fields": ["kind", "number", "entry"], "sequence": true, "author": true},
{"name": "propose", "effect": "set-fields", "fields": ["kind", "number", "entry", "pending-sections"], "sequence": true, "author": true},
{"name": "write-section", "effect": "set-entry", "into": "pending-sections", "key": "title", "fields": ["title", "digest"], "sequence": true, "author": true},
{"name": "submit", "effect": "set-fields", "fields": ["kind", "number", "entry", "pending-sections"], "sequence": true, "author": true},
{"name": "drop", "effect": "set-fields", "fields": ["kind", "number", "entry", "pending-sections"], "sequence": true, "author": true},
{"name": "import", "effect": "set-fields", "fields": ["kind", "number", "entry", "pending-sections"], "sequence": true, "author": true},
{"name": "form", "effect": "set-fields", "fields": ["kind", "number", "entry", "pending-sections"], "sequence": true, "author": true},
{"name": "take-over", "effect": "set-fields", "fields": ["kind", "number", "entry"], "sequence": true, "author": true},
{"name": "review", "effect": "set-fields", "fields": ["kind", "number", "entry"], "sequence": true, "author": true},
{"name": "ask", "effect": "set-fields", "fields": ["kind", "number", "entry"], "sequence": true, "author": true},
{"name": "warrant", "effect": "set-fields", "fields": ["kind", "number", "entry"], "sequence": true, "author": true},
{"name": "accept", "effect": "set-fields", "fields": ["kind", "number", "entry"], "sequence": true, "author": true},
{"name": "withdraw", "effect": "set-fields", "fields": ["kind", "number", "entry"], "sequence": true, "author": true},
{"name": "retract", "effect": "set-fields", "fields": ["kind", "number", "entry"], "sequence": true, "author": true},
{"name": "draft", "effect": "set-fields", "fields": ["kind", "number", "entry"], "sequence": true, "author": true}
]
},
{
"name": "research",
"schema": {
"kind": {"type": "string"},
"number": {"type": "integer"},
"entry": {"type": "object"},
"version": {"type": "object"},
"pending-sections": {"type": "object"},
"title": {"type": "string"},
"text": {"type": "string"},
"digest": {"type": "string", "digest-of": "text"},
"why": {"type": "string"},
"reason": {"type": "string"}
},
"operations": [
{"name": "reserve", "effect": "set-fields", "fields": ["kind", "number", "entry"], "sequence": true, "author": true},
{"name": "propose", "effect": "set-fields", "fields": ["kind", "number", "entry", "pending-sections"], "sequence": true, "author": true},
{"name": "write-section", "effect": "set-entry", "into": "pending-sections", "key": "title", "fields": ["title", "digest"], "sequence": true, "author": true},
{"name": "submit", "effect": "set-fields", "fields": ["kind", "number", "entry", "pending-sections"], "sequence": true, "author": true},
{"name": "drop", "effect": "set-fields", "fields": ["kind", "number", "entry", "pending-sections"], "sequence": true, "author": true},
{"name": "import", "effect": "set-fields", "fields": ["kind", "number", "entry", "pending-sections"], "sequence": true, "author": true},
{"name": "form", "effect": "set-fields", "fields": ["kind", "number", "entry", "pending-sections"], "sequence": true, "author": true},
{"name": "take-over", "effect": "set-fields", "fields": ["kind", "number", "entry"], "sequence": true, "author": true},
{"name": "review", "effect": "set-fields", "fields": ["kind", "number", "entry"], "sequence": true, "author": true},
{"name": "ask", "effect": "set-fields", "fields": ["kind", "number", "entry"], "sequence": true, "author": true},
{"name": "warrant", "effect": "set-fields", "fields": ["kind", "number", "entry"], "sequence": true, "author": true},
{"name": "accept", "effect": "set-fields", "fields": ["kind", "number", "entry"], "sequence": true, "author": true},
{"name": "withdraw", "effect": "set-fields", "fields": ["kind", "number", "entry"], "sequence": true, "author": true},
{"name": "retract", "effect": "set-fields", "fields": ["kind", "number", "entry"], "sequence": true, "author": true},
{"name": "draft", "effect": "set-fields", "fields": ["kind", "number", "entry"], "sequence": true, "author": true}
]
}
]
},
{"name": "drafts", "storage": "key-value", "template": "state", "options": {"key-ttl": true}},
{"name": "asked", "storage": "key-value", "template": "state"},
{"name": "findings", "storage": "key-value", "template": "state"},
{"name": "sent", "storage": "key-value", "template": "state"},
{"name": "reviews", "storage": "stream", "configuration": {"when-full": "refuse", "max-mib": 512, "max-age-days": "none", "grant": "readers", "events": ["part-reviewed"]}}
],
"contributes": {
"postgres-database": {
"name": "knowledge"
},
"route": {
"label": "knowledge",
"endpoint": "overview"
}
},
"binds": {
"postgres-database": "${dir:state}/database.json",
"route": "${dir:state}/route.json"
},
"listens": [
{
"name": "overview",
"port": 8480,
"protocol": "tcp",
"from": "machine",
"why": "the overview page, read-only: only a process on this machine reaches it, and the operator through the route proxy (novox/hq ADR 0616 §4)"
}
],
"secrets": {
"postgres-database": "${dir:state}/database.secret"
},
"seats": [
{
"name": "knowledge-base",
"scope": "mesh",
"serves": [
"ask",
"get",
"list",
"findings",
"holds",
"links",
"history",
"reserve",
"propose",
"open",
"write",
"remove",
"order",
"submit",
"drop",
"take-over",
"import",
"return",
"withdraw",
"retract",
"progress"
]
}
],
"claims": [
{
"name": "knowledge-base",
"scope": "mesh",
"serves": [
"ask",
"get",
"list",
"findings",
"holds",
"links",
"history",
"reserve",
"propose",
"open",
"write",
"remove",
"order",
"submit",
"drop",
"take-over",
"import",
"return",
"withdraw",
"retract",
"progress"
]
}
],
"tools": [
"knowledge_health",
"knowledge_highest",
"knowledge_marks",
"knowledge_head",
"knowledge_operations",
"knowledge_section",
"knowledge_draft",
"knowledge_parts",
"knowledge_asked",
"knowledge_fill",
"knowledge_rebuild_index",
"knowledge_review_again",
"knowledge_integrity",
"knowledge_form_only",
"knowledge_move",
"knowledge_move_check",
"knowledge_overview",
"knowledge_overview_reread"
],
"emits": [
"reserved",
"proposed",
"reviewed",
"accepted",
"changed",
"imported",
"drafted",
"confirmed",
"returned",
"opened",
"written",
"removed",
"ordered",
"submitted",
"dropped",
"taken-over",
"part-reviewed",
"moved",
"checked",
"formed"
],
"consumes": [
"claude-code.judged",
"mesh-issues.opened",
"mesh-issues.moved",
"mesh-issues.milestone-set",
"mesh-issues.milestone-moved",
"mesh-delivery-gate.group",
"mesh-delivery-gate.transition",
"mesh-delivery-gate.merged",
"messenger.offered",
"messenger.closed"
],
"uses": [
"operator-channel"
],
"invokes": [
"seat:issue-tracker.reserve",
"claude-code.claude_code_judge",
"records.records_status",
"records.records_list",
"records.records_read",
"seat:operator-channel.notify",
"seat:issue-tracker.list",
"seat:issue-tracker.get",
"seat:issue-tracker.milestones",
"seat:issue-tracker.changes",
"seat:mesh-delivery.deliveries",
"seat:mesh-delivery.show",
"seat:mesh-delivery.groups",
"seat:operator-channel.asks",
"seat:mesh-hand-acts.hand-act"
],
"config": {
"readers": {
"type": "object",
"description": "The modules heard on the reviews of records (the stream of each part's verdict), by name, each with why; empty grants none. Set only at the controller's terminal or on the operator's Approve.",
"default": {}
},
"judge-model": {
"type": "string",
"description": "The model the knowledge base's drafting and confirming judgements ask, by the agent's name for it, such as sonnet; empty is sonnet.",
"default": "sonnet"
},
"drafting": {
"type": "string",
"description": "Whether the knowledge base drafts and confirms clauses itself: off stops it, anything else is on.",
"default": "on"
},
"reserved-for": {
"type": "string",
"description": "How long a reserved number waits for its proposal before it is withdrawn, as a duration such as 168h; empty is the knowledge base's own default.",
"pattern": "|[0-9]+(\\.[0-9]+)?(ns|us|µs|ms|s|m|h)([0-9]+(\\.[0-9]+)?(ns|us|µs|ms|s|m|h))*",
"default": "168h"
},
"research-active-at-most": {
"type": "number",
"description": "The most research efforts that may be active at once; propose refuses a further one, which is parked as an idea instead. 0 or empty is 3.",
"minimum": 0,
"default": 3
}
},
"resources": [
{
"id": "state",
"type": "directory",
"mode": "0700",
"place": ".",
"unknown": "program"
},
{
"id": "database-url",
"type": "file",
"path": "${dir:state}/database.url",
"mode": "0600",
"template": "files/database.url"
},
{
"id": "settings",
"trusted": false,
"type": "file",
"path": "${dir:state}/settings.json",
"mode": "0600",
"takes-config": ["judge-model", "drafting", "reserved-for", "research-active-at-most"],
"merge": "json",
"template": "files/settings.json"
},
{
"id": "readers",
"type": "file",
"path": "${dir:state}/readers.json",
"mode": "0600",
"takes-config": ["readers"],
"merge": "json",
"template": "files/readers.json"
},
{
"id": "prepare",
"type": "process",
"name": "mesh-knowledge-prepare",
"artifact": "tools",
"run": [
"./mesh-knowledge",
"prepare"
],
"run-once": true,
"env": {
"DATABASE_URL_FILE": "${dir:state}/database.url"
},
"restart-on": [
"database-url"
]
},
{
"id": "keep",
"type": "process",
"name": "mesh-knowledge-keep",
"artifact": "tools",
"run": [
"./mesh-knowledge",
"keep"
],
"env": {
"DATABASE_URL_FILE": "${dir:state}/database.url"
},
"restart-on": [
"database-url"
],
"health": {
"kind": "unit"
}
},
{
"id": "watch",
"type": "process",
"name": "mesh-knowledge-watch",
"artifact": "tools",
"run": [
"./mesh-knowledge",
"watch"
],
"user": "${machine:account}",
"env": {
"DATABASE_URL_FILE": "${dir:state}/database.url",
"MESH_KNOWLEDGE_STATUS": "${dir:state}/health.json"
},
"restart-on": [
"database-url"
],
"health": {
"kind": "tool",
"tool": "knowledge_health",
"needs": "postgres-database",
"interval": "60s",
"timeout": "10s",
"looks": 2,
"grace": "180s"
}
}
],
"build": {
"artifacts": [
{
"name": "tools",
"kind": "bundle",
"language": "go",
"system": "arch",
"from": "cmd/mesh-knowledge",
"binary": "mesh-knowledge",
"loads": [
"mesh-knowledge"
],
"env": {
"DATABASE_URL_FILE": "${dir:state}/database.url",
"MESH_KNOWLEDGE_SETTINGS": "${dir:state}/settings.json",
"MESH_KNOWLEDGE_STATUS": "${dir:state}/health.json"
}
},
{
"name": "files",
"kind": "archive",
"from": "files"
}
]
}
}