One judgement per part with no tools, at most two at once; a section is read with its frame (the clauses and records it names and the digest of its Context), so a usual revision judges only what changed. The latest approval of each part is kept in the head and carried to the next version; a part that could not be judged keeps the others' verdicts and is the only one asked again; reviewed is said once per version and each verdict as part-reviewed on the stream reviews. A part in flight is a key of the state asked. A version is accepted when every part approves; findings name their part. Issue 1966. Claude-Session: https://claude.ai/code/session_01JG73KJNrH5EgFXMKKYSrig
347 lines
12 KiB
JSON
347 lines
12 KiB
JSON
{
|
|
"module": "mesh-knowledge",
|
|
"version": "1",
|
|
"slug": "knowledge",
|
|
"requires": [
|
|
"postgres-database",
|
|
{
|
|
"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"
|
|
}
|
|
},
|
|
"binds": {
|
|
"postgres-database": "${dir:state}/database.json"
|
|
},
|
|
"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"
|
|
],
|
|
"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"
|
|
],
|
|
"uses": [
|
|
"operator-channel"
|
|
],
|
|
"invokes": [
|
|
"seat:issue-tracker.reserve",
|
|
"claude-code.claude_code_judge",
|
|
"claude-code.claude_code_judged",
|
|
"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"
|
|
],
|
|
"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"
|
|
}
|
|
},
|
|
"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"],
|
|
"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"
|
|
}
|
|
]
|
|
}
|
|
}
|