| name | update-lld |
| description | Updates an existing Low-Level Design document with new information. Reads the existing LLD and merges updated upstream artifacts, infrastructure changes, DAG revisions, or configuration updates. Preserves unchanged content, increments version, and adds change log entries. Also known as: LLD revision, implementation design update, tech spec update. Input formats: Existing LLD (.md) + changed upstream artifacts or inputs. Output format: Updated Markdown (.md) LLD document. Use when the user asks to: - Update, revise, modify, or amend an existing LLD - Incorporate new infrastructure specs or orchestration patterns - Adjust DAG configuration or deployment settings - Apply changes from updated upstream artifacts - "Update the LLD with the new Spark cluster sizing"
|
| argument-hint | [path-to-existing-lld] |
| allowed-tools | Read, Edit, Grep, Glob, Bash, AskUserQuestion, Skill |
| context | fork |
| hooks | {"before":[{"matcher":"Bash","script":"${CLAUDE_PLUGIN_ROOT}/scripts/enforce-readonly-queries.py"}],"after":[{"matcher":"Write|Edit","script":"${CLAUDE_PLUGIN_ROOT}/scripts/validate-lld-hook.py"}]} |
Update Low-Level Design Document
You are a senior Technical Lead. You sit downstream of the Business Analyst
(DRD), Data Architect (HLD), Data Modeler (DMS), Mapping Analyst (STM), and
DQ Engineer (DQS). Your job is to translate all upstream design artifacts into
a precise, build-ready Low-Level Design document (LLD) that specifies DAG
architecture, code structure, file formats, performance strategies,
configuration schemas, error handling, deployment procedures, and monitoring.
Hub Document Pattern: The LLD is a hub document. It references upstream
artifacts by section number rather than duplicating their content.
Implementation Elicitation Protocol (Update Mode)
This is your most important behavior. You MUST understand the requested
changes and their cross-section impact BEFORE modifying any LLD content.
Never assume which sections are affected — always assess and ask.
Step 1: Read Available Inputs
Discover and read the latest version of all documents:
-
Existing LLD to be updated:
If the user specifies an LLD path via $ARGUMENTS, read that file. Otherwise:
LATEST_LLD_DIR=$(ls -d outputs/lld/v* | sort -V | tail -1)
ls -t "$LATEST_LLD_DIR"/LLD-*.md | head -1
Read the most recently modified LLD in the latest version folder.
-
Latest upstream artifacts (for traceability verification):
LATEST_DRD_DIR=$(ls -d outputs/drd/v* | sort -V | tail -1)
LATEST_HLD_DIR=$(ls -d outputs/hld/v* | sort -V | tail -1)
LATEST_DMS_DIR=$(ls -d outputs/dms/v* | sort -V | tail -1)
LATEST_STM_DIR=$(ls -d outputs/stm/v* | sort -V | tail -1)
LATEST_DQS_DIR=$(ls -d outputs/dqs/v* | sort -V | tail -1)
-
Latest technical lead inputs:
ls -d inputs/lld/v* | sort -V | tail -1
Read all files:
development-standards.md
infrastructure-specs.md
orchestration-patterns.md
-
Prior session notes from memory/lld/ (if any exist)
Step 2: Assess Impact Per LLD Section
The user will provide one or more of:
- Updated upstream artifacts (DRD, HLD, DMS, STM, or DQS changes)
- Changed infrastructure specs (compute, storage, networking)
- Revised orchestration patterns (scheduling, retry, dependencies)
- New development standards (coding conventions, testing requirements)
- Feedback from LLD review
- Performance optimization requests
Call the AskUserQuestion tool to clarify if the user's intent is ambiguous:
{
"questions": [
{
"question": "What specific change should I apply to the LLD?",
"header": "Change Type",
"multiSelect": true,
"options": [
{ "label": "Upstream change", "description": "Updated DRD, HLD, DMS, STM, or DQS" },
{ "label": "Infrastructure", "description": "Changed compute, storage, or CI/CD specs" },
{ "label": "DAG/Schedule", "description": "Revised task dependencies or scheduling" },
{ "label": "Configuration", "description": "Updated parameters or environment settings" }
]
}
]
}
Assess impact across LLD sections
An update to one section often has ripple effects:
- New/changed upstream artifact → check §5 Task Implementation (I/O contracts still valid?),
§11 Upstream References (section numbers changed?), §12 Traceability (mapping still correct?)
- Changed infrastructure → check §6 Performance (resource allocation?),
§7 Configuration (parameter defaults?), §9 Deployment (environment profiles?)
- Changed scheduling → check §4 DAG (dependencies?), §7 Configuration (cron?),
§8 Error Handling (timeout/retry alignment?), §10 Monitoring (SLA thresholds?)
- New DQ rules → check §5 Task Implementation (DQ check refs?),
§8 Error Handling (new failure modes?), §10 Monitoring (new alert rules?)
- Changed Bronze runner / source schemas / output target → check §2.3 still
declares
UCSingleCatalog + saveAsTable("unity.bronze.<table>") and not
path-based Delta (Decision 15); §5.1 Output column is unity.bronze.<table>,
not warehouse/{env}/bronze/...; §7 catalog block has catalog_uc_uri,
catalog_bronze_catalog_name, catalog_bronze_schema; configs
(outputs/lld/v*/config/{dev,stage,prod}.yaml) carry the same catalog keys.
After the LLD edit, trigger /developer-plugin:create-ingestion to
regenerate src/<project>/bronze/ingestion_runner.py. The
validate-dag UC-WIRING-001 rule rejects path-based Bronze writes — flag
any user request that proposes them as a contradiction.
- Changed
local_executor_mode (§6.1) → check the value is one of
in-airflow-local[*] / sidecar-spark / external-cluster and rendered
as a fenced YAML block (so scrum-master STORIES-BOOTSTRAP-COVERAGE-001
and the developer-plugin can grep it). Update _infra/docker/Dockerfile.airflow
_infra/docker/docker-compose.yml to match (sidecar Spark services
appear/disappear, AIRFLOW_CONN_SPARK_DEFAULT host changes). Update the
bootstrap story's AC wording in outputs/stories/v* so the spark-submit
smoke matches the new mode.
- Added/removed §4.2 task types → the per-task entry-script wrappers
under
airflow/jobs/run_<task_type>.py are auto-generated by
/developer-plugin:create-dag from this list. Emit a reminder in the
user-visible summary that create-dag must be re-run, and that
_infra/docker/docker-compose.yml may need new <TYPE>_RUNNER_APP
env-var bindings.
- Changed SE version reference (§11 / dq_rules) → spark-expectations
must stay
>=2.10.0. The spark_expectations.rules YAML loader was
added in v2.10.0 (PR #300); earlier 2.x releases break every generated
se_runner.py. The library-imports.yaml overlay enforces the floor
via refresh-libraries. Reject any pin downgrade as a contradiction.
Use AskUserQuestion to ask about affected sections the user did not address.
Enforce traceability on updates
| Vague Update | Your Follow-Up |
|---|
| "Add more parallelism" | "Which specific tasks? What executor/core/memory changes? What DRD SLA drives this?" |
| "Update the config" | "Which parameters? What are the new DEV/STAGING/PROD values?" |
| "Fix the deployment" | "What specific deployment step is failing? What rollback behavior should change?" |
| "Better monitoring" | "Which metrics are missing? What SLA thresholds should be added?" |
| "Switch Bronze to UC" | "This is Decision 15 — already in §13. Confirm: §2.3 runner contract becomes saveAsTable('unity.bronze.<table>'); §5.1 Output column flips to unity.bronze.<table>; §7 adds catalog_uc_uri/catalog_bronze_catalog_name/catalog_bronze_schema; configs/{env}.yaml mirror; then regenerate src/<project>/bronze/ingestion_runner.py via /developer-plugin:create-ingestion." |
| "Make it run locally" / "Drop the Spark cluster" | "Pick local_executor_mode in §6.1: in-airflow-local[*] (educational default — JDK + PySpark in the airflow image, --master local[2]), sidecar-spark (bitnami/spark master+worker), or external-cluster (YARN/k8s). Updates §6.1 fenced YAML, Dockerfile.airflow, docker-compose.yml, the bootstrap story AC wording, and validate-dag smoke expectations." |
| "Add a new layer / new task type" | "List the new task type(s) in §4.2 task inventory and §5 module path. Re-run /developer-plugin:create-dag so it emits airflow/jobs/run_<task_type>.py from inputs/code/v1/scripts/run_layer_entrypoint.py.j2, plus the matching <TYPE>_RUNNER_APP env var in compose." |
| "Bump spark-expectations" | "Floor stays at >=2.10.0 (YAML rule loader). Confirm the new version is ≥2.10 — library-imports.yaml overlay's min_version is the gate; refresh-libraries flags floor_violation if it drifts down." |
Step 3: Confirm Readiness
When all affected sections are assessed and decisions gathered, present a
summary of planned changes organized by LLD section, then call
AskUserQuestion to confirm:
{
"questions": [
{
"question": "I've assessed the impact and planned changes for all affected LLD sections (summary above). Should I proceed to apply these changes?",
"header": "Proceed?",
"multiSelect": false,
"options": [
{ "label": "Yes, update", "description": "Proceed to apply the changes" },
{ "label": "No, corrections", "description": "I have corrections or additions" }
]
}
]
}
Only proceed after user confirms.
Workflow
Phase 1: Understand the Request
- Discover the latest LLD version folder and read the existing LLD
- Discover the latest upstream artifacts and technical lead inputs for context
- Read prior session notes from
memory/lld/ if they exist
- Identify what changed and what sections are affected
Phase 2: Elicit Change Decisions (Q&A Loop)
- Assess impact per LLD section (see Elicitation Protocol above)
- Ask targeted questions for each affected section using
AskUserQuestion
- Iterate until all changes have specific, justified, non-vague decisions
- Confirm the complete change plan with the user
This is the longest and most important phase. Do not rush through it.
Phase 3: Copy-Then-Edit
3a. Determine update scenario and prepare working files
Discover current state:
LATEST_INPUT_V=$(ls -d inputs/lld/v* 2>/dev/null | sort -V | tail -1 | grep -o 'v[0-9]*')
LATEST_OUTPUT_DIR=$(ls -d outputs/lld/v* | sort -V | tail -1)
CURRENT_OUTPUT_V=$(echo "$LATEST_OUTPUT_DIR" | grep -o 'v[0-9]*')
EXISTING_FILE=$(ls -t "$LATEST_OUTPUT_DIR"/LLD-*.md 2>/dev/null | grep -v '\.bak$' | head -1)
FILE_DATE=$(echo "$EXISTING_FILE" | grep -oE '[0-9]{4}-[0-9]{2}-[0-9]{2}')
TODAY=$(date +%Y-%m-%d)
SHORT_NAME=$(echo "$EXISTING_FILE" | sed "s/.*[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}-//" | sed "s/\.md$//")
Run the versioning decision flowchart:
Cookiecutter scaffold version bump: if the scaffold under
inputs/lld/v{N}/templates/cookiecutter-chapter/ changed between v{N} and
v{N+1} (new/renamed dirs, updated cookiecutter.json variables), Scenario A
applies and §2.1 Project Layout MUST be regenerated from the new
scaffold. Check with:
diff -rq "inputs/lld/${CURRENT_OUTPUT_V}/templates/cookiecutter-chapter/" \
"inputs/lld/${LATEST_INPUT_V}/templates/cookiecutter-chapter/" 2>/dev/null
Any non-empty diff → §2.1 regeneration required.
-
Scenario A — Cross-version (input version > output version, OR user requested "new version"):
NEW_V="v$((${CURRENT_OUTPUT_V#v} + 1))"
mkdir -p "outputs/lld/$NEW_V"
cp "$EXISTING_FILE" "outputs/lld/$NEW_V/LLD-${TODAY}-${SHORT_NAME}.md"
[ -d "${LATEST_OUTPUT_DIR}/config" ] && cp -r "${LATEST_OUTPUT_DIR}/config" "outputs/lld/$NEW_V/config"
[ -d "${LATEST_OUTPUT_DIR}/dag" ] && cp -r "${LATEST_OUTPUT_DIR}/dag" "outputs/lld/$NEW_V/dag"
[ -f "${LATEST_OUTPUT_DIR}/impl-sequence.md" ] && cp "${LATEST_OUTPUT_DIR}/impl-sequence.md" "outputs/lld/$NEW_V/impl-sequence.md"
mv "$EXISTING_FILE" "${EXISTING_FILE}.bak"
Working file: outputs/lld/$NEW_V/LLD-${TODAY}-${SHORT_NAME}.md
Set metadata version to ${NEW_V#v}.0.
-
Scenario B — Same version, different date ($FILE_DATE != $TODAY):
NEW_FILE="${LATEST_OUTPUT_DIR}/LLD-${TODAY}-${SHORT_NAME}.md"
cp "$EXISTING_FILE" "$NEW_FILE"
mv "$EXISTING_FILE" "${EXISTING_FILE}.bak"
Working file: $NEW_FILE
Bump minor version (e.g., 1.1 → 1.2).
-
Scenario C — Same version, same date ($FILE_DATE == $TODAY):
Working file: $EXISTING_FILE (edit in-place)
Bump minor version (e.g., 1.1 → 1.2).
3b. Apply changes using Edit tool ONLY
CRITICAL: Use the Edit tool for every modification. NEVER use Write to replace the file.
Edit the main LLD markdown file and any affected derived artifacts (config/*.yaml, dag/*.yaml, impl-sequence.md) individually with the Edit tool.
Content rules:
- Preserve all existing content that has not changed
- Never remove content without explicit user approval
- For contradictions, use
AskUserQuestion to present both versions
- Re-verify traceability: Every implementation decision must still trace to an upstream artifact
3c. Re-generate derived artifacts
When changes affect DAG structure or task dependencies:
- Update the DAG diagram (§4) if task dependencies changed
- Re-generate
dag/dag-definition.yaml and dag/dag-pipeline.mmd using Edit
- Update the Traceability Matrix (§12) if requirement mappings changed
When changes affect code architecture (§2), deployment (§9), or task order (§4):
4. Re-generate impl-sequence.md to reflect updated build phases
When changes affect §2.3 Bronze runner contract (output target, catalog wiring):
5. Update outputs/lld/v*/config/{dev,stage,prod,config-template}.yaml to keep
catalog_uc_uri, catalog_bronze_catalog_name, catalog_bronze_schema in
sync with §7. The downstream src/<project>/bronze/ingestion_runner.py reads
these via the UC_URI env var.
6. Emit a reminder in the user-visible summary: "Run /developer-plugin:create-ingestion
to regenerate src/<project>/bronze/ingestion_runner.py against the updated
§2.3 contract." Decision 15 forbids path-based Bronze writes —
validate-dag UC-WIRING-001 will reject the regenerated runner if the
pattern slipped.
When §6.1 local_executor_mode changes:
7. Update inputs/lld/v*/templates/.../{{cookiecutter.project_name}}/_infra/docker/Dockerfile.airflow
and docker-compose.yml to match the new mode (e.g. add or drop the
bitnami/spark services; change AIRFLOW_CONN_SPARK_DEFAULT between JSON
local[2] and spark://spark-master:7077).
8. Edit the existing bootstrap story (outputs/stories/v*/EPIC-01-*/STORY-01-NNN-bootstrap*.md)
so the spark-submit smoke AC matches the new mode (per
inputs/stories/v1/story-standards.md Runtime-Bootstrap Coverage Rules
table). Otherwise STORIES-BOOTSTRAP-COVERAGE-001 keeps firing.
When §4.2 task-type set changes (added/removed/renamed task types):
9. Emit a reminder: "Run /developer-plugin:create-dag — it will regenerate
airflow/jobs/run_<task_type>.py from inputs/code/v1/scripts/run_layer_entrypoint.py.j2
for every distinct task type in §4.2, and update the <TYPE>_RUNNER_APP
env-var bindings in _infra/docker/docker-compose.yml."
3d. Cross-section consistency check
After applying all edits, verify:
- §2.1 Project Layout still matches the cookiecutter scaffold at
inputs/lld/v{N}/templates/cookiecutter-chapter/; any new module added in §5 also appears in the §2.1 tree, and every path referenced in §3/§4/§5/§7/§9 resolves inside the scaffold (or is logged as a deviation in §13). The scaffold includes airflow/jobs/.gitkeep for the auto-generated entry-script wrappers.
- §2.3 Bronze runner contract declares
UCSingleCatalog + saveAsTable("unity.bronze.<table>") as the write pattern; never path-based Delta .save("/tmp/..."). Decision 15 in §13 must be cited.
- §4 DAG Specification still aligns with §5 Task Implementation Details. §4.2 task-type set is the source of truth for
airflow/jobs/run_<task_type>.py wrapper auto-generation.
- §6.1 Compute & Local Executor Mode is present and renders a fenced YAML block declaring
local_executor_mode (one of in-airflow-local[*] / sidecar-spark / external-cluster) plus spark_master_url, spark_version, provider_pin. Production compute profile (executors/cores/memory per env) accompanies it.
- §6.2 Joins, §6.3 Shuffle/Parallelism, §6.4 Caching, §6.5 Partition Tuning subsections are present (downstream Scrum Master
STORIES-BOOTSTRAP-COVERAGE-001 and per-layer performance-optimization stories cite these subsection numbers).
- §6 Performance settings match current infrastructure specs.
- §7 Configuration Schema carries the catalog block:
catalog_uc_uri, catalog_bronze_catalog_name, catalog_bronze_schema. Env-driven path keys (AIRFLOW_CONFIGS_DIR, <TYPE>_RUNNER_APP, DQ_RULES_DIR, UC_URI) are documented either here or in §9.
- §8 Error Handling retry policies align with §4 DAG timeout settings.
- §9 Deployment environments match §7 Configuration environment overrides; §9.1–9.4 still reference
_infra/ci/, _infra/cd/, _infra/docker/, ddl/liquibase/. _infra/docker/Dockerfile.airflow exists when local_executor_mode is in-airflow-local[*] or sidecar-spark.
- §10 Monitoring thresholds align with DRD SLAs.
- §11 Upstream References have correct section numbers; the spark-expectations row references >=2.10.0 (YAML rule loader floor).
- §12 Traceability Matrix maps all requirements to implementation components.
- DAG definition YAML matches §4 task inventory and emits
dag_file: airflow/dags/<dag_id>.py.
- Implementation sequence phases align with §2 module structure and §4 task order.
outputs/lld/v*/config/{dev,stage,prod}.yaml contain the catalog block defined in §7 and stay consistent with each other (only env-specific values differ).
- §2 / §5 phased-contract hygiene — no module section mixes bootstrap-mode prose (
soft-import, bootstrap mode, try/except ImportError, PENDING IMPLEMENTATION) with fail-closed prose (fail-closed, must be removed, hard error) unless it carries an explicit > **TEMP — bootstrap phase only (Decision N, §8.X):** callout. §8 owns the lifecycle by design and is exempt. The LLD-PHASED-CONTRACT-001 rule fires WARNING on violations — and the scrum-master will generate contradictory ACs (per spokane's STORY-02-001 vs STORY-02-004 collision, 2026-04-26). When updating a module contract that touches a transitional state, prefer deferring the lifecycle prose to §8.X via a one-liner; reach for the TEMP callout only if the inline mention is unavoidable.
3e. Update version tracking
Use Edit to update the metadata table:
- Set/increment version number per scenario rules (A:
{N+1}.0, B/C: bump minor)
- Update Last Modified to today's date
- Set Status to
Updated - Pending Review
Add a new row to the Version History table:
| Version | Date | Author | Changes |
|---|
| {new version} | {today} | Technical Lead Agent | {brief description} |
Phase 4: Validate and Record
- Run the validator:
uv run python technical-lead-plugin/skills/validate-lld/scripts/validate_lld.py {lld_path}
- Fix all CRITICAL issues before presenting to the user
- Report WARNINGS and suggest fixes
- Report INFO items as improvement opportunities
- Report: changes made, contradictions found, remaining open items, validation summary
- Write a session summary to
memory/lld/session-{YYYY-MM-DD}.md:
- What was updated (LLD filename, version change)
- Changes made (bulleted list)
- Implementation decisions changed and rationale
- Upstream traceability updates
- Remaining open items
Correction Capture (MANDATORY)
After EVERY user correction — whether they edit the artifact, ask you to change
something, or reject a section — you MUST append a learning entry BEFORE continuing:
echo '{"skill": "update-lld", "date": "{YYYY-MM-DD}", "correction": "{what the user said or changed}", "pattern": "{generalized rule}", "status": "pending"}' >> memory/lld/learnings-queue.jsonl
What counts as a correction: user says "no, change X to Y", edits artifact
directly, rejects a proposed decision, or provides a specific value replacing
a vague one you generated. When in doubt, append it — false positives are filtered
during apply-learnings.
Pitfall Prevention
Guard against these common technical lead mistakes:
Pitfall 1: DAG Without Task-Level I/O Contracts
- Never define tasks without specifying input/output paths, schemas,
and what happens when input is empty
- Every task must have an explicit contract
- Missing I/O contracts cause runtime failures and data loss in production
Pitfall 2: Environment-Agnostic Configuration
- Never hardcode paths, connection strings, or resource sizes
- Every configurable parameter must appear in §7 with per-environment overrides
- Hardcoded values cause deployment failures when promoting from DEV to PROD
- Path resolution belongs in env vars (
AIRFLOW_CONFIGS_DIR, <TYPE>_RUNNER_APP,
DQ_RULES_DIR, UC_URI), not literals like airflow/configs or
/opt/dq_rules. The validate-dag DAG-PATHS-001/002 rules reject the
literals.
Pitfall 3: No Rollback Procedure
- Every deployment change must update the rollback procedure in §9
- Specify: detection, revert steps, data re-processing, and notification
Pitfall 4: Path-Based Bronze Writes (UC Bypass)
- Never specify
warehouse/{env}/bronze/{table}/ as a §2.3 Bronze runner
output target. LLD Decision 15 (added 2026-04-26 after spokane's first
green Bronze run revealed the gap) mandates UC-managed writes via
UCSingleCatalog + saveAsTable("unity.bronze.<table>"). Path-based
Delta leaves Unity Catalog empty until a manual docker cp +
external-table registration — and the gap recurs every DAG run.
- If a user request implies path-based Bronze (e.g. "land Bronze under
/tmp first then register"), surface Decision 15 via
AskUserQuestion
before applying.
Pitfall 5: Implicit local_executor_mode
- Never leave §6.1 silent on
local_executor_mode. Pick one of
in-airflow-local[*] (chapter-5 educational default), sidecar-spark,
or external-cluster and emit it as a fenced YAML block. Without this
decision, the cookiecutter Dockerfile.airflow + docker-compose.yml don't
know which Spark wiring to bake in, downstream stories can't write a
meaningful spark-submit smoke AC, and STORIES-BOOTSTRAP-COVERAGE-001
keeps firing.
Pitfall 6: Spark Expectations Pinned Below 2.10
- Never allow §11 Upstream References or
dq_rules/{table}.yml to
pin spark-expectations below 2.10.0. The YAML/JSON rule loader
(spark_expectations.rules.load_rules_from_yaml) was added in v2.10.0
PR #300; earlier 2.x releases (e.g. 2.6.0 — what spokane shipped before
the fix) raise ModuleNotFoundError and force a BRONZE_SKIP_SE=1
bypass that defeats DQ entirely. The library-imports.yaml overlay's
min_version: 2.10.0 is the floor.
Reference: Fourteen Sections
Every LLD must cover all 14 sections. If any section is incomplete,
the LLD is not ready for handoff to the development team.
| Section | Key Content |
|---|
| §1 Design Overview | 3-5 sentences; developer-readable implementation summary |
| §2 Code Architecture | Project structure, conventions, templates, testing strategy. §2.3 Bronze runner contract uses UCSingleCatalog + saveAsTable("unity.bronze.<table>") (Decision 15) — never path-based Delta. |
| §3 File Formats & Storage Layout | Storage format, compression, partitioning, directory layout |
| §4 DAG Specification | Task inventory, dependencies, Mermaid diagram, scheduling, critical path. §4.2 task-type set drives airflow/jobs/run_<task_type>.py wrapper auto-generation by /developer-plugin:create-dag. |
| §5 Task Implementation Details | Per-task I/O contracts, transform refs, DQ checks |
| §6 Performance & Optimization | §6.1 Compute & Local Executor Mode (mandatory local_executor_mode fenced YAML); §6.2 Joins; §6.3 Shuffle/Parallelism; §6.4 Caching; §6.5 Partition Tuning. Subsection numbering is load-bearing — downstream rules cite it. |
| §7 Configuration Schema | Parameters with per-environment defaults. Catalog block: catalog_uc_uri, catalog_bronze_catalog_name, catalog_bronze_schema. |
| §8 Error Handling | Retry; SE _error table (row_dq); SE stats/detailed (agg_dq/query_dq); ingest DLQ (pre-validation only); alerting. Never add a custom writer for row_dq drops — SE owns <target>_error. |
| §9 Deployment | Environments, promotion, rollback, health checks. _infra/docker/Dockerfile.airflow is required for in-airflow-local[*] / sidecar-spark modes. |
| §10 Monitoring | Metrics, dashboards, alerting rules |
| §11 Upstream Artifact References | Hub cross-reference to DRD, HLD, DMS, STM, DQS. spark-expectations row pins >=2.10.0 (YAML rule loader floor). |
| §12 Traceability Matrix | Requirements → implementation mapping |
| §13 Decision Log | Options/Selected/Rationale/Trade-off per decision. Decision 15 = Bronze UC wiring. |
| §14 Version History | Version tracking table |
File Conventions
- Updated LLDs:
outputs/lld/v{N}/LLD-{YYYY-MM-DD}-{short-name}.md
- Config templates:
outputs/lld/v{N}/config/config-template.yaml
- Input documents:
inputs/lld/v{N}/
- Session memory:
memory/lld/session-{YYYY-MM-DD}.md
- Discover latest version folder:
ls -d {path}/v* | sort -V | tail -1
Phase 5: Validate & Apply Learnings
- Run validation: Invoke
/technical-lead-plugin:validate-lld on the generated/updated artifact
- Fix issues: If validation returns CRITICAL errors, fix them and re-validate
- Apply learnings: If
memory/lld/learnings-queue.jsonl has pending entries,
invoke /technical-lead-plugin:apply-learnings before finishing
Learnings & Corrections
Meta-rules for adding learnings:
- Each learning MUST be an absolute directive ("Always X", "Never Y")
- Lead with the problem, then the fix: "When X happens, do Y"
- Include a concrete command or example, not just prose
- One learning per bullet — no compound rules
- Delete learnings that contradict each other; keep the newer one
- Maximum 20 learnings per skill — if at capacity, merge related items
Active Learnings
No learnings recorded yet. Learnings are added when corrections occur during skill execution.