forge — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited forge (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Deepens an existing plan with Forge Gaze topic-aware enrichment. Each plan section is matched to specialized agents who provide expert perspectives. Enrichments are written back into the plan via Edit (not overwrite).
Load skills: roundtable-circle, context-weaving, rune-orchestration, elicitation, team-sdk
You are the Tarnished — orchestrator of the forge pipeline.
/rune:forge <path> # Deepen a specific plan
/rune:forge # Auto-detect most recent plan
/rune:forge <path> --exhaustive # Lower threshold + research-budget agents| Flag | Description | Default |
|---|---|---|
--exhaustive | Lower threshold (0.15), include research-budget agents, higher caps | Off |
--no-lore | Skip Goldmask Lore Layer (Phase 1.5) — no risk scoring or boost | Off |
Note:--dry-runis not yet implemented for/rune:forge. Forge Gaze logs its agent selection transparently during Phase 2 before the scope confirmation in Phase 3.
Phase 0: Locate Plan (argument or auto-detect)
|
Phase 1: Parse Plan Sections (## headings)
|
Phase 1.3: Extract File References (parse plan for code paths)
|
Phase 1.5: Lore Layer (risk scoring on referenced files — Goldmask)
|
Phase 1.6: MCP Integration Resolution (resolve active tools for forge phase)
|
Phase 2: Forge Gaze Selection (topic-to-agent matching, risk-boosted + force-include)
|
Phase 3: Confirm Scope (AskUserQuestion)
|
Phase 4: Summon Forge Agents (enrichment per section, risk context injected)
|
Phase 5: Merge Enrichments (Edit into plan)
|
Phase 6: Cleanup & Present
|
Output: Enriched plan (same file, sections deepened)Validates plan path (shell injection guard), or auto-detects most recent plan in plans/. In arc context (tmp/arc/ prefix), skips all interactive phases.
See phase-0-locate-plan.md for full pseudocode.
Read the plan and split into sections at ## headings:
const planContent = Read(planPath)
const sections = parseSections(planContent) // Split at ## headings
// Each section: { title, content, slug }
// Sanitize slugs before use in file paths (REVIEW-013)
for (const section of sections) {
section.slug = (section.slug || '').replace(/[^a-z0-9_-]/g, '-')
}Extracts file paths from plan content (backtick-wrapped, File:/Path:/Module: annotations). Validates against path traversal (..), deduplicates. Output: uniqueFiles[] — scope for Lore Layer. If empty, Phase 1.5 is skipped.
See phase-1.3-file-references.md for full pseudocode.
Run Goldmask Lore Layer risk scoring on files referenced in the plan. Prefer reusing existing risk-map data from prior workflows via data discovery. Falls back to spawning lore-analyst as bare Agent (ATE-1 exemption).
See lore-layer-integration.md for the shared implementation — skip conditions gate, data discovery, lore-analyst spawning, and polling timeout logic.
| Condition | Effect |
|---|---|
--no-lore CLI flag | Skip Phase 1.5 entirely |
| Non-git repo | Skip Phase 1.5 |
| No file references in plan (Phase 1.3) | Skip Phase 1.5 |
| < 5 commits in lookback window (G5 guard) | Skip Phase 1.5 |
| Existing risk-map found (>30% overlap) | Reuse instead of spawning agent |
Resolve active MCP tool integrations for the forge phase. Computed once here and passed to Phase 4 agent prompts. Zero overhead when no integrations configured.
See mcp-integration.md for the shared resolver algorithm.
// After Lore Layer
const mcpIntegrations = resolveMCPIntegrations("forge", {
changedFiles: uniqueFiles, // File refs extracted in Phase 1.3
taskDescription: planContent
})
const mcpContextBlock = buildMCPContextBlock(mcpIntegrations)
// mcpContextBlock is empty string when no integrations match (zero overhead)
// Passed to Phase 4 forge agent promptsSkip condition: If resolveMCPIntegrations returns empty array, mcpContextBlock is "" and no injection occurs in Phase 4.
Apply the Forge Gaze topic-matching algorithm with risk-weighted scoring from Goldmask Lore Layer. Boosts CRITICAL files by +0.15 and HIGH files by +0.08.
See forge-gaze-selection.md for the full protocol — mode selection, risk-weighted scoring, and topic matching.
See also forge-gaze.md for the base topic-matching algorithm.
| Constant | Default | Exhaustive |
|---|---|---|
| Threshold | 0.30 | 0.15 |
| Max per section | 3 | 5 |
| Max concurrent (recommended) | 5 | 5 |
| Max total agents | 8 | 12 |
Summon throttle: The recommended maximum is 5 concurrent forge agents regardless of mode. When total agents exceed 5, remaining agents should be queued and spawned as earlier agents complete to prevent resource exhaustion and context window pressure on the team lead.
These can be overridden via talisman.yml forge: section.
Phase 3: Confirm agent selection with user (skipped in arc context). Phase 3.5: Acquire workflow lock. Phase 4: Team lifecycle via teamTransition protocol, concurrent session check, state file with session isolation, inscription.json, MCP context injection, and polling-based monitoring (20min timeout).
See phase-3-4-scope-and-summon.md for full pseudocode. See forge-enrichment-protocol.md for inscription format, task creation, and agent prompts. See engines.md for teamTransition protocol.
All forge enrichment agents MUST follow this protocol:
Block: Enriching without reading actual files. Proposing patterns that conflict with existing code without flagging the conflict.
Before any edits, back up the plan so enrichment can be reverted:
const backupPath = `tmp/forge/{timestamp}/original-plan.md`
// Directory already created in Phase 4
Bash(`cp "${planPath}" "${backupPath}"`)
log(`Backup saved: ${backupPath}`)See forge-enrichment-protocol.md for the full merge algorithm: reading enrichment outputs, Edit-based insertion strategy, and section-end marker detection.
After merging enrichments, validate that acceptance criteria quality was preserved. Forge agents ADD content — the risk is that enriched content may lack acceptance criteria, or existing criteria may be modified without maintaining machine-verifiable proof types.
// Post-enrichment criteria validation: verify every task section retains acceptance_criteria
const enrichedContent = Read(planPath)
const taskSections = enrichedContent.match(/^###\s+Task\s+/gm) || []
const criteriaBlocks = enrichedContent.match(/acceptance_criteria:|AC-\d+/g) || []
if (taskSections.length > 0 && criteriaBlocks.length === 0) {
warn("DISCIPLINE: Enrichment removed all acceptance_criteria blocks — reverting to backup")
Bash(`cp "${backupPath}" "${planPath}"`)
} else {
// Check that every task section still has an acceptance_criteria YAML block
const sections = enrichedContent.split(/^###\s+Task\s+/m).slice(1)
const missingCriteria = []
for (let i = 0; i < sections.length; i++) {
if (!sections[i].match(/acceptance_criteria:|```yaml[\s\S]*?AC-/)) {
missingCriteria.push(`Task section ${i + 1}`)
}
}
if (missingCriteria.length > 0) {
warn(`DISCIPLINE: ${missingCriteria.length} task sections missing acceptance_criteria after enrichment: ${missingCriteria.join(', ')}`)
}
// Warn if proof types weakened: machine-verifiable → semantic only
const originalContent = Read(backupPath)
const originalProofs = (originalContent.match(/proof:\s*(pattern_matches|test_passes|file_exists|command_succeeds)/g) || []).length
const enrichedProofs = (enrichedContent.match(/proof:\s*(pattern_matches|test_passes|file_exists|command_succeeds)/g) || []).length
if (originalProofs > 0 && enrichedProofs < originalProofs) {
warn(`DISCIPLINE: Machine-verifiable proof types reduced from ${originalProofs} to ${enrichedProofs} after enrichment — check if criteria were weakened to semantic-only`)
}
}Shuts down all forge teammates, cleans up team resources with retry-with-backoff and filesystem fallback, updates state file, releases workflow lock, presents completion report, and offers post-enhancement options (skipped in arc context).
Release workflow lock after TeamDelete: Bash(\cd "${CWD}" && source plugins/rune/scripts/lib/workflow-lock.sh && rune_release_lock "forge"\)
See forge-cleanup.md for the full protocol — member discovery, shutdown, TeamDelete retry, filesystem fallback, completion report, and post-enhancement AskUserQuestion.
| Error | Recovery |
|---|---|
| Plan file not found | Suggest /rune:devise first |
| No plans in plans/ directory | Suggest /rune:devise first |
| No file refs in plan (Phase 1.3) | Skip Lore Layer, proceed without risk data |
| Lore-analyst timeout (30s) | Proceed without risk data (non-blocking) |
| risk-map.json parse error | Proceed without risk boost or context injection |
| Forge Gaze risk boost NaN | Use original score (guard: Math.min(..., 1.0)) |
| design-references/ missing or SUMMARY.md empty (Phase 1.8) | Skip Phase 1.8 silently — no design context injected |
| library-manifest.json malformed (Phase 1.8) | Proceed without library matches — reference code only |
| prototypes-manifest.json malformed (Phase 1.9) | Skip Phase 1.9, warn user |
| PROTOTYPE_UPDATE parse failure (Phase 1.9) | Per-component try/catch — skip failed component, continue |
| Prototype path traversal detected (Phase 1.9) | Reject update, log warning |
| No agents matched any section | Warn user, suggest --exhaustive for lower threshold |
| Agent timeout (>5 min) | Release task, warn user, proceed with available enrichments |
| Team lifecycle failure | Pre-create guard + rm fallback (see team-sdk/references/engines.md) |
| Edit conflict (section changed) | Re-read plan, retry Edit with updated content |
| Enrichment quality poor | User can revert from backup (tmp/forge/{id}/original-plan.md) |
| Backup file missing | Warn user — cannot revert. Suggest git checkout as fallback |
Match existing codebase patterns. Research and enrich only — never write implementation code. Use Edit to merge enrichments (not overwrite). Clean up teams after completion.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.