| name | gtkb-hygiene-investigation |
| description | Run a repeatable, full-coverage GT-KB architecture/hygiene investigation using the proven 4-round probe method (parallel focus-area probes -> gap probe -> completeness critic -> adversarial skeptic) with loop-until-dry and explicit decay disclosure. Emits findings against a structured schema, renders a chunked report via the deterministic report generator, and uses the frozen HYG-001..068 baseline registry for lookup and reporting; baseline diff/delta mode is deferred to a follow-on bridge. Use when the owner asks for a hygiene/architecture investigation, a drift/debt census, or a repeat of the GT-KB self-investigation that produced HYG-001..068. |
/gtkb-hygiene-investigation
This skill packages the method that produced the GT-KB self-investigation finding corpus (HYG-001..068,
frozen in config/governance/hygiene-baseline-registry.toml). It is the orchestration half of the layered
repeatable-investigation design chartered by DELIB-FABLE-GRILL-20260610-Q5: a deterministic detector core
(FAB-19, separate thread) feeds a reusable orchestration skill (this skill), and a future delta mode keys
re-runs to the baseline registry.
The deterministic-services split (DELIB-S312-DETERMINISTIC-SERVICES-PRINCIPLE) places the stable,
re-derivable surfaces — the chunked report generator and the baseline-registry loader — in
scripts/hygiene/ as testable Python, and keeps probe design, finding quality, and owner-decision routing
in this skill where they require model judgment.
This skill body presents identical content to every harness via the cross-harness skill-adapter pipeline
(config/agent-control/harness-capability-registry.toml + scripts/generate_codex_skill_adapters.py). The
Codex adapter at .codex/skills/gtkb-hygiene-investigation/SKILL.md carries a GTKB-CODEX-SKILL-ADAPTER
marker and is generated, not hand-edited; edit this canonical source and regenerate.
When to invoke
- Explicit owner direction — "run a hygiene investigation", "do an architecture/drift census",
"repeat the GT-KB self-investigation".
- Periodic re-baseline — when enough has changed since the last frozen baseline that a fresh full-coverage
census is warranted (the differential/delta optimization is a deferred follow-on; see below).
- Pre-release hygiene gate — a full-coverage census before a release lane, to surface drift/debt/defects
that mechanical gates do not catch.
This skill surfaces findings and routes owner decisions; it does not auto-remediate. Each finding becomes
a governed work_items candidate only through the explicit, owner-gated routing below.
Structured findings schema
Every finding the probes produce conforms to this schema (the same shape the loader and report generator
consume — scripts/hygiene/hygiene_baseline.py::HygieneFinding). Required fields are marked *.
| Field | Meaning |
|---|
id* | Stable identifier, HYG-NNN, contiguous within a run. |
title* | One-line verbatim finding title. |
finding_class* | One of defect, debt, decision-needed, drift. |
locations | Concrete file/line/path evidence anchors (a list). |
problem_statement | The quantified description of the finding. |
verification | The exact commands/reads used to confirm it (reproducibility evidence). |
impact | Value assessment: High / Medium / Low. |
effort | Value assessment: High / Medium / Low. |
confidence | Value assessment: High / Medium / Low. |
current_state / expected_state | The observed vs. goal state. |
owner_touchpoint_required | true when an owner decision is required to disposition the finding. |
owner_question | The owner decision phrased as numbered options (when a touchpoint is required). |
decision_complexity | low / medium / high (when a touchpoint is required). |
proposed_approach | The minimal remediation path. |
related_items | Cross-references to WIs, sibling findings, prior deliberations. |
source | Provenance label (e.g. v1_report, a run id). |
fab_cluster | The FAB cluster / WI the finding maps to, when known. |
A finding is evidence-first: locations and verification are what make it a finding rather than an
impression. A finding with impact >= Medium and no verification is incomplete and must go back through the
adversarial-skeptic round before it is reported.
The 4-round probe method
Run the rounds in order. Each round is a fan-out of focused sub-agent probes; collect their structured
findings, dedup by (finding_class, primary location), and carry the surviving set forward.
Round 1 — parallel focus-area probes (breadth)
Partition the platform into focus areas and probe each independently and blind to the others, so one
search angle's blind spots are covered by another's. A good default partition:
- bridge dispatch + automation substrate; MemBase + storage + backups; rule/glossary/narrative surfaces;
hooks + gates + enforcement; harness registry + roles + parity; CI + tests + assertions; isolation +
root-boundary + Agent-Red residue; backlog + deliberations + work-item hygiene; token/startup cost.
Each probe returns findings against the schema. Breadth, not depth, is the Round-1 goal: name the finding,
anchor at least one location, and propose a verification command. Do not stop at the first finding in an
area — enumerate.
Round 2 — gap probe (what no focus area owned)
Ask explicitly: what surface did no Round-1 probe own? Cross-cutting concerns (cost economics, duplicate
files, cloud-sync residue, retired-but-on-disk subsystems, contradictions between two always-loaded
surfaces) routinely fall between focus areas. Probe the seams.
Round 3 — completeness critic
A single critic pass over the accumulated corpus asking: what modality was not run, what claim is unverified,
what source went unread? The critic does not re-find; it identifies the missing work, which becomes the next
round of probes. Anything the critic surfaces re-enters Round 1/2 for the affected surface.
Round 4 — adversarial skeptic (depth / refutation)
For each finding at impact >= Medium (or any decision-needed), spawn an independent skeptic prompted to
refute it: reproduce the verification, check whether the evidence actually supports the claim, and
default to "downgrade/withdraw" when uncertain. Record the outcome inline (UPHELD / corrected / withdrawn).
This is what separates a high-impact finding from a plausible-but-wrong one.
Loop-until-dry with decay disclosure
Repeat Rounds 1-4 until K consecutive rounds surface nothing new (default K = 2). Simple "run once"
misses the tail; loop-until-dry catches it.
Decay disclosure is mandatory. Each loop pass returns fewer and lower-confidence findings; quality decays
as the obvious corpus is exhausted. The report MUST state, per surface: how many loop passes ran, when the
last new finding appeared, and an explicit honesty note that absence of new findings in the final passes is
evidence of coverage, not proof of completeness. Never present a dry run as "the platform is clean" — present
it as "this method, at this depth, found no more; deeper or differently-angled probing may still surface
findings."
Rendering the report (deterministic)
Use the deterministic report generator rather than hand-assembling a large report:
python scripts/hygiene/hygiene_report.py --baseline # render the frozen baseline as a chunked report
scripts/hygiene/hygiene_report.py renders a finding list (schema-keyed) into the v1-style report in
size-bounded chunks, so a large corpus does not exceed a single context window. It is callable without a
live agent run (pure function: generate_report_chunks(findings, max_chars=...)), which is what makes it
testable and cheap. Call it from this skill once probing converges; do not re-implement report shaping in
prose.
Baseline registry
config/governance/hygiene-baseline-registry.toml is the canonical frozen HYG-001..068 record: the
investigation corpus as of 2026-06-10, loadable via scripts/hygiene/hygiene_baseline.py::load_baseline().
Use it to:
- look up whether a fresh finding is already in the baseline (avoid re-reporting known items);
- seed the report generator with the baseline (
--baseline) when you need the frozen census rendered;
- serve as the differ's baseline once the deferred delta mode lands.
The baseline is versioned and seeded once; do not silently mutate it. A new full-coverage run produces a new
run corpus; promoting that corpus into a new frozen baseline is a separate, owner-gated step.
Routing findings to the backlog (owner-gated, no bulk mutation)
A finding is emitted in a form routable to work_items via
scripts/hygiene/hygiene_report.py::finding_to_work_item(finding), which returns the field set
gt backlog add consumes (title, origin='hygiene', component, change_reason, description). This is
how findings become governed backlog candidates rather than markdown-only context (GOV-08,
GOV-STANDING-BACKLOG-001).
This skill performs no bulk backlog/MemBase mutation. Routing a finding into work_items is an explicit,
per-finding, owner-gated step under GOV-STANDING-BACKLOG-001 (capture is not implementation approval).
A bulk routing run is its own owner-AUQ-approved operation with its own inventory + review packet; this skill
only produces the routable form.
Deferred follow-on (NOT in this slice)
The delta mode — diffing the deterministic FAB-19 evidence pack against the baseline registry and probing
only the changed surfaces, with the Q5 token targets — is deferred. It depends on the FAB-19 evidence-pack
output contract, which is a separate bridge thread. This skill ships the full-run method only; it does not
implement, invoke, or consume any FAB-19 evidence pack or delta differ. Do not add a delta procedure here
until the follow-on thread lands with the producer contract cited.
Pre-flight
- Resolve role from the canonical registry — read the active harness role via
groundtruth_kb.harness_projection.read_roles (canonical harness-state/harness-registry.json); do not
read any retired role-assignments mirror. This skill is required_for_roles = ["prime-builder"].
- Read TAFE/dispatcher bridge state — use the bridge dispatcher
status/health CLI and TAFE-backed bridge-state surfaces to confirm no
parallel session is already driving a hygiene-investigation thread. Do not
consult or recreate aggregate queue artifacts as bridge authority.
- No mutation scope is invented — this skill produces findings, a rendered report, and routable
work-item forms; any source/config remediation a finding implies is a separate, GO-gated bridge.
Does NOT
- Auto-remediate or auto-route. Findings become backlog items only through explicit owner-gated routing.
- Bulk-mutate
work_items or MemBase. It emits the routable form; the routing run is separate and gated.
- Implement delta mode / consume a FAB-19 evidence pack. Deferred follow-on (see above).
- Silently mutate the baseline registry. Re-baselining is an explicit, owner-gated promotion step.
- Present a dry run as "clean". Decay disclosure is mandatory; coverage is not completeness.
Required reading
.claude/rules/file-bridge-protocol.md — protocol contract for any remediation child-bridge.
.claude/rules/codex-review-gate.md — review-gate constraints for remediation proposals.
.claude/rules/deliberation-protocol.md — Deliberation Archive search obligations.
.claude/rules/operating-model.md — canonical vocabulary.
DELIB-FABLE-GRILL-20260610-Q5 (Deliberation Archive) — the repeatability-architecture charter.
DELIB-S312-DETERMINISTIC-SERVICES-PRINCIPLE — the service/skill split rationale.
config/governance/hygiene-baseline-registry.toml — the frozen HYG-001..068 baseline.
Companion deterministic surfaces
scripts/hygiene/hygiene_baseline.py — HygieneFinding schema + load_baseline() (the frozen-findings
loader).
scripts/hygiene/hygiene_report.py — generate_report_chunks() (chunked report) +
finding_to_work_item() (backlog-routable form).
- The deterministic detector core (FAB-19) is a separate thread; its evidence-pack contract is the input the
deferred delta mode will consume.
Copyright
(c) 2026 Remaker Digital, a DBA of VanDusen & Palmeter, LLC. All rights reserved.