fix(skills): канон адресации num/ref/uuid вместо internal id (task:1221) + парная review через субагента + деплой-гейт
mappa-task-work v1.5.0: - entity_get/task_get: uuid | task:NNN | bare num (голое число = num, канон 1221) - Phase 3.5: self-assigned impl-таска создаёт парную review; ревью через субагента (review_subagent/review-kit-pi-method), не сам - Phase 3.6: деплой-гейт (close → review → follow-up done → deploy, через .admin) mappa-brainstorm-promote v1.10.0: - brainstorm_id = num | ref | uuid; PATCH /brainstorm/:id num|ref|uuid - 'bare numbers → 400' убрано (этап A task:1221 задеплоен) mappa-knowledge v1.5.2: - wiki_update: num/ref/uuid вместо internal id; addressing slug → num/ref/uuid mappa-delegation v1.4.0: - деплой-гейт (target .admin, ранбуки/секреты служебные) - уведомление всех затронутых проектов письмом (кроме себя)
This commit is contained in:
BIN
dist/mappa-brainstorm-promote.skill
vendored
BIN
dist/mappa-brainstorm-promote.skill
vendored
Binary file not shown.
BIN
dist/mappa-delegation.skill
vendored
BIN
dist/mappa-delegation.skill
vendored
Binary file not shown.
BIN
dist/mappa-knowledge.skill
vendored
BIN
dist/mappa-knowledge.skill
vendored
Binary file not shown.
BIN
dist/mappa-task-work.skill
vendored
BIN
dist/mappa-task-work.skill
vendored
Binary file not shown.
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: mappa-brainstorm-promote
|
name: mappa-brainstorm-promote
|
||||||
author: ours
|
author: ours
|
||||||
version: 1.9.0
|
version: 1.10.0
|
||||||
description: >
|
description: >
|
||||||
Finalize a brainstorm buffer (mappa type=brainstorm, status=buffer): two
|
Finalize a brainstorm buffer (mappa type=brainstorm, status=buffer): two
|
||||||
paths. (1) Promote a matured buffer — read → target → brainstorm_promote
|
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',
|
1. **Find the buffer in mappa.** `mcp__mappa__entity_search(type='brainstorm',
|
||||||
project=<project>, q=<topic>)` → in the results brainstorm:N (ref). Read the
|
project=<project>, q=<topic>)` → in the results brainstorm:N (ref). Read the
|
||||||
full buffer: `mcp__mappa__entity_get(key)` — key = uuid or full ref
|
full buffer: `mcp__mappa__entity_get(key)` — key = uuid, full ref
|
||||||
`brainstorm:N` (task:1067; bare numbers → 400) — body = running record
|
`brainstorm:N`, or bare num (канон адресации task:1221: голое число = num;
|
||||||
(frontmatter + rounds). The response carries the internal `id` for
|
этап A задеплоен) — body = running record (frontmatter + rounds).
|
||||||
`brainstorm_promote`.
|
Адресация буфера — по num/ref/uuid, internal id наружу не используем
|
||||||
|
(выпилится в этапе B, task:1221).
|
||||||
|
|
||||||
If the buffer is not in mappa — create a brainstorm entity via
|
If the buffer is not in mappa — create a brainstorm entity via
|
||||||
`mcp__mappa__brainstorm_create` (or HTTP `POST /entities` type=brainstorm,
|
`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):**
|
5. **Content promotion (always via `brainstorm_promote`, decision 7):**
|
||||||
|
|
||||||
`mcp__mappa__brainstorm_promote(project=<target>, brainstorm_id=<internal id>)`
|
`mcp__mappa__brainstorm_promote(project=<target>, brainstorm_id=<num | ref brainstorm:N | uuid>)`
|
||||||
|
|
||||||
- Atomically: buffer → wiki page (slug from the buffer, body preserved,
|
- Atomically: buffer → wiki page (slug from the buffer, body preserved,
|
||||||
parent_of buffer→wiki edges and refs→buffer) + buffer → `archive` +
|
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
|
- **Frontmatter-summary (wiki:2661):** make sure the buffer body has
|
||||||
`summary:` as one line in the frontmatter — `wiki.search` cards read it.
|
`summary:` as one line in the frontmatter — `wiki.search` cards read it.
|
||||||
If missing — append via `mcp__mappa__brainstorm_update` (PATCH
|
If missing — append via `mcp__mappa__brainstorm_update` (PATCH
|
||||||
/brainstorm/:id, title/body/status, optimistic version+409) before the
|
/brainstorm/:id, title/body/status, optimistic version+409; id = num |
|
||||||
promotion.
|
ref | uuid) before the promotion.
|
||||||
- Re-promoting an archived buffer → error (one-shot, idempotent via
|
- 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
|
- 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
|
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
|
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.
|
with the error text; don't create a buffer by guess.
|
||||||
- Target project doesn't exist in mappa → abort before promotion.
|
- Target project doesn't exist in mappa → abort before promotion.
|
||||||
- `brainstorm_promote` failed (409 version / stable refusal) → retry with the
|
- `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 stays in buffer — retried later.
|
||||||
- Buffer already `archive` (repeated call) → abort: promotion is one-shot,
|
- Buffer already `archive` (repeated call) → abort: promotion is one-shot,
|
||||||
idempotence via status (decision 7).
|
idempotence via status (decision 7).
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: mappa-delegation
|
name: mappa-delegation
|
||||||
author: ours
|
author: ours
|
||||||
version: 1.3.0
|
version: 1.4.0
|
||||||
description: >
|
description: >
|
||||||
The cycle of delegating a task to another agent/project: pre-flight gate →
|
The cycle of delegating a task to another agent/project: pre-flight gate →
|
||||||
body template → dry-run preview → confirm → covering letter to the
|
body template → dry-run preview → confirm → covering letter to the
|
||||||
@@ -176,6 +176,17 @@ If the task is implementation — create the paired `<slug>-review`
|
|||||||
(status=blocked, blocker=`#n` — the impl task number). Skip for: pointer
|
(status=blocked, blocker=`#n` — the impl task number). Skip for: pointer
|
||||||
tasks, ops tasks, research tasks, any non-impl.
|
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
|
**`weight` of the review task — inherit from the impl task, but never below
|
||||||
`needs-claude`** (set explicitly at `tasks_create`):
|
`needs-claude`** (set explicitly at `tasks_create`):
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: mappa-knowledge
|
name: mappa-knowledge
|
||||||
author: ours
|
author: ours
|
||||||
version: 1.5.1
|
version: 1.5.2
|
||||||
description: >
|
description: >
|
||||||
The cycle of working with a project's knowledge in Mappa (Karpathy LLM Wiki,
|
The cycle of working with a project's knowledge in Mappa (Karpathy LLM Wiki,
|
||||||
channel = mappa entities): ingest → query → lint + a graph layer for
|
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
|
card is poorer — snippet fallback only). Don't insert duplicate info into the
|
||||||
body: the summary is compiled once, in the frontmatter.
|
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),
|
full name as the first field: `ref: "wiki:3"` (decision 20, convention #1028),
|
||||||
`num` next, the global `id` — internal (last). `wiki_update` needs the
|
`num` next, the global `id` — internal (last). `wiki_update` takes the
|
||||||
internal `id` — from the `wiki_get`/`entity_search` response. In prose —
|
`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`
|
slug/name first, ref as anchor: "the spec `concepts/session-live-ingest`
|
||||||
(wiki:2604)". In page bodies — wikilinks by slug (`[[concepts/foo]]`,
|
(wiki:2604)". In page bodies — wikilinks by slug (`[[concepts/foo]]`,
|
||||||
decision 4) or per-type refs by full names (`[[task:N]]`/`[[inbox:N]]`).
|
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})` |
|
| incoming — «кто ссылается на X», «backlinks», "what links to X" | `graph_backlinks({id})` |
|
||||||
| health — «сироты», «битые ссылки», «здоровье вики», "orphan pages" | `graph_stats()` + `graph_backlinks(id)` |
|
| health — «сироты», «битые ссылки», «здоровье вики», "orphan pages" | `graph_stats()` + `graph_backlinks(id)` |
|
||||||
|
|
||||||
**Addressing: slug → internal id.** Resolve `id` via `wiki_get`/`entity_search`
|
**Addressing: slug → num/ref/uuid.** Resolve the key via `wiki_get`/`entity_search`
|
||||||
(the last response field; `ref`/`num` — for display). Graph responses carry
|
(ref/num/uuid — публичная адресация, канон task:1221; internal id не используем). Graph
|
||||||
per-type refs by full names (`task:N`/`inbox:N`/`wiki:N`, convention #1028) —
|
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 —
|
reference them, not ids. An empty `path` = the link genuinely doesn't exist —
|
||||||
say so; don't invent a chain from textual proximity.
|
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.
|
work; reading — carve-out.
|
||||||
- **Answering a relational question by reading one page.** That's the exact
|
- **Answering a relational question by reading one page.** That's the exact
|
||||||
0%-recall failure — call graph_*.
|
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).
|
deleted entity → error).
|
||||||
- **Dragging the whole wiki into context** to "trace" links by hand — the
|
- **Dragging the whole wiki into context** to "trace" links by hand — the
|
||||||
service does it for zero tokens.
|
service does it for zero tokens.
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
name: mappa-task-work
|
name: mappa-task-work
|
||||||
author: ours
|
author: ours
|
||||||
version: 1.4.1
|
version: 1.5.0
|
||||||
description: >
|
description: >
|
||||||
The central cycle of working with tasks in Mappa: orientation → work
|
The central cycle of working with tasks in Mappa: orientation → work
|
||||||
selection (priority/due) → execution → handover (close + review-umbrella) +
|
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) |
|
| 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 |
|
| 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 |
|
| 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 | `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 or `task:NNN`; bare number → 400 |
|
| 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=<name>, limit)` | all statuses |
|
| Board list | `mcp__mappa__entity_search(q, type='task', project=<name>, limit)` | all statuses |
|
||||||
| parent_of tree | `mcp__mappa__graph_tree(root, depth?, fields?, limit?)` | umbrellas/hierarchy |
|
| 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 |
|
| 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=<name>, limit=50)`: sort
|
2. **Board** — `entity_search(q, type='task', project=<name>, limit=50)`: sort
|
||||||
by status (🔴 → 🟡 → ⚪), one line per task — row format from
|
by status (🔴 → 🟡 → ⚪), one line per task — row format from
|
||||||
`mappa-presentation` (never raw JSON).
|
`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".
|
4. Confirm in one sentence: "We're in the middle of X, next step — Y".
|
||||||
5. Ask whether the plan is right before acting.
|
5. Ask whether the plan is right before acting.
|
||||||
|
|
||||||
@@ -154,11 +154,25 @@ Don't confuse: 🟢 — *done*, not "ready". Ready is ⚪.
|
|||||||
the commissioner: `project=<notify>`, `subject="[event: closed] <slug>"`,
|
the commissioner: `project=<notify>`, `subject="[event: closed] <slug>"`,
|
||||||
body = the outcome (done, acceptance, references). A live session writes it
|
body = the outcome (done, acceptance, references). A live session writes it
|
||||||
itself. Task 🟢 ≠ commissioner learned.
|
itself. Task 🟢 ≠ commissioner learned.
|
||||||
5. **Review-umbrella for impl tasks** (canon `mappa-delegation`): if the task
|
5. **Review for impl tasks (paired, canon rule 4 AGENTS .workshop).**
|
||||||
is implementation and closed — the paired `<slug>-review` should already
|
Every impl task gets a paired review — regardless of the assignment channel:
|
||||||
have been created at assignment (status=blocked, blocker=impl#); closing the
|
- **Assigned/delegated task** (`mappa-delegation`): the paired `<slug>-review`
|
||||||
impl unblocks the review. Don't create a review yourself if it didn't exist
|
was created at assignment (status=blocked, blocker=impl#); closing the impl
|
||||||
— that's the assigner's job; mention it in the close-note.
|
unblocks it — the next session in the target reviews.
|
||||||
|
- **Self-assigned task (your own board, mappa-task-work)**: YOU create the
|
||||||
|
paired `<slug>-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:<path>` refs). Admin gets a task + covering letter (canon
|
||||||
|
`mappa-delegation`). Never deploy yourself.
|
||||||
6. Add a summary line to the handoff/wiki if present.
|
6. Add a summary line to the handoff/wiki if present.
|
||||||
|
|
||||||
### Pause / switch / session end
|
### Pause / switch / session end
|
||||||
|
|||||||
Reference in New Issue
Block a user