diff --git a/dist/mappa-brainstorm-promote.skill b/dist/mappa-brainstorm-promote.skill index 5b1d6f6..a7db543 100644 Binary files a/dist/mappa-brainstorm-promote.skill and b/dist/mappa-brainstorm-promote.skill differ diff --git a/dist/mappa-delegation.skill b/dist/mappa-delegation.skill index d53a3a9..86597e4 100644 Binary files a/dist/mappa-delegation.skill and b/dist/mappa-delegation.skill differ diff --git a/dist/mappa-knowledge.skill b/dist/mappa-knowledge.skill index b1b74bc..cb4ea02 100644 Binary files a/dist/mappa-knowledge.skill and b/dist/mappa-knowledge.skill differ diff --git a/dist/mappa-task-work.skill b/dist/mappa-task-work.skill index 53fa83f..9390ccc 100644 Binary files a/dist/mappa-task-work.skill and b/dist/mappa-task-work.skill differ diff --git a/skills/mappa-brainstorm-promote/SKILL.md b/skills/mappa-brainstorm-promote/SKILL.md index eec316d..c181df6 100644 --- a/skills/mappa-brainstorm-promote/SKILL.md +++ b/skills/mappa-brainstorm-promote/SKILL.md @@ -1,7 +1,7 @@ --- name: mappa-brainstorm-promote author: ours -version: 1.9.0 +version: 1.10.0 description: > Finalize a brainstorm buffer (mappa type=brainstorm, status=buffer): two paths. (1) Promote a matured buffer — read → target → brainstorm_promote @@ -108,10 +108,11 @@ brainstorm entity in mappa (type=brainstorm, status=buffer) 1. **Find the buffer in mappa.** `mcp__mappa__entity_search(type='brainstorm', project=, q=)` → in the results brainstorm:N (ref). Read the - full buffer: `mcp__mappa__entity_get(key)` — key = uuid or full ref - `brainstorm:N` (task:1067; bare numbers → 400) — body = running record - (frontmatter + rounds). The response carries the internal `id` for - `brainstorm_promote`. + full buffer: `mcp__mappa__entity_get(key)` — key = uuid, full ref + `brainstorm:N`, or bare num (канон адресации task:1221: голое число = num; + этап A задеплоен) — body = running record (frontmatter + rounds). + Адресация буфера — по num/ref/uuid, internal id наружу не используем + (выпилится в этапе B, task:1221). If the buffer is not in mappa — create a brainstorm entity via `mcp__mappa__brainstorm_create` (or HTTP `POST /entities` type=brainstorm, @@ -143,7 +144,7 @@ brainstorm entity in mappa (type=brainstorm, status=buffer) 5. **Content promotion (always via `brainstorm_promote`, decision 7):** - `mcp__mappa__brainstorm_promote(project=, brainstorm_id=)` + `mcp__mappa__brainstorm_promote(project=, brainstorm_id=)` - Atomically: buffer → wiki page (slug from the buffer, body preserved, parent_of buffer→wiki edges and refs→buffer) + buffer → `archive` + @@ -151,12 +152,12 @@ brainstorm entity in mappa (type=brainstorm, status=buffer) - **Frontmatter-summary (wiki:2661):** make sure the buffer body has `summary:` as one line in the frontmatter — `wiki.search` cards read it. If missing — append via `mcp__mappa__brainstorm_update` (PATCH - /brainstorm/:id, title/body/status, optimistic version+409) before the - promotion. + /brainstorm/:id, title/body/status, optimistic version+409; id = num | + ref | uuid) before the promotion. - Re-promoting an archived buffer → error (one-shot, idempotent via - status). Cross-check `brainstorm_id` (internal) from step 1. + status). Cross-check `brainstorm_id` (num/ref) from step 1. - If `brainstorm_promote` failed (version conflict, 409) → retry with the - fresh internal id; on a stable failure — abort before creating tasks. + fresh num/ref; on a stable failure — abort before creating tasks. 5b. **Closing an already-completed buffer (no promotion).** When the work is already done and no wiki page is needed (legacy-promoted, resolved by the @@ -257,7 +258,7 @@ brainstorm entity in mappa (type=brainstorm, status=buffer) with the error text; don't create a buffer by guess. - Target project doesn't exist in mappa → abort before promotion. - `brainstorm_promote` failed (409 version / stable refusal) → retry with the - fresh internal id; on a repeated failure — abort before creating tasks. The + fresh num/ref; on a repeated failure — abort before creating tasks. The buffer stays in buffer — retried later. - Buffer already `archive` (repeated call) → abort: promotion is one-shot, idempotence via status (decision 7). diff --git a/skills/mappa-delegation/SKILL.md b/skills/mappa-delegation/SKILL.md index d64363d..564b50a 100644 --- a/skills/mappa-delegation/SKILL.md +++ b/skills/mappa-delegation/SKILL.md @@ -1,7 +1,7 @@ --- name: mappa-delegation author: ours -version: 1.3.0 +version: 1.4.0 description: > The cycle of delegating a task to another agent/project: pre-flight gate → body template → dry-run preview → confirm → covering letter to the @@ -176,6 +176,17 @@ If the task is implementation — create the paired `-review` (status=blocked, blocker=`#n` — the impl task number). Skip for: pointer tasks, ops tasks, research tasks, any non-impl. +**Deploy gate (operator rule 2026-08-26):** if the task requires deploy — its +target is `.admin` (secrets/runbooks are service-use, other agents must NOT +look into them), not the app repo. Deploy is possible ONLY after: impl close → +paired review done → all follow-up tasks closed. Admin gets the task + a +covering letter. + +**Notifying affected projects (operator rule 2026-08-26):** every delegation / +promotion notifies the project agents — the covering letter goes to ALL +affected projects, except yourself (self-copy doesn't count as notifying +others). Task on a board doesn't ping a live session; the letter is the ping. + **`weight` of the review task — inherit from the impl task, but never below `needs-claude`** (set explicitly at `tasks_create`): diff --git a/skills/mappa-knowledge/SKILL.md b/skills/mappa-knowledge/SKILL.md index 3821a73..833e5c5 100644 --- a/skills/mappa-knowledge/SKILL.md +++ b/skills/mappa-knowledge/SKILL.md @@ -1,7 +1,7 @@ --- name: mappa-knowledge author: ours -version: 1.5.1 +version: 1.5.2 description: > The cycle of working with a project's knowledge in Mappa (Karpathy LLM Wiki, channel = mappa entities): ingest → query → lint + a graph layer for @@ -86,10 +86,11 @@ write `summary:` — ONE essence line in the page frontmatter (`---\ntitle: …\ card is poorer — snippet fallback only). Don't insert duplicate info into the body: the summary is compiled once, in the frontmatter. -**Refs and ids (#1037/#1028).** The public surface carries the per-type ref by +**Refs and ids (#1037/#1028, канон task:1221).** The public surface carries the per-type ref by full name as the first field: `ref: "wiki:3"` (decision 20, convention #1028), -`num` next, the global `id` — internal (last). `wiki_update` needs the -internal `id` — from the `wiki_get`/`entity_search` response. In prose — +`num` next, the global `id` — internal (last). `wiki_update` takes the +`num` | `ref wiki:N` | uuid (этап A task:1221 задеплоен: голое число = num; +internal id наружу не используем — выпилится в этапе B). In prose — slug/name first, ref as anchor: "the spec `concepts/session-live-ingest` (wiki:2604)". In page bodies — wikilinks by slug (`[[concepts/foo]]`, decision 4) or per-type refs by full names (`[[task:N]]`/`[[inbox:N]]`). @@ -171,9 +172,9 @@ Question form → tool: | incoming — «кто ссылается на X», «backlinks», "what links to X" | `graph_backlinks({id})` | | health — «сироты», «битые ссылки», «здоровье вики», "orphan pages" | `graph_stats()` + `graph_backlinks(id)` | -**Addressing: slug → internal id.** Resolve `id` via `wiki_get`/`entity_search` -(the last response field; `ref`/`num` — for display). Graph responses carry -per-type refs by full names (`task:N`/`inbox:N`/`wiki:N`, convention #1028) — +**Addressing: slug → num/ref/uuid.** Resolve the key via `wiki_get`/`entity_search` +(ref/num/uuid — публичная адресация, канон task:1221; internal id не используем). Graph +responses carry per-type refs by full names (`task:N`/`inbox:N`/`wiki:N`, convention #1028) — reference them, not ids. An empty `path` = the link genuinely doesn't exist — say so; don't invent a chain from textual proximity. @@ -253,7 +254,7 @@ page already exists; don't proliferate catalog duplicates. work; reading — carve-out. - **Answering a relational question by reading one page.** That's the exact 0%-recall failure — call graph_*. -- **Slugs/paths into graph tools.** Only internal ids, and only fresh ones (a +- **Slugs/paths into graph tools.** Only fresh keys (num/ref/uuid, канон task:1221; a deleted entity → error). - **Dragging the whole wiki into context** to "trace" links by hand — the service does it for zero tokens. diff --git a/skills/mappa-task-work/SKILL.md b/skills/mappa-task-work/SKILL.md index 090b514..6d164dc 100644 --- a/skills/mappa-task-work/SKILL.md +++ b/skills/mappa-task-work/SKILL.md @@ -1,7 +1,7 @@ --- name: mappa-task-work author: ours -version: 1.4.1 +version: 1.5.0 description: > The central cycle of working with tasks in Mappa: orientation → work selection (priority/due) → execution → handover (close + review-umbrella) + @@ -53,8 +53,8 @@ cross-project overview (→ `using-system-snapshot`). | Create a task | `mcp__mappa__task_create(project, slug, title?, description?, status?, priority?, due?)` | **carve-out without a lease**; per-type number (decision 20) | | Close a task | `mcp__mappa__task_close(project, id, version)` | **version-based**: conflict → 409 → retry with the fresh version from task_get | | Update a task | `mcp__mappa__task_update(project, id, parent?, owner?, status?, reason?, version)` | version-based; 409 → retry | -| Read a task | `mcp__mappa__entity_get(id)` | key: uuid or full ref `task:NNN` (task:1067); bare number → 400 | -| Read a task compact | `mcp__mappa__task_get(id)` | key: uuid or `task:NNN`; bare number → 400 | +| Read a task | `mcp__mappa__entity_get(id)` | key: uuid, full ref `task:NNN`, or bare num (канон task:1221: голое число = num) | +| Read a task compact | `mcp__mappa__task_get(id)` | key: uuid, `task:NNN`, or bare num | | Board list | `mcp__mappa__entity_search(q, type='task', project=, limit)` | all statuses | | parent_of tree | `mcp__mappa__graph_tree(root, depth?, fields?, limit?)` | umbrellas/hierarchy | | Related entities | `mcp__mappa__graph_neighbors/backlinks(id)` | refs to the task | @@ -101,7 +101,7 @@ Don't confuse: 🟢 — *done*, not "ready". Ready is ⚪. 2. **Board** — `entity_search(q, type='task', project=, limit=50)`: sort by status (🔴 → 🟡 → ⚪), one line per task — row format from `mappa-presentation` (never raw JSON). -3. If the user named a task — `entity_get(key)` by its ref/uuid (`task:NNN` or uuid; task:1067 — bare numbers rejected). +3. If the user named a task — `entity_get(key)` by its ref/num/uuid (`task:NNN` / bare num / uuid; канон task:1221 — голое число = num). 4. Confirm in one sentence: "We're in the middle of X, next step — Y". 5. Ask whether the plan is right before acting. @@ -154,11 +154,25 @@ Don't confuse: 🟢 — *done*, not "ready". Ready is ⚪. the commissioner: `project=`, `subject="[event: closed] "`, body = the outcome (done, acceptance, references). A live session writes it itself. Task 🟢 ≠ commissioner learned. -5. **Review-umbrella for impl tasks** (canon `mappa-delegation`): if the task - is implementation and closed — the paired `-review` should already - have been created at assignment (status=blocked, blocker=impl#); closing the - impl unblocks the review. Don't create a review yourself if it didn't exist - — that's the assigner's job; mention it in the close-note. +5. **Review for impl tasks (paired, canon rule 4 AGENTS .workshop).** + Every impl task gets a paired review — regardless of the assignment channel: + - **Assigned/delegated task** (`mappa-delegation`): the paired `-review` + was created at assignment (status=blocked, blocker=impl#); closing the impl + unblocks it — the next session in the target reviews. + - **Self-assigned task (your own board, mappa-task-work)**: YOU create the + paired `-review` (status=blocked, blocker=impl#) at the same moment + you create the impl task. **Do not review your own work** — run the review + through a subagent (`review_subagent` / `review-kit-pi-method`: clean + context, non-implementer) after close, then close the review with the + findings (or file them as follow-up tasks). If the subagent is unavailable + — leave the review task for the next session (blocked until then). + - If the impl is already closed — the review is created ready (not blocked). +6. **Deploy gate (impl requiring deploy).** Deploy is possible ONLY after: + close → review (paired, done) → all follow-up tasks closed. Order + irreversible. All deploys go strictly through `.admin` (secrets and + runbooks are service-use; other agents must NOT look into them — only + `secret:` refs). Admin gets a task + covering letter (canon + `mappa-delegation`). Never deploy yourself. 6. Add a summary line to the handoff/wiki if present. ### Pause / switch / session end