算法艺术创作
algorithmic-art
通过代码和可调参数创作生成艺术与交互式视觉效果。
phantom-quench【设计与创意】Input-tracing grounding audit for artifacts such as test cases, analysis reports, and design docs. Extracts proper nouns, numbers, citations, version claims, and branching conditions, then back-traces each to declared local files by grep or to external sources by fetch-and-support checks. Marks missing anchors as Phantom Claims and cited-but-unsuppor…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Just because an artifact looks plausible doesn't mean it's grounded in source. plausible ≠ grounded.
Renamed from
source-grounding-audit(2026-06-06) — the grounding member of the quench series (steel-quench · phantom-quench · goal-quench). Same skill, same ruleset; only the label changed to fit the family. The v1 paper (Zenodo 10.5281/zenodo.20397566) cites the old name — that is the historical record, not a phantom (paper/forge_harness_v1.0.htmlis left unchanged by design; readers map source-grounding-audit (v1) = phantom-quench (current)). The deprecated redirect stub directory was removed 2026-06-12 — old-name utterances ("source grounding audit", "grounding audit") route here via this description's trigger phrases. This is a label rename, not a capability change — phantom-quench does not fuse steel-quench or inject faults; those remain separate (orthogonality is deliberate — see Role Separation below).Quench-series semantics (resolves the "quench what?" question): each member subjects a different thing to the forge — steel-quench hardens an existing output; phantom-quench hardens the system against mistaking the absent for present (the phantom illusion — not the phantom as a material to harden); goal-quench hardens the goal itself into an advanced version. Same verb, consistent grammar.
Not the same as
phantom-gate.phantom-gateis the productized standalone phantom detector — a PyPI package run against any repo from the shell.phantom-quenchis the in-harness skill — the same detection lineage as a method invoked inside a Claude session against a declared source set. Tool vs skill; different delivery, shared idea.
When AI generates artifacts without reading the source, those artifacts look like domain knowledge but are actually Phantom Claims coming from LLM weights. This skill back-traces each claim in the artifact to the declared source to explicitly mark Phantoms.
| Dimension | steel-quench | phantom-quench |
|---|---|---|
| Attack target | Output patterns (self-declarations, cushion language, reason for existence) | Input tracing (is the claim in the source?) |
| Core question | "Is this structure flawed?" | "Where did this content come from?" |
| Activation timing | All-angle quench just before completion | Immediately after source-based artifact generation or at point of suspicion |
| Primary attack vector | Bus factor, self-reference, platform obsolescence | Phantom Claim, source not read, fabricated branching conditions |
| Representative pattern | "Declaration only, no evidence" | "Number in TC that doesn't exist in source" |
Can be used together: steel-quench Wave 1 real-code-based attack + phantom-quench Phantom marking can be run sequentially in the same session. But do not mix the roles of the two skills.
| Phrase | Situation |
|---|---|
| "phantom detection", "phantom claim", "false claim detection" | Full artifact Phantom scan (primary trigger) |
| "source back-trace", "source audit" | Analysis report, design document verification |
| "verify source", "where did this come from" | Suspecting origin of a specific claim |
| "TC evidence tracing", "TC source verification" | Post-TC-generation source consistency check |
| "grounding audit", "source grounding audit" | Full artifact Phantom scan |
| "verify evidence files" | Analysis report, design document verification |
| "citation support check", "does the source support this claim", "cited but not verified", "claim to source" | External cited source (arXiv/DOI/URL/version) — fetch and check support, not just existence (Step 2-E) |
/phantom-quench | Explicit call |
Phantom Claim: A claim that appears in the artifact but cannot be found in the declared source files.
3 paths through which Phantoms are produced:
| Path | Description | Risk |
|---|---|---|
| Source not read | AI generates artifact using domain knowledge without Read-ing source | S |
| Partial reading | Source partially read, rest filled in with inference | A |
| Reconstruction contamination | Source was read but LLM modified values/conditions during paraphrase | A |
External anchor: package hallucination — an LLM emitting a non-existent or invalid package name, which an attacker can then register under the hallucinated name as a supply-chain vector — is a documented instance of the Phantom Claim class (arXiv:2607.02052, Mitigating Package Hallucinations in Large Language Models via Model Editing). That work mitigates the failure inside the model; phantom-quench catches the same class at the artifact surface by back-tracing each referenced name to a declared source.
If not provided by user, explicitly confirm: artifact file path, declared source files, and audit scope. Source not declared = S-grade blocker registered immediately.
Detail: See
SKILL_detail.md §Step0-Detail— confirmation output format and simplification guard — read when audit target or source list is ambiguous.
Schema:
knowledge/shared/harness-core/tpa_schema.md—phantom_riskderivation rule, gate trigger conditions, §Gate Routing Table.
Runs after Step 0 (target + source confirmed). Skip if user specifies scope explicitly.
Scan artifact quickly to classify claim distribution:
| Dimension | Signal → Audit depth shift |
|---|---|
claim_density | > 10 claims → full Step 1-4 audit; ≤ 3 claims → light (S+A only) |
artifact_type | SKILL.md/design-doc → prioritize Branch/State-transition claims; code → prioritize Proper-noun/API claims |
risk_level | external publish / arXiv citations → all claim types, max depth, and Step 2-E (external fetch+support) is mandatory |
source_count | 0 declared sources → S-grade blocker immediately (skip to Step 3 prescription) |
quantitative_density | > 3 numerical claims → focus numerical+range types first |
external_citation | artifact (or its diff) contains arXiv: / DOI / http(s):// / a version token (x.y.z) → route those claims to Step 2-E (governance binding: these are the load-bearing external claims FH's substantive carve-out already gates — .claude/rules/fh_4axis_gate.md §Substantive carve-out) |
Scope recommendation output:
Claim types to prioritize: [list]
Audit depth: [full | prioritized | light]
Immediate blockers detected: [yes/no — 0 sources = immediate S-grade]
0-source behavioral rule: When artifact has 0 declared sources, skip Steps 1-2 entirely and go directly to Step 3 with S-grade blocker: "Source not declared — all claims unverifiable."
Extract claims from the artifact that require source back-tracing. Claim types: Proper nouns (highest), Numerical/range values (highest), Branching conditions (highest), State transitions (high), Preconditions (high), Actors (medium). Exclude generic test methodology descriptions and generic UI patterns.
Detail: See
SKILL_detail.md §Step1-Detail— full claim types table with examples, exclude list, and Step 1 output format template — read when deciding which claims to include or format the extraction results.
Back-trace each claim to the declared source files using Read + Grep directly — no inference judgment. Partial match is not treated as match.
Mechanical anchor (GROUNDED is gated on a literal grep hit in the right slot, not a bare judgment) — this closes out-of-context grounding: citing a real, readable file for a false claim, where the judge biases GROUNDED merely because the source exists and contains domain-adjacent text (measured 2026-06-13, judge-robustness swarm — the cheapest S-exploit of this skill). The anchor is typed — applying one byte-literal rule to every claim type both under-blocks (a token that hits an irrelevant line) and over-blocks (a correct value formatted differently); each type gets the right check:
grep -n "<exact token>" <cited file> — must return a non-empty line, surfaced literally
(file:line: matched text), and that line must be where the identifier is used as the claim
asserts (a bare occurrence elsewhere is not grounding — e.g. claim "X is the default model" needs
the line that sets X as default, not any line mentioning X). No qualifying hit → Phantom.300s ≡ 300 seconds, ≥5 ≡ >= 5 (ASCII/Unicode), 5 minutes ≡ 300 seconds. The value must
sit in the slot the claim asserts. A correct value in a different format = Grounded (note the
normalization in evidence); a different value in that slot = Partial (re-confirm) or Phantom.
Never auto-Phantom a format variant.Universal rule: a grep hit counts only if the surfaced line expresses the claimed relation. "The token appears somewhere in a real file" is precisely the out-of-context trap, not evidence.
A claim that is cited to a specific source but the source cannot be Read (path doesn't resolve,
line beyond EOF) is S-grade Phantom, not the softer Source-Missing 🔴 — a citation that does not
resolve means the citation was invented. Source-Missing 🔴 is reserved for undeclared sources only.
Declared "sources" that are not resolvable file paths (e.g. source: "the codebase") count as 0
sources for the Step 0.5 blocker.
Back-tracing classification:
| Classification | Criteria | Marking |
|---|---|---|
| Grounded | Typed anchor passes: identifier grep-hits in the asserting slot / value matches after normalization / branching sub-conditions trace (line surfaced) | ✅ |
| Partial | A different value sits in the claimed slot, or a compound condition partially traces — needs re-confirmation | ⚠️ |
| Phantom | Exact token not found in source, or cited to a named source that cannot be Read | ❌ |
| Source-Missing | Source was not declared (undeclared only — a failed cited source is Phantom) | 🔴 |
Detail: See
SKILL_detail.md §Step2-Detail— back-tracing execution procedure, classification decision rules, and Step 2 output format template — read when handling edge cases or formatting results.
Step 2 grounds claims against local declared files (grep). Step 2-E grounds claims whose cited
source is external — arXiv: / DOI / http(s):// / a version token. It fires when Step 0.5 flags
risk_level: external or external_citation (the governance binding above). For an external claim,
existence is not support: a link can resolve (HTTP 200, valid arXiv id) and still not contain the
claimed fact — the measured failure class (link validity >94% but factual support 39–77%; degrades
~42% as tool calls scale 2→150; source: arXiv:2605.06635, span-verified). So this pass checks
support, not reachability.
Non-Model Ground anchor (isomorphic to Step 2's typed grep anchor) — the anchor substrate must be non-model: for a local claim it is a grep hit in the asserting slot; for an external claim it is a literal quoted span from the fetched source that expresses the claimed relation. A second model agreeing the claim looks right is not an anchor (that is the agreement-bias trap — a panel can converge on a confident wrong answer; only a fetched/grepped span breaks it). Never mark Grounded on "the source looks like it supports this" — surface the span or it is not grounded.
Procedure (per external-cited claim):
arXiv:NNNN.NNNNN → https://arxiv.org/abs/NNNN.NNNNN; bare DOI → https://doi.org/…). If the
artifact names a source without a URL ("paper X shows Y"), use one WebSearch to locate the
canonical source, then proceed — do not verify against the search snippet alone.WebFetch the resolved URL with a prompt that asks only for a span and its
polarity — "quote the span that states , and label it ASSERTS / NEGATES / MENTIONS
the claim; if no span, say NONE." Do not ask the fetch model to judge support — ask it to retrieve a
span and its stance. (Polarity guards the false-Grounded trap: a page saying "X does NOT hold" or
"prior work claimed X — we refute it" contains a lexically-matching span that is not support.)Capability-absent ≠ per-source blocked: Unreachable ⏳ is for one source blocked (paywall/403/timeout)
while fetch still works generally. If WebFetch/WebSearch are absent or disabled in this environment
(every external claim would fetch-fail), Step 2-E cannot run — do not mark every claim Unreachable and
emit CONDITIONAL_PASS (that falsely implies external grounding was attempted). Report a distinct outcome:
"external grounding NOT PERFORMED — no fetch capability in this environment" and set the verdict to
ESCALATE, surfacing that the external claims are unverified.
External back-trace classification (extends the Step 2 table):
| Classification | Criteria | Marking |
|---|---|---|
| Grounded | Fetched source returns a literal span expressing the claimed relation (span recorded) | ✅ |
| Unsupported | Source fetched + readable, but no span supports the claim — the cited-but-not-verified class | 🟠 |
| Unreachable | Identifier plausibly real but un-fetchable here (paywall/403/timeout) — provisional, second-surface/human | ⏳ |
| Phantom | External identifier invalid / does not resolve (fabricated citation) | ❌ |
Unsupported severity: an Unsupported claim is graded like a Phantom in Step 3 (S if a wrong value would mis-Pass behavior or anchor a decision; A if it misroutes; B otherwise). An external-publish or paper citation that is Unsupported is at least A — a published wrong citation is an external-facing error.
Detail: See
SKILL_detail.md §Step2E-Detail— identifier-normalization table, WebFetch prompt template, span-evidence format, and the Step 2-E output table — read when fetching or formatting results.
Step 2 grounds claims against locally declared files; Step 2-E grounds externally cited
sources. Domain claims — org-specific facts, terminology, policy ("this service's policy is X",
"here Y means Z") — hit neither surface and all fall to 🔴 Source-Missing, even though the org
knowledge layer is exactly their ground. It was simply not on the search path. This step is that
wiring. Contract: knowledge/shared/rules/knowledge_layer_seam.md (this skill is its first FH
consumer; machine check = scripts/knowledge_seam_check.sh).
When it fires: the claim is (a) an org-specific fact/term/policy and (b) undeclared in Step 2 (a 🔴 candidate). A declared source always wins — this step is an additional surface, never a replacement.
Procedure (reuses Step 2's typed-anchor rule — no new adjudication method):
knowledge/{org}/INDEX.md or index.md/README.md
(the checker accepts all; case matters on Linux). Never full-scan (contract K2).file:line: matched text. A token existing somewhere
is not grounding.review_after (contract K3-f).Classification
| Situation | Verdict | Why |
|---|---|---|
Slot hit + review_after not elapsed | Grounded | ✅ |
Slot hit + review_after elapsed | Partial | ⚠️ stale ground is not ground — do not pretend freshness |
| Slot hit + no date | Partial | ⚠️ freshness unknown — do not assume current |
| No hit | keep 🔴 | state explicitly that the org layer lacks it too |
knowledge/{org}/ absent | keep 🔴 + mark UNMEASURED | ⚠️ absence is not zero — "no context" ≠ "confirmed groundless"; never fill by inference |
Two boundaries that are never crossed (contract §1-a · K1-s):
knowledge/{org}/ content does not go out — only sanitized summaries do.(Adversarial pair for the contract's absence-declaration clause: tests/seam_absence_probes.md —
5 fixed prompts, pass = 5/5 explicit absence declarations.)
Runs only when the artifact is a split pair — a SKILL.md (or any doc) that carries
§SectionName detail pointers into a sibling SKILL_detail.md. Back-tracing a pointer to its target
(Step 2) is only the forward half; a split has a reverse failure mode Step 2 never sees. Check
both — a pointer that resolves is necessary but not sufficient.
| Direction | Check | Failure = | Grade |
|---|---|---|---|
| Forward (phantom) | every SKILL_detail.md §X pointer in SKILL.md resolves to a ## §X header in SKILL_detail.md | PHANTOM pointer — points at a section that isn't there | A |
| Reverse (orphan) | every ## §X header in SKILL_detail.md has ≥1 inbound §X pointer from SKILL.md | ORPHAN section — detail content no pointer reaches (dead weight + maintenance trap; often the residue of content copied to detail but never removed from SKILL.md) | A |
An orphan section is a salience-splitter Done-When violation ("SKILL_detail.md has a §section with no
pointer from SKILL.md"). A forward-only check passes it silently — which is exactly how a real orphan
defect shipped and survived a phantom pass (2026-07-08, public-surface-audit split: 3 detail sections
duplicated inline in SKILL.md with no pointer). Both directions are mandatory whenever a split pair
is in scope; a one-directional pass is an incomplete audit, not a clean one.
Detail: See
SKILL_detail.md §Step2-7-Detail— the bidirectional grep procedure (forward pointer resolution + reverse orphan-section scan) and the output table — read when auditing a split-pair artifact.
Classify Phantom and Partial claims by severity and provide prescriptions.
Severity classification criteria:
| Severity | Criteria | Examples |
|---|---|---|
| S (Immediate blocker) | If this claim is wrong, TC could Pass-judge incorrect behavior | Monetary boundary values, branching conditions, status values |
| A (Must fix) | If this claim is wrong, TC cannot execute or runs wrong path | API endpoint names, field names, preconditions |
| B (Improvement recommended) | If this claim is wrong, TC can execute but intent may differ | Descriptive text, non-critical names |
Prescriptions: (1) Source Re-read — precisely re-read the relevant source section and fix; (2) Request source specification — when source doesn't exist or wasn't declared; (3) Delete/rewrite — delete claims without source grounding and rewrite from source.
Detail: See
SKILL_detail.md §Step3-Detail— prescription procedures and Step 3 output format template — read when writing the classification table or applying a prescription.
S-grade Immediate Human Gate — if 1+ S-grade Phantoms found, pause before Step 4/5 and surface:
⚠️ phantom-quench: N S-grade Phantom(s) found:
- [claim 1 — one-line summary, location]
- [claim 2 — one-line summary, location]
Options:
(a) Continue — AI proceeds to Step 4 pattern diagnosis + Step 5 re-audit
(b) Human review first — inspect Phantoms directly, then proceed
(c) Abort — fix sources manually and re-run audit
Waiting for input. (Default: a)
Rationale: S-grade Phantoms that enter Step 5 re-audit without human review risk LLM reconstruction contamination — the same pattern that originally produced the Phantoms can "verify" its own fixes. Human review at this threshold breaks the loop.
Analyze Phantom distribution to diagnose structural problems in the artifact generation process. Reveal "why were these Phantoms produced", not just "this TC is wrong".
Pattern detection criteria:
| Pattern | Detection Condition | Meaning |
|---|---|---|
| Source not read | 3+ Phantoms and no or partial source Read history | AI generated using domain knowledge without reading source |
| Partial reading contamination | Partial items exceed 30% of total | AI read source partially and filled rest with inference |
| Reconstruction modification | Source value exists but unit/format/range modified in TC | LLM paraphrase process contamination |
| Source declaration absent | Source file not specified when generating artifact | Process design stage problem |
Simplification guard: If 0 Phantoms, skip Step 4 entirely. Replace with one line: "Source grounding adequate."
Detail: See
SKILL_detail.md §Step4-Detail— Step 4 output format template — read when writing the pattern diagnosis section.
Re-run back-trace for S-grade blocker claims after fixes are complete. Activate when 1+ S-grade blockers exist and fix is immediately possible.
Done When (re-audit): Back-trace results for fixed claims all show Grounded (✅) status.
Template: See
SKILL_detail.md §Report-Template— full completion declaration format — read when producing the final audit summary.
Zero-finding declaration names its axes (2026-08-26). A pass reporting 0 phantoms must state
which claim classes were traced (e.g. 0건 (추적 축: 경로 참조 · 인용 · 버전 주장 — 외부 fetch 미실행)),
never a bare 0건. «Looked and found nothing» and «looked along one axis» are different claims, and
a bare zero collapses them — the same discipline the 4-axis marker's axes-run: imposes («silence
is not zero — write none»). External replication that motivated the field: the 2026-08-25 frontier
digest's edgelog measurement (a "no findings" round still yielded new issues from a different
perspective). One field, existing vocabulary, no new gate.
| Situation | Connected Skill |
|---|---|
| Simultaneously verify output patterns (self-declarations, cushion language) | /steel-quench Wave 1 "real-use verification" angle |
| Re-verify Phantom patterns from external user perspective | /sim-conductor Area A |
| Source not-read is a harness structure problem | /harness-doctor |
| Phantom pattern is a candidate for new rule items | fh-meta:persona-innovator |
| Redesign the artifact generation prompt itself | /meta-prompt-builder |
This skill can be used independently without the full meta-harness structure.
How to declare source files: When generating artifacts, specify "source: [file path list]", or provide source files when invoking this skill.
External environment fallback:
tracks/_meta/ → skip persistence stepStep 1 claim extraction complete
+ Step 2 all local claims back-traced (Read + Grep — highest-priority GROUNDED requires a typed literal grep hit in the asserting slot, not inference)
+ Step 2-E all external-cited claims fetch-checked for support (fired iff risk_level:external or external_citation) — GROUNDED requires a literal fetched span, Unsupported recorded for fetched-but-unsupported
+ Step 3 Phantom/Unsupported severity classification + prescription output
+ Step 4 process pattern diagnosis complete (skip if 0 Phantoms/Unsupported)
+ Each Unreachable ⏳ item carries a one-line disposition at completion (second-surface attempted: result | escalated to human gate) — no Unreachable left undispositioned
+ "phantom-quench Complete" declaration output
Check classes (per harness_6axis_framework.md §Axis 5):
/steel-quench Wave 1.Verdict: PASS (0 Phantom/Unsupported claims) | CONDITIONAL_PASS (LOW-severity Phantoms/Unsupported only, prescriptions noted; or Unreachable items pending a second surface) | FAIL (1+ HIGH/MEDIUM Phantom or Unsupported — broken path, phantom file, fabricated citation, stale external link, or a cited source that does not support its claim) | ESCALATE (scope unclear or claim extraction impossible)
Detail: See
SKILL_detail.md §Evidence— the verified-in-practice evidence record (TC-generation-without-source case; why steel-quench misses what back-tracing catches) — read when citing phantom-quench's track record.