Read all of yesterday's conversations with the AI, expose the thinking blind spot you yourself cannot see, and illuminate one chapter from WeChat Reading to fill it.
What a blind spot is
A blind spot is not a knowledge gap. It is not "haven't read a certain book" or "don't know a certain fact" — that kind of gap gets filled with a quick lookup.
A blind spot is a structural thinking habit that makes a certain kind of truthsystematically invisibleto you. It is not that you cannot think of it; it is that this habit keeps you from even looking in that direction. It hides in how you think about things, not in what you think about.
So the evidence is not in "what he said wrong." It is in — where he did not look, where he circled around, what he assumed by default but never examined.
Five blind spot signals
Look for these five in yesterday's conversations. Each one must land on specific words; you cannot go by feeling.
- Dodge point— a hard problem he opened and then quickly closed. Evidence: the question is raised, then he changes the subject, or slides past it with a line like "let's leave this for now."
- Spinning framework— repeatedly switching perspectives on the same problem without any of them landing. Evidence: one problem gets fitted with three or four frameworks, each only skimmed, and in the end there is no conclusion.
- Single viewfinder— all day he invokes only one or two f's (whenever anything comes up, it is "constraints," "evolution," "game theory"), and never tries another mirror. This is his most hidden blind spot: the handier the f, the more it blocks what other f's could reveal. (Jigang sees the world = f(x); the four axes are his default four f's; precisely because they are default, it is most worth checking whether today he again used only one of them.)
- Unchecked premise— a default assumption runs through the whole thing; he uses it as a hard constraint and never asks whether it is a false wall. Evidence: some statement of "this is just how it should be" appears repeatedly yet is never questioned by him.
- Adjacent gap— working backward from what he asked, the corner he should have asked about but did not. It is not a guess out of thin air; his own clues point there.
Which one to choose
From the signals, pick 1as today's blind spot. Better to explain one thoroughly than to touch on all five — the density of a blind spot is lower than its precision. Three criteria:
- Leverage— filling it opens the most possibilities for the next step.
- Truly blind— it is something he himself cannot see, not something he knows and is dragging his feet on.
- Aligned with mission— close to M0 (find a new viewfinder) / M1 (seek the essence). If the blind spot is exactly blocking his main line, prioritize it. Read
${LIFEOS_DIR:-$HOME/.codex/LIFEOS}/USER/TELOS/PRINCIPAL_TELOS.mdto confirm the main line.
Operating steps
Step one · Set the date
# 默认昨天;用户传了 YYYY-MM-DD 就用那天(macOS BSD date)
target=${1:-$(date -v-1d +%Y-%m-%d)}
Step two · Retrieve that day's conversations
Session files are in $HOME/.codex/sessions/YYYY/MM/DD/*.jsonl. The directory date records the start day of the session by local machine time; the in-line timestamp is UTC; therefore scan both the target day's and the previous day's directories at the same time, then filter messages by local date. Read only the top-level task's response_item / message / user / input_text, excluding session_meta.payload.source.subagent Existing sub-agent sessions, plus the harness wrapper and this invocation itself:
target=<上一步的日期>
out=/tmp/ljg-blind-${target}.txt
: > "$out"
previous_dir=$(date -j -v-1d -f '%Y-%m-%d' "$target" '+%Y/%m/%d')
target_dir=$(date -j -f '%Y-%m-%d' "$target" '+%Y/%m/%d')
for day_dir in "$previous_dir" "$target_dir"; do
session_dir="$HOME/.codex/sessions/$day_dir"
[ -d "$session_dir" ] || continue
find "$session_dir" -type f -name '*.jsonl' -print0
done | while IFS= read -r -d '' session_file; do
# Codex 将子 agent 与顶层 task 放在同一日期目录;从 session_meta 排除它们。
if jq -e 'select(.type=="session_meta") |
(.payload.source | type == "object" and has("subagent"))' \
"$session_file" >/dev/null 2>&1; then
continue
fi
jq -r --arg target "$target" '
def local_epoch:
sub("\\.[0-9]+Z$"; "Z") | fromdateiso8601;
select(.type=="response_item"
and .payload.type=="message"
and .payload.role=="user")
| (.timestamp | local_epoch) as $epoch
| select(($epoch | strflocaltime("%Y-%m-%d")) == $target)
| ([.payload.content[]?
| select(.type=="input_text")
| .text] | join("\n")) as $text
| select($text | length > 0)
| select(($text | test("^(<recommended_plugins>|<environment_context>|<task-notification>)")) | not)
| select(($text | test("(?i)(ljg-blind|扫盲区)")) | not)
| "[" + ($epoch | strflocaltime("%H:%M")) + "] " + $text
' "$session_file" 2>/dev/null >> "$out"
done
wc -m "$out"
If the material is >50KB, read it in segments by conversation. First identify what topic each segment is discussing, then keep reading. You can also look at a few adjacent assistant replies to establish context.
Fallback for sparse data: if the day's real human input is <200 characters or there is no conversation—state directly in the output "sparse conversation today / none,"do not force a blind spot into existence. Better to hand in a blank paper than to make things up.
Step three · Read out the blind spot
Go through the "five blind-spot signals" above. For each hit, note the evidence (which sentences, what turn made you see it). Then, using the three criteria of "which one to pick," choose the 1 most important blind spot.
Step four · Select a chapter on WeRead
Call the weread skill (WEREAD_API_KEY is in the environment variable, format wrk-xxxx; if not present, prompt export WEREAD_API_KEY=<key>). Three steps:
- Search for the book—extract 1-2 core words from the blind spot as the keyword:
curl -s -X POST https://i.weread.qq.com/api/agent/gateway \
-H "Authorization: Bearer $WEREAD_API_KEY" -H "Content-Type: application/json" \
-d '{"api_name":"/store/search","keyword":"<核心词>","count":8,"skill_version":"1.0.3"}' \
| jq -r '.results[].books[]?.bookInfo | "\(.bookId)\t\(.title)\t\(.author)\t评分\(.newRating)"'
From the results, pick 1 book with a rating as close as possible to ≥750 (the new rating is ×100, i.e. 7.5) and that fits the blind spot best, and note the bookId. Rating is not the only criterion—relevance > high score. A 7.4 that hits the blind spot squarely beats an 8.5 that only grazes it.
- Look at the table of contents—pick the 1 chapterthat fits best, not the whole book, not a vague preface:
curl -s -X POST https://i.weread.qq.com/api/agent/gateway \
-H "Authorization: Bearer $WEREAD_API_KEY" -H "Content-Type: application/json" \
-d '{"api_name":"/book/chapterinfo","bookId":"<bookId>","skill_version":"1.0.3"}' \
| jq -r '.chapters[] | select(.level<=2) | "\(.chapterUid)\t[\(.level)] \(.title)\t\(.wordCount)字"'
Note the chapterUid, chapter title, and wordCount.
-
Estimate the duration——
wordCount / 280(Chinese reading speed) and round up to a multiple of 5. If there is no wordCount, estimate somewhere between 15-45 minutes based on the feel of the table of contents; if the title contains macro words like "Part One/Part Two" or "Volume One," multiply the duration by 1.5. -
Construct the web version link—the WeRead web reader does not accept a bare
bookId/chapterUid, it must be encoded first. Generate it with the skill's built-in tool:
bun "${HOME}/.agents/skills/ljg-blind/Tools/WeReadWebUrl.ts" "<bookId>" "<chapterUid>"
The tool output looks like:
https://weread.qq.com/web/reader/{encodedBookId}k{encodedChapterUid}
Write the complete output URL into the note. Do not hand-assemble the encoded value, and do not stuff the bare ID directly into /web/reader/。
Fallback: if the search is entirely empty / there is no fitting chapter → pick a whole related book and pass only the bookId to generate the web version book entry:
bun "${HOME}/.agents/skills/ljg-blind/Tools/WeReadWebUrl.ts" "<bookId>"
Explain in the text why it could not be pinpointed to a chapter.
Step five · Write the note
Get the timestamp:date +%Y%m%dT%H%M%S and date "+%Y-%m-%d %a %H:%M"(use the current time, not target).
Write into ~/Context/{时间戳}--盲区-{主题}__blind.org. org-mode format, markdown syntax forbidden.
Body template:
#+title: 盲区扫描 · {一句话点出这个盲区}
#+date: [YYYY-MM-DD Weekday HH:MM]
#+filetags: :blind:weread:topology:
* 昨天你在想什么
<1-2 段。当天对话的思维地形——哪几件事、绕着哪个核心在转。给证据:哪几句话看出来的。不流水账,抓主线。>
* 照出来的盲区
<挑出的那 1 个盲区。先一句话点破它是哪种(绕开点 / 空转框架 / 单一取景框 / 未检前提 / 相邻空缺)。再 2-3 段说清:它具体长什么样、昨天哪几处暴露了它、为什么你自己看不见。要点到杠杆——补上之后会打开什么。>
* 这一章给你
- 书:《书名》 — 作者
- 章节:<章节标题>
- 时长:约 N 分钟
- 链接:[[https://weread.qq.com/web/reader/ENCODED_BOOKkENCODED_CHAPTER][在微信读书网页版阅读本章]]
- 为什么是它:<3-4 句。把盲区和这一章对上——这章具体讲什么、怎么补这个盲区。不要泛泛说"开阔视野",要说清这一章的哪个东西正对这个盲区的哪个缺口。>
Report the file path to the user.
Tone rules (hold to these when writing the note)
This note is written for someone who thinks alongside you long-term, not a report, not a stranger reader.
- Write in Chinese, no translationese. Use "however / moreover / it is worth noting" sparingly; use nominalizations sparingly ("understanding of…" → "get…", "make the decision to…" → "decide"); omit the subject when possible; prefer short sentences. After writing, recite it once and ask: would a Chinese person who has never read translated fiction say it this way? Would Wang Zengqi write it this way? Rewrite the whole passage where it sticks, not just swap a word.
- No slash-mark style metal metaphors. Do not write the whole set of self-congratulatory meta-rhetoric like "this cut," "one layer harsher," "sharp words," "nail it down," "pin it dead," "hard words." Whether the blind spot is illuminated accurately, the reader can tell; the author does not need to shout about the force.
- Warm, rough-edged, opinionated. You can take a stance; don't pretend to be neutral to the point of hypocrisy. But make it clear this is a judgment, not objective fact.
Strict org syntax (no mixing in markdown)
- Use
*/**/***for headings, not# - Bold
*字*, italics/字/, monospace~code~ - Use
-for lists, not*(*is a heading in org) - Links
[[url][text]], not[text](url) - Horizontal rules
-----, not---; no markdown>blockquotes
Self-check (go through it before finishing)
- Does each blind spot have concrete evidence? Can every one be traced to specific sentences from yesterday? If not, go back to step three.
- Did you pick only 1 blind spot and explain it thoroughly? Or did you greedily pick three or four?
- Do section links start with
https://weread.qq.com/web/reader/and are they generated by the tool with a non-empty bookId and chapterUid? - Does the full text have no leftover special-scheme links that can only open the mobile app?
- Did you check for translationese? Scan for nominalizations, "it is... that" sentences, and omittable conjunctions.
- Did you check for the sliced-metal metaphor style? Not a single "this cut," "nail it down," or "hammer it solid" left.
- Do all three sections have content, with no empty sections?
Gotchas
- The web reader path uses encoded IDs.
https://weread.qq.com/web/reader/573976?chapterUid=13returns 404; you must useTools/WeReadWebUrl.tsto encode bookId and chapterUid separately, then usekto join them. - Chapter location is not placed in query parameters. The correct form is
/web/reader/{encodedBookId}k{encodedChapterUid}; omitting the chapter encoding only opens the entry point for the whole book.
Division of labor with "Morning Letter"
Pulse has an automatic morning letter every day (陈平安思维拓扑.org), in Chen Ping'an's tone, one letter a day, picking one hole. ljg-blind is theon-demandanalysis version—same underlying "read yesterday → look at blind spots → pick a chapter in weread" foundation, but more systematic, focused specifically on blind spots, with fuller analysis, and it can scan any day (pass a date parameter). If you want a letter, wait for the morning letter; if you want to actively check a certain day's blind spots and want an analysis you can archive, use ljg-blind.