Repository navigation
msys path conversion argv vs script literal
Git Bash 上で bash で一時ファイルへ書く → Python でパッチ → gh --body-file で読む を繋いだとき、中間ステップが落ちても最終ステップが成功し、更新したつもりの無い古い内容が書かれるのはなぜか。そして Li+ source にこれを禁じる規則を足すか。
機構 = MSYS のパス変換は argv に効き、スクリプト内の文字列リテラルには効かない。同じパス文字列を両方で使ったときにだけ踏む。
規則は足さない。足す対象がリポジトリに存在せず、足せば既に在る指示の二枚目になる。
ずれているのは Python から見た /tmp ではなく、/tmp という文字列がどこで変換されるかである。
$ python -c "import os;print(os.path.abspath('/tmp/x'))"
C:\tmp\x ← スクリプト内リテラル。変換されない
$ python -c "import sys;print(sys.argv[1])" /tmp/x
C:/Users/smile/AppData/Local/Temp/x ← argv。MSYS が変換する
argv 経由なら Git Bash の MSYS 変換が働いて実体を指す。スクリプト内の文字列リテラルには変換が働かず、Windows のドライブ相対パスとして C:\tmp\x に解決される。
書き側も同様に実測できる。bash から echo > /tmp/probe で書いたファイルは C:/Users/smile/AppData/Local/Temp/probe に落ち、同一プロセスの Python から os.path.exists('/tmp/probe') は False を返す。
したがって「bash で書く → Python でパッチ → gh --body-file で読む」は、書きと読みだけが実体を指し、中間のパッチが別の場所を叩く構造になる。gh はネイティブ Windows バイナリで argv 経由なので、書き側と同じ実体を読む。Python が落ちても gh はパッチ前の内容を読んで成功を返す。
読み方向は FileNotFoundError を上げるが、書き方向は黙って通る。当該ホストでは C:\tmp が実在し、中身も入っている(tmp.n4jWwC5RRw / tpl.json)。スクリプト内リテラルへの書き込みは例外を上げずに別ディレクトリへ着地する。
さらに、中間ステップの失敗と最終ステップの成功が別コマンドに分かれているため、最終ステップの成功だけを見ている限り失敗は観測されない。
- 踏む = 同じパス文字列を argv とスクリプト内リテラルの両方で使うとき
- 踏まない = argv 経路のみで完結する書き方(heredoc +
gh --body-fileを 1 コマンドで繋ぐ等)
対照実測: 2026-09-06 に Claude Lay が発行した issue 本文 3 件・コメント 4 件はいずれも /tmp + --body-file だが、中間に Python を挟まないため踏んでいない(文字数まで照合済み)。
- depends on — gate-miss-measured-not-enforced。「規則をもう一本足す反射」を禁じ、足す前に substrate と発生率を問う判断。本 entry の「足さない」側はその適用例であり、当該判断が崩れれば本判断も再評価対象
- conflicts with — なし
- supersedes — なし
2026-09-06、#1884 / PR #1893 の brake 1 裁定中に、実装 subagent が報告した。issue 本文を書き換えるため一時ファイルへ dump → Python でパッチ → gh issue edit --body-file の順で実行したところ、Python 側が FileNotFoundError で落ちたのに gh はパッチ前のファイルを読んで成功した。
実害はゼロだった(同一内容の上書き。本文 2337 文字を検証済み、scratchpad 経路で再実行して復旧)。
初版の説明は誤っていた。 起票時は「Git Bash の /tmp と Python から見た Windows パスが同じ場所を指していない」と書かれたが、これは変換の所在を取り違えている。Claude Lay が上記の 2 コマンドを実測して訂正した。訂正前の説明でも「踏んだ」ことは説明できるが、踏まない書き方(argv 経路のみ)が区別できない。
2026-09-07、main の全ソースに当てた結果:
-
--body-fileはリポジトリ全体で 0 件。ghの呼び出し方を Li+ source が規定している箇所自体が無い -
/tmpは 5 件、すべてadapter/*/hooks/on-session-start.shのmktempfallback($(mktemp 2>/dev/null || echo "/tmp/liplus-...-$$"))。bash 内部で閉じており、argv とスクリプト内リテラルの分岐を持たないため本機構には当たらない
起票時の本文は /tmp を「一度も現れない」と書いたが、これは不正確だった。ただし当該 5 件は上記のとおり機構の適用外であり、結論は動かない。
踏み方は Li+ source の指示に従った結果ではなく、実行した agent がその場で選んだ経路である。直すべき literal がリポジトリに存在しない。
一時ファイルの置き場については、少なくとも当該セッションのハーネス側 system prompt が scratchpad ディレクトリを名指しし /tmp ではなくそちらを使うよう指示している。同じ指示が全 agent・全ホストに在るかは未検証。
採用 — Li+ source は変更しない。記録は判断記録(本 entry)に置く。
rules/model/subtractive-structural-beauty.md Spec write の binary(required か unnecessary か)で言えば unnecessary 側。加えて「実行が保証されない手順」を足す形になるため、同ファイルが構造への置換を要求する側でもある。
棄却 — rules/ / skills/ / adapter/ に「一時ファイルは scratchpad に置け」「/tmp を使うな」に類する行を足す案. 足す対象の literal が無く、既に在るハーネス側指示の二枚目になる。
残る価値 — 機構そのもの(MSYS の変換が argv には効きスクリプト内リテラルには効かない、その結果として中間ステップの失敗が痕跡を残さない)は、次に同型を踏んだときの判定材料になる。踏んだ回に「なぜ古い内容が書かれたか」を再測定せずに済む。
この Wiki は、Li+ に基づく開発・運用を支えるための情報整理空間です。
数字で始まるページは、 Li+プログラムの各レイヤーの仕様を定義するページです。
- 要求(何を満たすか)と仕様(どう振る舞うか)を一体として記述する
- 実装前に作成または更新する
- issue群から採用された要件を集約する
これらのページは 安定性と一貫性を重視して管理されます。
アルファベットで始まるページは、 Li+の構想・設定・導入手順などの参照用ページです。
- 設計思想・背景
- 設定リファレンス・インストール手順
これらのページは 必要に応じて更新・拡張されます。
リポジトリ内の rules/**/*.md(L1–L4 の常時ロード分、subdir 含む)、skills/**/SKILL.md(トリガー起動分)、adapter/claude/CLAUDE.md、adapter/claude/hooks-settings.md、adapter/claude/hooks/*.sh、adapter/codex/AGENTS.md、およびルート直下の Li+config.md、Li+update.md は、
AIやランタイムが直接読む実行用プログラム / 定義ファイルです。
-
docs/は人間向けの仕様書・要求仕様・手順書 -
rules/,skills/および adapter / update は実行時に読み込まれる本体
両者は対応しているが、役割は同じではない。
Home | 1. Model | 2. Evolution | 3. Task | 4. Operations | A. Concept
要求仕様書 (1-6)
参考文書 (A-L)
- A. Concept
- B. Configuration
- C. Update
- D. Installation
- DiDD(対話駆動開発)
- E. Li+ language
- F. Behavior-First
- G. Sheepdog Engineering
- H. Roles and Evaluation
- K. Source File Format
- L. Hop Count Instrument
判断構造
- Decision Structure
- layer reorg rationale
- github app user-to-server token expiration
- sheepdog engineering concept
- prerelease tag recovery procedure
- release flip drift patterns
- Li+ long-term vision (feedback only)
- Master role as client-architect
- current architecture as concession
- Li+ license Apache-2.0 rationale
- Character_Instance evolution history
- prompt as emotion vector controller
- agentic-search five-phase refactor
- Character_Instance output-styles migration
- Li+ lightening L1 gate override
- subagent state-machine label mechanism
- LSP integration out of scope
- Character_Instance opt-in and surface scope
- parallel-subagent-eval three-axis decomposition
- parallel-subagent-eval cost acceptance
- parallel-subagent-eval model floor
- release version rule always-on relocation
- bootstrap walkthrough skip and gh install relocation
- wiki sync sidebar integrity check
- decision structure rename rationale
- decision structure industry positioning
- subtractive structural beauty framing
- Li+ authorship is collaborative
- Li+ design intent vs current limit
- Li+ history is empirical
- Master verification at runtime not spec
- rules cache fetch address table
- dialogue-evaluator scoring redesign
- Li+ always-on footprint is load-bearing
- DiDD umbrella naming
- milestone subsystem removal
- L1 brake 2 root-criteria evaluator
- Hook-driven gate trigger
- ゲート適用漏れは強制より先に測る
- dynamic-workflows non-adoption
- ACE context-engineering non-adoption
- memory GraphRAG SQLite exploration
- Li+ context-rot tension
- Li+ structure as retrieval surface
- 常時ロード分の重複を削る向き
- Li+ evaluation criterion
- Li+ self-evolution lineage
- Li+ judgment-learning telos
- Sheepdog Engineering publish intent
- Implementation always delegated
- brake evaluator baseline integrity
- brake1 single-round cap
- brake1 の再実行可否は監査内容で決める
- brake 指摘の裁定を再開した著者が持つ
- brake1 の発火条件を基準で閉じる
- skill の発火条件は description 内に置く
- subagent parallel-width cap
- brake1 operational-copy target-conditional
- brake1 findings は親を経由する
- brake1 の per-draft 軸を 2 本に固定する
- brake 2 の DEVIATION を人間が上書きする
- wiki sync code-notation strip
- wiki sync drift-targeted mirror
- decision structure writer surface activation
- decision structure state-form edge binding
- Neuron Graph RAG integrated prototype
- issue 完了条件フィールドの射程
- body 節と description の被覆ずれの解き方
- グラフエンジニアリング非採用
- Li+ の配布形式は GitHub 直配布
- 配布される source に config の解決値を書かない
- ルールは基準を持ち、来歴は git に置く
- 人間と AI の関係条項を absolute.md に置く
- 来歴を預けた retrieval 面が実際に答えるか
- 存在側の欠陥は空欄ラベルの可視性に届かない
- brake 2 の判定対象は変更の内容
- エージェント定義の判定基準を sentinel 区画で所有
- brake 2 を廃し L1 のゲートを brake 1 へ一本化
- 多セッションが効くのは入力が変わるとき
- source 本文は振る舞いのみ、理由は移設
- parallel-agent-eval 本文は振る舞いのみ
- agentic-search 蒸留版は full と同等(実測)
- 読みの除去テストが通した削除を実測が差し戻した
- brake1 の評価者数の床を N=1 へ
- Judgment record ポインタ要件を撤廃
- brake1 を上限 3 往復の収束ループへ
- 受け皿より先に縮んだ検出幅の窓を閉じる
- issue constraints の「対象ではない」は宣言
- クローン同一性は remote で解決
- tally は機構の名前の下に置く
- config 値比較は厳格に、外れた値は名指し
- webhook 到着通知の消去は確認を伴う
- 検索性能比較コーパスは既存リポジトリ内の path で隔離する
- MSYS のパス変換は argv だけに効く
- 観測不能な主張は書き手を替えても記録にならない
- parallel-agent-eval の 1 周目の跡に残っていたのは再掲
- 実装委譲エージェントに定義ファイルを与え effort を固定
- cold-start diff-only 状態は agent key でパーティション分割
- 観測不能の宣告はホストの母集団に対する主張
- 検出器は到達可能な位置にあって初めて検出器である
- ランタイムの rules はタグへ解決する
- 記録面の除外は読み直しで捕まる行にだけ成り立つ
- 再開プロンプトの注入項目は基準で閉じる
- 委譲プロンプトが運ぶのは境界であって手順ではない
- 規則の効きの実測の各条件は観測された失敗の上に置かれている
- parallel-agent-eval は蒸留で約 5,340 トークン、残りの超過は受容
- brake 1 の往復上限を撤廃し、同じ指摘の再発を人間へ上げる
- rules/evolution と rules/task の本文は振る舞いのみ
- rules/operations と adapter の本文は振る舞いのみ
- rules/model(L1)の本文は振る舞いのみ
- main-agent-procedures の常時ロード本文はメインの運用場面で行いを決める文のみ
- cold-start-synthesis の本文は振る舞いのみ、フックの仕様は docs へ
- initiator-autonomy の常時ロード本文は振る舞いのみ、tests の散文規則は skill へ
- operations.md の常時ロード本文は振る舞いのみ、索引と label 辞書の写しは持たない
- memory-entry-format.md の常時ロード本文は書式と保守のみ、observation 手順は skill へ
- promotion-judgment の常時ロード本文は振る舞いのみ、軸の関係の説明は docs へ
- execution-mode.md の常時ロード本文は、マトリクスを言い直さず、他の常時ロード面の写しも持たない
- task.md の常時ロード本文は issue とラベルの行いだけを持ち、写しと層の説明は持たない
- main-agent-procedures の場面に限られる手順は、名指しが届く skill へ
- evolution.md の常時ロード本文は振る舞いのみ、レイヤーの位置づけと他面の写しは持たない
- operations.md の場面に限られる節は、名指しが届く skill へ
- CLAUDE.md の常時ロード本文は振る舞いのみ、位置づけ・読込の説明・常時ロード面の写しは持たない
- initiator-autonomy の場面に限られる記述は、brake 1 の skill へ
- skill description の詰めは、場面を狭めない句だけを切る
- L1 の 5 本の 2 周目は内側の写しと位置づけの説明を外し、書く規律は常時ロードに残す
- subtractive-structural-beauty と trigger-check-gate の常時ロード本文は振る舞いのみ、言い直し・位置づけ・他所の再掲は持たない
- absolute.md の常時ロード本文は振る舞いのみ、Name prefix scope の言い直し・位置づけは持たない
- サブエージェント起動の着地点の目安と数値の出典