SLOPSHOPPER

mod-lane-probe

The mod lane precondition: a module with one passing test, so a failure is the engine, never the mod.

new
A shopper browsing a rack in a slop shop
README

kodflow Claude marketplace

An opinionated agent configuration for Claude Code and Codex, installed from one place instead of copied by hand.

git clone https://github.com/kodflow/claude-marketplace
cd claude-marketplace && ./scripts/install.sh

--check reports what it would do and writes nothing. Re-running is safe.

What is in it

PluginSkills
kodflow-workflow/project /warmup /search /plan /challenge /refine /git /feature /fix /flow /recap /docs
kodflow-review/review /debug /adr /learn /lint
kodflow-devops/infra /audit /update /ktn
kodflow-shell/shell — and super-claude on your PATH
kodflow-specialists34 language, platform and concern agents
kodflow-hud (optional)/hud — a Tasks pane beside the status line (a mod, Claude Code 2.1.293+)
kodflow-ktn (optional)/ktn-view — ktn-linter's daemon and findings in a Go project (a mod, Claude Code 2.1.299+)

The three ideas worth the install

Work leaves a trail. /feature and /fix record what you are doing where the project already tracks work — a note store when the session has one, a GitLab or GitHub issue otherwise — and cut a branch named after it. Running either again on the same subject appends a comment and never rewrites the original: the record of the first understanding is what makes the trail worth keeping.

Claims are checked, not recalled. Every specialist verifies an API, a default, a limit or a deprecation against documentation before asserting it, and returns what it consulted and what it could not confirm. A claim with an empty consulted list is marked as recall, not accepted as evidence. The local pattern library carries a verified date and a category TTL, so a stale entry is a hypothesis rather than a source.

Plans are argued before they are built. /challenge puts a plan through contradictory lenses plus every specialist whose technology it touches, asks you the moment it hits something it cannot settle, and emits a directive that a script validates — length, an unticked task list, a runnable check per acceptance criterion, no vague verbs, no placeholders. A directive that would let a run report success at 60% does not ship.

Pinning a version for a project or a team

install.sh follows the tip of main, which is right on your own machine and wrong for a team: a plugin update lands the moment someone opens the project, possibly mid-sprint. A repository can register the marketplace at a fixed git ref in its own .claude/settings.json — a tag, a branch or a commit sha — so everyone working on it runs the same revision until that file changes:

{
  "extraKnownMarketplaces": {
    "kodflow": {
      "source": {
        "source": "git",
        "url": "https://github.com/kodflow/claude-marketplace.git",
        "ref": "4eeb32f3b9cacea4696faf549fb4a80b6760eedd"
      }
    }
  },
  "enabledPlugins": {
    "kodflow-workflow@kodflow": true,
    "kodflow-review@kodflow": true
  }
}

Pin when a change to the skills would be a change to the work — a release branch, a shared CI image, an audit whose findings have to be reproducible — and leave it unpinned everywhere else, where getting the fix the day it lands is the reason to install from a marketplace at all.

Both CLIs, one source

codex/ is generated from plugins/ by scripts/build-codex.py, not maintained in parallel. The skill container is close on both CLIs; the agent format is not — Codex custom agents are TOML with developer_instructions. Tool names that exist on one side only are rewritten rather than dropped, because an agent told to use a tool that is not there simply fails.

Re-run the generator after changing anything under plugins/; CI checks the result parses and that no private detail survived.

What a session pays to have this installed

scripts/check-context-cost.py reports the standing cost of the catalogue: agents that leave model or effort unpinned, skills that leave effort unpinned or name a model without forking (a skill's model switches the whole conversation and re-reads it uncached), descriptions over 350 characters (loaded into every session, used or not), a SKILL.md over 20 000 characters, memory blocks copied out of the harness, and cross-plugin references written bare — a backticked debug in a kodflow-workflow skill or agent resolves to whatever debug the user has installed locally, so it is written kodflow-review:debug.

An agent is reported when either model or effort is unpinned, so both have to be pinned explicitly, and pinned means a real value: an empty effort:, a null and a ~ are all unpinned. Whichever field is missing inherits the user's session setting, xhigh included, on every spawn.

Findings are warnings and CI stays green. A check gates the build only once it is named in COST_CHECKS_STRICT (comma-separated, or all), which is what keeps a cleaned-up check clean: CI runs with model_effort strict, since every agent and skill now pins what the model policy (plugins/kodflow-workflow/skills/_shared/model-policy.md) asks of it. An oversized SKILL.md can be exempted in SKILL_SIZE_ALLOWLIST in that script, and only with a dated reason — "YYYY-MM-DD: why, and whether a reduction is planned"; an entry whose file shrank or disappeared becomes a finding of its own.

The repository is public, and CI enforces it

scripts/sanitize.py fails the build on a credential shape — tokens, keys, credentials in a URL — while distinguishing a real one from a placeholder or a detection pattern, so a security skill can ship the regexes it needs. CI also refuses machine paths and internal hostnames, validates every skill and agent against the documented frontmatter schema, checks that module links resolve, and parses every shell script.

mcp/mcp.example.json references credentials as ${VAR} and contains none. The installer seeds it only when no config exists — it never overwrites a file holding a working token.

Licence

MIT.

Source 1 files
hooks/register.ts 7 lines
1import type { Register } from "claude-code";
2
3// Nothing hooked: the probe asks only whether the engine loads modules.
4export const register: Register = (on) => {
5  on("session.start", async ($, e, next) => next(e));
6};
7