# Codeck

> |

- **Type:** Skill
- **Install:** `agentstack add skill-hiyeshu-codeck-codeck`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [hiyeshu](https://agentstack.voostack.com/s/hiyeshu)
- **Installs:** 0
- **Category:** [Agent Skills](https://agentstack.voostack.com/c/agent-skills)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [hiyeshu](https://github.com/hiyeshu)
- **Source:** https://github.com/hiyeshu/codeck/tree/main/skills/codeck
- **Website:** https://codeck.sh

## Install

```sh
agentstack add skill-hiyeshu-codeck-codeck
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# codeck — Deck Room Entry

Open the deck room, scan materials, diagnose project state, route work to role lanes, and write the role channel as work moves.

Flag anomalies proactively: stale stages, upstream changes not reflected downstream, unresolved threads, and tasks without a handoff.

## Deck room model

codeck follows a slock-style collaboration model in one skill runtime.

A skill is a channel: an addressable role with a clear write boundary, durable
room files, and a handoff protocol. `/codeck` is the entry channel. The
sub-skills are internal channels that own one part of the room.

Fixed role lanes:

| Handle | Owns | Writes |
|--------|------|--------|
| `@orchestrator` | room state, routing, task tickets, threads, handoffs | `MEMORY.md`, `tasks/tasks.md`, `threads/threads.md`, `channel/YYYY-MM-DD.md`, `roles/*.md` |
| `@outline` | narrative, deck content, slide structure | `deck.md` |
| `@design` | design skeleton, visual system, HTML source | `DESIGN.md`, `custom.css`, `slides.html` |
| `@review` | audience resistance, QA, scoped fixes | `review.md`, scoped fixes to `slides.html` / `custom.css` |
| `@speech` | talk track, presenter notes | `speech.md`, HTML `data-notes` |
| `@export` | PDF/PPTX output and export QA | PDF/PPTX files, export notes in `review.md` or `MEMORY.md` |

Dynamic role persona:

- Read `diagnosis.md` for the recommended person behind `@outline`, `@design`, and `@review`.
- The fixed handle owns the work. The dynamic person shapes the judgment.
- Example: `@outline` may work with Feynman's instinct; `@design` may use Ravel's formal logic.

Default user-facing output is compact: judgment, artifact, next action. The expanded role channel is written to `channel/YYYY-MM-DD.md`; show it only when the user asks to see the channel.

Compact response shape:

```markdown
codeck: {state}

I read this as {task}. I {did/will do} {action}.

Artifact: `{path}`
Next: `{next command or next lane}`
```

When the user asks to see the channel, show the handoff:

```markdown
@orchestrator
I read the current request as: {task}. Owner: @outline.

@outline
I will change `deck.md` first and leave visual files alone.

@design
I will rebuild `slides.html` and `custom.css` after the content changes.

@review
I will check whether the change lands for the target audience.
```

## Room document contract

Room documents are not equal. The room has one current truth layer, one work-state layer, and one audit layer.

| Layer | Files | Read rule | Write rule |
|-------|-------|-----------|------------|
| Current truth | `MEMORY.md`, `deck.md`, `DESIGN.md`, `custom.css`, `slides.html`, latest assembled HTML, `speech.md` when present | Read first. These files define the rebuildable deck. | Rewrite compactly so they describe the current room, not the whole history. |
| Work state | `diagnosis.md`, `tasks/tasks.md`, `threads/threads.md`, `roles/*.md`, `review.md` | Read current material diagnosis, active tickets, open decisions, lane persona/rules, and the latest valid review. | Keep live coordination clear; mark old decisions answered/defaulted/superseded. |
| Audit trail | `channel/YYYY-MM-DD.md`, legacy `PROJECT.md`, legacy `outline.md`, legacy `design-notes.md`, superseded review notes, generated old previews | Read only when debugging history or when the user asks to see the channel. | Append-only or leave untouched. Never use as generation truth. |

Read order for every lane:

1. `MEMORY.md` Active Context, Role Registry, Open Threads, Task Index, Artifacts, Assumed Defaults, Decision Log.
2. `tasks/tasks.md` open or active rows only.
3. `threads/threads.md` open rows and their detail blocks only; closed rows are audit evidence.
4. `diagnosis.md` for material interpretation and dynamic persona, when present.
5. `roles/{lane}.md` for current lane persona and lane-local rules.
6. Owned source: `deck.md`; `DESIGN.md` before `custom.css` / `slides.html`; assembled HTML only after `build-html.sh`.
7. `channel/YYYY-MM-DD.md` only for audit/debug. Channel text must not override current truth.

Legacy artifacts:

- `outline.md` is audit-only if found from an older room. Do not read, write, or recreate it during normal generation.
- `design-notes.md` is a legacy design scratchpad from main. Do not recreate it; migrate useful facts into `DESIGN.md`, `roles/design.md`, or latest valid `review.md`.
- `review.md` is the latest QA report only when it matches the current assembled HTML. If HTML changed after review, treat review as stale.
- Old project-root `*-rN.html` or `*-deck.css` files are historical unless they were produced by the current `build-html.sh` path.

## Memory protocol

`MEMORY.md` is the deck room index and current-state map. It replaces `PROJECT.md`.

Keep it short. Store current decisions, state, and indexes. Do not paste the full deck, channel transcript, or stale preview history.

`MEMORY.md` must include:

```markdown
# Memory

## Active Context
- Current request:
- Active lane:
- Next:
- Blockers:

## Room Truth Contract
- Current truth: MEMORY.md, deck.md, DESIGN.md, custom.css, slides.html, latest assembled HTML, speech.md when present.
- Work state: diagnosis.md current material reading, tasks/tasks.md active tickets, threads/threads.md open decisions and decision ledger, roles/*.md lane memory, latest valid review.md.
- Audit only: channel/YYYY-MM-DD.md, legacy PROJECT.md, legacy outline.md, legacy design-notes.md, superseded reviews, old previews, project-root sibling CSS.
- Rule: audit text never overrides current truth; legacy outline.md is never a generation source.

## Role Registry
| Handle | Dynamic persona | Owns | Writes |
|--------|-----------------|------|--------|
| @orchestrator | codeck room lead | room state, routing, handoffs | MEMORY.md, tasks, threads, channel, roles |
| @outline | {from diagnosis.md or fallback} | narrative and deck content | deck.md |
| @design | {from diagnosis.md or fallback} | design skeleton, visual system, HTML source | DESIGN.md, custom.css, slides.html |
| @review | {from diagnosis.md or fallback} | audience resistance and QA | review.md, scoped source fixes |
| @speech | {coach if needed} | speech script and presenter notes | speech.md, HTML data-notes |
| @export | publisher | PDF/PPTX output and QA | PDF/PPTX, export notes |

## Latest Channel Summary
{short summary of the latest role exchange}

## Open Threads
| ID | Kind | Owner | Status | Blocking | Writes To | Decision |
|----|------|-------|--------|----------|-----------|----------|

## Task Index
| Task | Owner | Status | Artifact | Handoff |
|------|-------|--------|----------|---------|

## Artifacts
- Diagnosis:
- Content source:
- Design source:
- Current preview:
- Latest review:
- Speech:
- Final exports:

## Assumed Defaults
- {field}: {value} — {reason}

## Decision Log
| Time | ID | Moment | Resolution | Source |
|------|----|--------|------------|--------|
```

Workspace directories:

```text
$DECK_DIR/MEMORY.md
$DECK_DIR/channel/YYYY-MM-DD.md
$DECK_DIR/tasks/tasks.md
$DECK_DIR/threads/threads.md
$DECK_DIR/roles/orchestrator.md
$DECK_DIR/roles/outline.md
$DECK_DIR/roles/design.md
$DECK_DIR/roles/review.md
$DECK_DIR/roles/speech.md
$DECK_DIR/roles/export.md
```

`channel/YYYY-MM-DD.md` stores expanded role turns. Append one block per handoff:

Channel is an audit trail. Do not read it during normal generation, and do not let old channel facts override `MEMORY.md`, `deck.md`, or `DESIGN.md`.

```markdown
## {ISO time} — {request}

@orchestrator
{routing read}

@{owner}
{claim and action}

@{next-owner}
{handoff if any}
```

`tasks/tasks.md` stores live claim tickets. Do not use hard locks. Each ticket has owner, status, artifact, and handoff. Closed history belongs in `MEMORY.md` summaries or channel, not as a growing task backlog.

`threads/threads.md` stores unresolved decisions, content conflicts, design disputes, cross-owner proposals, and the Decision Ask ledger. A user-facing question is never free-floating; it must first exist here as a decision record. Once resolved, copy the outcome into the owned source and `MEMORY.md` Decision Log, then mark the thread answered/defaulted/superseded. Normal reads treat only `open` rows as work state.

For Decision Ask entries, keep an index row and a short detail block:

```markdown
| D-20260511-01 | Decision Ask: Deck Intent | @outline | open | true | deck.md, MEMORY.md | choose audience scene/duration package |

### D-20260511-01 — Deck Intent
- Reason:
- Current read:
- Recommendation:
- Options:
  - A:
  - B:
  - C:
- Default:
- Runtime:
```

`roles/*.md` stores each fixed lane's long-lived rules plus current dynamic persona. Update it when `diagnosis.md` changes.

Legacy migration:

- If `MEMORY.md` is missing but `PROJECT.md` exists, read `PROJECT.md` as legacy memory.
- On the next state write, create `MEMORY.md` and copy intent/defaults/AskUser or Decision Log entries into the matching sections.
- Leave `PROJECT.md` untouched. Do not keep writing to it.

## Decision Ask Policy

Decision Ask is a room-scoped decision layer, not a questionnaire. AskUser UI is only one possible renderer.

The room is the durable scope. A necessary ask belongs to `$DECK_DIR/threads/threads.md` first, then renders through the runtime:

```text
Decision Ask semantics -> AskUser UI if available -> plain text pause if blocking -> assumed default if non-blocking
```

Default rule:

```text
Infer what materials already prove.
Use a reasonable default when the risk is low.
Ask only when the answer changes the deck direction.
```

One `/codeck` run may use at most **2 Decision Ask rounds**. Count all internal modules against that budget.

Allowed Decision Ask moments:

1. **Project Init** — only when project state is missing or ambiguous.
2. **Deck Intent** — audience scene, duration, language, and core goal. Bundle these into one round. Skip fields already clear from the user request, materials, `MEMORY.md`, or `deck.md`. Do not ask for slide count directly; derive it from duration: 15 minutes ≈ 10 pages, 30 minutes ≈ 20 pages, 45 minutes ≈ 25-30 pages.
3. **Design Direction** — before visual generation or when user says "change the visual style".
4. **Export Format** — only when user says "export" without PDF / PPTX / all.
5. **Speech Style** — only when user asks for a script and style or duration is missing.

Never create a Decision Ask for:

- Generic permission to continue
- Whether to generate HTML
- Whether to run review
- Whether to save files
- Whether to use existing materials

Those steps are automatic.

Decision record shape:

```text
id: D-YYYYMMDD-NN
owner: @orchestrator | @outline | @design | @export | @speech | @review
moment: Project Init | Deck Intent | Design Direction | Export Format | Speech Style | User-Owned Conflict
reason: why this cannot be safely inferred
current_read: what the room already knows
recommendation: the preferred option and one concrete reason
options: 2-3 mutually exclusive packages
default: the option to use if non-blocking or unanswered
blocking: true only when inventing the answer would damage the deck direction or user commitment
writes_to: MEMORY.md | deck.md | DESIGN.md | speech.md | review.md | export artifact
status: open | answered | defaulted | superseded
```

Every rendered ask must contain:

1. **Re-ground** — which skill, which step. One line.
2. **Current read** — what the system thinks is true.
3. **Recommendation** — `Suggest [X] because [reason]`.
4. **Options** — 2-3 mutually exclusive choices. Mark one as recommended.

Only state verified facts. Unexecuted actions use "will / plan to".

Runtime rendering:

1. If structured AskUser UI is available, render the decision through that UI.
2. If no structured UI is available and `blocking: true`, show the same decision as a compact plain-text question, write it to `threads/threads.md`, and stop before mutating the target artifact.
3. If no structured UI is available and `blocking: false`, use the default, record `assumed default`, and continue.
4. If the 2-round budget is exhausted, use the default only for non-blocking decisions; leave blocking decisions open in `threads/threads.md` and stop.

If the user does not answer a non-blocking decision, use the recommended option. Record it in `MEMORY.md` as `assumed default`.

Persist every Decision Ask result:

- `threads/threads.md` stores every open decision before it is rendered to the user.
- `MEMORY.md` stores current room state, project-level intent, defaults, Decision Log, task index, thread index, and artifact index. It is not a transcript.
- `deck.md` stores deck-shaping decisions that affect rebuilds.

Automatic light review must not trigger Decision Ask. Write findings and fixes to `review.md`. Ask only when the content has a real conflict the user must decide.

---

## Single-entry routing

`/codeck` routes the user's request before running the pipeline:

| User intent | Action | Decision Ask |
|-------------|--------|--------------|
| New / continue deck | `@orchestrator` opens room → scan → diagnose → `@outline` → `@design` → `@review` | Deck Intent and Design Direction only if needed, max 2 rounds |
| "make slide 3 less dense" / concrete content edit | `@outline` edits `deck.md` → `@design` rebuilds → `@review` checks | none |
| "change visual style" / "change style" | `@design` runs Design Direction, updates `DESIGN.md`, rebuilds → `@review` checks | Design Direction |
| "export" | `@export` exports latest HTML | Export Format only if PDF / PPTX / all is missing |
| "export PDF" / "export PPTX" | `@export` exports requested format | none |
| "create speech script" | `@speech` generates `speech.md` and syncs notes | Speech Style only if style or duration is missing |

For edits, `deck.md` is the single truth source. HTML is the audience preview, not the editing surface.

Before a lane works:

1. `@orchestrator` writes or updates a task ticket.
2. The owner states the claim in channel.
3. The owner reads only the needed current-truth and work-state artifacts. Do not read channel unless debugging history.
4. Cross-owner changes go to `threads/threads.md` as proposals.

After a lane works:

1. Update the task ticket.
2. Rewrite `MEMORY.md` Active Context, Latest Channel Summary, Open Threads, Task Index, Artifacts, Assumed Defaults, and Decision Log so they describe current state.
3. Append the role exchange to today's channel file.
4. Keep the user response compact unless the user asked for the channel.

## Two directories

- **Current directory (`.`)** — the user's project. Materials live here. **Final HTML goes here too** so the user can open it directly.
- **`$DECK_DIR`** — codeck's deck room. `MEMORY.md`, `channel/`, `tasks/`, `threads/`, `roles/`, `deck.md`, `diagnosis.md`, `DESIGN.md`, `custom.css`, `slides.html`, `review.md`, `speech.md`.

Scan materials in `.`. Write intermediate artifacts to `$DECK_DIR`. Output final HTML to `.`.

## Phase 1: Init + status

```bash
DECK_DIR="$HOME/.codeck/projects/$(basename "$(pwd)")"
CODECK_SKILL_DIR="${CODECK_SKILL_DIR:-}"
if [ -z "$CODECK_SKILL_DIR" ]; then
  for d in "$HOME/.agents/skills/codeck" "$HOME/.codex/skills/codeck" "$HOME/.claude/skills/codeck"; do
    if [ -d "$d/scripts" ]; then CODECK_SKILL_DIR="$d"; break; fi
  done
fi
[ -n "$CODECK_SKILL_DIR" ] || { echo "codeck skill scripts not found" >&2; exit 1; }
mkdir -p "$DECK_DIR"
mkdir -p "$DECK_DIR/channel" "$DECK_DIR/tasks" "$DECK_DIR/threads" "$DECK_DIR/roles"
bash "$CODECK_SKILL_DIR/scripts/init-room.sh" "$DECK_DIR"

bash "$CODECK_SKILL_DIR/scripts/status.sh" "$DECK_DIR"
```

Initialize the room before creating any Decision Ask:

1. If `$DECK_DIR/MEMORY.md` is missing, create it from the Memory protocol template.
2. If `$DECK_DIR/PROJECT.md` exists, migrate its intent, defaults, and AskUser / Decision Log entries into `MEMORY.md`.
3. If `$DECK_DIR/tasks/tasks.md` is missing, create it with the task ticket table.
4. If `$DECK_DIR/threads/threads.md` is missing, create it w

…

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [hiyeshu](https://github.com/hiyeshu)
- **Source:** [hiyeshu/codeck](https://github.com/hiyeshu/codeck)
- **License:** MIT
- **Homepage:** https://codeck.sh

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** yes
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-hiyeshu-codeck-codeck
- Seller: https://agentstack.voostack.com/s/hiyeshu
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
