Post-Edit Verification
After editing a component file, the natural instinct is to re-read the full file to confirm the edit landed. Don't, by default. Component JSON files are minified single-line documents, often 20–100 KB, and re-reading them after every edit consumes parent-conversation context that the actual work needs. Several lighter-weight signals do the same job — apply them in this order.
Hook-replacement context. Mitch's repo carried a PostToolUse hook (hooks/validate-component.py) that auto-blocked any Edit/Write of a tracked component suffix when the description was null/empty/>100 chars or the JSON failed to parse. The Datex Skills repo has no PostToolUse mechanism — skills are not auto-invoked by tool events. This skill is the substitute: every component-creator skill ends with "after your edit, invoke post-edit-verification", so the same two platform invariants are enforced in one place (DRY) at the skill layer instead of the harness layer. If a harness-level save-gate hook is installed in a given environment (a PostToolUse validator that blocks bad component saves), treat hook silence as a positive signal — those gates passed at the harness level — not as absent feedback; the skill checks below remain the portable floor.
Platform invariants (the minimum checks)
These two rules are non-negotiable for every component file. They are the rules the former hook enforced and they remain the floor of this skill — every invocation must confirm both, regardless of how trivial the edit looked.
description is present and within the platform limit. The top-level description must be non-null, non-empty, and ≤ 100 characters. The Footprint platform stores description in a SQL column capped at 100 characters; imports fail with a SQL truncation error if exceeded. See ../datex-studio-conventions/defaults.md for the canonical "Descriptions Are Mandatory" rule and ../datex-studio-conventions/file-format.md for the 100-char SQL limit. If the field is missing or too long, fix it as part of the same edit cycle — do not ask whether to backfill, just author a ≤100-char description (the user can override the wording afterward like any authored value).
The JSON parses cleanly. After the edit, the file must still be valid JSON. Run python -c "import json; json.load(open(r'<path>')); print('OK')". A mismatched brace, stray quote, or bad escape sequence will surface here. Free, no parent-context cost. Run it once after a sequence of edits to the same file, not after each one.
If either invariant fails, the edit is not done. Fix the violation and re-verify before claiming completion or moving on.
Verification stack (cheapest first)
The Edit tool's success message. The tool reports "The file ... has been updated successfully." That message means old_string matched and was replaced verbatim. If you crafted a precise old_string and the tool reported success, the textual edit is in. The remaining question is whether the result is structurally and semantically valid — which the next layers cover.
JSON-parse check. python -c "import json; json.load(open(r'<path>')); print('OK')". Confirms the edit didn't break the JSON envelope (mismatched braces, stray quotes, escape errors). Free, no parent-context cost. Run this once after a sequence of edits to the same file, not after each one. This is platform invariant #2.
Description check. After the JSON parses, confirm description is non-null, non-empty, and ≤ 100 characters:
python -c "import json; d=json.load(open(r'<path>'))['description']; assert d and len(d) <= 100, (d, len(d) if d else 0); print('OK', len(d))"
This is platform invariant #1. If the assertion trips, fix the field as part of the same edit cycle.
Grep with -C context. To confirm a specific edit landed where you intended, target the changed section by name, not the whole file:
Grep "while \(pickTasks" -C 30 returns ~60 lines around the loop instead of the entire 30 KB file.
Grep "concurrency_limit" -C 5 confirms an inParam was added without dumping the whole schema.
- Order-of-magnitude context win without sacrificing precision.
component-validator subagent. For substantial structural validation after a non-trivial refactor — the kind of audit a final-gate review runs but file-by-file — invoke component-validator. The subagent reads the file in its own context; only the punch list comes back to the parent. For grids specifically, use grid-validator instead — it carries grid-specific gotchas (envelope shape, text-display coercion, five-location invariant) the generic dispatcher does not catch.
Re-read the full file (last resort). Reach for Read only when you genuinely need to see the entire structure end-to-end and don't yet know what to grep for — e.g. chasing an obscure layout issue, debugging a case where the validator's punch list was empty but something still feels wrong. Should be the last signal you reach for, not the first.
When to delegate to the component-validator agent
Delegate when:
- You finished a non-trivial edit (loop refactor, schema change, multi-step fix) on a single component file.
- The file is > 20 KB minified (most component files).
- You want a structured punch list rather than your own free-form spot-check.
- The change touched
description, inParams / outParams, accessModifier, or other contract fields the type's Pre-Flight Checklist covers.
Don't delegate when:
- The edit is a single-character or single-line tweak.
Grep -C is faster.
- You're mid-edit and need to decide on the next change. The parent needs the local context.
- The change is purely formatting / whitespace (validator has no rules for those).
- You already invoked the validator after a prior edit and only made small subsequent changes.
For grid files (*-grid.json), prefer grid-validator over component-validator — it is mandatory for grids regardless of edit size, because the grid-specific gotchas (envelope shape, dynamic-filter mirror drift, partial lookupcode/id syncs) are not caught by the generic dispatcher.
Risk-proportional verification
Apply verification cost in proportion to the change's risk surface. Platform invariants (#1 and #2 above) are the floor — they apply to every row. The right-hand column lists additional checks beyond the floor.
| Edit type |
Verification (beyond the two platform invariants) |
| Single-character / comment fix |
Trust the Edit success message — nothing more. |
| Single-block content change in a non-contract field |
(Floor only.) |
Schema or contract change (inParams / outParams / accessModifier) |
Targeted Grep -C of the changed schema. |
| Multi-edit refactor across the same file |
component-validator subagent at the end of the sequence, not per-edit. |
| Cross-component change (multiple files coordinated) |
component-validator on each file at the end + component-wiring-check skill. |
Grid file (*-grid.json) — any edit |
grid-validator subagent (mandatory; replaces the generic validator for grids). |
Verification is insurance, not confirmation. Match the premium to the risk — but never skip the floor.
References
- ../datex-studio-conventions/defaults.md — Canonical "Descriptions Are Mandatory" rule (non-null, non-empty, ≤ 100 chars).
- ../datex-studio-conventions/file-format.md — Canonical file-format rules including the 100-char SQL limit on
description and the single-line minified-JSON convention.
- ../datex-studio-conventions/universal-checklist.md — The fuller cross-cutting checklist beyond this skill's two-invariant floor. This skill enforces the floor (description + JSON parse);
component-validator walks the full list on escalation.
component-validator — generic per-type audit dispatcher; escalation target for non-trivial edits.
grid-validator — grid-specific audit; mandatory for *-grid.json regardless of edit size.
1---2name: post-edit-verification3description: Use after editing or writing any Datex Studio component file — invoked by every creator skill's closer ("After your edit, invoke post-edit-verification"). Runs the verification stack cheapest-first: Edit/Write tool succeeded → JSON parses → description is non-null, non-empty, ≤100 chars (platform limit) → grep for obvious typos. Escalates to component-validator subagent for non-trivial edits. Replaces Mitch's PostToolUse validate-component.py hook with a skill-based pattern. Triggers: invoked by every component-creator's closer; rarely invoked directly by users.4---56# Post-Edit Verification78After editing a component file, the natural instinct is to re-read the full file to confirm the edit landed. **Don't, by default.** Component JSON files are minified single-line documents, often 20–100 KB, and re-reading them after every edit consumes parent-conversation context that the actual work needs. Several lighter-weight signals do the same job — apply them in this order.910> **Hook-replacement context.** Mitch's repo carried a `PostToolUse` hook (`hooks/validate-component.py`) that auto-blocked any Edit/Write of a tracked component suffix when the `description` was null/empty/>100 chars or the JSON failed to parse. The Datex Skills repo has no `PostToolUse` mechanism — skills are not auto-invoked by tool events. This skill is the substitute: every component-creator skill ends with *"after your edit, invoke `post-edit-verification`"*, so the same two platform invariants are enforced in one place (DRY) at the skill layer instead of the harness layer. If a harness-level save-gate hook *is* installed in a given environment (a PostToolUse validator that blocks bad component saves), treat hook silence as a positive signal — those gates passed at the harness level — not as absent feedback; the skill checks below remain the portable floor.1112## Platform invariants (the minimum checks)1314These two rules are non-negotiable for every component file. They are the rules the former hook enforced and they remain the floor of this skill — every invocation must confirm both, regardless of how trivial the edit looked.15161. **`description` is present and within the platform limit.** The top-level `description` must be non-null, non-empty, and ≤ 100 characters. The Footprint platform stores `description` in a SQL column capped at 100 characters; imports fail with a SQL truncation error if exceeded. See [../datex-studio-conventions/defaults.md](../datex-studio-conventions/defaults.md) for the canonical "Descriptions Are Mandatory" rule and [../datex-studio-conventions/file-format.md](../datex-studio-conventions/file-format.md) for the 100-char SQL limit. If the field is missing or too long, **fix it as part of the same edit cycle** — do not ask whether to backfill, just author a ≤100-char description (the user can override the wording afterward like any authored value).17182. **The JSON parses cleanly.** After the edit, the file must still be valid JSON. Run `python -c "import json; json.load(open(r'<path>')); print('OK')"`. A mismatched brace, stray quote, or bad escape sequence will surface here. Free, no parent-context cost. Run it once after a sequence of edits to the same file, not after each one.1920If either invariant fails, the edit is **not** done. Fix the violation and re-verify before claiming completion or moving on.2122## Verification stack (cheapest first)23241. **The Edit tool's success message.** The tool reports "The file ... has been updated successfully." That message means `old_string` matched and was replaced verbatim. If you crafted a precise `old_string` and the tool reported success, the textual edit is in. The remaining question is whether the *result* is structurally and semantically valid — which the next layers cover.25262. **JSON-parse check.** `python -c "import json; json.load(open(r'<path>')); print('OK')"`. Confirms the edit didn't break the JSON envelope (mismatched braces, stray quotes, escape errors). Free, no parent-context cost. Run this once after a sequence of edits to the same file, not after each one. **This is platform invariant #2.**27283. **Description check.** After the JSON parses, confirm `description` is non-null, non-empty, and ≤ 100 characters:2930 ```31 python -c "import json; d=json.load(open(r'<path>'))['description']; assert d and len(d) <= 100, (d, len(d) if d else 0); print('OK', len(d))"32 ```3334 **This is platform invariant #1.** If the assertion trips, fix the field as part of the same edit cycle.35364. **`Grep` with `-C` context.** To confirm a *specific* edit landed where you intended, target the changed section by name, not the whole file:37 - `Grep "while \(pickTasks" -C 30` returns ~60 lines around the loop instead of the entire 30 KB file.38 - `Grep "concurrency_limit" -C 5` confirms an inParam was added without dumping the whole schema.39 - Order-of-magnitude context win without sacrificing precision.40415. **`component-validator` subagent.** For substantial structural validation after a non-trivial refactor — the kind of audit a final-gate review runs but file-by-file — invoke `component-validator`. The subagent reads the file in *its own* context; only the punch list comes back to the parent. For grids specifically, use `grid-validator` instead — it carries grid-specific gotchas (envelope shape, text-display coercion, five-location invariant) the generic dispatcher does not catch.42436. **Re-read the full file (last resort).** Reach for `Read` only when you genuinely need to see the entire structure end-to-end and don't yet know what to grep for — e.g. chasing an obscure layout issue, debugging a case where the validator's punch list was empty but something still feels wrong. Should be the *last* signal you reach for, not the first.4445## When to delegate to the component-validator agent4647**Delegate when:**4849- You finished a non-trivial edit (loop refactor, schema change, multi-step fix) on a single component file.50- The file is > 20 KB minified (most component files).51- You want a structured punch list rather than your own free-form spot-check.52- The change touched `description`, `inParams` / `outParams`, `accessModifier`, or other contract fields the type's Pre-Flight Checklist covers.5354**Don't delegate when:**5556- The edit is a single-character or single-line tweak. `Grep -C` is faster.57- You're mid-edit and need to decide on the next change. The parent needs the local context.58- The change is purely formatting / whitespace (validator has no rules for those).59- You already invoked the validator after a prior edit and only made small subsequent changes.6061For grid files (`*-grid.json`), prefer `grid-validator` over `component-validator` — it is mandatory for grids regardless of edit size, because the grid-specific gotchas (envelope shape, dynamic-filter mirror drift, partial lookupcode/id syncs) are not caught by the generic dispatcher.6263## Risk-proportional verification6465Apply verification cost in proportion to the change's risk surface. Platform invariants (#1 and #2 above) are the floor — they apply to every row. The right-hand column lists *additional* checks beyond the floor.6667| Edit type | Verification (beyond the two platform invariants) |68|---|---|69| Single-character / comment fix | Trust the Edit success message — nothing more. |70| Single-block content change in a non-contract field | (Floor only.) |71| Schema or contract change (`inParams` / `outParams` / `accessModifier`) | Targeted `Grep -C` of the changed schema. |72| Multi-edit refactor across the same file | `component-validator` subagent at the *end* of the sequence, not per-edit. |73| Cross-component change (multiple files coordinated) | `component-validator` on each file at the end + `component-wiring-check` skill. |74| Grid file (`*-grid.json`) — any edit | `grid-validator` subagent (mandatory; replaces the generic validator for grids). |7576Verification is insurance, not confirmation. Match the premium to the risk — but never skip the floor.7778## References7980- [../datex-studio-conventions/defaults.md](../datex-studio-conventions/defaults.md) — Canonical "Descriptions Are Mandatory" rule (non-null, non-empty, ≤ 100 chars).81- [../datex-studio-conventions/file-format.md](../datex-studio-conventions/file-format.md) — Canonical file-format rules including the 100-char SQL limit on `description` and the single-line minified-JSON convention.82- [../datex-studio-conventions/universal-checklist.md](../datex-studio-conventions/universal-checklist.md) — The fuller cross-cutting checklist beyond this skill's two-invariant floor. This skill enforces the floor (description + JSON parse); `component-validator` walks the full list on escalation.83- `component-validator` — generic per-type audit dispatcher; escalation target for non-trivial edits.84- `grid-validator` — grid-specific audit; mandatory for `*-grid.json` regardless of edit size.