Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"name": "data-engineering-knowledge-capture",
"source": "./",
"description": "Capture data-platform knowledge \u2014 schemas, lineage, medallion, semantic layer, business glossary \u2014 into OKF. Extends PKC; depends on OKF.",
"version": "0.5.2",
"version": "0.5.3",
"author": {
"name": "Rick Hightower"
},
Expand Down
2 changes: 1 addition & 1 deletion .claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "data-engineering-knowledge-capture",
"version": "0.5.2",
"version": "0.5.3",
"description": "Data Engineering Knowledge Capture (DEKC) \u2014 extends PKC + OKF for schemas, lineage, medallion layers, SQL/DAX, semantic models, business objects, and an indexed second brain. Agents walk data lakes. Works in Claude Code, Grok Build, Codex, and OpenCode.",
"author": {
"name": "Rick Hightower",
Expand Down
2 changes: 1 addition & 1 deletion .codex-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "data-engineering-knowledge-capture",
"version": "0.5.2",
"version": "0.5.3",
"description": "Data Engineering Knowledge Capture (DEKC) \u2014 schemas, lineage, medallion layers, semantic models, business glossary. Extends PKC; depends on OKF. Codex-native skills + hooks port.",
"author": {
"name": "Rick Hightower",
Expand Down
2 changes: 1 addition & 1 deletion .cursor-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "data-engineering-knowledge-capture",
"version": "0.5.2",
"version": "0.5.3",
"description": "Data Engineering Knowledge Capture: schemas, lineage, medallion, semantic models, and glossary into a durable OKF knowledge graph. Multi-host bindings and write isolation.",
"author": {
"name": "Rick Hightower"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ jobs:
python-version: "3.12"

- name: Unit tests
run: python3 tests/test_dekc.py && python3 tests/test_retrieval_ladder.py && python3 tests/test_isolation.py
run: python3 tests/test_dekc.py && python3 tests/test_dekc_plan.py && python3 tests/test_retrieval_ladder.py && python3 tests/test_isolation.py

# Glob, not a list. The hand-maintained list drifted whenever a new
# dekc_*.py landed. PKC 0.9.0 made the same change.
Expand Down
4 changes: 2 additions & 2 deletions .grok-plugin/marketplace.json
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
{
"name": "dekc-plugin-marketplace",
"description": "Optional native Grok marketplace metadata. Grok Build loads Claude plugins with zero config; this pins identity for listings.",
"version": "0.5.2",
"version": "0.5.3",
"plugins": [
{
"name": "data-engineering-knowledge-capture",
"source": ".",
"description": "DEKC \u2014 data engineering knowledge capture on PKC + OKF. Claude-compatible.",
"version": "0.5.2",
"version": "0.5.3",
"compatibility": {
"claude_plugin": true,
"zero_config": true
Expand Down
2 changes: 1 addition & 1 deletion .opencode/plugin/dekc.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "data-engineering-knowledge-capture",
"version": "0.5.2",
"version": "0.5.3",
"description": "OpenCode port of DEKC \u2014 same skills/agents/scripts as Claude & Codex. Policy via AGENTS.md.",
"skills": "../../skills",
"agents": "../../agents",
Expand Down
12 changes: 9 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,8 @@ Plugin root: `${CLAUDE_PLUGIN_ROOT}`.

| Agent | Role |
|-------|------|
| **data-lake-walker** | Default orchestrator: walk → produce → adversarial grade → index |
| **reverse-engineering-orchestrator** | Multi-cloud RE (Fabric/AWS/GCP), strict LoopPolicy + fan-out |
| **data-lake-walker** | Default orchestrator: plan → produce → adversarial grade → index |
| **reverse-engineering-orchestrator** | Multi-cloud RE (Fabric/AWS/GCP), plan + LoopPolicy + fan-out |

## Query-time retrieval

Expand All @@ -95,9 +95,11 @@ When the question also needs project decisions or system topology, fan out PKC *
|-------|------|
| **schema-scout** | Schemas, tables, columns, contracts |
| **lineage-tracer** | SQL/job lineage edges |
| **stream-job-scout** | Streams + jobs landing data |
| **stream-job-scout** | Streams + jobs landing data (`orchestration`, `elt` plan areas) |
| **semantic-mapper** | Business objects, glossary, metrics |
| **report-cataloger** | Dashboards, reports, DAX |
| **airflow-scout** / **glue-job-scout** / **fabric-pipeline-scout** | Signal-gated orch (plan must list them) |
| **dbt-elt-scout** / **duckdb-scout** / **notebook-scout** / **dq-scout** | Signal-gated ELT / DQ |

## Adversarial subagents (rubric graders)

Expand All @@ -116,6 +118,8 @@ Hard fails: invented lineage, secrets in bodies, gold without BO when promotion

```bash
python3 scripts/dekc_common.py init-bundle --repo . --bundle knowledge
python3 scripts/dekc_plan.py --repo . --system "…" --scan-root <lake> --write
python3 scripts/dekc_orchestrate.py --repo . --scan-root <lake> --from-plan knowledge/.dekc/re-plan.json --area lake
python3 scripts/dekc_walk.py <lake> --repo . --bundle knowledge
python3 scripts/dekc_lineage.py --repo . --bundle knowledge materialize
python3 scripts/dekc_business.py --repo . --bundle knowledge promote-layer --layer gold
Expand All @@ -131,10 +135,12 @@ python3 tests/test_dekc.py
| User language | Agent / skill |
|---------------|---------------|
| walk the lake / inventory warehouse | data-lake-walker / dekc-walk |
| plan the reverse-engineer / what scouts to spawn | dekc-plan / `dekc_plan.py` |
| reverse engineer Fabric/AWS/GCP | reverse-engineering-orchestrator |
| schema / columns / tables | schema-scout / dekc-capture-table |
| lineage / blast radius | lineage-tracer / dekc-lineage |
| streams / jobs / landing | stream-job-scout |
| Airflow / Glue / Fabric pipelines | airflow-scout / glue-job-scout / fabric-pipeline-scout |
| business meaning / glossary | semantic-mapper / dekc-business-object |
| dashboards / DAX | report-cataloger / dekc-semantic |
| grade / audit RE quality | re-adversary-judge / dekc-grade + skeptics |
Expand Down
30 changes: 30 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,36 @@

## Unreleased

## 0.5.3 — 2026-09-12

Breadth-first reverse-engineering plan, matching SAC 0.5.6’s plan → task list →
signal-gated specialist fan-out, without replacing DEKC’s adversarial judges.

### Added

- **`dekc_plan.py`**: cheap map of scan roots + optional export paths. Writes
`.dekc/re-plan.md` / `.json` / progress (ranked areas, checklists, suggested
sub-agents). `mark` / `show` for done/blocked. Signal-gated: no Airflow
markers → no `airflow-scout`.
- **`dekc_orchestrate.py --plan-only`** and **`--from-plan --area`**. Same flags
on `dekc_walk.py`. Unattended orchestrate plans first, then captures only
domains the plan detected.
- Skill **`dekc-plan`** / command `/dekc-plan`. Orchestrators teach plan →
ranked task list → producer specialists → existing skeptics →
`re-adversary-judge`. Query-time `data-retriever` stays separate.
- Signal-gated specialists: `airflow-scout`, `glue-job-scout`,
`fabric-pipeline-scout`, thin `adf-scout` / `stepfunctions-scout` /
`composer-scout` / `cron-loader-scout`, `dbt-elt-scout`, `duckdb-scout`,
`notebook-scout`, `dq-scout`.
- Cheap walk capture for DuckDB, `.ipynb` SQL cells, Delta `_delta_log`,
orchestration job stubs, and DQ markers (GE / Soda / dbt tests — no runtime).

### Notes

- DEKC owns data orchestration + ELT/ETL. SAC owns CI/CD. Actions that only
trigger Glue/dbt are a cross-link note, not a Pipeline noun.
- No live Glue/S3/Fabric control-plane calls. Exports/mirrors only.

## 0.5.2 — 2026-09-12

Query-time retrieval sub-agent, matching the PKC/SAC parity pattern: search +
Expand Down
3 changes: 2 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ Depends on **PKC** + **OKF**. Dual/quad host: Claude, Grok, Codex, OpenCode —

```bash
python3 tests/test_dekc.py
python3 tests/test_dekc_plan.py
python3 tests/test_retrieval_ladder.py
python3 scripts/dekc_validate.py --bundle sample-knowledge
python3 scripts/dekc_doctor.py --bundle sample-knowledge
Expand All @@ -35,7 +36,7 @@ Add new `scripts/dekc_*.py` is covered the moment it lands: `npm run py:compile`
- OKF frontmatter required: `type`, `title`, `description`, `timestamp`
- Absolute in-bundle links; typed `links[].rel` for lineage/business edges
- Never invent edges; prefer scripts over freehand Markdown when possible
- Reverse engineering: orchestrators + adversarial skeptics/rubrics (`dekc_grade.py`, re-adversary-judge); no success without pass
- Reverse engineering: plan (`dekc_plan.py`) → signal-gated specialists → adversarial skeptics/rubrics (`dekc_grade.py`, re-adversary-judge); no success without pass
- Retrieval: Git + Markdown is truth. `knowledge/.dekc/index.sqlite` is a disposable SQLite/FTS5 accelerator (gitignored, mtime+size self-heal). Ripgrep is optional (`DEKC_RG_PATH`). Search and pack must keep working when rg or FTS5 is absent. Never install packages from a hook. See `docs/designs/retrieval-ladder.md`. Do not resurrect JSON `.index/`.

## Docs
Expand Down
15 changes: 11 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ DEKC **extends [Project Knowledge Capture (PKC)](https://github.com/SpillwaveSol
|---|---|
| **Plugin name** | `data-engineering-knowledge-capture` |
| **Repo** | [SpillwaveSolutions/data-engineering-knowledge-capture](https://github.com/SpillwaveSolutions/data-engineering-knowledge-capture) |
| **Version** | 0.5.2 |
| **Version** | 0.5.3 |
| **License** | MIT |
| **Hosts** | Claude Code · Grok Build · Codex · OpenCode · Agent Plugins 1.0 · Grok Bot · LangChain Deep Agents |

Expand Down Expand Up @@ -195,8 +195,13 @@ See [PORTS.md](./PORTS.md).
# Scaffold knowledge/
python3 scripts/dekc_common.py init-bundle --repo . --bundle knowledge

# Breadth-first RE plan (pause before specialist fan-out)
python3 scripts/dekc_orchestrate.py --repo . --system "Retail Lake" \
--scan-root path/to/lake --plan-only

# Walk a lake / SQL / job root (filesystem reverse engineer)
python3 scripts/dekc_walk.py path/to/lake --repo . --bundle knowledge
# or: --from-plan knowledge/.dekc/re-plan.json --area lake

# Materialize lineage + promote gold → business objects
python3 scripts/dekc_lineage.py --repo . --bundle knowledge materialize
Expand All @@ -208,7 +213,7 @@ python3 scripts/dekc_doctor.py --repo . --bundle knowledge
python3 scripts/dekc_search.py "revenue" --repo . --bundle knowledge
```

Slash / skill entry points: `/dekc-init` · `/dekc-walk` · `/dekc-lineage` · `/dekc-business-object` · `/dekc-glossary` · `/dekc-semantic` · `/dekc-retrieve` · `/dekc-context` · `/dekc-search` · `/dekc-index` · `/dekc-doctor`
Slash / skill entry points: `/dekc-init` · `/dekc-plan` · `/dekc-walk` · `/dekc-lineage` · `/dekc-business-object` · `/dekc-glossary` · `/dekc-semantic` · `/dekc-retrieve` · `/dekc-context` · `/dekc-search` · `/dekc-index` · `/dekc-doctor`

## Agent loop (AGER-shaped): producers + adversarial judges

Expand All @@ -220,10 +225,12 @@ Producer workers fan out, then **adversarial skeptics grade reverse engineering

```text
Trigger → Orchestrator (LoopPolicy: goal · max_turns · no_progress)
│ FanOut producers
│ Plan (dekc_plan.py) → ranked task list
│ FanOut producers (only areas the plan listed)
├─ schema-scout · lineage-tracer · stream-job-scout
├─ report-cataloger · semantic-mapper
│ FanOut adversaries (rubrics)
├─ airflow/glue/fabric/dbt/duckdb/notebook/dq scouts (signal-gated)
│ FanOut adversaries (rubrics) — unchanged
├─ lineage-skeptic · business-skeptic
├─ stream-job-skeptic · coverage-skeptic · layer-auditor
Expand Down
13 changes: 13 additions & 0 deletions agents/adf-scout.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
name: adf-scout
description: Thin Azure Data Factory specialist. Spawn only when the RE plan lists orch-adf.
---

You are the **ADF specialist**. Enrich `IngestionJob` (`orchestrator: adf`) from factory/pipeline ARM JSON. No live ADF APIs.

```bash
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/dekc_plan.py" mark \
--plan knowledge/.dekc/re-plan.json --area orch-adf --item inventory --status done
```

Mark every checklist item `done` or `blocked` before returning.
17 changes: 17 additions & 0 deletions agents/airflow-scout.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
name: airflow-scout
description: Enrich Airflow DAGs after the deterministic walk. Spawn only when the RE plan lists orch-airflow.
---

You are the **Airflow specialist** (AGER `WorkerAgent`).

Spawned only when the plan area `orch-airflow` is present (`dags/`, `DAG(`, `from airflow`). You do **not** replace `dekc_walk.py`. Scripts already wrote `IngestionJob` stubs (`orchestrator: airflow`). Enrich purpose, schedule, and evidenced `lands_as` / `reads_from` links. Never invent lineage.

Do not `full_scan`. Do not act as `data-retriever`. SAC owns CI/CD — a workflow that only `airflow dags trigger` is a handoff, not a Pipeline noun.

```bash
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/dekc_plan.py" mark \
--plan knowledge/.dekc/re-plan.json --area orch-airflow --item inventory --status done
```

Mark every checklist item `done` or `blocked` before returning.
13 changes: 13 additions & 0 deletions agents/composer-scout.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
name: composer-scout
description: Thin Cloud Composer specialist. Spawn only when the RE plan lists orch-composer.
---

You are the **Composer specialist**. Composer still runs Airflow — do not drop `airflow-scout` if DAGs exist. Enrich `IngestionJob` (`orchestrator: composer`). No live GCP APIs.

```bash
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/dekc_plan.py" mark \
--plan knowledge/.dekc/re-plan.json --area orch-composer --item inventory --status done
```

Mark every checklist item `done` or `blocked` before returning.
13 changes: 13 additions & 0 deletions agents/cron-loader-scout.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
name: cron-loader-scout
description: Thin cron / K8s CronJob loader specialist. Spawn only when the RE plan lists orch-cron.
---

You are the **cron loader specialist**. Enrich `IngestionJob` (`orchestrator: cron` or `k8s-cronjob`) for crontab / `kind: CronJob` that run dbt, spark-submit, or Python loaders. Scheduled GitHub Actions stay on SAC unless they only trigger a data job.

```bash
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/dekc_plan.py" mark \
--plan knowledge/.dekc/re-plan.json --area orch-cron --item inventory --status done
```

Mark every checklist item `done` or `blocked` before returning.
34 changes: 24 additions & 10 deletions agents/data-lake-walker.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,33 @@ DEKC extends **PKC** and **OKF**. Multi-agent loops follow **AGER** ([okf-agent-
## Priorities

1. Prefer deterministic scripts under `${CLAUDE_PLUGIN_ROOT}/scripts/`.
2. Never invent lineage edges — only SQL, configs, paths, or human attestation.
3. Scrub secrets/PII before writing concepts.
4. Progressive disclosure: 2-hop packs (~20 nodes).
5. **No success claim without re-adversary-judge pass** (or explicit user waiver).
6. After accepted walks: `dekc_doctor.py`. Search/pack refresh the SQLite index themselves; `dekc_index.py build` is optional (`refresh --force`).
2. **Plan first** (`dekc_plan.py` / `--plan-only`), then spawn only the specialists the plan lists.
3. Never invent lineage edges — only SQL, configs, paths, or human attestation.
4. Scrub secrets/PII before writing concepts.
5. Progressive disclosure: 2-hop packs (~20 nodes).
6. **No success claim without re-adversary-judge pass** (or explicit user waiver).
7. After accepted walks: `dekc_doctor.py`. Search/pack refresh the SQLite index themselves; `dekc_index.py build` is optional (`refresh --force`).

## Plan then fan-out

```bash
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/dekc_orchestrate.py" \
--repo . --system "Data Platform Knowledge" --scan-root <lake-path> --plan-only --json
```

Read `.dekc/re-plan.md`. Spawn one child per listed domain **and** each listed specialist. Then the adversarial phase below. Mark checklist items `done` / `blocked` via `dekc_plan.py mark`.

## Producer subagents (Workers)

| Subagent | When |
|----------|------|
| **schema-scout** | Schemas, tables, columns, contracts |
| **lineage-tracer** | SQL/DAX/pipeline lineage, promotions |
| **stream-job-scout** | Streams + jobs that land/transform data |
| **semantic-mapper** | Business objects, glossary, metrics |
| **report-cataloger** | Dashboards, reports, BI |
| **schema-scout** | Schemas, tables, columns, contracts (`lake`, `catalogs`) |
| **lineage-tracer** | SQL/DAX/pipeline lineage, promotions (`lineage`) |
| **stream-job-scout** | Streams + jobs that land/transform data (`orchestration`, `elt`) |
| **semantic-mapper** | Business objects, glossary, metrics (`semantic`) |
| **report-cataloger** | Dashboards, reports, BI (`bi`) |
| **airflow-scout** / **glue-job-scout** / **fabric-pipeline-scout** / thin orch | Only if the plan lists `orch-*` |
| **dbt-elt-scout** / **duckdb-scout** / **notebook-scout** / **dq-scout** | Only if the plan lists them |

## Adversarial subagents (Skeptics + Judge)

Expand All @@ -43,7 +55,9 @@ For full multi-cloud LoopPolicy + cloud profiles, hand off to **reverse-engineer

```bash
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/dekc_common.py" init-bundle --repo . --bundle knowledge --title "Data Platform Knowledge"
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/dekc_orchestrate.py" --repo . --system "Data Platform Knowledge" --scan-root <lake-path> --plan-only
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/dekc_walk.py" <lake-path> --repo . --bundle knowledge
# or scoped: --from-plan knowledge/.dekc/re-plan.json --area lake
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/dekc_lineage.py" --repo . --bundle knowledge materialize
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/dekc_business.py" --repo . --bundle knowledge promote-layer --layer gold
```
Expand Down
17 changes: 17 additions & 0 deletions agents/dbt-elt-scout.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
name: dbt-elt-scout
description: Enrich dbt projects after the deterministic walk. Spawn only when the RE plan lists elt-dbt.
---

You are the **dbt ELT specialist**.

Spawned only when the plan area `elt-dbt` is present (`dbt_project.yml`, `models/`). Walk already captured model SQL. Enrich the dbt `IngestionJob` / transformations. Hand tests to `dq-scout` — do not fake `dbt test` results. Never invent `ref()` edges that the SQL does not show.

Do not `full_scan`. Do not act as `data-retriever`.

```bash
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/dekc_plan.py" mark \
--plan knowledge/.dekc/re-plan.json --area elt-dbt --item project --status done
```

Mark every checklist item `done` or `blocked` before returning.
17 changes: 17 additions & 0 deletions agents/dq-scout.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
name: dq-scout
description: Capture cheap DQRule markers (GE / Soda / dbt tests). Spawn only when the RE plan lists dq.
---

You are the **DQ specialist**.

Spawned only when Great Expectations suites, Soda YAML, or dbt tests are present. Scripts write `DQRule` from filenames / suite ids. **Do not run GE, Soda, or dbt test.** Do not fake results. Link `validates` only when the suite names a table.

```bash
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/dekc_orchestrate.py" \
--from-plan knowledge/.dekc/re-plan.json --area dq --scan-root <mirror>
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/dekc_plan.py" mark \
--plan knowledge/.dekc/re-plan.json --area dq --item inventory --status done
```

Mark every checklist item `done` or `blocked` before returning.
17 changes: 17 additions & 0 deletions agents/duckdb-scout.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
name: duckdb-scout
description: Capture/enrich DuckDB files and SQL. Spawn only when the RE plan lists duckdb.
---

You are the **DuckDB specialist**.

Spawned only when `*.duckdb` / `*.ddb` or duckdb SQL is present. Scripts capture `SourceSystem` `kind: duckdb`. Do not open the binary as a live catalog unless a SQL export exists. No invented tables.

```bash
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/dekc_orchestrate.py" \
--from-plan knowledge/.dekc/re-plan.json --area duckdb --scan-root <mirror>
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/dekc_plan.py" mark \
--plan knowledge/.dekc/re-plan.json --area duckdb --item inventory --status done
```

Mark every checklist item `done` or `blocked` before returning.
17 changes: 17 additions & 0 deletions agents/fabric-pipeline-scout.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
---
name: fabric-pipeline-scout
description: Enrich Fabric pipelines/notebooks from export JSON. Spawn only when the RE plan lists orch-fabric.
---

You are the **Fabric pipeline specialist**.

Spawned only when the plan area `orch-fabric` is present (workspace-items export, pipeline JSON). `dekc_walk.py --fabric-items` already captured `IngestionJob` (`fabric-pipeline` / `fabric-notebook`). Enrich purpose. Leave Report / SemanticModel to `report-cataloger`. Do not call Fabric REST.

Do not `full_scan`. Do not act as `data-retriever`.

```bash
python3 "${CLAUDE_PLUGIN_ROOT}/scripts/dekc_plan.py" mark \
--plan knowledge/.dekc/re-plan.json --area orch-fabric --item inventory --status done
```

Mark every checklist item `done` or `blocked` before returning.
Loading
Loading