Skip to content
Back to skills

Aggregate Codify Proposals

ASecurity

Walk the inference-output directory under STM, read every proposal artifact each infer-*-from-code skill produced, and compose the master proposals.yaml index classified by the two-level learning taxonomy (learning_category + sub_category). This is the artifact that /garura:enrich consumes. Used exclusively by the /codify play.

  • 3 stars
  • 0 votes
  • 0 copies
  • 5 views
  • Added September 10, 2026
documentationgofrontend

Security analysis

A100/100

Scanned September 10, 2026

npx -y skills add kapilvirenahuja/garura --skill aggregate-codify-proposals --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Aggregate Codify Proposals?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Aggregate Codify Proposals
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/kapilvirenahuja-aggregate-codify-proposals/badge)](https://www.skillsdirectory.com/skills/kapilvirenahuja-aggregate-codify-proposals)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: aggregate-codify-proposals
description: Walk the inference-output directory under STM, read every proposal artifact each infer-*-from-code skill produced, and compose the master proposals.yaml index classified by the two-level learning taxonomy (learning_category + sub_category). This is the artifact that /garura:enrich consumes. Used exclusively by the /codify play.
version: 0.1.0
user-invocable: false
model: sonnet
allowed-tools: Read, Write, Grep, Glob
deprecated: true
deprecated_note: '#434 ProductOS realignment — superseded by the command model; retained for Phase E reference, not installed'
---

# aggregate-codify-proposals

Called by the `/codify` play after all inference agents finish. Produces `proposals.yaml` — the master index that /garura:enrich reads to promote proposals into product LTM. Every inferred LTM artifact is catalogued here with its tier, taxonomy, evidence, confidence, and target LTM path.

## Purpose

Each `infer-*-from-code` skill writes one artifact under `{stm_base}/{issue}/evidence/codify/proposals/<target-path>`. Those files are the proposals themselves. This skill walks that tree, reads each file, extracts its metadata block, classifies each proposal against /reap's two-level learning taxonomy, groups by tier, and writes a single master index. The master index is what downstream consumers (the user at the checkpoint; /garura:enrich later) read.

## Input

Receive from the /codify play orchestrator via JSON contract.

- `proposals_root` (path, required) — `{stm_base}/{issue}/evidence/codify/proposals/`. Walked recursively; every file is treated as a proposal artifact.
- `scan_result_path` (path, required) — `{stm_base}/{issue}/evidence/codify/scan-result.yaml`. Used to read scan metadata (repos, frontend detection, scan status) into the master index.
- `output_path` (path, required) — `{stm_base}/{issue}/evidence/codify/proposals.yaml`.
- `incremental_mode` (bool, optional, default false) — when true, read `skipped_locked` from caller and include it in the master index.
- `skipped_locked` (list[path], optional) — list of target LTM paths skipped because they are LOCKED. Only populated when `incremental_mode` is true.
- `skipped_phases` (list[str], optional) — phases skipped entirely (e.g., `["experience"]` when no frontend detected, or `["scope"]` under a --target filter).
- `target_filter` (str, optional) — if /codify was invoked with `--target`, record the filter here for provenance.

## Process

### 1. Validate inputs

- Confirm `proposals_root` exists and is a directory. Missing → structured failure with `what_failed: proposals_root_missing`.
- Confirm `scan_result_path` exists and is valid YAML. Missing → structured failure with `what_failed: scan_result_missing`.
- Parse `scan_result_path`.

### 2. Walk proposals directory

Enumerate every file under `proposals_root`. For each file:

1. Determine `target_path` — the path relative to `proposals_root` with the file name preserved. This is the LTM-relative destination (e.g., `architecture/logical-architecture.yaml`, `scope/epics/epic-auth-001.yaml`).
2. Parse the file:
   - YAML (`.yaml` / `.yml`) → parse top-level `meta` block expected to contain `source_type`, `evidence`, `confidence`, `learning_category`, `sub_category`, `tier`, optional `adr_draft_path`, optional `impact`, optional `taxonomy_justification`, optional `resolution_trace_path`.
   - Markdown (`.md`) → parse YAML frontmatter for the same fields.
3. Validate the mandatory fields:
   - `source_type` MUST equal `"inferred_from_code"`.
   - `evidence` MUST be a non-empty list.
   - `confidence` MUST be one of `"high"` | `"medium"` | `"low"`.
   - `learning_category` MUST be one of `arch | domain | product | quality | standards` OR carry a `learning_category_proposed: true` flag with a complete `taxonomy_justification` block.
   - For hierarchical parents (arch, quality, standards): `sub_category` MUST be present OR `sub_category_proposed: true` with a complete `taxonomy_justification`.
   - For flat parents (domain, product): `sub_category` MUST be null or absent.
   - `tier` MUST be one of `1` | `2` | `3`.

Any validation failure produces a structured failure with `what_failed: invalid_proposal` and the offending file path. Do NOT silently drop invalid proposals.

### 3. Classify by tier (sanity-check)

Confirm each proposal's declared tier matches the /reap tier table:

| Target path | Expected tier |
|-------------|---------------|
| `user-provided/project-profile.yaml` | 1 |
| `architecture/*.yaml` | 1 |
| `specification/quality-profile.yaml` | 2 |
| `specification/domain-selection.yaml` | 2 |
| `specification/market-brief.md` | 2 |
| `scope/scope.yaml` | 2 |
| `scope/garura:enriched-capabilities.yaml` | 2 |
| `scope/features.yaml` | 2 |
| `scope/mvp-recommendation.md` | 2 |
| `scope/epics/*.yaml` | 2 |
| `research/*.md` | 2 |
| `experience/*` | 3 |

A mismatch between declared tier and expected tier for the target path is a `what_failed: tier_mismatch` failure.

### 4. Compose master index

Write `proposals.yaml` at `output_path`:

```yaml
schema_version: "1.0"
generated_at: "<ISO timestamp>"
scan:
  status: "<scan_status>"
  repos: [...]
  frontend_detected_any_repo: <bool>
  duration_seconds: <float>
incremental_mode: <bool>
target_filter: <string or null>
skipped_phases: [...]
skipped_locked: [...]
total_proposals: <int>
alignment_confirmed: <bool>   # true when total_proposals == 0
tier_counts:
  tier_1: <int>
  tier_2: <int>
  tier_3: <int>
confidence_counts:
  high: <int>
  medium: <int>
  low: <int>
learning_category_counts:
  arch: <int>
  domain: <int>
  product: <int>
  quality: <int>
  standards: <int>
proposals:
  - proposal_id: "<slug>"
    target_path: "<relative to product LTM>"
    artifact_path: "<absolute STM path to the proposal file>"
    learning_category: "<canonical value>"
    sub_category: "<canonical child or null>"
    learning_category_proposed: <bool, default false>
    sub_category_proposed: <bool, default false>
    taxonomy_justification: {...}   # only when *_proposed: true
    tier: 1 | 2 | 3
    source_type: "inferred_from_code"
    confidence: "high" | "medium" | "low"
    evidence: [...]
    resolution_trace_path: "<path or null>"
    adr_draft_path: "<path or null>"   # only when tier == 1 and conflicts with LOCKED LTM
    impact: {...}                       # only when adr_draft_path is present
    notes: "<free text>"
```

### 5. Compute proposal_id

For each proposal, derive a stable `proposal_id`:

- Strip extension from `target_path`
- Replace path separators with dashes
- Lowercase
- Suffix with `-<short-hash>` where short-hash is 8 chars of the SHA-256 of the proposal file bytes, to make re-runs stable and detect content changes

## Output

Primary artifact: `proposals.yaml` at `output_path`.

No decision manifest — this skill makes no inferred decisions. It is a deterministic aggregator over artifacts other skills produced.

## Failure Modes

```yaml
status: failure
what_failed: "<proposals_root_missing | scan_result_missing | invalid_proposal | tier_mismatch>"
detail: "<specific error string>"
evidence:
  offending_path: "<file path>"
  offending_field: "<field name, if applicable>"
```

## Notes

- Zero-proposal case is valid: if `proposals_root` is empty (e.g., fully aligned LTM in incremental mode), write `total_proposals: 0` and `alignment_confirmed: true`. Do NOT raise a failure.
- This skill enforces structural validation only. Semantic correctness of each proposal's content is the originating infer-*-from-code skill's responsibility.
- `proposals.yaml` is the single artifact /garura:enrich consumes. Treat its schema as a stable contract.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.