Spec Writer
garrytan/gstack
Converts a vague idea into a precise, executable spec in five phases, files it as an issue and can start an agent on it in a fresh worktree.
Sanitizes analysis specs to remove implementation contamination while preserving provenance metadata.
$ npx skills add prime-radiant-inc/greenfield --skill spec-sanitization -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install prime-radiant-inc/greenfield spec-sanitization --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/prime-radiant-inc/greenfield.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/spec-sanitization .claude/skills/spec-sanitization && 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 "spec-sanitization" agent skill from https://github.com/prime-radiant-inc/greenfield/tree/main/skills/spec-sanitization into .claude/skills/spec-sanitization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "spec-sanitization", 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/prime-radiant-inc/greenfield/tree/main/skills/spec-sanitizationType 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 prime-radiant-inc/greenfield --skill spec-sanitization -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install prime-radiant-inc/greenfield spec-sanitization --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/prime-radiant-inc/greenfield.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/spec-sanitization .agents/skills/spec-sanitization && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "spec-sanitization" agent skill from https://github.com/prime-radiant-inc/greenfield/tree/main/skills/spec-sanitization into .agents/skills/spec-sanitization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "spec-sanitization", 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 prime-radiant-inc/greenfield --skill spec-sanitization -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install prime-radiant-inc/greenfield spec-sanitization --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/prime-radiant-inc/greenfield.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/spec-sanitization .cursor/skills/spec-sanitization && 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 "spec-sanitization" agent skill from https://github.com/prime-radiant-inc/greenfield/tree/main/skills/spec-sanitization into .cursor/skills/spec-sanitization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "spec-sanitization", 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/prime-radiant-inc/greenfield.git --path skills/spec-sanitization--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 prime-radiant-inc/greenfield --skill spec-sanitization -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install prime-radiant-inc/greenfield spec-sanitization --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/prime-radiant-inc/greenfield.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/spec-sanitization .gemini/skills/spec-sanitization && 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 "spec-sanitization" agent skill from https://github.com/prime-radiant-inc/greenfield/tree/main/skills/spec-sanitization into .gemini/skills/spec-sanitization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "spec-sanitization", 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 prime-radiant-inc/greenfield spec-sanitizationInstalls 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 prime-radiant-inc/greenfield --skill spec-sanitization -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/prime-radiant-inc/greenfield.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/spec-sanitization .github/skills/spec-sanitization && 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 "spec-sanitization" agent skill from https://github.com/prime-radiant-inc/greenfield/tree/main/skills/spec-sanitization into .github/skills/spec-sanitization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "spec-sanitization", 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 prime-radiant-inc/greenfield --skill spec-sanitization -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install prime-radiant-inc/greenfield spec-sanitization --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/prime-radiant-inc/greenfield.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/spec-sanitization .opencode/skills/spec-sanitization && 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 "spec-sanitization" agent skill from https://github.com/prime-radiant-inc/greenfield/tree/main/skills/spec-sanitization into .opencode/skills/spec-sanitization/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "spec-sanitization", 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.
spec-sanitizationSanitizes analysis specs to remove implementation contamination while preserving provenance metadata.
Spec Sanitization is an agent skill from prime-radiant-inc/greenfield. Sanitizes analysis specs to remove implementation contamination while preserving provenance metadata. Run in SEPARATE SESSION after analysis, before implementation.
Its SKILL.md is about 6.4k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
The repository describes itself as: A Claude Code plugin that reverse-engineers clean behavioral specs, test vectors, and acceptance criteria from any codebase, producing a provenance trail so a fresh team can… The licence is Apache-2.0.
5 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 6e6d4b4. 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 markdown and dot).
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.
Spec Sanitization loads about 6.4k tokens when it runs. Until then it costs about 46 tokens; SKILL.md has 2,610 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 prime-radiant-inc/greenfield at commit 6e6d4b4, republished under its Apache-2.0 licence (© prime-radiant-inc). 2,610 words, ~6,404 tokens.
.claude/skills/spec-sanitization/SKILL.md (or your agent's skills folder).The sanitization pass turns raw analysis into specs an implementer can build from.
Analysts read source code, binaries, and runtime behavior. Even with good intentions, they leak implementation details:
workspace/raw/source/analysis/chunk-42.md:67)These have no place in the output specs. Your job: READ each spec, UNDERSTAND the behavior, REWRITE without source references, TRANSFORM provenance citations.
You must not copy text from raw specs into output specs. Not sentences, not paragraphs, not sections. Read the raw specs to understand the behavior, then write a fresh output spec from your understanding.
Why? Raw specs have source code identifiers woven into every sentence — minified names (k0, Wq, z1), internal function signatures (Pn(a, b, c)), and numeric implementation constants. Find-and-replace cannot catch them all; many internal identifiers read like plain English (shouldRetryOnTimeout, evict_stale_connections). A paraphrase that preserves the original's structure is still leaking the original's design. The only reliable approach is to never copy the text at all.
Process per file:
[UNCERTAINTY: U-{DOMAIN}-{NNN}] {what the raw spec said, in behavioral terms as best you can} — behavioral purpose could not be determined from available analysis.Never preserve implementation jargon in slightly-reworded form. "validator.Exists() is called" rewritten as "the exists check runs" is still jargon — neither you nor the implementer knows what it means. Either translate it to behavior ("verifies the value exists in the constrained list") or flag it as uncertain.
If you find yourself copying a sentence and then editing out identifiers — STOP. You are doing it wrong. Rewrite the sentence from scratch.
Caveat on the "close the file" step: this is a behavioral instruction, not an enforced mechanism. Closing a file does not evict its content from the agent's context window; the raw text remains readable until the session ends. The Layer 6 second-pass review, which runs in a fresh session with access only to workspace/output/, is the practical check on verbatim leakage. Treat this process as discipline, not guarantee.
For every identifier in a spec, ask: "Would an implementor encounter this exact string?"
DATABASE_URL → YES: it's in official docs, users type it. KEEP.--format → YES: it's in CLI help output. KEEP.plugins → YES: it's a config file key users write. KEEP.Retry-After → YES: it's an HTTP header defined by RFC 9110. KEEP.routeRequest → NO: this is an internal function name the developer chose. A different developer would name it differently. GENERALIZE to "the request routing operation."ff_batch_commit_v2 → NO: this is an internal feature flag. No user ever types this. GENERALIZE to "the batch commit feature gate."q9 → NO: this is a minified identifier with zero semantic content. REMOVE.No set of regex patterns will catch every internal identifier because many look like legitimate English (e.g., shouldRetryOnTimeout, evict_stale_connections). You must read every line and apply the principle above.
Every identifier in a raw spec is either an implementation detail that must be abstracted or an external contract that must be preserved. This distinction is language-agnostic — it applies whether the source is TypeScript, Python, Rust, Go, Java, C++, or anything else.
These are choices the original developers made that a reimplementor would reasonably make differently. Abstract them to behavioral descriptions or remove them entirely.
Internal names — function, method, class, module, and variable names chosen by the original developers:
_drain_write_queue(), RecordParser, should_retry_on_timeoutrouteRequest(), evictStaleConnections, indexBuilderfn decode_packet(), struct ProtocolFrameparseRecord(), validateRecord(), AbstractMessageProcessorInternal architecture — how the codebase is organized into files, modules, packages, or namespaces:
pkg/internal/transport/"Framework-specific patterns — references to libraries, state management, UI frameworks, or runtime internals:
useStore, getState(), @observable, store.get()className=, styled., @Component, #[derive(Template)]Model.objects.filter(), has_many :sessions, @Entity@Inject, container.resolve(), wire.Build()Build and deployment artifacts — paths, chunk IDs, minified identifiers, line numbers:
src/, lib/, pkg/, internal/, dist/, target/, build/auth-handler.ts, record_parser.py, transport.go, Main.javaAb2, q9, a$b, __webpack_require__MOD-023, chunk-NNNNInternal feature gates — feature flag names, experiment keys, and vendor-specific telemetry identifiers:
ff_batch_commit_v2, FF_NEW_INDEX_FORMAT, ff_dark_modeexp_async_cache_v2, exp_beta_usercli_parse_completed, worker_startedCode structure language — descriptions that mirror source code control flow rather than observable behavior:
These are constraints imposed by the outside world that a reimplementor cannot redesign. Preserve them exactly.
User-facing identifiers — anything a user types, reads in docs, or sees in output:
DATABASE_URL, DEBUG, RUST_LOG--format, --workers, -h, --verboseupstreams, log_level, timeout_secondsvscode://, myapp://Wire protocol fields — names that appear in network traffic, file formats, or IPC contracts:
request_id, batch_size, streamAuthorization, 200, 401External system schemas — databases, APIs, CLIs, and file formats the application does not own:
Published constants and standard names — values defined by specifications or public documentation:
For any identifier, ask: "Could the reimplementor reasonably redesign this?"
When the test isn't clear-cut, apply these secondary questions:
--verbose → external contract. If one might write parseArgs and another parse_arguments → implementation detail.Internal identifiers like routeRequest, should_retry_on_timeout, FlushConnectionPool, strict_schema_validation look legitimate because they're descriptive English words in some casing convention. But they are implementation details — an implementor would choose different names for the same concepts. This applies equally to camelCase, snake_case, PascalCase, and kebab-case identifiers.
The test: Does this exact string appear in official documentation, a config file schema, a CLI --help output, or an API response? If not, it's an internal identifier and MUST be generalized, even if it's descriptive.
Examples that STAY (user-facing): upstreams, rate_limit, --workers, DATABASE_URL
Examples that GO (internal): routeRequest → "the request routing operation", should_retry_on_timeout → "the retry-on-timeout check", FlushConnectionPool → "the connection pool flush"
When the target depends on external systems it does not own — shared databases, third-party APIs, CLI tools it shells out to, imposed file formats — the details of those systems are behavioral constraints, NOT implementation details. The contract-extractor should have produced dedicated contract files in workspace/raw/specs/contracts/ for each external system.
Do NOT strip from external system contracts:
External contract files flow to implementation: workspace/raw/specs/contracts/{database,api-*,cli-*,format-*}.md → workspace/output/specs/contracts/.
Concrete before/after examples for the sanitizer to follow.
Before: The Ab2() function is the application entry point
After: The application entry point is invoked on startup
Before: ## Part 3: RecordParser Module
After: ## Session Lifecycle Management
Before: The application consists of 52 modules organized into 8 domains
After: (remove entirely — this is analysis organizational metadata)
Before:
| Module | Depends On |
|--------|-----------|
| RecordParser | IndexBuilder, ConfigLoader |After: (remove entirely — replaced by behavioral integration requirements in BIR format)
Before: Sends a message on the task-completed IPC channel
After: Notifies listeners when the order status changes via internal messaging
Before: Reads store.activeDocument.content to get the document body
After: Retrieves the current document body from application state
Before: When FF_NEW_INDEX_FORMAT is enabled, the feature activates
After: When the batch commit feature gate is active, the feature activates
Before: Defined in the auth handler source file alongside the token refresh logic
After: The authentication handling component also manages token refresh
Before: The validation logic at line 234 checks for...
After: The validation logic checks for...
Before: Applies the .toolbar__button--active CSS class
After: Applies active styling to the toolbar button
Before: Stores data in the sessions table with columns: id, owner, started_at, state
After: Persists session data including identifier, owner, start time, and state
Exception: If the system is external (documented in contracts/database.md, contracts/api-*.md, contracts/cli-*.md, or contracts/format-*.md), KEEP details as-is — they are external constraints, not implementation choices. This applies to database schemas, API field names, CLI flags, file format fields, etc.
Before: The parseRecord() function calls validateRecord() which calls refreshToken() on failure
After: Authentication validates the current token and refreshes it on failure
After sanitization, every file in workspace/output/ must be reviewed. External contract files (database.md, api-*.md, cli-*.md, format-*.md) are exempt — they document systems the app does not own.
Review each file in workspace/output/specs/ (excluding external contract files) and produce a structured verdict. The review is semantic — you are reading for meaning, not running pattern matches.
For each file, check these categories:
Content contamination:
Ab2, a$b, Qz)src/, lib/, pkg/, internal/, dist/, target/)auth-handler.ts, record_parser.py, transport.go, Main.java)Structural contamination:
Part N: header prefixes from analysis's module organizationMOD-NNN)workspace/raw/)Verdict format per file:
FILE: {path}
VERDICT: PASS | FAIL
ISSUES:
- LINE {N}: {quoted text} — {category}: {why this is contamination}
- LINE {N}: {quoted text} — {category}: {why this is contamination}A file with zero issues gets VERDICT: PASS and no ISSUES block. A file with any issue gets VERDICT: FAIL with line-level citations.
Hard rule: ALL files in workspace/output/specs/ must receive PASS. Any FAIL verdict blocks the pipeline. Fix the contamination and re-verify until all files pass.
When transforming workspace/raw/specs/modules/ into workspace/output/specs/domains/:
record-parser.md, auth-handler.md)session-lifecycle.md, authentication.md)Part N: prefixes from all headers## Cross-Module Dependencies sections entirely## Module Boundary sections entirely## Inter-Module Interface sections entirelyMOD-NNN identifiersFrom module: fields in Prerequisites sectionsNeeds: session token. From module: IndexBuilder. Failure: returns 401Needs: session token. Failure: returns 401workspace/
├── public/ # Public origin - pass through directly
│ ├── docs/ # doc-researcher output
│ └── ecosystem/ # sdk-analyzer output
├── raw/ # RAW - your input
│ └── specs/
│ ├── modules/ # Module-organized specs (analysis structure)
│ ├── journeys/
│ ├── contracts/
│ │ ├── cli.md # Flows to implementation
│ │ ├── environment.md # Flows to implementation
│ │ ├── configuration.md # Flows to implementation
│ │ ├── inter-module.md # ⛔ Stays in analysis
│ │ └── behavioral-integration.md # Flows to implementation
│ ├── test-vectors/
│ └── validation/
│ └── acceptance-criteria/
└── output/ # Sanitized specs for the implementer
├── public/ # Copied from workspace/public/ directly
├── specs/
│ ├── domains/ # Behavioral specs merged by domain (NOT original modules)
│ ├── journeys/
│ └── contracts/ # External contracts + behavioral integration requirements
├── test-vectors/ # Output test vectors (sibling of specs/)
└── validation/ # Output acceptance criteria (sibling of specs/)
└── acceptance-criteria/Semantic judgment, not pattern matching.
Pattern-matching tools can catch obvious contamination like Ab2 or src/cli/main, but they miss descriptive internal identifiers ("calls the parser function", "the auth handler validates") and produce false positives on legitimate terms. The sanitizer must READ each spec, UNDERSTAND the behavior, and REWRITE it in pure behavioral terms — applying the implementation-detail-vs-external-contract test to every identifier.
BEFORE (what raw analysis looks like):
### Entry Point: main()
Location: src/cli/main:45
Function calls parseArgs() for arg parsing, then detectMode().
Variable config.recordId = generateRecordId() creates session ID.
<!-- cite: source=source-code, ref=workspace/raw/source/analysis/chunk-0003.md:45, confidence=confirmed, agent=chunk-analyzer -->AFTER (what spec-sanitizer produces):
### Application Entry
**Trigger:** Command-line invocation
**Behavior:**
1. Parse command-line arguments into structured format
2. Detect execution mode from first positional argument
3. Generate session ID (UUID v4, once per process)
4. Route to mode-specific handler
**Session ID:**
- Format: UUID v4
- Lifecycle: Generated at startup, immutable
- Scope: Process-global singleton
<!-- cite: source=source-code, confidence=confirmed, agent=chunk-analyzer -->Same information. Zero source references. Provenance preserved (minus raw paths).
During sanitization, provenance citations are transformed based on their source type.
Sources: source=source-code, source=runtime-observation, source=binary-analysis
These contain file paths into workspace/raw/ — implementation details that must not reach the implementer.
Before:
<!-- cite: source=source-code, ref=workspace/raw/source/analysis/chunk-0019.md:77, confidence=confirmed, agent=deep-dive-analyzer, corroborated_by=runtime-observation -->After:
<!-- cite: source=source-code, confidence=confirmed, agent=deep-dive-analyzer, corroborated_by=runtime-observation -->Rule: Remove the ref field entirely. Preserve source, confidence, agent, and corroborated_by.
Sources: source=official-docs, source=sdk-analysis, source=public-api
These contain references to public URLs or workspace/public/ paths — no implementation details.
Before:
<!-- cite: source=official-docs, ref=workspace/public/docs/claims/claims-by-topic.md:89, confidence=confirmed, agent=doc-researcher -->After (unchanged):
<!-- cite: source=official-docs, ref=workspace/public/docs/claims/claims-by-topic.md:89, confidence=confirmed, agent=doc-researcher -->Rule: Pass through without modification.
workspace/public/ content is NOT raw. It comes from official documentation, SDK analysis, and public APIs. Copy directly to workspace/output/public/ without modification.workspace/raw/specs/ content IS raw. It was produced by agents that read source code, binaries, or runtime internals. Every file must be sanitized before entering workspace/output/specs/.workspace/output/ is the output. The implementer reads ONLY from here.Acceptance criteria and test vectors also need sanitization:
AC-{MODULE}-{NNN}) must survive sanitization intact.workspace/raw/specs/ to relative references within workspace/output/specs/).digraph sanitization_process {
rankdir=TB;
"Start sanitization" [shape=doublecircle];
"Assess contamination level" [shape=box];
"Copy public/ to output/public/" [shape=box];
"Sanitize each spec in raw/specs/" [shape=box];
"Sanitize validation artifacts" [shape=box];
"Run LLM judge verification on output/specs/" [shape=box];
"All files PASS?" [shape=diamond];
"Verify behavioral completeness preserved" [shape=box];
"Sanitization complete" [shape=doublecircle];
"STOP: Contamination found in output" [shape=octagon, style=filled, fillcolor=red, fontcolor=white];
"Start sanitization" -> "Assess contamination level";
"Assess contamination level" -> "Copy public/ to output/public/";
"Copy public/ to output/public/" -> "Sanitize each spec in raw/specs/";
"Sanitize each spec in raw/specs/" -> "Sanitize validation artifacts";
"Sanitize validation artifacts" -> "Run LLM judge verification on output/specs/";
"Run LLM judge verification on output/specs/" -> "All files PASS?";
"All files PASS?" -> "Verify behavioral completeness preserved" [label="yes"];
"All files PASS?" -> "STOP: Contamination found in output" [label="no"];
"Verify behavioral completeness preserved" -> "Sanitization complete";
}/sanitize workspace/This:
workspace/raw/specs/ to assess contamination levelworkspace/public/ to workspace/output/public/workspace/output/specs/workspace/output/sanitization-report.mdThe sanitization report lives in output/ — it is an implementer-facing artifact. It must not contain source module names, raw file paths, source-to-domain mappings, or any reference to the original's internal structure. Include only: file inventory (counts, domain names, SPEC ID prefixes), provenance format explanation, SPEC ID coverage, directory structure, and implementer guidance.
Why this matters: the report is read alongside the output specs by the team building the reimplementation. Its job is to help them navigate the output, not to describe what the original looked like. References to the original's module names or architectural decomposition anchor the reimplementation to the original's design — the implementer should be free to choose their own.
workspace/output/; the raw analysis stays in workspace/raw/© prime-radiant-inc, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in skills/spec-sanitization of prime-radiant-inc/greenfield.
Open the folder on GitHubat commit 6e6d4b4
Spec Sanitization 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 |
|---|---|---|---|---|---|---|
| Spec Sanitization this skillprime-radiant-inc/greenfield | 292 | — | ~6.4k | Automated safety check: Pass | Apache-2.0 | |
| Spec Writergarrytan/gstack | 136k | — | ~14k | Automated safety check: Notes | MIT | |
| Specgarden-co/classic-jazz | 2.5k | — | ~1.3k | Automated safety check: Pass | MIT | |
| Spec Driven Workflowalirezarezvani/claude-skills | 28k | — | ~3.9k | Automated safety check: Pass | MIT | |
| Sparc Specruvnet/ruflo | 74k | — | ~1.1k | Automated safety check: Notes | MIT | |
| Write A Specdifferent-ai/openwork | 24k | — | ~3.3k | Automated safety check: Pass | Custom licence |
garrytan/gstack
Converts a vague idea into a precise, executable spec in five phases, files it as an issue and can start an agent on it in a fresh worktree.
garden-co/classic-jazz
Implement features using Spec Driven Development (SDD) workflow.
alirezarezvani/claude-skills
A skill your agent uses when the user asks to write specs before code, define acceptance criteria, plan features before implementation, generate tests from specifications, or follow spec-first…
ruvnet/ruflo
Run the SPARC Specification phase — gather requirements, define acceptance criteria, identify constraints, and store the spec in memory
different-ai/openwork
Write or extend an E2E journey spec in evals/specs that proves a PR's change to a human reviewer.
vinvcn/mattpocock-skills-zh-CN
把当前对话转成 spec 并发布到项目 issue tracker:不做访谈,只综合已经讨论的内容. An agent skill from vinvcn/mattpocock-skills-zh-CN.
prime-radiant-inc/greenfield
Master methodology for reverse-engineering a codebase into behavioral specs with cited evidence, reading every line across source, binaries, docs, runtime and git history.
prime-radiant-inc/greenfield
Mines tutorials, forums, reviews, issues and changelogs for observed product behavior, using six search channels and consensus analysis.
prime-radiant-inc/greenfield
Runs untrusted analysis targets inside Docker or Podman containers with memory, CPU and process limits, covering image builds, lifecycle, command execution and cleanup.
prime-radiant-inc/greenfield
Finds OpenAPI, GraphQL, Protobuf and JSON Schema files in a codebase and extracts behavioral claims from them as part of a reverse-engineering workflow.
prime-radiant-inc/greenfield
Method for extracting behavioral specifications from a product's public documentation: tiered search order, claim extraction rules, output structure, stop criteria and gap analysis.
prime-radiant-inc/greenfield
Layer 1 skill for SDK and ecosystem analysis. An agent skill from prime-radiant-inc/greenfield.
Sanitizes analysis specs to remove implementation contamination while preserving provenance metadata. Spec Sanitization is an agent skill from prime-radiant-inc/greenfield. Sanitizes analysis specs to remove implementation contamination while preserving provenance metadata.
Run `npx skills add prime-radiant-inc/greenfield --skill spec-sanitization -a claude-code`. Or copy the skill folder (skills/spec-sanitization in prime-radiant-inc/greenfield) into .claude/skills/spec-sanitization in your project. Claude Code loads it when a task matches its description.
Run `npx skills add prime-radiant-inc/greenfield --skill spec-sanitization -a codex`. Or copy the skill folder (skills/spec-sanitization in prime-radiant-inc/greenfield) into .agents/skills/spec-sanitization 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 prime-radiant-inc/greenfield --skill spec-sanitization -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/spec-sanitization, .gemini/skills/spec-sanitization, .github/skills/spec-sanitization and .opencode/skills/spec-sanitization in your project.
SKILL.md names no scripts, command-line tools or credentials: Spec Sanitization is instructions for the agent only.
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.
Spec Sanitization is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.4k tokens (SKILL.md is roughly 26k 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 Spec Sanitization: Spec Writer (garrytan/gstack, 136k stars), Spec (garden-co/classic-jazz, 2.5k stars), Spec Driven Workflow (alirezarezvani/claude-skills, 28k stars) and Sparc Spec (ruvnet/ruflo, 74k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
prime-radiant-inc (a GitHub organization) maintains it in prime-radiant-inc/greenfield, which has 292 GitHub stars. The repository holds 21 skills in this directory. The repository was last updated on August 6, 2026.
Source: prime-radiant-inc/greenfield on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.