MemPalace Task Handoff
MemPalace/mempalace
Creates, hands off, claims, executes and closes agent tasks through the MemPalace logstream, with approval of the exact task before it is recorded.
Breaks a brief into ordered goals, keeps a durable ledger under .omc/ultragoal and prints handoff text so a Claude /goal run survives session restarts.
$ npx skills add Yeachan-Heo/gajae-code --skill ultragoal -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Yeachan-Heo/gajae-code ultragoal --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Yeachan-Heo/gajae-code.git skills-src && mkdir -p .claude/skills && cp -r skills-src/packages/coding-agent/src/defaults/gjc/skills/ultragoal .claude/skills/ultragoal && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "ultragoal" agent skill from https://github.com/Yeachan-Heo/gajae-code/tree/main/packages/coding-agent/src/defaults/gjc/skills/ultragoal into .claude/skills/ultragoal/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ultragoal", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Yeachan-Heo/gajae-code/tree/main/packages/coding-agent/src/defaults/gjc/skills/ultragoalType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Yeachan-Heo/gajae-code --skill ultragoal -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Yeachan-Heo/gajae-code ultragoal --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Yeachan-Heo/gajae-code.git skills-src && mkdir -p .agents/skills && cp -r skills-src/packages/coding-agent/src/defaults/gjc/skills/ultragoal .agents/skills/ultragoal && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "ultragoal" agent skill from https://github.com/Yeachan-Heo/gajae-code/tree/main/packages/coding-agent/src/defaults/gjc/skills/ultragoal into .agents/skills/ultragoal/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ultragoal", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Yeachan-Heo/gajae-code --skill ultragoal -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Yeachan-Heo/gajae-code ultragoal --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Yeachan-Heo/gajae-code.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/packages/coding-agent/src/defaults/gjc/skills/ultragoal .cursor/skills/ultragoal && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "ultragoal" agent skill from https://github.com/Yeachan-Heo/gajae-code/tree/main/packages/coding-agent/src/defaults/gjc/skills/ultragoal into .cursor/skills/ultragoal/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ultragoal", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Yeachan-Heo/gajae-code.git --path packages/coding-agent/src/defaults/gjc/skills/ultragoal--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Yeachan-Heo/gajae-code --skill ultragoal -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Yeachan-Heo/gajae-code ultragoal --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Yeachan-Heo/gajae-code.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/packages/coding-agent/src/defaults/gjc/skills/ultragoal .gemini/skills/ultragoal && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "ultragoal" agent skill from https://github.com/Yeachan-Heo/gajae-code/tree/main/packages/coding-agent/src/defaults/gjc/skills/ultragoal into .gemini/skills/ultragoal/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ultragoal", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Yeachan-Heo/gajae-code ultragoalInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Yeachan-Heo/gajae-code --skill ultragoal -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Yeachan-Heo/gajae-code.git skills-src && mkdir -p .github/skills && cp -r skills-src/packages/coding-agent/src/defaults/gjc/skills/ultragoal .github/skills/ultragoal && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "ultragoal" agent skill from https://github.com/Yeachan-Heo/gajae-code/tree/main/packages/coding-agent/src/defaults/gjc/skills/ultragoal into .github/skills/ultragoal/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ultragoal", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Yeachan-Heo/gajae-code --skill ultragoal -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Yeachan-Heo/gajae-code ultragoal --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Yeachan-Heo/gajae-code.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/packages/coding-agent/src/defaults/gjc/skills/ultragoal .opencode/skills/ultragoal && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "ultragoal" agent skill from https://github.com/Yeachan-Heo/gajae-code/tree/main/packages/coding-agent/src/defaults/gjc/skills/ultragoal into .opencode/skills/ultragoal/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "ultragoal", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
ultragoalBreaks a brief into ordered goals, keeps a durable ledger under .omc/ultragoal and prints handoff text so a Claude /goal run survives session restarts.
Ultragoal splits a brief into an ordered set of goals and records start, checkpoint, blocker and failure events in an append-only ledger kept in the repository under `.omc/ultragoal`. The `omc ultragoal` command only writes those artifacts and prints a handoff for the active Claude agent, which must act on it in-session; it cannot change Claude's `/goal` state from the shell.
Claude Code's `/goal` is a session-scoped hook that keeps a session going until a condition holds, but it loses state across sessions. Ultragoal adds a durable plan, per-story attempt counts and evidence, and a final gate that runs ai-slop-cleaner, verification and a code review before completion. Goals are created from a brief file or from explicit goal arguments, in aggregate mode by default or per story with `--claude-goal-mode per-story`. It is not meant for single small changes, planning-only work or invoking `/goal` from a shell. The excerpt is cut off in the notes on parallel sessions.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 91fe978. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
No scripts in the folder and no shell commands in SKILL.md (its code samples are bash and json).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Ultragoal Multi-Goal Ledger loads about 8.4k tokens when it runs. Until then it costs about 24 tokens; SKILL.md has 3,852 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Yeachan-Heo/gajae-code at commit 91fe978, republished under its MIT licence (© Yeachan-Heo). 3,852 words, ~8,392 tokens.
.claude/skills/ultragoal/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.Use when the user asks for ultragoal, create-goals, complete-goals, durable multi-goal planning, or sequential execution over GJC goal mode.
ultragoal turns a brief into repo-native durable artifacts and then drives execution through the unified goal tool as a UX bridge only. goals.json is the canonical source of goal identity and state; ledger.jsonl is the canonical proof stream for checkpoints, receipts, blockers, steering, and reviews. The inline goal tool and goal-mode-request create-bridge exist only to keep the agent's interactive loop focused on the current aggregate or story objective. Completion is verified purely from durable goals.json plus fresh ledger.jsonl receipts, never from inline goal state. The agent, not the CLI or hooks, calls goal({"op":"complete"}) or goal({"op":"drop"}) after durable run completion or cleanup; CLI commands and hooks never mutate goal state.
.gjc/_session-{sessionid}/ultragoal/brief.md.gjc/_session-{sessionid}/ultragoal/goals.json.gjc/_session-{sessionid}/ultragoal/ledger.jsonl (checkpoint and structured steering audit events)Existing aggregate plans with the legacy enumerated objective are migrated to the stable pointer objective on read, persisted to goals.json, retained in gjcObjectiveAliases for already-active hidden goal reconciliation, and audited with an aggregate_objective_migrated ledger entry.
gjc.ultragoal.nudgeBudget, default 10, non-negative integer) is read
through one shared resolver in this exact order (first valid value wins):.gjc/config.yml<agentDir>/config.yml (normally ~/.gjc/agent/config.yml, honoring
GJC_CODING_AGENT_DIR/PI_CODING_AGENT_DIR; XDG applies only to categorized data/state/cache subdirs, never the workflow config path)config.yml uses the nested (schema) form - gjc: { ultragoal: { nudgeBudget } }.
Project configuration beats user configuration. The reported source is the
canonical path of the winning file, or default. config.yml is the ONLY
settings surface: the legacy settings.json files (project and config-root)
are retired: the config-root ~/.gjc/settings.json is migrated once into the
default global agent config.yml and its source removed, while the project
.gjc/settings.json is retained for non-workflow settings (only its workflow
keys are migrated into project .gjc/config.yml and no longer read unless a migration target is absent - a migration that could not publish (e.g. a read-only .gjc) leaves the retained legacy value effective as the previously configured override until it can publish). Invalid optional settings
files continue to the next layer or the default (tolerant).When ultragoal detects its own current-session state is corrupt, tampered, unreadable, or stale on resume, run gjc state clear --force --mode ultragoal before reseeding or restarting. Scope the clear to the current session via --session-id, the command payload, or GJC_SESSION_ID; it clears only ultragoal state for that session and never clears other skills or sessions.
Use these exact gjc ultragoal commands before spending tool calls rediscovering syntax:
gjc ultragoal status
gjc ultragoal status --json
gjc ultragoal create-goals --brief "<brief>"
gjc ultragoal create-goals --brief-file <path>
gjc ultragoal complete-goals
gjc ultragoal complete-goals --retry-failed
gjc ultragoal quality-gate source-hash --json
gjc ultragoal quality-gate validate --quality-gate-json <quality-gate-json-or-path> [--goal-id <id>] [--json]
gjc ultragoal checkpoint --goal-id <id> --status complete --evidence "<evidence>" --quality-gate-json <quality-gate-json-or-path>
gjc ultragoal checkpoint --goal-id <id> --status failed --evidence "<blocker/evidence>"
gjc ultragoal record-review-blockers --goal-id <id> --title "Resolve final review blockers" --objective "<blocker-resolution objective>" --evidence "<review findings>"Use these exact goal-tool calls for the inline goal state:
goal({"op":"get"})
goal({"op":"create","objective":"<printed aggregate or per-story objective>"})
goal({"op":"complete"})
goal({"op":"drop"})
goal({"op":"resume"})drop clears the active goal without exiting goal mode; resume reactivates a paused goal.
Decide on the brief. To produce multiple stories, separate them with a reserved @goal: delimiter line; the title follows on the same line and the objective is everything beneath it until the next delimiter:
Shared brief constraints / context go here (optional preamble).
@goal: Parse the intake CSVs
Ingest reviewer CSVs from the watch dir, validate headers, and reject
malformed rows with a per-row reason. Objectives can span multiple lines
and contain `code`, "quotes", or commands — no escaping needed.
@goal: Normalize records
Map raw rows onto the canonical schema and dedupe by record id.
@goal: Export the audit report
Emit an audit-ready report covering every accepted and rejected row.Delimiter contract:
@goal line is a story boundary only when it starts at column 0 (no leading whitespace) and the character right after @goal is :, whitespace (space or tab), or end-of-line. So @goal: Title, @goal Title, and a bare @goal line all open a story.@goalish, @goals:, @goal-foo, @goal.foo, @goal/foo, and any indented or mid-line @goal are ordinary objective text, not delimiters. To keep a literal @goal line inside an objective, indent it.create-goals errors instead of writing a placeholder goal.@goal delimiter) is global context/constraints only; it is retained in the brief but is not turned into a goal. Every executable story needs its own @goal block.@goal delimiter anywhere, the whole brief becomes a single goal G001 (unchanged legacy behavior).Stories become G001, G002, … in order.
Run one of:
gjc ultragoal create-goals --brief "<brief>"gjc ultragoal create-goals --brief-file <path>cat <brief> | gjc ultragoal create-goals --from-stdingjc ultragoal create-goals --gjc-goal-mode per-story --brief "<brief>" only when one GJC goal context per story is explicitly preferredInspect .gjc/_session-{sessionid}/ultragoal/goals.json and refine if needed.
Before splitting a brief into many thin stories, check whether the candidate stories are validation-coupled. Merge validation-coupled stories into one goal and fan out executor slices inside that goal instead of creating one goal per slice. Two stories are validation-coupled when they share any of:
Fanning out executor slices inside a single merged goal keeps one review/QA boundary while preserving parallel implementation. When validation-coupled stories must stay as separate goals for scheduling reasons, use an aggregate-mode validation batch (below) so the coupled review happens once at the final member.
Loop until gjc ultragoal status reports all goals complete:
gjc ultragoal complete-goals.goal({"op":"get"}).goal({"op":"create","objective":"<printed payload objective>"}) with the printed payload. In aggregate mode, if the same aggregate objective is already active, continue the current GJC story without creating a new GJC goal. If goal({"op":"get"}) shows a stale dropped goal (status "dropped") and a new aggregate must start, no extra cleanup is needed — goal({"op":"create"}) succeeds directly. If a previous aggregate is still active and you genuinely need a fresh start in the same session, call goal({"op":"drop"}) first, then goal({"op":"create"}).--status complete checkpoint, run the mandatory final cleanup/review gate below. In aggregate mode, do not call goal({"op":"complete"}) for intermediate stories; checkpoint each story while the aggregate objective is still active. On the final story, create the final aggregate receipt first; only after that receipt exists may goal({"op":"complete"}) run.--quality-gate-json only:
gjc ultragoal checkpoint --goal-id <id> --status complete --evidence "<evidence>" --quality-gate-json <quality-gate-json-or-path>
A successful complete checkpoint is story completion, not automatic run completion. Read the checkpoint output: when it prints Next ultragoal goal: <id>, continue that active story under the same aggregate GJC goal; when it prints All ultragoal goals are complete, the durable run is terminal. gjc ultragoal complete-goals remains the supported manual next-story command if continuation output was missed.gjc ultragoal checkpoint --goal-id <id> --status failed --evidence "<blocker/evidence>"gjc ultragoal checkpoint --goal-id <id> --status blocked --evidence "<completed legacy GJC goal blocks goal create in this thread>"gjc ultragoal complete-goals --retry-failed.An active Ultragoal run must not give up on a blocker by pausing the goal and asking the user. Classify every blocker before deciding what to do, and default to resolvable when unsure:
resolvable — anything the agent can act on: failing tests, missing implementation, a dependency to install, an ambiguous-but-inferable detail, investigation. Never pause. Exhaust autonomous resolution first: investigate, gjc ultragoal steer --kind add_subgoal --title "Investigate blocker" --objective "..." --evidence "..." --rationale "...", delegate an executor, or preserve the blocker durably with gjc ultragoal checkpoint --status blocked / gjc ultragoal record-review-blockers and keep scheduling the next goal.human_blocked — only the user can act: credentials/secrets, a manual or physical step, an external approval/decision, access the agent lacks. Pause is the last resort and is gated.goal({"op":"pause"}) is blocked at runtime while an Ultragoal run is active unless the latest blocker_classified ledger event is human_blocked and a later bound clean pause terminal critic verdict is recorded for it (see Terminal critic gate). assertUltragoalPauseAllowed first consumes a pre-existing give-up nudge (a durable ledger write) before it runs the read-only pause diagnostic; only isUltragoalPauseBlocked is a pure reader. To pause, first record the human-only classification and capture its event id, then record the terminal critic's clean bound pause verdict, and only then pause:
gjc ultragoal classify-blocker --classification human_blocked --evidence "<the specific human-only dependency>" [--goal-id <id>]
gjc ultragoal record-critic-verdict --terminus pause --classification-event-id <eventId> --verdict OKAY --evidence "<terminal critic evidence>"
goal({"op":"pause"})Recording --classification resolvable is an audit note only; it never authorizes a pause. The ask tool stays blocked during active runs regardless of classification — record unresolved decisions as durable blockers instead of prompting.
Use gjc ultragoal steer when real findings or blockers prove the current story decomposition should change while the aggregate objective and constraints stay fixed. Steering is explicit-only and evidence-backed; broad natural-language requests are rejected instead of guessed.
Allowed mutation kinds are:
add_subgoalsplit_subgoalreorder_pendingrevise_pending_wordingannotate_ledgermark_blocked_supersededExamples:
gjc ultragoal steer --kind add_subgoal --title "Investigate blocker" --objective "Validate the blocker and report evidence." --evidence "log/test output" --rationale "The blocker changes the safe execution order." --json
gjc ultragoal steer --kind split_subgoal --goal-id G002 --replacements-json '[{"title":"Fix parser","objective":"Resolve parser blocker."},{"title":"Verify parser","objective":"Run focused parser verification."}]' --evidence "Implementation split found two separable risks" --rationale "Splitting keeps each sub-goal independently verifiable." --json
gjc ultragoal steer --kind reorder_pending --order-json '["G003","G002"]' --evidence "Dependency order changed after investigation" --rationale "G003 must land before G002 can proceed safely." --json
gjc ultragoal steer --kind revise_pending_wording --goal-id G002 --title "Clarify blocker story" --evidence "The current title hides the actual blocker" --rationale "Clear wording keeps the ledger auditable." --json
gjc ultragoal steer --kind annotate_ledger --evidence "User changed release ordering at runtime" --rationale "The aggregate objective is unchanged, but the execution history needs an audit note." --json
gjc ultragoal steer --kind mark_blocked_superseded --goal-id G004 --evidence "The blocked work is no longer required because replacement evidence covers it" --rationale "No replacement sub-goal is needed; superseding only the blocked sub-goal unblocks final completion without changing the aggregate objective." --json--directive-json and UserPromptSubmit structured steering are planned/deferred routing surfaces, not part of the native typed --kind CLI path described above.
Steering invariants:
.gjc/_session-{sessionid}/ultragoal/goals.json and .gjc/_session-{sessionid}/ultragoal/ledger.jsonl, not an enumeration of initial goal ids..gjc/_session-{sessionid}/ultragoal..gjc/_session-{sessionid}/ultragoal/ledger.jsonl.goals.json with steering metadata and are skipped for scheduling.UserPromptSubmit structured steering directives are a planned/deferred routing surface. Normal prose does not mutate state.
Ultragoal execution should use GJC's bundled role-agent roster when a durable story is large enough to benefit from delegation:
executor for bounded implementation, refactoring, and fix slices.planner for story sequencing or handoff refinement when execution uncovers a missing plan branch.architect for read-only architecture and code-review lanes, including CLEAR / WATCH / BLOCK status.critic for read-only plan or handoff critique before execution proceeds.Direct inline implementation by the leader is the default. Delegate to executor subagents only when the expected diffs land in genuinely different sub-domains, modules, or systems — separable surfaces with independent acceptance criteria and no shared-file contention. File count or line count alone does not force delegation; a large change confined to one domain/subsystem is usually better done inline or by a single sequenced executor.
Delegation is worth it when:
When delegating:
executor bounded targets and explicit acceptance criteria, and keep checkpoint/goal-state ownership in the leader.architect / critic review lanes for early signal, but treat them as advisory: the canonical review is the boundary cohort gate below, and a slice-level lane never substitutes for it or its verdict. Skip slice review entirely when the boundary cohort will cover the same change set shortly. Worker agents never mutate .gjc/_session-{sessionid}/ultragoal or call goal tools.When delegating with native subagents, an await timeout only limits the leader's wait. It is not subagent failure evidence and must not be used as a cancellation reason; inspect or continue independent work, and cancel only when the subagent has actually failed, gone off-track, or become unrecoverably wrong.
Fresh spawns re-pay the full context ramp-up (file reads, domain orientation, contract restatement) on every delegation. When a later slice or lane targets the same sub-domain/module/system as a prior subagent of the same role, resume the prior subagent instead of freshly spawning:
executor slice or same-scope architect review lane, resume that id and inject only the delta (new targets, new acceptance criteria, the updated frozen change set) rather than re-briefing from scratch.subagent resume/steer controls only. Route per attempt: running → steer/inject to the same id and await; queued → retain or await the same id; terminal (completed/failed/cancelled) with context available → resume the same id; context_unavailable, not_found, no_runner, or resume_failed → fresh spawn fallback for that slice..gjc/_session-{sessionid}/ultragoal, call goal tools, or absorb checkpoint/goal-state ownership, and review lanes (architect, critic) stay read-only when resumed.architect review or executor QA lane must still evaluate the current frozen change set on its own evidence, not rubber-stamp its earlier verdict.If an Ultragoal request has no approved plan or consensus artifact and the scope genuinely needs one, run ralplan first and preserve its PRD, test spec, role roster, and verification guidance in the Ultragoal ledger. Skip ralplan for small scope: work that fits a single reviewable PR and is tied to a single domain/subsystem can proceed directly from the brief — record that judgment in the ledger instead of running a planning round. Reach for ralplan when the scope spans multiple domains/subsystems, needs cross-cutting sequencing, or would not fit a single PR.
The Ultragoal leader owns .gjc/_session-{sessionid}/ultragoal/goals.json and .gjc/_session-{sessionid}/ultragoal/ledger.jsonl. Role agents return implementation/review evidence; they do not checkpoint Ultragoal or mutate goal state.
Native subagent parallelism is a contract for bounded executor delegation, not a runtime scheduler:
executor parallelism only when a story's expected diffs fall in genuinely different sub-domains/modules/systems, each boundable by a per-slice coordination contract..gjc/_session-{sessionid}/ultragoal, call goal tools, make checkpoint decisions, own integration, or own final verification. The Ultragoal leader keeps those responsibilities.gjc ultragoal checkpoint: checkpoint authority stays with the leader after worker tasks are terminal. The leader checkpoints from worker evidence plus the current-session GJC goal snapshot, and performs no hidden goal mutation.Before workers start, each per-slice coordination contract MUST name the target files/surfaces, independence assumptions, allowed coordination channel, conflict-escalation rule, expected evidence, and terminal status. Conflict or assignment changes remain leader-owned and must be auditable through durable ledger evidence.
For failed, timed-out, or contract-violating slices, record durable ledger evidence; preserve successful terminal slices only when safe; and reassign, retry, or collapse the invalid work to serial execution under an updated contract. Completion after parallel work still requires terminal worker evidence, leader integration, targeted verification, and the existing cleaner + architect + executor QA/red-team gate before checkpoint complete.
Heavyweight review runs once per boundary, not once per story. In aggregate mode the whole required-goal set is one implicit boundary by default: every checkpoint before the run's final required goal may present the lightweight deferredToBatch gate, and only the final goal carries the full strict gate. Nothing needs to be declared to get this — it is the default.
A deferred gate is just the proof the runtime cannot know: that targeted verification ran. Everything mechanical — kind, the batch tuple, deferredLanes, and the whole changeSet block (paths, changeSetHash) — is auto-filled from durable state and the computed cumulative git diff. Never hand-compute a hash. The minimal valid gate:
{
"deferredToBatch": {
"ranLanes": ["targetedVerification"],
"targetedVerification": {
"status": "passed",
"commands": ["bun test <targeted suite>"],
"evidence": "what was verified and how it passed"
}
}
}deferredToBatch.ranLanes lists the lanes you actually ran (targetedVerification, plus optionally aiSlopCleaner / iteration); declaration and evidence must match in both directions. ranLanes can never claim architectReview or executorQa, and a deferred gate can never contain architectReview, executorQa, or validationBatchClose — review always belongs to the boundary, and deferring never manufactures approvals. Any optional field you do supply must match reality; a wrong value fails closed. Check with gjc ultragoal quality-gate validate before checkpointing.
When one ledger is large enough that a single end-of-run boundary is too coarse, use an explicit validation batch to subdivide it into phase/module boundaries, each with its own final member. Validation batches are aggregate-only, explicit-only, and fail-closed. They are created only through --validation-batch-json; there is no inference from brief prose, no per-story batching, and no other batching input path.
Create a batch explicitly:
gjc ultragoal create-goals --brief-file <path> --validation-batch-json '[{"schemaVersion":1,"batchId":"VB001","memberIds":["G001","G002","G003"],"finalGoalId":"G003"}]'Checkpoint contract summary — the full contract lives in the validation-batch-contracts fragment (skill-fragments/ultragoal/validation-batch-contracts.md); load it before checkpointing any batch member:
complete with a single top-level deferredToBatch quality gate (kind validation-batch-deferred) proving targeted verification, a declaration-matched lane set, and a cumulative-since-base change set — never architectReview, executorQa, or validationBatchClose; deferring never manufactures fake review approvals.finalGoalId) checkpoints complete with the normal full strict gate PLUS a top-level validationBatchClose proof covering all members; out-of-order close is rejected, close state is append-only proof on the final member only, and batch invalidation is fail-closed. Like the deferred gate, every close field except coverageEvidence is auto-filled from durable receipts and the computed diff — the minimal close is {"validationBatchClose":{"coverageEvidence":"..."}} alongside the strict gate.Cohort lanes are parallel by construction: the boundary gate freezes one sourceHash first, so cleaner, architect, and qa can run concurrently against the identical immutable snapshot and then join. Fall back to sequential lanes only when code is still changing (nothing can be frozen yet), when the red-team lane depends on architect fixes, or when architect findings gate the QA scope. Either way the lanes must join before checkpoint — no lane checkpoints independently, and repair work starts only after the join.
The completion-gate cleanup sweep is driven by ai-slop-cleaner, an internal Ultragoal sub-skill bundled as a kind: "skill-fragment" prompt with parent skill ultragoal (installed at skill-fragments/ultragoal/ai-slop-cleaner.md). It is analogous to deep-interview's auto-research fragment: loaded on demand for one specific hook, never a user-facing skill.
skill://..gjc/, checkpoints, calls goal tools, or spawns workflows.executor own all fixes; the cleaner reruns until zero blocking findings remain. Advisory findings live in the gate report only.ralplan/deep-interview/ultragoal; broad or architectural findings are handed back to the leader as review blockers.This heavyweight gate applies only at a boundary: the run's final required goal, or an explicit validation batch's final member. Intermediate stories use the lightweight deferredToBatch checkpoint above and never run this cohort. At a boundary, one frozen-snapshot review generation runs: verify, freeze the change set, run the cohort lanes (ai-slop-cleaner, architect review, executor QA/red-team) on that snapshot, then join all lane verdicts before any repair. Validate the gate with gjc ultragoal quality-gate validate before checkpointing.
The full contract lives in the boundary-cohort-gate fragment. Read embedded:gjc/skill-fragments/ultragoal/boundary-cohort-gate.md before acting on this section; do not act from this summary alone.
Both terminal exits (completion and blocked/pause termini) require a read-only critic role agent's OKAY verdict, once per run terminus. It is additive to the per-story review lanes and fails closed.
The full contract lives in the terminal-critic-gate fragment. Read embedded:gjc/skill-fragments/ultragoal/terminal-critic-gate.md before acting on this section; do not act from this summary alone.
gjc ultragoal review runs the same hardened gate against an already implemented PR, branch, or worktree. Use --pr <number> for a PR, --branch <ref> for a branch diff, omit both for the current worktree, and pass --spec <path> when a real contract exists. --mode review-only emits the verdict/findings without creating fix work; --mode review-start records review blockers for follow-up. Review mode validates the same executorQa shape and live-surface artifacts as checkpoint --status complete. A thin or derived-only contract can never clean-pass: the verdict is capped at inconclusive: weak-contract until a supplied spec or equivalent strong acceptance criteria are available.
Receipts are freshness-scoped:
goal_started or clean receipt-backed goal_checkpointed events for other goals do not stale older per-goal receipts.review_blocked required goals remain.finalGoalId; a story-scope query for a deferred member stays blocked until that close, and mutating a member after close stales the batch-close and final aggregate receipts.When approved work belongs in another repository, never edit repositoryBinding or copy the runtime directory; use gjc ultragoal succession offer|adopt|status instead.
The full contract lives in the cross-repository-succession fragment. Read embedded:gjc/skill-fragments/ultragoal/cross-repository-succession.md before acting on this section; do not act from this summary alone.
When the aggregate ultragoal is complete OR the user requests return to planning/clarification, mark ultragoal ready for handoff so the skill tool's chain guard permits the backward transition:
gjc state ultragoal write --input '{"current_phase":"handoff"}' --jsonThe skill tool then dispatches /skill:ralplan or /skill:deep-interview same-turn and runs gjc state ultragoal handoff --to <ralplan|deep-interview> --json in-process to atomically demote ultragoal, promote the callee, and sync both .gjc/_session-{sessionid}/state/skill-active-state.json files. You do not need to run the handoff verb yourself.
/goal slash-command and the agent loop must not depend on any /goal subcommand.goal({"op":"get"}), goal({"op":"create"}), goal({"op":"complete"}), goal({"op":"drop"}), goal({"op":"resume"}). drop clears the active goal without exiting goal mode so the next goal({"op":"create"}) works in-session. No slash-command cleanup exists or is required; Ultragoal never calls any /goal subcommand.goal({"op":"get"}) still reports an active aggregate, call goal({"op":"drop"}) before goal({"op":"create"}); when no active goal exists or the prior aggregate is already complete or dropped, call goal({"op":"create"}) directly. The goal tool remains callable across drop; no slash-command cleanup exists or is required.goal({"op":"create"}) when goal({"op":"get"}) reports a different active goal.goal({"op":"complete"}) unless the aggregate run or legacy per-story goal is actually complete.goals.json state and append receipt proof to ledger.jsonl; the final story checkpoint creates the final aggregate receipt before the agent may call goal({"op":"complete"}).--quality-gate-json only. Shell commands and hooks must not mutate goal state; the agent reconciles inline goal-tool state after durable completion.criticReview OKAY; a human_blocked pause additionally requires a fresh OKAY critic_verdict receipt.ledger.jsonl as the durable audit trail; checkpoint after every success or failure.© Yeachan-Heo, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files in packages/coding-agent/src/defaults/gjc/skills/ultragoal of Yeachan-Heo/gajae-code.
Open the folder on GitHubat commit 91fe978
Ultragoal Multi-Goal Ledger next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Ultragoal Multi-Goal Ledger this skillYeachan-Heo/gajae-code | 2.9k | — | ~8.4k | Automated safety check: Pass | MIT | |
| MemPalace Task HandoffMemPalace/mempalace | 60k | — | ~1.9k | Automated safety check: Pass | MIT | |
| Planning And Task Breakdownabashev/vfs-s3 | 106 | 8 repos | ~1.9k | Automated safety check: Pass | Apache-2.0 | |
| ULW Plan Workflowcode-yeongyu/oh-my-openagent | 70k | — | ~3.9k | Automated safety check: Pass | Custom licence | |
| Ask NavigatorYeachan-Heo/oh-my-claudecode | 40k | — | ~4.1k | Automated safety check: Pass | MIT | |
| Planning with FilesOthmanAdi/planning-with-files | 27k | — | ~2.9k | Automated safety check: Pass | MIT |
MemPalace/mempalace
Creates, hands off, claims, executes and closes agent tasks through the MemPalace logstream, with approval of the exact task before it is recorded.
abashev/vfs-s3
Breaks work into ordered tasks. An agent skill from abashev/vfs-s3.
code-yeongyu/oh-my-openagent
Explore-first planning that turns a vague or large request into one decision-complete work plan, written only after your approval and executed by a separate worker.
Yeachan-Heo/oh-my-claudecode
Charts a foggy effort into a map of decision tickets on the repo's issue tracker and works through them one per session, producing decisions rather than deliverables.
OthmanAdi/planning-with-files
Keeps a task plan, findings and progress log in markdown files on disk so long agent tasks survive context resets, with Gemini hooks and helper scripts.
tailcallhq/forgecode
Writes a structured Markdown implementation plan with checkbox tasks, verification criteria and risks, then checks it with a validation script; no code changes.
Yeachan-Heo/gajae-code
Runs one improvement mission as a bounded loop: each round makes a change, runs a strict JSON evaluator, logs the decision in markdown and continues until a max runtime is hit.
Yeachan-Heo/gajae-code
Operate trusted local GJC sessions through a reviewed broker-bound CLI allowlist with single-use human approval.
Yeachan-Heo/gajae-code
Shorthand for oh-my-claudecode's consensus planning, where Planner, Architect and Critic agents iterate on a plan before any execution begins.
Yeachan-Heo/gajae-code
Delegate planning and execution workflows to gajae-code via the coordinator MCP server.
Yeachan-Heo/gajae-code
Discover and inspect trusted local GJC sessions through the broker-bound session CLI.
Yeachan-Heo/gajae-code
Operate GJC SDK sessions from the CLI (gjc sdk session list|inspect|send|status|tail|close|raw plus the explicit raw control|query|global hatch).
Categories
Breaks a brief into ordered goals, keeps a durable ledger under .omc/ultragoal and prints handoff text so a Claude /goal run survives session restarts. omc/ultragoal`. The `omc ultragoal` command only writes those artifacts and prints a handoff for the active Claude agent, which must act on it in-session; it cannot change Claude's `/goal` state from the shell.
Ultragoal Multi-Goal Ledger fits situations like: tracking a large initiative across several Claude sessions or git worktrees; breaking a brief into ordered stories with attempt counts and evidence; gating final completion behind cleanup, verification and code review; keeping progress when a session restarts mid-task.
Run `npx skills add Yeachan-Heo/gajae-code --skill ultragoal -a claude-code`. Or copy the skill folder (packages/coding-agent/src/defaults/gjc/skills/ultragoal in Yeachan-Heo/gajae-code) into .claude/skills/ultragoal in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Yeachan-Heo/gajae-code --skill ultragoal -a codex`. Or copy the skill folder (packages/coding-agent/src/defaults/gjc/skills/ultragoal in Yeachan-Heo/gajae-code) into .agents/skills/ultragoal in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Yeachan-Heo/gajae-code --skill ultragoal -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/ultragoal, .gemini/skills/ultragoal, .github/skills/ultragoal and .opencode/skills/ultragoal in your project.
SKILL.md names no scripts, command-line tools or credentials: Ultragoal Multi-Goal Ledger is instructions for the agent only. Our summary lists: The `omc` CLI from oh-my-claudecode; Claude Code with its `/goal` command.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Ultragoal Multi-Goal Ledger is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 8.4k tokens (SKILL.md is roughly 34k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Ultragoal Multi-Goal Ledger: MemPalace Task Handoff (MemPalace/mempalace, 60k stars), Planning And Task Breakdown (abashev/vfs-s3, 106 stars), ULW Plan Workflow (code-yeongyu/oh-my-openagent, 70k stars) and Ask Navigator (Yeachan-Heo/oh-my-claudecode, 40k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Yeachan-Heo (a GitHub user) maintains it in Yeachan-Heo/gajae-code, which has 2,937 GitHub stars. The repository holds 9 skills in this directory. The repository was last updated on October 10, 2026.
Source: Yeachan-Heo/gajae-code on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.