yysun/project-manager
v1.10.0MIT
An AI project manager you work with through conversation, with a read-only status card and board rendered in the chat.
Changelog
All notable changes to this project are documented here.
The format follows Keep a Changelog, and version numbers are
the project-manager skill version recorded in
skills/project-manager/SKILL.md. Studio and repository tooling
ship alongside the skill and are noted under the release they landed in.
State-file schema versions are independent of the skill version and are called out per release. A project written by an older release keeps loading unchanged; no release has required a migration.
1.10.0 — 2026-08-18
Added
- Run records. A new optional
RUNS.mdstate file (schema version 1) records each run's ID, status, timestamps, per-repository integration branch, base branch, base commit, and coordinator worktree, and per-task branch, executor root, and integration flag.startRun,advanceRun, andresumeRuninscripts/lib/run-execution.jsdrive it through the existing atomic mutation path, with aproject-run.jsCLI exposingstart,advance, andresume.startRunrefuses to open a second run beside an unfinished one;resumeis read-only and answers fromRUNS.mdalone, performing no Git or filesystem discovery. Before this, none of that existed on disk, so a lost coordinator session could not resume a run — only start a new one and orphan the previous integration branch. A project with noRUNS.mdhashes exactly as it did before: the pre-change module and this one were run against an identical fixture, and that literal is now pinned in the suite, so a change that would stale every project's cachedSTATUS.mdfails a test. - Execution telemetry. Evidence manifests accept
schema_version: 2, which adds anexecutionobject carryingllm_calls,tool_calls,input_tokens, andoutput_tokens. Counts are incremental per manifest rather than cumulative, so one summation rule composes at attempt, task, and run level; executors must follow it or task totals will be wrong, and the rule is stated in conventions.md and execute-rpd.md. Elapsed time is derived from contract and manifest timestamps, so it is recorded even when an executor reports no counts. A read-onlyexecutionDataprojection aggregates attempt → task → run and is surfaced inreportData;statusDatacarries a cheap in-memory run summary instead, becauserenderStatusruns inside every atomic mutation andexecutionDatawalks the handoffs tree. Storedschema_version: 1manifests still validate through the stored-attempt path — version 1 rejectsexecution, version 2 requires it. - Critical-path-aware ready ranking.
nextDatacomputesdepth, the longest remaining dependency chain a task unblocks, with a memoized traversal of the already-validatedblocksreverse link, and ranks on it above immediate fan-out. A chain-heading task now outranks a task with more leaf dependents. Ordering is unchanged where depth ties. - Concurrency ceiling projection. A new
concurrencyDataprojection reportscritical_path,widest_level,serial_prefix, andconcurrency_ceilingfor the remaining plan, surfaced instatusData. No scheduler can beat a plan's critical path, so this is what makes an unreachable parallelism target visible before a run rather than after it;execute-rpdnow caps in-flight work at the smaller of runtime capacity andwidest_level, and reports the ceiling so wall time is read against what the plan permitted. - Estimation rules for task schedules in plan.md.
scheduled_start/scheduled_endhave always been free-form judgment — the engine derives no duration and checks only that the pair is well-formed and ordered — so the skill now states how that judgment is formed: fix the executor's throughput unit first (person-days, agent-hours, and CI minutes are not one ruler), estimate the cost of proving an outcome rather than producing it, carry uncertainty in the width of the span, leave explicit rework allowance, recalibrate against first actuals, and record estimation risk with magnitude and trigger. Assumptions behind a date belong inASSUMPTIONS.mdwithimpact_if_false, trigger conditions in theRISKS.mdv2triggerfield, and estimation error after the fact inLESSONS.mdunderestimation. No schema or script behavior changes; the rules are LLM-facing guidance over the existing schedule fields. - Dependency-density guidance in plan.md and
review.md: declare a dependency only when the
dependent cannot start without the other, prefer the specific contract-establishing edge over
transitive restatements, and read a long
serial_prefixas a signal that foundation work was split into stages that are not independently verifiable. - A judgment-discipline section in review.md binding
review,
validate-task, impact analysis, and status narrative: confirm the checked-out revision before assessing, read the decision record before calling something a gap, re-read rather than asserting state from memory, separate "does not exist" from "cannot be reached", mark verified apart from inferred and name what could not be executed, and require evidence rather than artifacts for a completion claim. - A waiting and escalation policy in execute-rpd.md, from analysis of four real run logs: request every permission during preflight, declare a human-gated wait once instead of polling it, use blocking waits rather than fixed sleeps, and run Delivery the moment the last task settles. The logs showed roughly eight hours of dead wall time across three runs — none of it worker, review, or integration time — including 162 minutes blocked on a sandbox escalation first requested 43 minutes into the run.
- A rule in SKILL.md forbidding hand-rolled state mutation, with the documented safe path for the cases where no command exists. A real run wrote its own milestone-completion script outside the skill's immutability guard, validation gate, and rollback, because no such command exists yet; that gap is now named rather than left implicit.
- Both READMEs list an undeclared executor behind a task date as something Project Manager pushes back on.
- The Studio brand header shows the release version, read from the same
src/version.tsconstant the MCP server and App host use, sonpm run release:versionkeeps it in sync instead of leaving a hand-edited string to drift.
Changed
- The
execute-rpdscheduler is documented as a work-conserving ready queue rather than a barriered dependency-wave model: promote a task the moment its dependency settles, count only mutating workers against concurrency (read-only reviewers are budgeted separately, since RPD serializes each task's own gates), and dispatch a value-concentrating sink task with company rather than last and alone. Stale "wave" language that survived the change inexecute-rpd.md,SKILL.md, andtrack.mdis gone — Integration still said "in ascending task ID within a wave" for a scheduler with no waves — and two scheduler steps that stated one concurrency rule twice with different criteria were reconciled. - Run-scoped branch and worktree naming in
execute-rpd.md. Each run generates one fresh
lowercase 8-hex run ID and never reuses a prior run's branches or worktrees, since a prior run may
have deliberately left them behind under Delivery. Integration branch
pm/<project-id>-<run-id>, task branchpm/<project-id>-<run-id>-<task-id>, worktree root<workspace-root>/.worktrees/<run-id>beside.projects, coordinator worktree<worktree-root>/<repo-name>-integrationper repository, and task worktree<worktree-root>/<task-id>. The worktree root must lie outside every target repository's working tree; when the workspace root is itself inside one, that repository's worktrees go to<git-common-dir>/pm-worktrees/<run-id>. Task worktrees are removed as soon as they are clean, reachable, and evidenced; only the integration branch and coordinator worktree persist across the run. Isolation is stated as an inspection and retry property, not a concurrency device — a single-task sequential run still gets its own branch and worktree. - Skill instructions are restructured as procedure plus rationale: numbered imperatives carry the
steps and reasoning moved into marked "Why" blocks, because negation-dense prose that buries an
imperative inside its justification is the form a small model most reliably misreads. Overlapping
authority became tables in
SKILL.md(Studio),tasks.md(row order vs. rescheduling vs. specification), andinit.md(profiles). Across the instruction files, negations went 264 → 239 and list items 167 → 267. This is presentation only, and was proved so rather than asserted: every backtick code span and numeric literal was diffed against the previous revision across all ten instruction files, and the sole difference isplanned|readyrendering asplanned↔readyin a table column. - A task whose specification requires changes in more than one repository is explicitly out of scope
for the
execute-rpdroute; it is reported for splitting rather than split unilaterally. RPD's primary-agent review fallback is likewise unavailable on this route — when a reviewer cannot be started the task blocks instead of accepting a self-review. - Workspace-root initialization now installs
studio.shandstudio.cmdinside the workspace's.projectsfolder instead of the workspace root, so all Project Manager support files live in one place and the workspace root stays untouched. Each launcher resolves the projects root from its own location, reads the.env.localbeside it, and still changes to the containing workspace before starting Studio, so catalog discovery and forwarded arguments are unchanged. Run./.projects/studio.shon POSIX or.projects\studio.cmdon Windows. A workspace initialized by an earlier release is migrated on the next initialization: the same transaction removes a rootstudio.shorstudio.cmdwhose bytes are exactly what a published release wrote, and reports the removals indata.removed_retired_launchers. Any other root file, directory, or symlink at those names is the operator's and is left untouched.
Fixed
- Dependency density in
concurrencyDatacounts an edge to a cancelled or deferred task as unsatisfied. Only adonedependency satisfies an edge; the previous count silently dropped edges whose target was not runnable, even thoughblockerItemsreports the dependent as blocked. - The bundled Studio server carried a pre-fix copy of that projection and was rebuilt from source.
- Studio SSE tests assert on framed events instead of raw socket chunks. A
read()chunk can carry two events or half of one, and the watcher legitimately interleavesproject-stale/project-livearound theproject-changea test waits for, which is what made the production-watcher test intermittently fail. The helper now pumps continuously, frames on the blank-line boundary, reports whole events by name, and settles adaptively rather than on a fixed sleep.
1.9.0 — 2026-08-16
Added
TASKS.mdschema version 4 manual task order. Timeline rows are reordered by dragging the left task-column grip or by keyboard, and the position is a persisted project fact written through one newPUT /api/task-orderroute, revision-guarded and queued like task edits. A task without anordertakes a default generated from the derived arrangement, so an unordered project renders as before with no ordering mode; the client sends the whole sequence, so a drop under active filters leaves hidden rows in place. Order changes no specification: it is excluded from the specification hash and Task Contract, leavesupdatedalone, and stays available on done, cancelled, and evidence-backed tasks. Holding a drag at the top or bottom edge auto-scrolls the page, inset by the sticky headers, so a row can reach a target that was off screen when the drag began.- The MCP App board renders lanes through a Kanban component with expandable per-task detail — outcome, owner, milestone, schedule, blockers, and acceptance items — plus an explicit loading state instead of a blank frame.
Changed
execute-rpdnow closes out each repository instead of ending on a retained integration branch. It asks once whether to merge the integration branch into its base branch and remove the coordinator worktree, naming the branch, the worktree path, the merge result, and — when tasks blocked — that merging lands partial work. Stating delivery intent in the request skips the question. Merging requires a clean base checkout and a conflict-free merge; conflicts against the user's base branch are never auto-resolved, and the delivery decision is recorded in the final report so an unmerged branch is unambiguous. Conflicts between a task branch and the integration branch are still resolved automatically and re-reviewed as before.- Board projection builds its id-to-task index once per call instead of once per lookup — 402
constructions at 200 tasks became one —
validateGraphreplaces a quadratic scan with a reverse-dependency map, and the compact MCP summary no longer builds the projection it discarded. TASKS.mdschema versions 1, 2, and 3 keep their exact normalized shapes, so installing v4 support cannot stale an untouched project'sSTATUS.md. Schema 4 is forward-only like v2 and v3 before it, and the version rises only when an operator actually reorders.
Fixed
- Request-time project containment moved into
ProjectCatalog.register, judged on the resolved real path so a symlinked ancestor no longer rejects a legitimate child, and decided on the parent before the leaf is touched so out-of-root paths cannot be probed for existence. Omitting the containment decision fails loudly instead of opening. Immutable-history ancestor checks compare path segments instead of string prefixes. - A Studio watcher that cannot rebind after a project root is replaced now reports its stream degraded rather than going quietly dead, and the client clears that warning only on an explicit server-stated liveness edge. Timeline drag suppression can no longer swallow a click on an unrelated bar.
.gitattributesrules match the real artifact paths, and the.gitignoredist/line that hid tracked Studio assets is gone.
1.8.0 — 2026-08-15
Added
- Read-only MCP App: a stdio MCP server exposing validated project facts as tools, with an inline status card and a fullscreen board rendered inside supporting hosts. Model-facing tools return a compact summary while full project data stays in app-only tools; hosts without MCP App rendering receive the text result, and all project mutation remains with the agent, skill, and CLI scripts.
- MCP App project selection by the agent: model-facing tools accept a project folder path as well as a configured ID or name, and the server starts with no project arguments, so no absolute path has to be written into host configuration. A configured projects root remains available as opt-in confinement, and views receive only opaque project keys.
- Explicit
npm run release:version -- <semver>andnpm run version:checkcommands keep the Agent Plugin manifest, standalone skill header, MCP server, and embedded App on one release version. Invalid, repeated, or already-drifted bumps fail without rewriting release files.
Changed
- Project Manager is now distributed as a root-native Agent Plugins 1.0 package for direct GitHub installation.
- GitHub installation documentation now separates the complete root plugin from Codex's standalone
skills/project-manager/installation, which intentionally excludes MCP tools and views. plugin.jsonis now the canonical product release version. Plugin builds validate every release-bearing file before replacing generated artifacts, while the private npm workspace keeps its non-product0.0.0version.- The MCP server and embedded App now report the shared Project Manager release version instead of
separate hard-coded
1.0.0values.
Fixed
- The status card's Open board action now loads the actual lane-based board before requesting fullscreen. Previously it only enlarged the status card. The action is also compact and right-aligned instead of stretching across the card.
1.7.0 — 2026-08-15
Added
- Workspace-root initialization now writes the active installed skill path to ignored
.projects/.env.localand creates canonicalstudio.shandstudio.cmdlaunchers at the workspace root. project-init-workspace.jsvalidates and installs the project plus launch support as one contained, rollback-safe transaction, generatingSTATUS.mdfrom authoritative project files.
Changed
- Repeated workspace initialization preserves unrelated local configuration and existing projects, while symlinked paths and operator-owned launcher conflicts fail before exposure.
1.6.0 — 2026-08-15
Added
- Studio now watches the selected project and refreshes automatically after CLI, agent, or editor changes, while deferring reconciliation until task and schedule drafts are safe.
Changed
- RPD-assigned work is now decomposed as cohesive end-to-end software stories suitable for one full RPD flow. Project plans and task-quality review reject stage, file, layer, test, review, documentation, and commit fragments that belong inside RPD's own architecture plan.
1.5.2 — 2026-08-13
Fixed
- Studio now opens every safely identified project even when a task has invalid execution state. Affected tasks remain visible with task-scoped warnings, unrelated planning edits continue to work, and execution plus standard validation commands remain strict.
- Timeline bars preserve lifecycle colors without severity borders. Amber and red dots mark planning or execution issues, while task details explain the issue and distinguish dependency tasks, free-text blocker notes, and schedule conflicts.
- Task warnings no longer repeat as page-level banners. Technical diagnostics, including stale
STATUS.mdstate, remain available through the API and validation output.
1.5.1 — 2026-08-13
Fixed
- An unavailable executor root now produces a project-validation and Studio warning instead of blocking the project from opening. Executor-root structure still fails closed, and governed execution still requires the selected task root to be an existing real directory before issuing or advancing work.
- Cancelled tasks now use a distinct grey treatment in Kanban and Timeline instead of sharing the orange treatment reserved for deferred work and active warnings.
1.5.0 — 2026-08-12
Added
- Built-in
project-start-agent.jsandproject-ingest-agent-manifest.jscommands for issuing immutable agent Task Contracts and ingesting exact Evidence Manifest payloads without generated project-local execution helpers. - Governed agent orchestration: the main agent coordinates dependency-ready, capacity-bounded waves and delegates one clean/minimal-context bounded worker per task while retaining project-state mutation and evidence-ingestion ownership.
Changed
- Agent workers now use an exact terminal-manifest return protocol with worker-only limits of 65,536 serialized UTF-8 bytes and 8,192 UTF-8 bytes per JSON string. Direct CLI ingestion retains the existing Evidence Manifest schema boundary.
- Execution preflight now makes capacity and mutation isolation explicit: shared or uncertain roots and write surfaces serialize, null-root work is limited to read-only or explicit non-filesystem targets, and post-issuance spawn failures preserve a visible governed attempt.
- Human approval tasks act as explicit dependency gates without redefining all human work as approval-only. Human and RPD execution routes remain unchanged.
- Agent start, blocked retry, and verified completion now move the latest applicable
CHANGES.mdre-verification binding throughpending,in_progress, andcompletein the same atomic mutation.
1.4.0 — 2026-08-12
Added
project execute-rpd <folder>, a one-line governed execution route that schedules active RPD tasks in dependency-ready waves, gives each mutating worker its own Git worktree, reserves independent review capacity, integrates task branches in dependency order, and advances project state only from validated Evidence Manifests.
Changed
- Project Manager now carries the worktree, subagent, review-invalidation, integration-verification, and stopping rules that previously had to be repeated in every execution prompt.
- RPD project execution now accepts natural-language requests in English and Chinese with a project
name. A deterministic resolver selects one exact project from the validated workspace
.projectscatalog and rejects missing or ambiguous names instead of guessing.
1.3.0 — 2026-08-11
PMI alignment through documented tailoring.
Added
PROJECT.mdschema version 2, adding a required declare-onlytailoringblock covering the ten PMBOK 6 knowledge areas. Each area is recorded as applied or tailored out, and tailoring an area out requires a rationale. Tailoring never obliges a project to practice an area and never enters the task specification hash or Task Contract.- Optional modules
ASSUMPTIONS.md(ASM-),ISSUES.md(ISS-),STAKEHOLDERS.md(STK-),LESSONS.md(LES-), andCLOSURE.md(CLO-), each fail-closed on its own exact schema once present. An issue log is distinct from taskblocked_bystrings, which remain the execution-level blocker mechanism. RISKS.mdschema version 2, adding PMI response strategy, threat/opportunity direction, trigger, and residual risk. Strategies are constrained to the direction, so an opportunity cannot be "mitigated".- Validation
TAILORING_CONTRADICTION: configuringRISKS.mdwhile risk is tailored out, orSTAKEHOLDERS.mdwhile stakeholder is tailored out, now fails. The declaration cannot become fiction. - Closure integrity rules: accepted project closure requires project completion, accepted milestone closure requires that milestone complete, acceptance requires an acceptor, date, and evidence, and duplicate project- or milestone-scoped records are rejected.
npm run demomaterializes a persistent Studio demo atdemo/pm-studio-demofor the current checkout.
Changed
- Status and report data move to schema version 3, exposing the tailoring declaration and the five new modules. A tailored-out area is reported as tailored out with its recorded rationale, never as a zero or as "on track"; an undeclared area on a schema-version-1 project is reported as undeclared.
- README and both user guides describe PMI alignment as PMBOK 7 principles-aligned with documented tailoring, explicitly not PMI certification.
- The Studio demo is generated rather than committed. Task Contracts bind an absolute canonical project
root and
contract_idhashes that payload, so no committed demo can be valid across clones. The previously committed demo had been broken since the repository moved paths. - RPD is no longer presented as a dependency in user-facing positioning. It remains a fully supported optional executor provider with no code change.
Compatibility
PROJECT.mdschema version 1 is unchanged, rejectstailoringas an unknown field, and needs no migration.RISKS.mdschema version 1 rejects the new fields and keeps its exact normalized shape.- A project configuring none of the new modules produces a byte-identical
source_sha256, so no existingSTATUS.mdbecomes stale. - Cost, Earned Value,
TASKS.mdeffort estimates, typed dependencies, float, and critical path remain unimplemented by design. Declare them tailored out, or record where they are managed instead.
1.2.0 — 2026-08-11
Changed
- Rewrote onboarding to be user-centered: manage through outcomes, events, constraints, evidence, and decisions rather than field edits, status changes, or card movements.
- Positioned Project Manager as an AI project manager you brief through conversation.
Added
- Studio persists Summary and Filters expanded/collapsed state independently in guarded browser storage, with Filters as an accessible native-hidden disclosure.
1.1.1 — 2026-08-10
Added
- Studio exposes a copyable RPD command for every task, preferring an issued contract when one exists.
- Kanban lane titles and counts stay visible as one sticky row, pinned below the application header, with synchronized horizontal scrolling between lane titles and bodies.
- Timeline allocates a readable weekly width and scrolls horizontally instead of compressing labels, with a frozen Task column and a separate sticky date header.
1.1.0 — 2026-08-09
Added
- Rigor profiles.
minimalandstandardcomplete eligible ordinary human work from one explicit approval while still creating the canonical immutable Task Contract and verified Evidence Manifest.controlledhuman work, and every RPD, agent, and external task, stay on the governed execution path. TASKS.mdschema version 3 task dispositions.deferredpauses actionability and may reactivate;cancelledis terminal. Neither satisfies a dependency or proves success, and evidence observed after the disposition timestamp cannot advance the task.
Changed
- Split Project Manager into a standalone repository.
1.0.1 — 2026-08-09
Fixed
- Correctness and consistency fixes across the skill contract and deterministic scripts.
1.0.0 — 2026-08-08
Initial release of the folder-native project manager.
Added
- Generic Markdown project state:
PROJECT.mdandTASKS.mdas truth,STATUS.mdas a derived cache, with optionalMILESTONES.md,RISKS.md,DECISIONS.md,SOURCES.md,TRACEABILITY.md, andCHANGES.mdmodules. - Task Contract to Evidence Manifest execution boundary with immutable attempts, canonical hashing, staged evidence requirements, acceptance mappings, and replay-fingerprint rejection.
- Lifecycle
planned → ready → in_progress → implemented → verification → verified → done, with blocking separate from lifecycle and change-driven re-verification. - Human, RPD, agent, and external executor providers with per-provider default evidence requirements.
- Six read-only deterministic scripts for validation, status, next work, blockers, coverage, and report data, with a locked exit-code and envelope contract.
- Project Manager Studio: one loopback-authenticated local server with URL-addressable Kanban and Timeline sibling views over the same validated snapshot.
TASKS.mdschema version 2 schedule metadata with paired inclusive dates, canonical clearing, legacy v1 source-hash compatibility, and no impact on contract or specification hashes.- Studio project selection defaulting to
<launch-working-directory>/.projects, with server-issued opaque keys binding reads and saves to one catalog entry, and no client-supplied filesystem paths.