计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
dialogue-harvest【效率与协作】Mines improvement insights from long-form AI dialogue logs and long texts — an external or pasted corpus, not the current session (current-session wrap-up belongs to harvest-loop). First operation is sycophancy removal — separates speakers, strips the counterpart's agreement/restatement spans, converts the user's own utterances into falsifiable propo…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
Extracts the load-bearing propositions from a long AI-human dialogue (or long text) after removing the counterpart's sycophancy. Fills the gap between FH's loading assets (corpus-grounding-expander, video-ingest) and its mining assets (frontier-digest = feed items, field-harvest = git history, harvest-loop = session records): none of those mines an argument-shaped corpus, and a naive summarizer run on an AI dialogue returns "the user made several excellent points" — worthless, because most of the volume is agreement.
Why the first operation is sycophancy removal: AI dialogue logs are dominated by agreement and restatement. Without stripping them first, extraction inflates the user's contribution; without provenance labeling (Step 4), "my insight" and "a frame the counterpart planted" are indistinguishable — which is exactly the failure this skill exists to prevent.
/dialogue-harvest {path or pasted log}Boundary: wrapping up the current session → harvest-loop; this skill mines an
external/pasted dialogue corpus.
Speaker separation is the first operation and it needs turn boundaries. Who said what? (Provide turn markers, or confirm the text is single-author — single-author texts skip Steps 1–2 and go straight to proposition-ization.)
Single-author path: skip Steps 1–2, Step 4 stamps every proposition independent (no
counterpart exists), and the Step 6 counterpart sections read n/a.
Split the log into turns and attribute each to USER or COUNTERPART. If markers are absent but
inference is possible, proceed and stamp the output header speaker-inference: judged — never
present inferred attribution as given.
Remove COUNTERPART spans in these classes, counting every removal by class. Only the first
class is mechanical; the other two are judgment calls and their drops are marked (judged) in the
counter — never presented as grep certainty:
| Class | Check | Detection |
|---|---|---|
| Praise/agreement lexicon | grep-able | grep for praise-class tokens (sharp/brilliant/exactly right/정확한 지적/탁월한/완벽한 …) — extend the pattern list per corpus language |
| Restatement | judged | counterpart paragraph whose content substantially re-says the user's immediately-preceding utterance (high term overlap, no new claim) |
| Closing filler | judged | session pleasantries carrying no claim |
Multi-class span: a span matching more than one class is counted once, under the first matching class in the table order above.
Drop counter is mandatory: silent drops are material loss (the qasp loader precedent — unused material does not scream). Every stripped span and every non-propositional user turn appears in the Step 6 accounting. Counterpart turns that introduce a frame or claim are retained — they are the provenance source for Step 4, not noise.
Language note: the praise-token list is language-specific. On a corpus language not yet in the
list, extend the patterns first, then construct (or use, if shipped) a known pair in that
language and re-run calibration — re-running an English-only pair after adding Korean tokens
exercises nothing (vacuous pass). An ASCII-token scan over a Korean corpus is the measured
false-positive precedent. calibration_pair.md ships English + Korean sections.
Convert each remaining USER utterance into a falsifiable statement (a form you can ask true/false of), keeping a source reference (turn id / line) per proposition. Meaning must not drift: the proposition is a compression of the user's claim, not an improvement of it.
For each proposition, find the first occurrence of its core frame/key terms in the log:
Counterpart-authored content the user selected as valuable is listed separately, marked "selection, not authorship" — selection is a real act but must not be recorded as the user's claim.
Step 4 asks "who first said this — the user or the counterpart?" On a single-author corpus
(a video transcript, an article, a talk) there is no counterpart, so every proposition is stamped
independent for free and the differentiator does not fire at all. The first real-corpus run
measured exactly that: 12 propositions, 12 free labels, zero discrimination.
On a single-author corpus the load-bearing provenance axis is not within the document — it is between the corpus and the assets that were supposed to consume it:
Which of these propositions reached our own assets, and which did we hold and never use?
Run it when the corpus is single-author AND a downstream asset on the same topic exists. Skip (and say so) when there is no plausible consumer — the question is meaningless without one.
absorbed. (A count-only absorbed is the same defect as a whole-file parity grep going
green on a line that says "excluded" — measured in this repo the same day.)held-unused by grep and declined in fact, recorded in hub_maturity_roadmap.md.)
Automation is prohibited here: the first run produced 2 false positives out of 12, both
caught only by opening the matched line.Instrument discipline (mandatory-pass, learned on the first run — four failures in one session): a known-positive control runs beside every measurement and its result is printed. A bare zero is not publishable.
⚠️ The control must be a separate search, not an alternation bolted onto the target pattern.
grep -E "core_term|title" satisfies "a control ran" while proving nothing: title matches, the
command exits 0, and a malformed core_term still silently matches nothing. That is a vacuous pass.
The control's job is to prove this pattern form, on this target, through this shell can return a
hit at all — so run the same pattern shape against something you know contains it, as its own
command, and print both numbers. The four measured failure modes:
BRE \| inside an ERE pattern · unquoted $VAR under zsh (no word-splitting) · a stale cd making
paths unresolvable · substring collision (install contains stall). Each produced a confident,
wrong zero; each was caught only by the control. Do not redirect stderr away — three of the four
announced themselves there.
Degrade direction — and the skip/degrade boundary, which must not be a matter of taste.
skip (N/A) and UNCALIBRATED are different states with different triggers, and the boundary is
mechanical because otherwise the cheaper exit wins under time pressure:
| Situation | State | Why |
|---|---|---|
| Corpus is multi-speaker | N/A | Step 4 already answered provenance; 4-b's question does not arise |
| A consumer search was run and recorded, and no asset on the topic exists | N/A, quoting the search | A real negative, not a failure |
| A consumer is named but does not resolve (bad path, missing file) | UNCALIBRATED | Never N/A — a broken pointer is a tooling failure wearing absence's clothes |
| The known-positive control returns zero | UNCALIBRATED | The instrument is not measuring |
| No search was run | UNCALIBRATED | "I didn't look" is not "nothing is there" |
Under UNCALIBRATED the step emits no absorbed/held-unused/declined labels at all — a provenance
verdict is a claim about what an organization did with knowledge, and an uncalibrated one is worse
than none. Under N/A the step states the reason and the search that established it.
⚠️ Known weakness, stated rather than papered over: a hurried session's natural pull is to grep a
nearby-but-plausible file and report against it without flagging the substitution. The Sonnet
floor-sim of this step reached UNCALIBRATED correctly and named that same failure as the more
likely one in practice. The forcing function is the control returning zero alongside the
measurement — which is why the control is mandatory-pass and not advice.
Each proposition gets a status: mechanically checkable / falsifiable-but-untested / unfalsifiable (axiom-only use) / speculation. Unfalsifiable propositions are still listed — flagged so they are never later cited as established facts.
[dialogue-harvest output]
Corpus: {source} | speaker-inference: given | judged
calibration: run-this-session | previously-verified {date} ← declare every run (L2 guard)
── Propositions ──
| # | proposition | source ref | provenance | verification status |
── Counterpart-originated (selection ≠ authorship) ──
| item | first-occurrence ref |
── Accounting (mandatory identity, turn-based) ──
user turns N = propositionized turns + dropped turns (dropped listed by reason)
propositions total: P (a turn may yield several — counted separately, never forced 1:1)
counterpart spans stripped: {count by class, judged classes marked} · retained as frame-source: {count}
── Routing proposals (no auto-write) ──
{insight → fh_signal / memory / CHAMBER-CANDIDATE / project track — one line each, operator decides}
Routing is proposal-only: this skill writes nothing outside its output block.
calibration_pair.md (shipped beside this
file, English + Korean sections) reproduces its known answers: known-independent → independent,
known-induced → induced, drop counted. Required on first use and whenever the praise-pattern list
changes; a corpus language with no shipped section requires constructing that language's known
pair first — re-running an existing-language pair for a new language is a vacuous pass, not a
measurement (check-class: measured; declare the result in the output header
calibration: field).UNCALIBRATED and emits no labels (check-class: mandatory-pass — the control result
is either printed or the labels are absent; N/A when the corpus is multi-speaker or no consumer
asset exists, and the N/A must be stated).phantom-quench back-trace of each proposition to its source ref — a
proposition whose source span does not support it is an Unsupported finding).Independently executable: Read/Grep only, no other FH skill required. phantom-quench is the
adversarial pairing for the judged condition, not a runtime dependency. Works standalone
(plugin-only install).