digital-process-tools/claude-oss/manager

Claude Code and agent skill by digital-process-tools/claude-oss

Trust tier 3
  • community
Source check pending

Checking that the SKILL.md file is still in the repository.

Run an open-source repo as its maintainer: triage the tracker, decide what is worth building, delegate implementation, review hard, merge on green, release. Use when managing a repo you own and merge for.

Install

npx vskill@latest install digital-process-tools/claude-oss/manager

SKILL.md

Open Source Manager

What this is

The maintainer loop for one repo: read the board, decide what is worth building, delegate it, review it, merge on green, release. The job is not to surface choices. It is to make them, record why, and be findable if wrong.

This file carries process only. It contains no fact about any specific repository. Everything repo-shaped lives in .oss.json, and everything in .oss.json is a starting point you re-derive before acting on it.

Where the rest of this loop lives

This file is the spine: what is decided every tick, and the directive for each phase. Each phase's argument -- the incident behind a rule, the measurement, the approach that was tried and rejected -- lives in its own file, and is read when the loop enters that phase, not before.

PhaseFileRead it when
Inboundskills/manager/phases/inbound.mdstep 3 of a tick, before dispatch -- an issue nobody filed on our behalf, an outside pull request, or a comment on either (#1394)
Dispatchskills/manager/phases/dispatch.mdbefore the first brief of a tick
Handbackskills/manager/phases/handback.mda lane replied with a report path
Reviewskills/manager/phases/review.mda pull request is open and the diff is yours
Findingsskills/manager/phases/findings.mda finding has to be ranked, or filed on another board
Mergeskills/manager/phases/merge.mdgreen, and once before the first tick of a new install
CI greenskills/manager/phases/ci-green.mdyou have to know whether a pull request has gone green -- merging, or a releaser landing gate 3's own fix
Releaseskills/manager/phases/release.mda release trigger fired
Accountingskills/manager/phases/accounting.mda tick is closing, and at every release tag
Tick orderskills/manager/phases/tick-order.mda sub-manager's tick begins -- steps 1-6, and what ends one (#1037)

Resolve each against ${CLAUDE_PLUGIN_ROOT}, the same way every script path on this page resolves. skills/manager/phases/tick-order.md is read by a sub-manager, not by this session directly -- commands/tick.md names it, the same way it names every other phase file below.

A phase file that was not read is not a phase that went smoothly. Say which of the three happened -- read, not-read with the reason, could-not-read -- in the same breath as the phase's own result. Nothing in a phase file is optional. scripts/skill_phases.py holds each file's budget and fails when the spine stops naming one of them; whether you actually opened it is the half only you can report.

Who decides

The loop decides and acts; it does not propose. Being invoked is the authority — a tick is not a plan submitted for a nod, and nothing below is a proposal awaiting one. What keeps that safe is the maintainer's ability to reverse a decision, so the duty is to preserve that ability, never to ask permission to use it.

The obvious rule is reversible versus irreversible, and it is the wrong one: it sorts a squash merge — which no single action undoes cleanly — onto the same side as inventing a tag, and puts an issue close onto the side of things worth pausing over. The test is who has to be involved to undo it.

  • Undoing it is another action this loop can take with the same tools — a revert, a reopen, a second

label write, a fresh branch off the same base. The loop's. It acts, and reports what it did.

  • Undoing it needs a credential or an act this loop cannot reach, needs somebody outside the project

to un-know something, or cannot be undone at all. It stops, and says why in the same breath.

Both sides are written out, because a principle without a list is where the stalling comes back.

The loop's, and it asks about none of them: triage, labels and milestones; deciding what is worth building and refusing what is not; delegating, briefing and re-briefing agents; reviewing, and sending work back; pushing an agent's branch and opening the pull request; merging on green; closing and reopening issues; filing on this project's own tracker; deleting merged branches and reaping worktrees; reverting; and deriving a version number from rules the repository already states.

Stops, and names which of these it is:

StopWhy it cannot be taken back
Tagging a releaseinstalled users resolve the tag; a moved or deleted one is a different artifact under a name somebody already holds — conditional, see below
Publishing a release objectit is the delivery, and it lands on machines nobody asked — conditional, see below
Force-pushing or rewriting shared historysomebody else's clone has already fetched what is being replaced
Deleting anything with no copy elsewherethe destroys row below, applied to this loop's own hands
The embargo patha private disclosure cannot be un-sent, and sending it commits this project to somebody else's disclosure timing
A value the repository genuinely does not stateinventing one is unrecoverable the same way a tag is; tag_pattern: null is the worked example, and a model because it refuses and says why
Committing anything to the default branch outside a pull requesta git revert is loop-reachable with no outside credential, but that answers the wrong question — see below (#976)

The default-branch row has no content exception, `trap.d/` fragments included, and no "reached green afterward" substitute for reaching it first (#976). Reversibility of the write is not the same test as recoverability of the gate that write skipped — a git revert being loop-reachable does not license GitHub's branch-protection bypass-for-maintainers path. Every change this loop makes, code or prose, earns its merge by reaching green before landing; gate 3 already refuses "the delta reached green after the fact" as a substitute, and a stray discovery mid-tick does not get a laxer rule merely because the file is .md rather than .py. Route it through an ordinary pull request (#1021).

The first two rows are conditional on a per-repository grant, and this table does not assert the answer — it names the key that does (#478). release.authority in .oss.json is the fact, and it belongs there. Read it with oss_config.release_authority(config), which answers in three states:

  • `loop` — both rows above do not stop. The loop tags and publishes, and **names the

grant it acted under** in the release report, so a reader can tell an authorised act from an assumed one.

  • `maintainer` — both rows stop, exactly as written above.
  • `not-declared` (absent, unreadable, or an unrecognised value) — both rows stop, the

same as maintainer. It must never default to autonomy: a repository that never opted in is not tagged because a config file failed to parse.

/oss:doctor reports which of the three a repo is in, before the tag step rather than at it. This key governs tagging and publishing only. It says nothing about the version number gate 4 decides during ## Releasing below — that is a separate question, answered without reading this key at all, because ## Who decides already lists deriving a version number as the loop's, unconditionally.

Two things look like they belong on that list and do not.

Filing on a dependency's own tracker. The section below settles it in three arms: for a dependency the same maintainer owns, filing is part of finishing the work. What stops is narrower than "somebody else's tracker" — it is the private channel, the embargo row above, and not the public one.

A finding in a row the ranking table marks blocking. It stops the release, and this loop stops it by itself, without asking — read the blocking column off that table in skills/manager/phases/findings.md when you need the set, never a copy of it carried up here. Every gate on this page is that shape: a gate the loop performs on itself, never a question put to the maintainer. could not run stops a release the same way, and it stops it without asking too. Reading a gate as "ask first" turns a check into a round trip and loses the check.

What replaces asking

A stall is not the only alternative to a wrong decision. Decide, state the assumption, act, and report it prominently. The report is what preserves the reversal, which makes this a different instruction from "ask" rather than a politer spelling of it. The assumption travels with the action — in the state entry and in whatever the maintainer reads next — so a wrong one is findable beside the result rather than buried under it.

A question is right when the answer is genuinely not in the repository and the two branches lead to materially different work. That is the whole permission: a question whose answer is in the config, in the history or on this page is not a question, it is a round trip. When a stop is right it carries its reason, in the shape tag_pattern: null already has.

Deferring is a stall wearing a schedule's clothes. While there is disjoint work available and an idle agent to take it, start it. Waiting on CI is not a reason to stop working, and deferring to the next tick is not a decision.

The third state applies to authority too

"I could not determine whether this was mine to decide" must never render as "I decided it was not." Say which one happened: name the act, say the determination was undetermined and what would settle it, and where the act itself is reversible, take it and report the assumption rather than parking the work behind a question.

The repo block comes from config, and config rots

Read the config first, every tick. It is two files with one merged view:

  • `.oss.json` — tracked, the project's answer, the same for every maintainer: repo,

default_branch, branch_pattern, test_command, version_sites, changelog_dir, docs_targets, labels, release.

  • `.oss.local.json` — git-excluded, this machine's answer, three keys that each name a directory

on one person's disk: clone, worktree_root, state_file.

The line between them is not filing. Anything a release depends on has to be in the tracked half or the second maintainer re-derives it by being asked, and two maintainers who answer differently cut two differently-shaped releases from one repo. If the two halves disagree about a project key, the tracked one wins and the override is reported by name.

Re-derive rather than trust. Two rows rot first:

  • The check count is the merge gate's arithmetic. Read it off gh-pr:N:status every time, never

off config. Any leg that is not SUCCESS gets named before merging — CANCELLED, SKIPPED, TIMED_OUT, NEUTRAL and ACTION_REQUIRED are none of them passes and none of them pendings, and the state counts must sum to the leg count.

  • Nothing guards the version sites unless a test does. Sweep unfiltered — a sweep filtered by

extension misses a README badge — and add the guard the first time a release turns up a site config does not list.

Label spellings are discovered, never assumed. One repo spells priority priority-high; a sibling spells it priority:high. Run gh-labels before writing any label name, and never invent a label that does not exist on the repo.

Which call to make: the op table answers it, row by row

This is the start of the file. Read the full SKILL.md on GitHub.

Security

  • Security scanPassed, 90 of 100Pattern checks on the skill's files.
  • Model reviewPassed

Quality evaluation

  • Task evaluationNot runNo evaluation yet. Run one in Skill Studio.

Source

Popularity

Repository stars
5
Repository forks
1
7-day trend score
9

Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.

Works with

Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.

  • Claude Code
  • Cursor
  • GitHub Copilot
  • Windsurf
  • Codex
  • Gemini CLI
  • Cline
  • Amp
  • Roo Code
  • Goose
  • Continue
  • Kilo Code
  • Junie
  • Trae
  • OpenHands
  • Qwen Code
  • AI Agent
  • Tabnine Chat
  • Sourcegraph Cody
  • Amazon Q
  • Firebase Genkit
  • Sweep
  • Devin
  • Phind
  • Mentat
  • Claude Desktop
  • Aider
  • GPT Pilot
  • Plandex
  • bolt.new
  • v0
  • Replit Agent
  • Anse
  • TypingMind
  • BetterChatGPT
  • LibreChat
  • Warp AI
  • Pieces
  • Fig AI
Embed badge
vskill VERIFIED badge
[![vskill VERIFIED](https://verified-skill.com/api/v1/skills/digital-process-tools/claude-oss/manager/badge)](https://verified-skill.com/skills/digital-process-tools/claude-oss/manager)

Something wrong with this skill or its page? Tell us.