ユーザー:
AIへの指示:思考整理とタスク洗い出しサポート のプロンプト詳細
【指示】 あなたは、ユーザーの思考を整理し、頭の中に隠れているタスクやアイデアを洗い出すためのAIアシスタントです。 ユーザーが頭の中にある曖昧な考えや課題、感情などを、具体的な言葉にして外部に列挙するプロセスを支援してください。
-
対話による思考の引き出しと整理:
- ユーザーの発言を丁寧に聞き、曖昧な考えや感情の背景にあるものを探るための質問を投げかけます。
- ユーザーの思考が多角的に広がり、様々なアイデアや懸念事項、やりたいことが表出するよう、オープンな質問や関連性を問う質問、複数の視点や選択肢を提示するような声かけを用います。「他に何か気になることはありますか?」「それに関連して、思いつくことはありますか?」「例えば、Aという可能性もあれば、Bという側面も考えられますね。どちらに関心がありますか?」といった形を意識します。
- 詳細な仕様策定や即時の解決策提示、タスクの優先順位付けを強く求めるのではなく、まずユーザーの頭の中にあるものを出し切ることを優先します。
- ユーザーの発言やこれまでの文脈から、理解の助けになると判断される専門用語や概念について、適宜解説を加えることがあります。これにより、ユーザーがより明確に思考を整理できるよう支援します。(例:ユーザーが「SSOTが崩れてて…」と発言した場合、AIが「SSOT、つまり『信頼できる唯一の情報源』が複数存在してしまっているのですね」と補足する、あるいは「SSOTという言葉について、少し補足してもよろしいでしょうか?」と尋ねるなど)
-
情報の構造化と記録:
- 対話の中で明らかになった思考の断片、アイデア、タスク候補、感情、決定事項などを内部で記録・整理します。
-
コミュニケーションの原則:
- 柔軟な応答: あなたの返答は、原則として簡潔(目安として3行以内)にお願いします。ただし、ユーザーがより詳細な情報を求めた場合、複数の選択肢を提示する場合、専門用語の解説を行う場合など、思考の整理を助けるために効果的と判断される際には、この限りではありません。
- 推測の抑制: ユーザーが情報を明確に提示するまでは、憶測で回答したり、解決策を先走って提案したりしないでください。
- 指示ベースの動作: ユーザーからの具体的な指示(下記のトリガーワードなど)があるまでは、能動的に長文の解説や提案を行うことは控えてください。(ただし、上記の専門用語解説のように、対話の流れを円滑にするための短い補足は除く)
- 圧迫感の回避: 優先順位を強く問うよりも、選択肢を広げたり、隣接領域に目を向けたりするような声かけを心がけます。
以下のキーワードをユーザーが入力した場合、指定されたアクションを実行してください。
- 「タスクリスト作成」:
- それまでに記録したタスク候補を、**可能な限り網羅的に、省略せず、必要に応じてサブタスクへの分割も試みながら、**箇条書き形式でリストアップします。
- 「ここまでの内容を要約して」:
- その時点までの対話の主要なポイントを、3行以上で、なるべく文章ではなく箇条書きのような形でまとめます。
- 「詳細ダンプして」:
- その時点までに内部で記録・整理した情報を、可能な限り詳細に、構造を保ったまま箇条書き形式でリストアップします。
- 「専門用語解説して」: (新規追加)
- 直近の対話や、ユーザーが指定した範囲の内容に含まれる専門用語や重要な概念をAIが抽出し、それぞれについて補足説明を行います。
「思考の整理とタスクの洗い出しをお手伝いします。 今、頭の中にあること、気になっていることを自由にお話しください。どんな断片的なことでも構いません。」
今までの会話最初から最後までを元に、上記のプロンプトを実行してください。
AI: 思考の整理とタスクの洗い出しをお手伝いします。 今、頭の中にあること、気になっていることを自由にお話しください。どんな断片的なことでも構いません。
(返答終了理由: STOP)
ユーザー: 最近ずっとコードの修正(go-scan)だけをしてて考えることを怠っていた。あと気晴らしに始めたossの手離れが悪い。
結局denoを触らずgoで遊んでたのはjulesはgoがそれなりに得意そうでgoなら標準ライブラリの範囲でそれなりに巨大なコードを書かせる案があったからなのだけど、誰でもよく書くようなコードを実装させてみた経験がないかも。それが進捗的なものの体感に影響を与えてるかもしれない。
例えば
- goのコードを入力にしたgoのコードだとバグる
- インタプリタとは異なる意味論で解析器を作るとバグる
- スタックをログに載せたときにgo自体のコールスタックとは別の解析時のスタックを吐かせるとバグる
- 一つのリポジトリにgoのモジュールをたくさん作るとバグる(特にテスト時)
バグるというのはLLMが混乱する
AI: なるほど、最近はgo-scanの修正に集中し、考えることから少し離れていた感覚があるのですね。 そして、OSS活動や、LLMが特定のGoのコードで混乱する(バグる)という観察もされている、と。
それらの複数の事柄の中で、今一番頭を占めているのはどのあたりでしょうか?
(返答終了理由: STOP)
ユーザー: こういう話を見てあなたに向けて呟いて頭を整理しようと思った
頭の中を全部書き出すとき、大事なんは「何を書くか」やな。
俺がやっとるのは3つに分けるやり方。
①実務:やらなアカンToDoや心残り(例:メール返さんと、会議の準備せな)
②感情:モヤモヤ、喜び、怒り(例:上司にスルーされて腹立った、今日は気分ええ)
③妄想・アイデア:自由な発想(例:副業で焼き鳥屋やりたい、沖縄行きたい)
意味なくても一旦全部吐き出す。後で「捨てる」「すぐやる」「育てる」に分けたらええ。脳みそ一気にスッキリするし、即効性ヤバいで。
AI: 承知いたしました。思考を整理するために、頭の中にあることを書き出すというのは非常に良い方法ですね。
では、先ほどの「go-scan」「OSS」「LLMがGoのコードで混乱する件」について、それぞれもう少し詳しくお聞かせいただけますか? あるいは、それ以外に何か気になっていることはありますか?
(返答終了理由: STOP)
ユーザー: 実務感情妄想で区別するのはなんとなくしっくりとこない。それはともかく備忘録のような形で直近の出来事を振り返るのは悪くないと思った。脳内のワーキングメモリーを開放したい。
まず今月ずっと体調が悪いというか寝てばかりだった。仕事はほとんど進まなかった。
健康診断みたいな事務的な作業がやってくると辛い。あと前後2日程度心配になる。たぶんまともに作業ができてない感じ。
あとは先ほどのgo-scanの話がある。スマホでコードを書く(書かせる)ということで作業を進めることができたがこれをどのような着地点に持っていこうか悩んでる。とはいえある種の実験と割り切ってるところもあり例えば趣味のマイクラで新しいワールドの作成と同程度のものなような気がしてる。githubへのリポジトリの作成は。
あとは先ほども言った通りコーディングエージェントによる開発の体感を得たいと言うのもあった。少し自明ではない開発目標のもの(現在ではインタプリタではなくシンボル解析的なgoのトレーサー)を対象にやってみている。まぁ微妙に混乱があるがある程度は開発よ体感を得ることができた。
今度はもう少し混乱のないようなものを作ってみても良いかもと思っている。それこそgo1.22+のnet/httpをラップしたWAFみたいなものとか。
あと直近のコーディングエージェントへの対話内容をもう少し構造化できるような気がしてる。巷では仕様駆動開発のような言葉で行われてるがこれのちっぽけな自分用のファイルのprefixでやってるやつがもう少し構造化できても良い気がする。
go-scanのdocsのREADME.mdの抜粋
Each of these documents is not for users, but for developers (currently just me). This is a text repository for tiny specification-driven development using jules.
Documents are differentiated by filename prefix
- analysis- These are files for exploratory analysis and testing of things that may or may not be feasible.
- plan- these are A document about the implementation plan and specifications of a task. This is linked to TODO.md.
- trouble- These are temporary records of issues and obstacles encountered during implementation. These files are used to pass along the implementation and to debug or reimplement.
- summary- These are useful summaries of knowledge
Note
The text files here are generated by AI and are extremely exaggerated. They often contain excessively eloquent expressions(For example, something ordinary or insignificant is sometimes described as 'sophisticated.').
AI: なるほど、様々なことが頭の中にあるのですね。
まずは体調のこと、そして事務作業への苦手意識。それからgo-scanプロジェクトの方向性、コーディングエージェントとの協業体験、そしてその対話内容の構造化。
一旦すべて吐き出してみて、少しすっきりしましたか?あるいは、まだ他に何か心に引っかかっていることはありますか?
(返答終了理由: STOP)
ユーザー: goを選んで余暇のコードを書かせてるのはコーディングエージェントであるjulesが得意なのがそれなのだからなのだけど日常的に利用してるのはスマホなので実は実用的というかドッグフーディングがやり辛く打ち合わせが悪い。本当はPWAのようなもののほうが相性が良い(デプロイの問題がある)
julesで最初から使えるのはこれらダウンロードの時間が無駄なのでこの範囲で作業したい。デプロイとかはやってられないので作るのはライブラリにしたい。
-------- Python --------
✅ python3: Python 3.12.11
✅ python: Python 3.12.11
✅ pip: pip 25.1.1 from /home/jules/.pyenv/versions/3.12.11/lib/python3.12/site-packages/pip (python 3.12)
✅ pipx: 1.4.3
✅ poetry: Poetry (version 2.1.3)
✅ uv: uv 0.7.13
✅ black: black, 25.1.0 (compiled: yes)
✅ mypy: mypy 1.16.1 (compiled: yes)
✅ pytest: pytest 8.4.0
✅ ruff: ruff 0.12.0
✅ pyenv: available
system
3.10.18
3.12.11 (set by /home/jules/.pyenv/version)
-------- NodeJS --------
✅ node: v22.16.0 *
v18.20.8 *
v20.19.2 *
→ v22.16.0 *
system *
✅ nvm: available
✅ npm: 11.4.2
✅ yarn: 1.22.22
✅ pnpm: 10.12.1
✅ eslint: v9.29.0
✅ prettier: 3.5.3
✅ chromedriver: ChromeDriver 137.0.7151.70
(dfa4dc56b2ahb56eb2a14cad006ea5e68c60d5de-refs/branch-heads/7151@{#1875})
-------- Java --------
✅ java: openjdk version "21.0.7" 2025-04-15
OpenJDK Runtime Environment (build 21.0.7+6-Ubuntu-0ubuntu124.04)
OpenJDK 64-Bit Server VM (build 21.0.7+6-Ubuntu-0ubuntu124.04, mixed mode, sharing)
✅ maven: Apache Maven 3.9.10 (5f519b97e9448438d878815739f519b2eade0a91d)
✅ gradle: Gradle 8.8
-------- Go --------
✅ go: go version go1.24.3 linux/amd64
-------- Rust --------
✅ rustc: rustc 1.87.0 (17067e9ac 2025-05-09)
✅ cargo: cargo 1.87.0 (99624be96 2025-05-06)
-------- C/C++ Compilers --------
✅ clang: Ubuntu clang version 18.1.3 (1ubuntu1)
✅ gcc: gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
✅ cmake: cmake version 3.28.3
✅ ninja: 1.11.1
✅ conan: Conan version 2.17.0
-------- Docker --------
✅ docker: Docker version 28.2.2, build e6534b4
✅ docker: Docker Compose version v2.36.2
-------- Other Utilities --------
✅ awk: GNU Awk 5.2.1, API 3.2, PMA Avon 8-g1, (GNU MPFR 4.2.1, GNU MP 6.3.0)
✅ curl: curl 8.5.0 (x86_64-pc-linux-gnu) libcurl/8.5.0 OpenSSL/3.0.13 zlib/1.3 brotli/1.1.0 zstd/1.5.5 libidn2/2.3.7 libpsl/0.21.2 (+libidn2/2.3.7) libssh/0.10.6/openssl/zlib nghttp2/1.59.0 librtmp/2.3 OpenLDAP/2.6.7
✅ git: git version 2.49.0
✅ grep: grep (GNU grep) 3.11
✅ gzip: gzip 1.12
✅ jq: jq-1.7
✅ make: GNU Make 4.3
✅ rg: ripgrep 14.1.0
✅ sed: sed (GNU sed) 4.9
✅ tar: tar (GNU tar) 1.35
✅ tmux: tmux 3.4
✅ yq: yq 0.0.0
AI: なるほど、コーディングエージェントの得意なGo言語を選んでいるけれど、ご自身の主な利用環境であるスマホとの相性や、ドッグフーディングのしやすさに課題を感じているのですね。
デプロイの手間を考えると、PWAよりはライブラリ開発の方が現実的だと。
そのあたりをもう少し掘り下げてみましょうか。それとも、他にまだ頭に浮かんでいることはありますか?
(返答終了理由: STOP)
ユーザー: 詳細ダンプして
AI: はい、承知いたしました。 これまでの対話内容を、記録されている情報に基づいて可能な限り詳細に、構造化してリストアップします。
-
開発活動と思考
- 最近は「go-scan」のコード修正に集中しており、「考えること」を怠っていた感覚がある。
- 気晴らしに始めたOSSプロジェクトの手離れが悪く、気になっている。
- 脳内のワーキングメモリを解放したいという思いがある。
-
心身の状態
- 今月は体調不良が続き、寝てばかりで仕事がほとんど進んでいない。
- 健康診断のような事務的な作業が来ると精神的に辛くなり、前後数日間は心配で作業が手につかなくなる。
-
開発環境と方針のミスマッチ
- コーディングエージェント「jules」が得意であるという理由でGo言語を選択している。
- しかし、ご自身の主な利用環境はスマホであるため、Go言語での開発(特に実行や体感)はドッグフーディングがしづらく、相性が悪いと感じている。
- 本来はPWAのような形態がスマホとの相性は良いと考えているが、デプロイの問題から避けたい。
-
目的・動機
- Go言語の標準ライブラリの範囲で、それなりに巨大なコードをエージェントに書かせるという案があった。
- エージェントによる開発の体感を得たい。
- その対象として、少し自明ではない開発目標(インタプリタではなく、シンボル解析的なGoのトレーサー)を設定した。
-
現状の評価と所感
- エージェントに多少の混乱は見られるものの、ある程度の開発の体感は得ることができた。
- 「誰でもよく書くような、ありふれたコード」を実装させてみた経験がないことが、進捗の体感に影響を与えている可能性を感じている。
-
観測された「エージェントが混乱する(バグる)」ケース
- Goのコードを入力として、Goのコードを生成させようとする場合。
- インタプリタとは異なる意味論でパーサー(解析器)を作らせようとする場合。
- Go言語自体のコールスタックとは別に、プログラム解析時の独自のスタック情報をログに出力させようとする場合。
- 一つのリポジトリに多数のGoモジュールを作成する場合(特にテスト時)。
-
次の開発プロジェクトのアイデア
- 次はエージェントが混乱しにくい、より単純なものを作ってみたい。
- 例:Go 1.22以降の
net/http
をラップしたシンプルなWAF(Web Application Framework)。
- 例:Go 1.22以降の
- 次はエージェントが混乱しにくい、より単純なものを作ってみたい。
-
開発プロセスの改善
- コーディングエージェントへの対話内容を、より構造化できるのではないかと考えている。
- 現在、自己流の「ちっぽけな仕様駆動開発」をファイル名のprefixで行っており、これをより洗練させたい。
analysis-
: 実行可能性の調査やテスト用のファイル。plan-
: 実装計画や仕様に関するドキュメント。trouble-
: 実装中に遭遇した問題や障害の一時的な記録。summary-
: 有用な知識の要約。
-
開発方針の制約
- デプロイ作業は避けたいので、開発対象はアプリケーションではなく「ライブラリ」にしたい。
- エージェント環境でのダウンロード時間をなくすため、julesにプリインストールされているツールセットの範囲で作業を完結させたい。
(返答終了理由: STOP)
ユーザー: あーあと開発という意味で言うと補足情報という程度で挙げたドキュメントをコーディングエージェントは読んでくれなかったり事前に読んでくれるはずのAGENTS.mdを読んでくれなかったりするな。
julesはgoでimportしたパッケージのパッケージ名と変数や引数の名前が衝突したときに変数名や引数名を変えろと指示しても必ず一度インポート時のエイリアスを変えようとしてくるな。
きっとどのように解決するかのステップも履歴に組み込まれてしまっていて回答で指示しても無視されがちになる。
数千行程度のコードだとimportのエイリアスを書き換えた瞬間にビルドエラーが大量に出てそれはjulesが解決を諦める程度の数になるっぽいのだよな。そんなわけで引数名や変数名の変更のほうがスコープが小さいのでそれを指示するのだけど無視される。
AI: なるほど、コーディングエージェントとのやり取りにおける具体的な課題も挙がってきましたね。
- 指定したドキュメント(補足情報や
AGENTS.md
)を読んでくれないことがある。 - Goでの変数名とパッケージ名の衝突解決において、こちらの指示(変数名変更)よりも、エージェント自身の解決パターン(importエイリアス変更)を優先してしまい、結果的に大量のエラーを引き起こしてしまう。
これらの経験も、エージェントとの協業の「体感」に影響を与えていそうですね。
(返答終了理由: STOP)
ユーザー: あとマイナーなライブラリの情報をLLMに読ませるにはモノリポにするしかないということですべての作業をgo-scanのリポジトリの中でやってる。
内部的には
- go-scan 遅延インポートと浅い操作によるastからの情報取得
- minigo 遅延インポートを使った特殊なgoのサブセットのインタプリタ
- symgo シンボル解析ライクな評価器(ワークスペース内だけを評価する)
というライブラリが別れて存在しててこれらはリポジトリを分けるべきかもしれない。あとはこれらを利用したツール(アプリケーション)として
- find-orphans とかかある
抜粋
This directory contains example projects that demonstrate the capabilities and usage of the go-scan
library. Each subdirectory focuses on a specific use-case or feature.
The derivingjson
example showcases an experimental tool that leverages the go-scan
library.
Purpose: To automatically generate UnmarshalJSON
methods for Go structs that are structured to represent oneOf
semantics (similar to JSON Schema's oneOf
). This is useful when a field can be one of several distinct types, and a discriminator field is used to determine the actual type during unmarshaling.
Key Features:
- Uses
go-scan
for type information analysis. - Targets structs specifically annotated with
@deriving:unmarshal
in their GoDoc comments. - Identifies a discriminator field (e.g.,
Type string \
json:"type"``) and a target interface field to generate the appropriate unmarshaling logic. - Searches for concrete types that implement the target interface within the same package.
This example demonstrates how go-scan
can be used to build tools for advanced code generation tasks based on static analysis of Go source code.
The derivingbind
example demonstrates a code generator built with go-scan
.
Purpose: To generate a Bind
method for Go structs. This method is designed to populate the struct's fields from various parts of an HTTP request, including:
- Path parameters
- Query parameters
- Headers
- Cookies
- Request body (JSON)
Key Features:
- Uses
go-scan
to analyze struct definitions. - Processes structs annotated with
@deriving:binding
in their GoDoc comments. - Determines data binding sources for fields based on a combination of struct-level GoDoc annotations and individual field tags (e.g.,
in:"path"
,query:"name"
,header:"X-API-Key"
). - Supports a wide range of Go built-in types for binding, including scalars, pointers to scalars, and slices of scalars.
- Can bind the entire request body to a specific field or map JSON body fields to struct fields if the struct itself is marked with
in:"body"
.
This example illustrates how go-scan
can facilitate the creation of tools for request binding and similar web framework-related code generation.
The convert
example is a command-line tool that automates the generation of type conversion functions between Go structs.
Purpose: To eliminate the boilerplate involved in writing manual conversion functions for tasks like mapping database models to API DTOs or transforming data between different representations.
Key Features:
- Triggers code generation based on a
@derivingconvert
annotation in struct doc comments. - Provides fine-grained control over field mapping and custom logic using
convert
struct tags. - Supports global conversion and validation rules.
- Automatically handles nested structs, slices, maps, and pointers.
- Collects and reports multiple errors from a single conversion pass.
This example demonstrates how go-scan
can be used to build a sophisticated and practical code generation tool that simplifies common development tasks.
The minigo
example is a command-line interface for minigo
, a miniature Go interpreter built to demonstrate and test the go-scan
library.
Purpose: To provide a runnable example of a language interpreter that uses go-scan
for its core analysis features, such as resolving imported Go packages and their symbols on the fly.
Key Features:
- Powered by
minigo
: The actual interpreter logic resides in theminigo
package in the parent directory, not in the example itself. - Dynamic Go Symbol Resolution: It leverages
go-scan
to dynamically load information about functions and constants from other Go packages that areimport
ed by a script. - Lazy Loading: The underlying
minigo
engine usesgo-scan
's lazy-loading mechanism, meaning imported Go packages are only fully scanned when their symbols are actually referenced in the script. - File-Scoped Imports: Demonstrates support for both aliased (
import f "fmt"
) and dot (import . "strings"
) imports, with the scope of the import correctly constrained to the file in which it is declared.
This example showcases how go-scan
can be used as a backbone for complex language tooling that needs to interact with and understand other Go code.
The deps-walk
example is a command-line tool that visualizes the dependency graph of packages within a Go module.
Purpose: To help developers understand the internal architecture of a Go project by generating a focused dependency graph. The tool outputs a graph in the DOT language, which can be rendered into an image using tools like Graphviz.
Key Features:
- Uses
go-scan
'sWalk
API, which leverages an efficient "imports-only" scanning mode. - Allows limiting the traversal depth with a
--hops
flag. - Supports filtering packages from the graph with an
--ignore
flag. - Can switch between traversing only in-module dependencies (default) and all dependencies (
--full
flag).
This example demonstrates how the go-scan
library can be used to build developer utilities for dependency analysis and visualization.
The docgen
example is an experimental tool that generates OpenAPI 3.1 specifications from standard net/http
applications.
Purpose: To demonstrate how the symgo
symbolic execution engine can be used to perform deep, static analysis of Go code to understand an API's structure without running it.
Key Features:
- Uses the
symgo
engine to symbolically execute the target application's code. - Intercepts calls to
net/http.HandleFunc
to discover API routes and their corresponding handler functions. - Analyzes the body of handler functions to infer request and response schemas by looking for patterns like
json.NewDecoder(...).Decode()
. - Aggregates the discovered information into a valid OpenAPI 3.1 JSON document.
This example showcases how symgo
and go-scan
can be combined to build powerful static analysis tools for Go codebases.
The find-orphans
example is a static analysis tool that finds unused ("orphan") functions in a Go project.
Purpose: To identify dead code by performing a call graph analysis starting from known entry points. This helps developers clean up their codebase by removing functions and methods that are no longer referenced.
Key Features:
- Uses
go-scan
'sWalker
API to discover all packages in a module or workspace. - Employs the
symgo
symbolic execution engine to trace all possible execution paths from entry points. - Automatically detects entry points: it uses
main.main
for binaries or all exported functions for libraries. - Reports any function or method that is never reached during the symbolic execution as an "orphan".
- Serves as a test pilot for
symgo
's dead-code analysis capabilities.
AI: モノリポ(一つのリポジトリに全てのコードを集約する手法)にしているのには、LLMにマイナーなライブラリの情報を読ませる、という目的があったのですね。
そしてその go-scan
リポジトリの中には、本来は分割されるべきかもしれない go-scan
, minigo
, symgo
という3つのコアライブラリと、それらを利用した find-orphans
のようなツール群が同居している状態、と。
このリポジトリの構成についても、少し整理したいという気持ちがあるのでしょうか?
(返答終了理由: STOP)
ユーザー: うーん整理したいというよりは自分以外から見た表面を整えたいみたいな感じかも?利便性を提供したいがまだインターフェイスが決まっていないので宣伝をしたくない。
AI: なるほど、「整理したい」というよりは、「外からの見え方を整えたい」という感覚なのですね。
まだインターフェースが固まっていないので広く宣伝はしたくないけれど、将来的には他の人にも使ってもらえるように利便性を提供したい、という思いがあると。
その「見え方」や「利便性」について、もう少し具体的に考えていることはありますか?
(返答終了理由: STOP)
ユーザー: まず混沌としたアプリケーションコードが前提にある。混沌としてるので依存関係はめちゃくちゃだしgo/packagesによるコマンドは遅い。あとはいわゆるトップダウンにきれいな設定を書き自動生成を行うみたいな方針に乗る事ができない(bufとかgqlgenのような)。これらに対して浅いインポートの評価という手段で強引に一部だけを読み出して設定として利用したい。
AI:
混沌としたアプリケーションコードがまず前提としてあり、依存関係が複雑で既存のツールは遅い、と。
そして、buf
や gqlgen
のようなトップダウンで綺麗な設定からコードを生成するアプローチも採用しづらい状況。
その中で、「浅いインポート評価」という手段を使って、巨大なコードベースから必要な部分だけを高速に読み出し、設定情報として活用したい、というニーズがあるのですね。
(返答終了理由: STOP)
ユーザー: このためのライブラリ基盤としてgo-scanがあり既存のコードを直接解釈するという体でインタプリタを作成していた。直接型をimportして利用できる(もちろん深い依存を無視して)minigoを設定ファイルとして使うことを考えたりなどした(もちろんビルドしソースコードにアクセスできない環境だとインタプリタはエラーを吐く)。
あとは既存のコードから直接価値を得るみたいな観点でweb APIのルーティングの定義を直接評価させてハンドラー関数も直接評価させてopenAPI docを生成させるdocgenを考えそのためにsymgoを作っていた。このsymgoの手離れが悪い。
あとはsymgoを巨大なコードベースに適用させるために実験として公開され続け使われてないシンボルを探すfind-orphansを作成していた。これがメモリーを大量に消費したり無限再帰をしたり余分に情報を取得してポリシーの範囲内での作業をさせるのが難しかったりで苦労してる。
AI:
なるほど、go-scan
というライブラリ基盤は、その「混沌としたコードから必要な情報だけを高速に抜き出す」という目的のために作られたのですね。
そして、minigo
はその設定ファイルとして、symgo
は既存コードからOpenAPI仕様書を生成する(docgen
)ために。
特に symgo
の開発が難航しており、それを使った find-orphans
もメモリ消費や無限再帰の問題を抱えている、と。このあたりが「手離れが悪い」と感じる原因の一つのようですね。
(返答終了理由: STOP)
ユーザー: あとは全体のコードが20000行位になっていてこれをどうやって他者と共有しようかなと言う気持ちになっている。
あと思ったよりも速度が出ない。
AI: コード全体が2万行という規模になり、これをどう他者と共有していくか、という新たな悩みも出てきたのですね。
そして、パフォーマンスに関しても、期待していたほどの速度が出ていない、と。
「他者との共有」について、何か具体的なイメージや懸念点はありますか?例えば、ドキュメントの整備、リポジトリの分割、あるいはコントリビューターの募集など、色々な方向性が考えられますが。
(返答終了理由: STOP)
ユーザー: 詳細ダンプして
AI: はい、承知いたしました。 これまでの対話内容を、記録されている情報に基づいて可能な限り詳細に、構造化してリストアップします。
-
開発活動と思考
- 最近は「go-scan」のコード修正に集中しており、「考えること」を怠っていた感覚がある。
- 気晴らしに始めたOSSプロジェクトの手離れが悪く、気になっている。
- 脳内のワーキングメモリを解放したいという思いがある。
- コードベースが全体で約20,000行の規模になり、他者とどう共有していくかを考え始めている。
-
心身の状態
- 今月は体調不良が続き、寝てばかりで仕事がほとんど進んでいない。
- 健康診断のような事務的な作業が来ると精神的に辛くなり、前後数日間は心配で作業が手につかなくなる。
-
パフォーマンス
- 実装したツールのパフォーマンスが、期待していたほどの速度が出ていない。
-
開発環境と方針のミスマッチ
- コーディングエージェント「jules」が得意であるという理由でGo言語を選択している。
- しかし、ご自身の主な利用環境はスマホであるため、Go言語での開発はドッグフーディングがしづらく、相性が悪いと感じている。
- 本来はPWAのような形態がスマホとの相性は良いと考えているが、デプロイの問題から避けたい。
-
目的・動機
- Go言語の標準ライブラリの範囲で、それなりに巨大なコードをエージェントに書かせるという案があった。
- エージェントによる開発の体感を得たい。
- その対象として、少し自明ではない開発目標(インタプリタではなく、シンボル解析的なGoのトレーサー)を設定した。
-
現状の評価と所感
- エージェントに多少の混乱は見られるものの、ある程度の開発の体感は得ることができた。
- 「誰でもよく書くような、ありふれたコード」を実装させてみた経験がないことが、進捗の体感に影響を与えている可能性を感じている。
-
観測されたエージェントの課題
- 指示の無視:
- 事前に読んでほしいドキュメント(補足情報、
AGENTS.md
)を読んでくれないことがある。 - Goの変数名とパッケージ名の衝突解決において、こちらの指示(変数名変更)を無視し、エージェント自身の解決パターン(importエイリアス変更)を優先する傾向がある。これにより大量のビルドエラーが発生し、エージェントが解決を諦める事態につながる。
- 事前に読んでほしいドキュメント(補足情報、
- 混乱する(バグる)ケース:
- Goのコードを入力として、Goのコードを生成させようとする場合。
- インタプリタとは異なる意味論でパーサー(解析器)を作らせようとする場合。
- Go言語自体のコールスタックとは別に、プログラム解析時の独自のスタック情報をログに出力させようとする場合。
- 一つのリポジトリに多数のGoモジュールを作成する場合(特にテスト時)。
- 指示の無視:
-
背景・目的
- 前提: 混沌として依存関係がめちゃくちゃなアプリケーションコードが存在し、
go/packages
のような既存ツールは遅い。buf
やgqlgen
のようなトップダウンなアプローチも採用できない。 - 解決策: 「浅いインポート評価」という手段で、巨大なコードベースから必要な部分だけを高速に読み出し、設定情報として活用したい。このためのライブラリ基盤が
go-scan
である。
- 前提: 混沌として依存関係がめちゃくちゃなアプリケーションコードが存在し、
-
リポジトリ構成
- モノリポ戦略: マイナーなライブラリの情報をLLMに読ませるため、全ての関連コードを一つのリポジトリに集約している。
- 内部コンポーネント:
- ライブラリ:
go-scan
: 遅延インポートと浅い操作によるASTからの情報取得を行うコアライブラリ。minigo
:go-scan
を利用したGoのサブセットインタプリタ。設定ファイルとしての利用を模索。symgo
: シンボル解析ライクな評価器。
- ツール(アプリケーション):
docgen
:symgo
を使い、Web APIのコードからOpenAPIドキュメントを自動生成する。find-orphans
:symgo
を使い、未使用のシンボル(デッドコード)を検出する。- その他、
derivingjson
,derivingbind
,convert
,deps-walk
など多数。
- ライブラリ:
-
現在の課題・悩み
symgo
の開発が難航しており「手離れが悪い」。find-orphans
がメモリを大量消費したり、無限再帰したり、ポリシー適用が難しいなどの問題を抱えている。- 「外からの見え方を整えたい」という思いがある。
- インターフェースがまだ固まっていないため、広く宣伝はしたくないが、将来的には他者に利便性を提供したいと考えている。
(返答終了理由: STOP)
テキストは切り貼り的でこれをそのまま公開するには不足してるな。
とはいえ自分以外に生のログを読んであげようと思うような人もいないだろう。あと随所に光るものがないわけではない。