oee-pipeline — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited oee-pipeline (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
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.
You generate a complete, production-grade Overall Equipment Effectiveness measurement pipeline for a manufacturing line. The output is real code (Python or Node + Grafana/Streamlit), not pseudocode or chat advice.
OEE = Availability × Performance × Quality. World-class is ~85%. Most plants run 40-60%. The gap is almost always invisible because nobody is measuring correctly. Your job is to make it measurable in a few hours of work.
============================================================ === PRE-FLIGHT === ============================================================
Before generating any code, gather and verify:
Recovery if anything is missing:
# TODO: replace with real <protocol> connection — see references/connectors.md.============================================================ === PHASE 1: SCAFFOLD THE PROJECT === ============================================================
Generate this layout in the current working directory (or a subfolder if the user specifies one):
oee/
├── README.md # Quickstart, formulas, deployment notes
├── pyproject.toml # or package.json if Node
├── docker-compose.yml # Local stack: broker + Grafana + InfluxDB
├── src/
│ ├── ingest/
│ │ ├── mqtt_source.py # paho-mqtt + Sparkplug B decoder
│ │ ├── opcua_source.py # asyncua subscription
│ │ ├── modbus_source.py # pymodbus TCP/RTU
│ │ └── mock_source.py # for testing without hardware
│ ├── oee/
│ │ ├── calc.py # core A×P×Q formulas
│ │ ├── six_big_losses.py # downtime categorizer
│ │ └── metrics.py # MTBF, MTTR, TEEP, NEE
│ ├── storage/
│ │ └── influx_writer.py # InfluxDB or TimescaleDB writer
│ └── dashboard/
│ └── grafana_dashboard.json
└── tests/
└── test_oee_calc.py # validates formulas against published examplesVALIDATION: Every directory exists. Every file has at least a docstring and one runnable function. Tests pass against the published OEE example: A=0.80, P=0.85, Q=0.95 → OEE=0.6460.
FALLBACK: If the user's existing project structure is incompatible (Django app, Flask, etc.), embed the OEE module as a single package without forcing the folder layout.
============================================================ === PHASE 2: OEE CALCULATION ENGINE === ============================================================
Generate src/oee/calc.py with the exact formulas:
# Availability = Run Time / Planned Production Time
# Planned Production Time = Shift Length - Planned Stops
# Run Time = Planned Production Time - Unplanned Stops
# Performance = (Ideal Cycle Time × Total Count) / Run Time
# Equivalent: Performance = (Total Count / Run Time) / Ideal Run Rate
# Quality = Good Count / Total Count
# OEE = Availability × Performance × Quality
# TEEP = OEE × Utilization (Utilization = Planned Production Time / All Time)
# NEE = Availability_uptime × Performance × Quality (excludes planned downtime)Edge cases the engine MUST handle:
Cite the formulas inline using a reference comment so future maintainers can audit:
# Source: ISO 22400-2:2014 Key Performance Indicators for Manufacturing Operations ManagementVALIDATION: Unit tests in tests/test_oee_calc.py cover: known-good values, divide-by-zero, P>1.0 clamp, partial shift, all-scrap output. All tests must pass.
FALLBACK: If a formula edge case is ambiguous (e.g., how to handle a machine running during a planned stop), default to the ISO 22400-2 interpretation and add a TODO comment explaining the assumption.
============================================================ === PHASE 3: SIX BIG LOSSES CATEGORIZER === ============================================================
Generate src/oee/six_big_losses.py that classifies downtime events into the canonical six categories:
| # | Loss Category | OEE Bucket | Detection Rule (default) |
|---|---|---|---|
| 1 | Breakdowns / Equipment failure | Availability | unplanned stop > 5 min, fault code present |
| 2 | Setup & Adjustments | Availability | stop tagged "changeover" or between product runs |
| 3 | Small Stops / Idling | Performance | stop 0–5 min, no operator intervention |
| 4 | Reduced Speed | Performance | running but actual_rate < ideal_rate |
| 5 | Startup Rejects | Quality | scrap within first N units after run start |
| 6 | Production Rejects | Quality | scrap during steady-state production |
The categorizer takes a stream of state events (timestamp, state, duration, fault_code, product) and emits classified loss events. Output schema must be JSON-serializable so it flows into the dashboard without ETL.
VALIDATION: Run the categorizer against a synthetic 8-hour shift in tests; verify that the six categories sum to the total loss within rounding.
FALLBACK: If fault codes are not available, classify all unplanned stops > 5 min as Breakdowns and emit a "fault_code_missing" warning so the user knows the granularity gap.
============================================================ === PHASE 4: DATA INGESTION ADAPTER === ============================================================
Generate the ingestion adapter matching the user's data source. Each adapter MUST:
{
"ts": "ISO8601",
"asset_id": "line-1",
"metric": "good_count",
"value": 1247,
"quality": "GOOD"
}MQTT Sparkplug B specifics:
spBv1.0/{group}/DDATA/{edge_node}/{device}.vendor/).OPC UA specifics:
asyncua (Python) — modern, asyncio-native, maintained.config/opcua_nodes.yaml.Modbus specifics:
pymodbus. Register maps live in config/modbus_map.yaml.VALIDATION: Adapter connects to a local broker (run via docker-compose) and emits at least 10 sample events in python -m src.ingest.<adapter> --test mode.
FALLBACK: If the protocol-specific library is unavailable in the user's environment, generate mock_source.py that replays a recorded CSV — pipeline still demonstrable end-to-end.
============================================================ === PHASE 5: DASHBOARD === ============================================================
Generate src/dashboard/grafana_dashboard.json (preferred) OR a Streamlit app at src/dashboard/app.py.
The dashboard MUST include:
Grafana panel queries must use the canonical event schema from Phase 4 so the dashboard works without per-deployment query editing.
VALIDATION: Import the JSON into a fresh Grafana instance (Grafana ≥ 10) and confirm all 6 panels render without errors against the mock data source.
FALLBACK: If Grafana setup is too heavy for the user, generate Streamlit (single streamlit run app.py).
============================================================ === PHASE 6: README & DEPLOYMENT NOTES === ============================================================
Write README.md with:
docker-compose up && python -m src.ingest.mock_source && open http://localhost:3000.VALIDATION: README quickstart actually works on a fresh machine.
============================================================ === SELF-REVIEW === ============================================================
Score each dimension 1–5:
If any < 4:
============================================================ === LEARNINGS CAPTURE === ============================================================
After completing, append to ~/.claude/skills/oee-pipeline/LEARNINGS.md:
============================================================ === STRICT RULES === ============================================================
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.