claude-code
|
bc02c2645b
|
跨 repo 版本清單+結案記帳(inkstone/ISEP#84、#85)(scripts/release-manifest)
|
2026-08-28 01:04:18 +00:00 |
|
claude-code
|
ca10e1db30
|
跨 repo 版本清單+結案記帳(inkstone/ISEP#84、#85)(scripts/milestone-account)
|
2026-08-28 01:04:16 +00:00 |
|
claude-code
|
5f6995b892
|
跨 repo 版本清單+結案記帳(inkstone/ISEP#84、#85)(hooks/tests/milestone-account-guard.test.sh)
|
2026-08-28 01:04:14 +00:00 |
|
claude-code
|
395d885ceb
|
跨 repo 版本清單+結案記帳(inkstone/ISEP#84、#85)(hooks/milestone-account-guard.sh)
|
2026-08-28 01:04:12 +00:00 |
|
claude-code
|
a7ca29c180
|
跨 repo 版本清單+結案記帳(inkstone/ISEP#84、#85)(hooks/hooks.json)
|
2026-08-28 01:04:10 +00:00 |
|
claude-code
|
ba30c49876
|
跨 repo 版本清單+結案記帳(inkstone/ISEP#84、#85)(docs/hooks-inventory.md)
|
2026-08-28 01:04:08 +00:00 |
|
claude-code
|
4eed944f68
|
跨 repo 版本清單+結案記帳(inkstone/ISEP#84、#85)(docs/TESTING.md)
|
2026-08-28 01:04:05 +00:00 |
|
claude-code
|
b6405b2a5c
|
跨 repo 版本清單+結案記帳(inkstone/ISEP#84、#85)(README.md)
|
2026-08-28 01:04:03 +00:00 |
|
claude-code
|
521dda1b47
|
跨 repo 版本清單+結案記帳(inkstone/ISEP#84、#85)(.claude-plugin/plugin.json)
|
2026-08-28 01:04:01 +00:00 |
|
claude-code
|
90ed988d84
|
Merge pull request '舊票每天有固定管道被撈出來(inkstone/ISEP#83)' (#101) from feat/debt-worklist into main
|
2026-08-28 01:01:53 +00:00 |
|
claude-code
|
d301810fb6
|
merge main(#98 下游做完時頂層跟著關),我的那節再讓一次編號
衝突只有 docs/TESTING.md 一列:#92 也用了 A19 ⇒ 我改成 A20,並把整節搬到 A19 後面。
(今天 main 上 A16、A17 各被佔兩次、A19 被佔兩次——編號撞是這條線的常態,
讓號的成本比要求別人改小,所以一律我讓。)
plugin.json 的腳本數在合併後的樹上重數 40 → 43:
main v0.13.0 那個「40」= `ls scripts | wc -l`(37 檔+3 目錄),
合併後同一算法 = 43:+2 是本 PR,+1 是 #98 帶進來的 test-ticket-handoff-writeback.sh
(#98 併進 main 時沒有回頭改這個數字)。版本號沒動(0.13.0)。
|
2026-08-28 00:58:49 +00:00 |
|
claude-code
|
e575786be3
|
merge main(定版 v0.13.0),衝突只有 plugin.json 一行
版本號取 main 的 0.13.0(我不定版)。description 的腳本數在合併後的樹上重數:
main 那個「40」= `ls scripts | wc -l`(37 個檔+3 個子目錄)
合併後同一個算法 = 42(多的兩個是本 PR 的 debt-worklist 與 test-debt-worklist.sh)
⇒ 40 → 42。閘的兩個數字沒變(hooks/*.sh = 54、hooks.json "command": = 71,本 PR 沒新增 hook)
|
2026-08-28 00:55:30 +00:00 |
|
claude-code
|
5d6c4b5d63
|
Merge pull request '下游做完時頂層跟著關(inkstone/ISEP#92)' (#98) from feat/handoff-writeback-loose into main
|
2026-08-28 00:54:27 +00:00 |
|
claude-code
|
45adc10a52
|
併進 main(v0.12.0)並接上「主線唯一答案」(inkstone/ISEP#83)
衝突只有 docs/TESTING.md 一處,兩邊都留:
main 的 A16(gate-ok)/A17(未推警察)/A18(信標)原樣保留,
我那節改編號成 A19——main 上 A16、A17 已經被 #90 與 #99 各佔一次,不動別人的。
接上 inkstone/ISEP#82 帶進來的 hooks/lib/mainline.py(不自己養第二套判斷):
· 有標主線 ⇒ 只排除「屬於主線那一條」的票;掛在**別條** milestone 的仍算債
(那條線現在沒有人在推,正是它躺著的原因)
· 沒標主線 ⇒ 退回保守做法:掛 open milestone 的一律不領,並在清單上照實說沒標
· 別條 milestone 已逾期 ⇒ +15「答應過人家的日期已經過了」
測試 40 → 47 條(+7 條全給主線這段),並把 ISEP_COUNTDOWN_STATE_DIR 也隔離:
不然這支測試的結果會取決於「這台機器現在標了哪條主線」。
盤點數字在合併後的樹上重數:
hooks/*.sh = 54、hooks.json "command": = 71(本 PR 沒新增 hook,兩個都沒變)
scripts 一層檔案 = 39(本 PR +2)⇒ plugin.json description 37→39
版本號沒動(0.12.0,總管統一定版)
|
2026-08-28 00:51:06 +00:00 |
|
claude-code
|
87678a8a87
|
Merge pull request '定版 v0.13.0(現在的主線是哪一個,有唯一答案)' (#102) from chore/v0.13.0 into main
v0.13.0
|
2026-08-28 00:49:13 +00:00 |
|
claude-code
|
62c2f3e664
|
定版 v0.13.0(.claude-plugin/plugin.json)
|
2026-08-28 00:48:59 +00:00 |
|
claude-code
|
07cb5e4e55
|
併進 main(#96 雲端接線/#100 v0.12.0/#99 主線唯一),解 TESTING.md 撞號(inkstone/ISEP#92)
唯一衝突在 docs/TESTING.md:兩條線各自加了一節、**都叫 A16**。
兩邊內容都留,我這一節改成 A19(main 已用掉 A16/A17/A18),
「目前狀態」表的那一列跟著搬到 A18 後面。
main 側本來就有的 A11/A12/A14/A15 重號**沒有動**——那是它兩條線各自編的,
不是這次造成的,動它會把 diff 炸開。
沒有碰的:.claude-plugin/plugin.json(維持 main 的 v0.12.0,版本由總管統一定)、
hooks/hooks.json、docs/hooks-inventory.md——這三個檔本線一個字都沒改,
自動合併拿到的就是 main 那份。
盤點數字在合併後的樹上重數(不是相加、不是抄別人的):
hooks/*.sh 54 hooks.json 註冊 71 commands 7 skills 2 scripts 頂層 38
docs/hooks-inventory.md 寫的 54/71 **是對的**;README 寫的 48/59/23
**三個都錯**,已改成實數,並把「怎麼重數」的指令寫進去——
這種數字會漂是因為沒人知道它怎麼來的。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016ZBu4Sa1cGntKFRBYNZ6xs
|
2026-08-28 00:48:49 +00:00 |
|
claude-code
|
4014676813
|
Merge pull request '現在的主線是哪一個,有唯一答案(inkstone/ISEP#82)' (#99) from feat/mainline-milestone into main
|
2026-08-28 00:43:55 +00:00 |
|
claude-code
|
7871921741
|
把主線接進派工與注入(inkstone/ISEP#82)
- hooks.json mainline-focus-guard 掛 Agent+Task(派工的兩個入口都要守);
SessionStart 多一條 `scripts/mainline refresh`(0.8s,不輪詢)
- hooks-inventory 54 支/71 條(當場數的)+補人話一列;順手修掉上一版重複的那一行,
並把「指向空氣」那格的假警報寫清楚(countdown-milestone-refresh 在 scripts/)
- TESTING A16(24 條離線)+ A17(要網路的那半怎麼驗)
- plugin.json 描述數字對齊;版本不動,待總管定版
|
2026-08-28 00:40:05 +00:00 |
|
Claude Code
|
21971ea83e
|
現在的主線是哪一個,變成一個查得到的事實(inkstone/ISEP#82)
14 個 open milestone 同時亮著,其中「Mira 現代化」同名活在 5 個 repo,
所以 SOP 說的「那個 active milestone」在現場沒有指涉對象。
- hooks/lib/mainline.py 主線的唯一存放處(一個檔放得下一條),從不打網路
- scripts/mainline show/list/set/clear/refresh/adopt/has
- hooks/mainline-focus-guard.sh 派了不在主線上的票 ⇒ 攔一次,問補收還是跳線
- hooks/lib/countdown.py ⏱ 那一行的主線改讀「被標定的」,蓋過「期限最近」的猜測
- hooks/countdown-guard.sh 同一個注入點加第二行 🎯(ISEP#63 那半不動)
- 測試 24 條(離線)+ countdown 原有 20 條仍全綠
|
2026-08-28 00:39:50 +00:00 |
|
claude-code
|
dbd7c8c874
|
Merge pull request '定版 v0.12.0(雲端的閘真的能用)' (#100) from chore/v0.12.0 into main
v0.12.0
|
2026-08-28 00:39:06 +00:00 |
|
claude-code
|
f9327de068
|
定版 v0.12.0(.claude-plugin/plugin.json)
|
2026-08-28 00:38:13 +00:00 |
|
claude-code
|
67f5f0fa5e
|
舊票每天有固定管道被撈出來(inkstone/ISEP#83)
leo 2026-08-27:「現在每天都在追新的,所以要用 Routine 去消化舊的,可以有多個條件」
兩條線各用各的判準(他當場訂正的那件事):
緊急線=掛 open milestone 的,用「距離目標的遠近」排
還債線=沒掛的那 188 張,用多條件排(事故/擋人/承諾/票齡/估工)← 本次做的
新增 scripts/debt-worklist(list/claim/forget):
· 撈全 org 15 個 repo 的 open issue + open PR,逐一列出當作「我查了哪些」的證明
· 扣掉掛 open milestone 的(緊急線在管)、等 leo 的(Human/human-exec/s/stage,
那些要催不是要領,催辦是 inkstone/ISEP#93)、已領走的
· 每張票旁邊印出「為什麼排這裡」的分項,排錯可以指著某一項說它給太多
· 成包只認強訊號:互相指著、或 Gitea 原生相依(母子票)。
第一版用單向引用成包,190 張裡 121 張黏成一坨——一包沒有人領得動
· 空清單會明講「查詢跑過了,結果是零」,不默默結束
· claim 之後那些票不再出現在清單上,並在隔天的清單頂端交代它們關了沒
hooks/session-start-recall.sh 加一段(不打網路,只看狀態檔日期):
今天還沒撈過就說一句,並給出要跑的那一行。開 session 自動去撈=輪詢,紅線擋著。
測試 scripts/test-debt-worklist.sh:40 條全離線,票上四條驗收條件各一組。
真實資料唯讀實跑過:229 張 → 可領 188 張/185 包,領走兩張後隔天清單少掉它們。
|
2026-08-28 00:38:02 +00:00 |
|
claude-code
|
9b0afec0b2
|
Merge pull request '雲端的閘:修好三個穩定重現的接線缺陷,並診斷第四個(inkstone/ISEP#90)' (#96) from fix/cloud-wiring-isep90 into main
|
2026-08-28 00:37:30 +00:00 |
|
claude-code
|
f3a41fba0e
|
下游做完時頂層跟著關(inkstone/ISEP#92)
票上的病:「開在頂層的票,下游做完了卻沒人回來關⋯⋯頂層票會永遠掛著,
而 leo 是看頂層的。」缺的三格是 journey 標籤、雙向連結的強制、完工回寫。
不重造既有的(票上明列):`ticket where` 戳記+側門閘(查票防重複)、
`comment-carries-task-guard`(留言藏任務)、Gitea 原生 issue dependency
(跨 repo 關聯的載體)——這一版全部長在它們上面。
四格,判準全部是機械事實(相依邊在不在、state 是什麼),沒有一格在猜文字:
① 雙向連結(驗收 1):`subtask`/新別名 `handoff` 一個動作同時掛原生相依
+ 在頂層票的時間軸貼一則指回下游的留言。相依邊只長在側欄,
時間軸上什麼都沒有,跨 repo 時尤其看不出來。
② 完工回寫(驗收 2,最痛的那格):`ticket close` 關完子票立刻問 `/blocks`
(誰在等我),對每張還開著的頂層票貼回寫留言;下游全關的那一張再
指派回總管+改 s/review。**不自動關母票**——關票要有交付物、要有人看過,
默默關掉跟默默留著是同一個病的兩面。
③ journey 標籤:`--journey <名>` 把 `j/<名>` 同時貼在母子兩端(只貼一端就
聚不起來)。標籤不存在就擋下並指回 labels.yaml——要求標籤在場,
不是猜哪些名字合法。labels.yaml 的 `j/` 段刻意留空:旅程怎麼切、叫什麼
名字是方向題,不由工具代決。
④ 撈得出來(驗收 3、4):新動詞 `ticket loose` 掃 org 的 open 票,撈
「有下游相依、下游全關、自己還開著」的頂層票。這是 ② 的補網——
關票的側門(直接 PATCH state=closed)是刻意放行的,漏掉的由這張網撈回來。
不是輪詢,掛在開場/收工對帳跑一次。
實跑(2026-08-28,唯讀,沒動任何票):245 張 open 票裡 17 張有下游相依,
其中 2 張是「下游都關了、自己還開著」——inkstone/arcrun-rag#136(已 s/review
且指派給 claude-code,正在被處理)與 inkstone/Arcrun#100(沒標籤、沒指派,
就是票上講的那種「永遠掛著」)。
測試:scripts/test-ticket-handoff-writeback.sh,49 條全綠,全程離線
(會打 API 的兩段把 api() 換成錄音機,不開票不關票不留測試票)。
回歸:A13 17/17、A4 24/24、A12 11/11 皆綠。
文件:docs/TESTING.md 新增 A16。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016ZBu4Sa1cGntKFRBYNZ6xs
|
2026-08-28 00:31:35 +00:00 |
|
claude-code
|
b7b83bf243
|
併進 main(#97 pr-verdict),並在合併後的樹上重數盤點數字(inkstone/ISEP#90)
數字全部在合併後的樹上重數,沒有用相加推的:
· hooks/*.sh = 53、hooks.json 註冊 = 68 —— 與 main 已宣告的一致,不用動
· scripts/ 頂層 = **39**(git 追蹤的),plugin.json 原本寫 38 ⇒ 改成 39
(本分支新增 scripts/gate-ok 一支)
🔴 這裡不能用 `ls scripts/ | wc -l`:它在這台機器回 40,因為多了一個**沒進版控的
`__pycache__/`**。那個數字會隨「有沒有人跑過 python」而變 ⇒ 用 git 追蹤的數目才穩定。
docs/hooks-inventory.md 標題也順手改:它寫「52 支閘」而自己第 10 行寫「53 個 .sh 檔」
——同一頁自相矛盾,標題是漏改的那半。
**version 一個字沒動**(0.11.0),由總管統一收斂。
合併後全部重跑(CLAUDE_CODE_CHILD_SESSION 有設與清掉各跑一次,結果相同):
pr-verdict-guard 52/52、countdown-guard 20/20、prod-write-guard 37/37、
gate-ok 17/17、unpushed-police 10/10、isep-presence-beacon 14/14、
main-and-prod-push 10/10+13/13、stage-before-prod 16/16+13/13、
sdd-guard 8/8、reply-identity 11/11、dispatch-format 33/33、
search-is-not-proof 31/31、mainline-idle 61/61、factory-idle 33/33、
ticket-api-bypass 24/24、ticket-where-seen 17/17、baton-handback 10/10、
comment-carries-task 22/22、github-contact 14/14、kbdb-api-wall 10/10、
release-tag 8/8、版本一致性 ✅。
|
2026-08-28 00:31:06 +00:00 |
|
claude-code
|
45b7b81075
|
Merge remote-tracking branch 'gitea/main' into fix/cloud-wiring-isep90
|
2026-08-28 00:29:10 +00:00 |
|
claude-code
|
bebbbd2c11
|
Merge pull request 'PR 一定要有結論(inkstone/ISEP#81)' (#97) from feat/pr-verdict-v2 into main
v0.11.0
|
2026-08-28 00:28:19 +00:00 |
|
claude-code
|
4322deb23a
|
補上 stat -f 診斷的最後一層:連離開碼都不可靠(inkstone/ISEP#90 ④)
總管自己驗這一格量到 exit=0,我量到 exit=1。**兩個都是真的**,
而分歧本身就是最後一塊拼圖:
**GNU 的 `-f` 是 `--file-system`,布林旗標、不接格式字串**
⇒ `%m` 不是格式,它被當成**另一個檔名運算元**
⇒ 離開碼取決於「cwd 裡有沒有一個叫 `%m` 的檔」:
A. 沒有(一般情況) → exit 1 ⇒ `||` 會跑 ⇒ 正確的秒數接在垃圾後面
B. 剛好有 → exit 0 ⇒ `||` 不會跑 ⇒ 整包連一個數字都沒有
兩種情況閘的結果一樣:MT 都不是純數字、戳記都作廢。(實測 GNU coreutils 9.4,兩種都重現過)
🔴 教訓比原本寫的更尖銳:舊寫法的 `||` fallback 救不了,
**不是因為它沒跑,而是因為「跑不跑」根本不由這支腳本決定**——
它由「cwd 裡有沒有某個檔名」決定。
一個行為取決於 cwd 有沒有某個檔的判斷式,不管跑不跑都是壞的。
⇒ 所以修法不能只是「把順序反過來」,**每一步都要驗它是不是純數字**
(lib/mtime.sh 本來就是這樣寫的,現在把理由寫進去了)。
gate-ok 測試補第 ⑰ 條守這一層:cwd 裡有一個叫 `%m` 的檔時,file_mtime 仍要回純數字。
16 → 17 條,TESTING.md 的 A16 一併更新。
|
2026-08-28 00:27:51 +00:00 |
|
claude-code
|
eb7c3656be
|
PR 一定要有結論(inkstone/ISEP#81)(scripts/pr-verdict)
|
2026-08-28 00:27:42 +00:00 |
|
claude-code
|
16c03e46c1
|
PR 一定要有結論(inkstone/ISEP#81)(hooks/tests/pr-verdict-guard.test.sh)
|
2026-08-28 00:27:40 +00:00 |
|
claude-code
|
99abdf725b
|
PR 一定要有結論(inkstone/ISEP#81)(hooks/pr-verdict-guard.sh)
|
2026-08-28 00:27:39 +00:00 |
|
claude-code
|
accedb5898
|
PR 一定要有結論(inkstone/ISEP#81)(hooks/hooks.json)
|
2026-08-28 00:27:37 +00:00 |
|
claude-code
|
77a2032858
|
PR 一定要有結論(inkstone/ISEP#81)(docs/hooks-inventory.md)
|
2026-08-28 00:27:34 +00:00 |
|
claude-code
|
be09353330
|
PR 一定要有結論(inkstone/ISEP#81)(docs/TESTING.md)
|
2026-08-28 00:27:32 +00:00 |
|
claude-code
|
81368f451f
|
PR 一定要有結論(inkstone/ISEP#81)(.claude-plugin/plugin.json)
|
2026-08-28 00:27:30 +00:00 |
|
claude-code
|
3a1c3d4969
|
Merge remote-tracking branch 'origin/main' into fix/cloud-wiring-isep90
# Conflicts:
# docs/TESTING.md
|
2026-08-28 00:25:04 +00:00 |
|
claude-code
|
617315e3dd
|
把四個雲端接線缺陷的診斷寫下來(inkstone/ISEP#90)
docs/governance/cloud-wiring.md:四個缺陷分成兩種病——
①④ 是「閘的判準寫的是地端才成立的假設」,②③ 是「同一個東西有兩份,雲端跑到舊的」。
每一格都附實測證據與修法,並標明還沒關掉的兩格住在哪張票(ISEP#67/真身 repo)。
TESTING.md 補 A14/A15/A16 三格:怎麼跑、該看到什麼、什麼算失敗。
三支閘被擋下的訊息也一併指向 scripts/gate-ok(原本的手打法保留當等價寫法)。
|
2026-08-28 00:14:01 +00:00 |
|
claude-code
|
3e83a4b4f3
|
修好「總管可以放行」那道門——它在 Linux(=每個雲端 session)上是焊死的(inkstone/ISEP#90 ④)
三支閘(prod-write-guard/main-and-prod-push-guard/stage-before-prod-guard)
判斷戳記新不新,都寫成這一行:
MT=$(stat -f %m "$STAMP" 2>/dev/null || stat -c %Y "$STAMP" 2>/dev/null || echo 0)
macOS(BSD stat)上 `-f %m` 就是 mtime,對的。
**GNU coreutils 的 `-f` 是「顯示檔案系統資訊」**,而且它一邊回非零、
一邊往 stdout 吐一整段區塊 ⇒ `||` 接上的秒數被那段文字污染
⇒ 下一行的 `case "$NOW$MT" in *[!0-9]*) return 1` 必然命中
⇒ **在 Linux 上那三支閘的戳記永遠不會被接受。**
後果不是少一個便利功能:那三支閘都是「擋下來、但總管看過就能放行」,
而放行那道門在雲端打不開 ⇒ **它們在雲端等於純擋**,
總管照著閘自己印的指示做,做幾次都打不開,閘也不會告訴他門是壞的
(inkstone/InkStoneCo#99 那次「連續四次蓋不出戳記」就是這個形狀)。
· hooks/lib/mtime.sh:先 `-c %Y`(GNU)再 `-f %m`(BSD),**每一步都驗是不是純數字**
——這個 bug 的成因正是「命令失敗了卻還是印了東西」,只看離開碼會再被騙一次。
四支用到的檔各自帶一份 inline fallback:這道門不能因為少一個檔案就再關上一次。
· scripts/gate-ok:把散在各閘訊息裡的七種逃生口收斂成一個名字、一種形狀
(`gate-ok <閘名> [參數]`)。原因是逃生口原本是「臨時湊出來的 Bash 指令」,
而臨時湊的指令沒有穩定形狀可以事先放行——settings.json 的 allow 只能逐條完全比對,
多一個 `&&`、換一個 session id 就落在規則外。它蓋的戳記與閘原本認的完全同一個檔、
同一種語意(單次、綁 repo、綁 session、有效期都沒動),換掉的只有「怎麼蓋」。
測試 hooks/tests/gate-ok.test.sh:16/16。既有的三支測試(29/16/10)不受影響。
拿 main 跑同一份:②⑤(門打得開)紅、⑥⑦⑧(門沒變寬)全綠
⇒ 這支補的正是既有測試從來沒驗過的那半邊。
|
2026-08-28 00:11:42 +00:00 |
|
claude-code
|
a9e30fc6e7
|
Merge pull request '每一則回覆都自己說出拖了多久(inkstone/ISEP#63)' (#94) from feat/countdown-stamp into main
v0.10.0
|
2026-08-28 00:10:10 +00:00 |
|
claude-code
|
adb7009b67
|
信標多報三件雲端會壞掉的事:版本落差/舊複本遮蔽正門/退役機制的殘骸(inkstone/ISEP#90 ②③)
信標原本只證明「有一份 plugin 載入了」,不證明「載入的是哪一份」——
2026-08-27 雲端載的是 0.3.9、main 是 0.9.0,中間差 7 個 release,而它照樣是綠的。
那個看不見的落差的實際後果:0.3.9 裡還活著兩支 v0.9.0 已整支刪掉的 hook,
於是 .claude/pending-verification/ 被清掉之後又長回來。
三格(都只報告、不擋、拿不到答案就閉嘴):
· 版本落差:匿名讀 ISEP main 的 plugin.json(D20 判準下屬於「讀」),快取 6 小時、
逾時 6 秒。落後就講清楚差幾版與怎麼修,並指向 inkstone/ISEP#67。
· 舊複本遮蔽正門:plugin 的 scripts/* 在專案樹(含雲端的 $TOP/InkStoneCo/)裡
有同名但**內容不同**的複本就點名。實例=InkStoneCo/scripts/ticket 的取 token
邏輯還停在「只認名叫 gitea 的 remote」,而雲端的 Gitea 叫 origin
⇒ 一律死在「拿不到 gitea token」⇒ 人被逼去繞過正門直接打 API,
而那正是 ticket-api-bypass-guard.sh 在防的事。
· 退役機制的殘骸:.claude/ 底下的目錄,若 plugin 的 hooks/scripts 一個字都沒提到
⇒ 產生它的東西已經不在這一份裡了。判準是「plugin 現在還認不認得它」,
**不是關鍵字黑名單**(leo 2026-08-17 已證明那條路 8 次誤攔、0 次正確攔截)。
訊息改由 hooks/lib/beacon_report.py 序列化:三段報告含引號與換行,
用 shell 內插拼 JSON 一個引號就會讓整行信標消失——而那正是「零閘狀態」的長相。
fail-open:python 掛掉、檔案不見、網路不通,一律退回原本那一行乾淨的信標。
測試 hooks/tests/isep-presence-beacon.test.sh:14/14(全離線)。
第 ⑪ 條守的是寫這支時真的犯過的 bug(內層迴圈變數跟外層的 d 撞名,
第二個殘骸之後全部被靜靜跳過)——把那個 bug 放回去,該條立刻轉紅。
|
2026-08-28 00:05:15 +00:00 |
|
Leo
|
17a74d7d3a
|
每一則回覆都自己說出拖了多久(inkstone/ISEP#63 → comment 5106)
leo 2026-08-27:「前面說過每個回覆要戴上已經花了總時長,這為什麼沒出現?」
「這應該寫在 ISEP,隨時看自己拖了多久」
重點在後面那句:不是要總管記得戴,是要它長在機器上。
總管當時答「我沒做,現在開始戴」——而那正是這條規則第一次失效的方式。
一支閘掛兩個事件,是同一件事的兩半(票上點名的失效模式就在這裡):
UserPromptSubmit → 注入算好的那一行(模型不必自己算,也算不準)
Stop → 查核這一回合的回覆裡到底有沒有那一行,沒有就擋一次
只做前半=又一個會被忽略的提醒;只做後半=罰它做一件拿不到資料的事。
判準不是關鍵字黑名單,是「那個被要求的輸出元素在不在」——
whitelist-of-one:要求一個機器產生的標記在場,不是猜哪些字不該在場。
換講法照樣要帶標記,多寫什麼都不會觸發。
時長從這段對話的第一則訊息算起,理由寫在 hooks/lib/countdown.py 檔頭:
「任務」在機器上沒有起點,而 CLAUDE.md 規則三點七「一段對話=一個 release」
剛好讓對話起點就是這個交付的起點——這個數字沒有人要維護,也不會說謊。
resume 取較早的那個:接關不是重新開始。
連帶修好票上的兩個卡點(prod-write-guard):
卡點一 發一則 Telegram 跟部署工作流在閘眼裡一模一樣 ⇒ 判準改看打的是哪一個
named webhook(路徑形狀+名字),放行範圍只有 notify_leo 一個名字
卡點二 連「把卡點寫進票裡」都被同一支閘擋(同款第八次)⇒ 剝掉內文再判,
起始行保留,所以真的在部署的寫法照樣擋
(修這支的過程又撞了一次同款——那就是這一格最好的證據)
測試:countdown 20/20、prod-write-guard 29→37/37,全程離線
(時鐘定住、狀態走環境變數、不打網路)。
實測:起點 06:28 台北、現在 08:03 ⇒ 期望「已過 1 小時 35 分」,實得同一字串。
plugin.json 0.9.0 → 0.10.0(版本沒動=沒有人吃得到)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-08-28 00:03:38 +00:00 |
|
claude-code
|
352d7a0b81
|
未推警察改用「遠端有沒有這顆 commit」判斷,不再用「有沒有 upstream」(inkstone/ISEP#90 ①)
雲端 session 開出來的工作分支天生沒有 upstream,內容卻等於遠端 main
(薄殼 HEAD 081c547 = GitHub 遠端 main 081c547,同一顆)
⇒ 每個雲端 session、每次收工都被攔一次,08-27 一個 session 五次全是誤報。
三件:
· 判準改成問遠端(git ls-remote,快取 120 秒)。本機只答得準「有」,
答「沒有」時才打網路——實測本 session 的 origin/main 落後遠端 4 天。
· 三態:遠端有/遠端沒有/問不到。**問不到一律不報**,不拿離線當罪證。
· 散落分支的基準也一起換成遠端實際那顆——基準過期會把已經在遠端 main 上的
分支整批報成散落(包含雲端 session 自己那條)。
順手補雲端那格接線:`$CLAUDE_PROJECT_DIR` 在雲端是薄殼根,真身在 `$TOP/InkStoneCo/`。
舊的掃描清單四個路徑一個都不存在 ⇒ 真身有東西沒推,這支閘一輩子不會知道。
測試 hooks/tests/unpushed-police.test.sh:10/10(全離線,本機 bare repo 當遠端)。
拿舊版跑同一份:A 群 5 條全紅、B 群 4 條全綠 ⇒ 測試有鑑別力,不是改到寬鬆。
|
2026-08-28 00:00:36 +00:00 |
|
claude-code
|
e0ac81b2e3
|
Merge pull request '補上「用錯的路去證明一件事」那一格的閘(inkstone/ISEP#30 → comment 4879)' (#80) from feat/gate-search-is-not-proof into main
v0.9.0
|
2026-08-27 13:41:17 +00:00 |
|
Leo
|
7de1ad6be6
|
補上「用錯的路去證明一件事」那一格的閘(inkstone/ISEP#30 → comment 4879)
擋的是**證據的出處**,不是措辭。
判準(兩個條件同時成立才響):
① 要送出去的那份東西(票上的留言/派工單)裡,貼了一個值
——entry id 或 `kb://` 來源位址——而它這個 session 只在
`kbdb_search` 的回應裡出現過
② 這個 session 從沒用產品檢索路徑(graph/wiki 內容/query)拿過那筆
為什麼不比對措辭:驗收條件第 4 條寫死不准,而 leo 2026-08-17 已經證偽過
文字層——那天 8 次誤攔、0 次正確攔截,且方向穩定:紅線寫得越細,命中
關鍵字的機率越高 ⇒ 那些閘在懲罰謹慎。值跟動作一樣有限且可枚舉,措辭不是。
🔴 `kbdb_search` 一點都沒有變難用:查 wiki、找 record_id、看某筆在不在,
全部照放。它只在「把搜尋輸出貼出去當產品檢索壞掉的證據」那一刻才響。
實測 31 條,A 群(不該擋)11 條、B 群(該擋)5 條、C 群訊息 6 條、
D 群登記處 9 條。真跡重演=inkstone/Arcrun#167 comment 4865 那則退回,
原文照貼會被擋;走過一次真路徑之後同一份留言就放行。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-08-27 21:38:17 +08:00 |
|
claude-code
|
a001b10947
|
Merge pull request '戳記要證明「看過」,不是「跑過」(inkstone/ISEP#72)' (#79) from fix/stamp-proves-seen-not-run into main
v0.8.0
|
2026-08-27 13:24:28 +00:00 |
|
Leo
|
ba444d1210
|
戳記要證明「看過」,不是「跑過」(inkstone/ISEP#72 → comment 4873)
2026-08-27 實犯:`ticket where … >/dev/null 2>&1` 之後直接 `ticket new`——
戳記寫成功了,命中的 72 張一眼沒看,於是開出 arcrun-rag#147,
而第一名 arcrun-rag#104 講的是同一件事,已經開了 13 天。
⇒ 舊戳記證明的是「這個程序被執行過」,而「有沒有看」在 stdout 那一端,
閘本來完全碰不到。
做法:把 stdout 那一端變成機械事實,不是文字判斷。
- `fd_is_devnull(fd)`:fstat 問得出來的事實。刻意只認 /dev/null 這一種
(寫進檔案讀得回來、pipe 有下游,只有 /dev/null 物理上找不回來)。
- `where` 把 `shown` 記進戳記;順便替前 3 名補內文摘要——今天的實害正是
「光看標題看不出是同一條線」(#104 的標題完全沒提 ingest)。
- `new` 的閘一之二:命中 >0 且 shown 為假就擋,並把那份被丟掉的清單
交到眼前;只要 stderr 不是 /dev/null,這一次的擋就記成「看過了」,
重下一模一樣的指令就會過——成本落在「看」,不落在「寫」。
- 刻意排在閘二**之前**:否則第一次就帶 `--not-a-comment "理由"` 的人
永遠看不到候選清單,理由是閉著眼睛寫的。
- 舊格式戳記(沒有 shown 欄位)當成沒看過(fail-closed)。
不該擋的(測試覆蓋):沒命中就不吵、看過了就不吵、`--not-a-comment`
既有欄位照舊、不判斷理由寫得好不好(leo 2026-08-17 已證偽文字層判準)。
測試 17/17:scripts/test-ticket-where-seen-guard.sh(離線,不打真實 Gitea、
不留測試票;離開碼 2=擋、1=放行走到網路才炸)。docs/TESTING.md 新增 A13。
plugin.json 升到 0.8.0——版本沒動=沒有人吃得到。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-08-27 21:17:35 +08:00 |
|
claude-code
|
a4eb17df48
|
Merge pull request '補上「有動作但主線沒動」那一格的閘(inkstone/ISEP#30)' (#78) from feat/gate-catches-recon-without-output into main
v0.7.0
|
2026-08-27 12:32:17 +00:00 |
|
Leo
|
35e927ef55
|
補上「有動作、不宣告」那一格:主線閒置警察(inkstone/ISEP#30)
空手警察判「有沒有動作」、稼動率警察判「有沒有那句話」,兩支中間留了一格:
**有動作、就是不宣告下一步** ⇒ 兩支都放行。2026-08-27 實際發生的就是這一格。
新閘 hooks/mainline-idle-guard.sh(Stop)判的是「有沒有推進」,不是「有沒有動作」:
- 乾回合 = 這回合 ≥3 個 tool call,且沒有任何推進證據
- 推進證據五種(任一成立就歸零):派工/產出/寫進外部系統/Bash 寫入白名單/
**工作區狀態變了**(HEAD 或未提交變更的指紋,heredoc·sed 改檔也吃得到)
- 連續 4 個乾回合擋一次,擋完歸零且**門檻加倍**(4→8→16)
一個字都不讀(守票上「不准文字層判準」那條紅線);③④ 的字面比對只用來放行,
永遠不用來擋——白名單漏一項是少放行一次,黑名單漏一項是誤攔一次。
門檻 4 是量出來的,不是拍腦袋:重放 6 份真 transcript、1965 個真實回合,
門檻 3 響 4 次、門檻 4 響 1 次(0.05%);門檻 3 多出來那三次都落在
「leo 連問問題、我逐題查證回答」的段落——那正是票上第 3 條驗收要保護的情境。
測試 hooks/tests/mainline-idle-guard.test.sh:61 條,A 群 15 條全是「不該擋」。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-08-27 20:28:55 +08:00 |
|
claude-code
|
736a601589
|
Merge pull request '盤點表補回漏掉的兩列人話+補上驗得出這種漏的指令(inkstone/ISEP#75)' (#76) from docs/inventory-missing-rows into main
v0.6.1
|
2026-08-27 10:39:59 +00:00 |
|