# gabriel-omat/rfp-intake architecture

> Architecture diagram of the GitHub repository gabriel-omat/rfp-intake, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-13). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/gabriel-omat/rfp-intake
- Repository: https://github.com/gabriel-omat/rfp-intake

## Overview

rfp-intake is a local Claude Code skill for turning an RFP folder into a cited estimating packet. The user starts the skill; Claude guides local ingestion and section-by-section semantic review, while the Python CLI extracts and indexes evidence, tracks package changes, validates review batches, and publishes packet outputs. Estimating is gated on checks and named human attestations; retrieval supports focused context, and a rerun reconciles addenda. The processor excerpt is partial, so internal links beyond its shown CLI and publishing behavior rely on README statements; optional OCR is documented but not shown in the excerpt.

Main entry points: [`plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py`](https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py) (Intake CLI), [`plugins/rfp-intake/skills/rfp-intake/SKILL.md`](https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/SKILL.md) (Skill instructions), [`plugins/rfp-intake/skills/rfp-intake/references/batch.schema.json`](https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/references/batch.schema.json) (Review batch)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_workflow["Skill workflow"]
  node_skill["Skill instructions<br/>[SKILL.md]"]
end

subgraph group_processing["Local processing"]
  node_processor["Intake CLI<br/>[rfp_intake.py]"]
  node_evidence[("Evidence index<br/>[rfp_intake.py]")]
  node_change_tracking["Change reconciliation<br/>[rfp_intake.py]"]
  node_ocr["Scanned-page OCR<br/>[rfp_intake.py]"]
end

subgraph group_review["Review and release"]
  node_review_batch["Review batch<br/>[batch.schema.json]"]
  node_review_ledger[("Review ledger<br/>[rfp_intake.py]")]
  node_release_gate["Release checks<br/>[rfp_intake.py]"]
end

subgraph group_outputs["Estimating outputs"]
  node_packet["Cited project packet<br/>[rfp_intake.py]"]
  node_retrieval["Context retrieval<br/>[rfp_intake.py]"]
end

node_user(("RFP user"))
node_source_folder["RFP folder"]
node_reviewer(("Named reviewer"))
node_estimator(("Estimating team"))
node_ocr_tools["Tesseract and Poppler"]

node_user -->|"invokes"| node_skill
node_skill -->|"guides commands"| node_processor
node_user -->|"selects"| node_source_folder
node_processor -->|"copies and hashes"| node_source_folder
node_processor -->|"extracts and indexes"| node_evidence
node_processor -->|"detects changes"| node_change_tracking
node_processor -->|"flags scanned pages"| node_ocr
node_ocr -.->|"uses optionally"| node_ocr_tools
node_skill -->|"collects review"| node_review_batch
node_reviewer -->|"provides decisions"| node_review_batch
node_processor -->|"imports batch"| node_review_batch
node_processor -->|"validates and records"| node_review_ledger
node_review_ledger -.->|"supplies review state"| node_release_gate
node_reviewer -->|"signs attestations"| node_release_gate
node_processor -->|"checks gates"| node_release_gate
node_processor -->|"publishes outputs"| node_packet
node_release_gate -->|"blocks estimating"| node_estimator
node_packet -->|"provides packet"| node_estimator
node_processor -->|"retrieves context"| node_retrieval

click node_skill "https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/SKILL.md"
click node_processor "https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py"
click node_evidence "https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py"
click node_change_tracking "https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py"
click node_ocr "https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py"
click node_review_batch "https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/references/batch.schema.json"
click node_review_ledger "https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py"
click node_release_gate "https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py"
click node_packet "https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py"
click node_retrieval "https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_skill,node_user,node_reviewer toneBlue
class node_processor,node_evidence,node_change_tracking,node_ocr toneAmber
class node_review_batch,node_review_ledger,node_release_gate toneMint
class node_packet,node_retrieval toneRose
class node_source_folder,node_estimator,node_ocr_tools toneIndigo
```

## Components

### Skill workflow

- [Skill instructions](https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/SKILL.md): `plugins/rfp-intake/skills/rfp-intake/SKILL.md`

### Local processing

- [Intake CLI](https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py): `plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py`
- [Evidence index](https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py): `plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py`
- [Change reconciliation](https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py): `plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py`
- [Scanned-page OCR](https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py): `plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py`

### Review and release

- [Review batch](https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/references/batch.schema.json): `plugins/rfp-intake/skills/rfp-intake/references/batch.schema.json`
- [Review ledger](https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py): `plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py`
- [Release checks](https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py): `plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py`

### Estimating outputs

- [Cited project packet](https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py): `plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py`
- [Context retrieval](https://github.com/gabriel-omat/rfp-intake/blob/main/plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py): `plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py`

### Other components

- **RFP user**
- **RFP folder**
- **Named reviewer**
- **Estimating team**
- **Tesseract and Poppler**

## Connections

- RFP user → Skill instructions: invokes (evidence: `README.md`)
- Skill instructions → Intake CLI: guides commands (evidence: `README.md`)
- RFP user → RFP folder: selects (evidence: `README.md`)
- Intake CLI → RFP folder: copies and hashes (evidence: `README.md`)
- Intake CLI → Evidence index: extracts and indexes (evidence: `README.md`)
- Intake CLI → Change reconciliation: detects changes (evidence: `README.md`)
- Intake CLI → Scanned-page OCR: flags scanned pages (evidence: `README.md`)
- Scanned-page OCR → Tesseract and Poppler: uses optionally (evidence: `README.md`)
- Skill instructions → Review batch: collects review (evidence: `README.md`)
- Named reviewer → Review batch: provides decisions (evidence: `README.md`)
- Intake CLI → Review batch: imports batch (evidence: `plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py`)
- Intake CLI → Review ledger: validates and records (evidence: `plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py`)
- Review ledger → Release checks: supplies review state (evidence: `plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py`)
- Named reviewer → Release checks: signs attestations (evidence: `README.md`)
- Intake CLI → Release checks: checks gates (evidence: `README.md`)
- Intake CLI → Cited project packet: publishes outputs (evidence: `plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py`)
- Release checks → Estimating team: blocks estimating (evidence: `README.md`)
- Cited project packet → Estimating team: provides packet (evidence: `README.md`)
- Intake CLI → Context retrieval: retrieves context (evidence: `plugins/rfp-intake/skills/rfp-intake/scripts/rfp_intake.py`)
