inkcheck
inkcheck
ink ストーリーのための機械的QA。 コンパイルチェック、制限付きの系統的な分岐探索、ランタイムエラーの再現パス、デッドコンテンツの検出 — ライターとチーム向けのスタンドアロンCLIとして、オプションのCIおよびMCP統合を備えています。
エージェントはここから始めてください → SKILL.md — これを呼び出すタイミング、動作例、MUST/MUST NOT 事項。ファミリー契約: FAMILY.md。
inkcheck は QA ツールであって、ライティングツールではありません。散文の一言も生成、書き換え、外部送信することはありません。あなたが書いたストーリーを機械的にチェックできるようにするために存在します: ink の公式コンパイラでコンパイルし、明示的な制限内で選択肢のパスを探索し、プレイヤーが見つける前に失敗を再現します。
AI を使用していますか?
いいえ。inkcheck 自体は、ストーリーをテストするために AI、機械学習、LLM、生成モデルを一切使用しません。あなたのソースを学習したり、散文の変更を推測したり、ストーリーテキストを書き換えたり、ストーリーコンテンツを AI サービスに送信したりすることはありません。
人間、CI システム、オプションの AI コーディングエージェントがすべて同じ機械的QAチェックを実行できるように設計されています。実際のチェックは決定論的なコードです: 公式の ink コンパイラ、ink ランタイム、制限付き分岐探索、構造化レポート。
Related MCP server: RenForge MCP
2分で試す
Node.js 18 以降が必要です:
npx -y inkcheck path/to/main.ink自分のストーリーを試す前に失敗パスのレポートを見たいですか? 2分間の合成デモ を実行してください。
製品の約束
inkcheck は、ink ストーリーのための制限付き機械的QAです。大規模なストーリーのすべてのパスが機能することを証明するものではありません。明示的な制限内で到達可能なストーリー状態を決定論的に探索し、見つけた問題の正確な再現パスを報告し、カバレッジが部分的であった場所と理由を示します。これにより、作者は安価で繰り返し可能な回帰保険として使用できます。
inkcheck は、大規模なインタラクティブストーリーにバグがないことを証明するものではありません。組み合わせ爆発は現実です: ループ、変数、ランダム性、ホストゲームコードによって、どんなツールも網羅的に訪問できないほど多くの可能な状態が生まれます。
約束はより狭く、より有用です: 機械的なストーリーQAを安価で、繰り返し可能で、実行可能にすること。inkcheck は明示的な制限内で実際に到達可能な選択状態を歩き、実行が部分的だったときに知らせ、失敗を修正後に再実行できる再現パスに変換します。今日壊れたパスを見つけた場合、同じ設定のチェックが明日もそのパスを探すことができます。
これは、その境界が重要だからこそ、オープンソースのQAプロジェクトです。レポートが過大評価している、明らかなパターンを見逃している、より良い走査戦略が必要、または安全に共有できるストーリー形状で失敗する場合は、フィクスチャまたはイシューを持ち込んでください。ロードマップは、部分的なカバレッジをより透明で価値あるものにすることであり、部分的なカバレッジが証明になると見せかけることではありません。
製品の方向性と自己評価
inkcheck の将来価値は、再現可能なハイブリッドから生まれる予定です: 広範なシード付きプローブ、体系的なローカル検査、制限付き多様性探索、およびゲート、ループ、アサーション、ストーリーレットの適格性のための Ink 対応スペシャリスト。スペシャリストは制限を維持しなければならず、ポートフォリオに新しい証拠を通じてより多くの作業を獲得する必要があります。なぜなら、それらも予算の罠になる可能性があるからです。
同じ取引はハードウェアにも適用されます。ローカルCLIとワンショットMCPポートフォリオチェックは、デフォルトで決定論的な1,024状態のライブパイロットを使用します。これにより、小規模で深さに制限があり、作者のフロンティアで飽和したジョブはシーケンシャルに保たれ、制限付きワーカーはオープンな持続フロンティアに対してのみアクティブになります。すべてのパイロット状態は元のグローバル上限の下でカウントされます; 決定を下すために検索が再起動されることはありません。マッチした評価では正確な証拠が保持され、5M状態・深さ100の The Intercept の実行が25.6%改善されましたが、制約付きおよびホスト型ジョブは明示的なシーケンシャル上限を維持します。並行性評価 を参照してください。
評価軸 | 現在 | 10/10 の方向性 |
実用的で再現可能なQA | 8/10 | 編集・CI・エージェントキャンペーン全体での安定した発見と正確なリプレイ |
誠実な制限付きエビデンス | 8/10 | 事実、見積もり、限界、不確実性、証明が常に分離されている |
未知の形状に頑健な探索 | 6/10 | 走査やフィクスチャの過適合なしに、ファミリー横断で幅広い価値 |
構造化スペシャリストの優位性 | 4/10 | ゲート、ループ、境界、ハブが制限付き専門プローブによってテストされる |
ウォールクロックあたりの任意時点価値 | 7/10 | 早期の結果ウィンドウと締め切りが存在; 最初のウィンドウのサイズ設定はまだ固定 |
作者とエージェントの意図 | 8/10 | 安全な不変条件、目標、リソースポスチャ、簡潔な説明 |
実証された一般化 | 4/10 | 事前宣言されたマルチプロジェクトコーパス(本格的な中規模/大規模作品を含む) |
これらは個別のスコアであり、平均ではありません。信頼スコアが高いからといって、失われたランタイムエラーを相殺することはできません。詳細な製品およびエンジニアリングの真実スコアカードは、すべての10/10ターゲット、現在の証拠、エンジニアリング制約、および各エピックまたはリリースで使用される再評価プロトコルを定義しています。最初の完全なポリシー v2 プロモーション評価は、混合証拠をローンチの主張に変えるのではなく、動的割り当てを実験的なままに保ちます。
Inkcheck 0.6 のスコープ
Inkcheck 0.6 は、普遍的に優れた動的検索ポリシーを主張することなく、いつでもQA基盤を提供します。確立された制限付きポートフォリオが検索のデフォルトのままです。ワークロードを意識した並行性は、ライブパイロットが十分な持続的な作業を示したときに結果を前倒しする可能性があります; 耐久キャンペーンは、ソースに束縛された結果ウィンドウに戻って再開し、検査できます; 人間とエージェントは名前付きの時間/リソースポスチャを選択できます; そしてすべての自動決定は帰属可能なままです。ロングテールの拡張、ローテーション、停止はシャドウのみに留まります。3ファミリーのプロモーションゲートが、それらをライブにするのに十分な作者向け価値を確立しなかったためです。
これは完了したリリース契約であり、より大きな研究問題が解決されたという主張ではありません。動的な最初のウィンドウサイズ設定、コンパクトな大規模チェックポイント、プロバイダー帰属のコスト、より広範なエージェント評価、制限付きスペシャリスト探索は、別途追跡されるロードマップ作業のままです。将来のリリースは、チェックされた証拠が同じクリティカル保持、リプレイ、リソース、誠実さのゲートをクリアした場合にのみ、固定ポートフォリオを置き換えるかもしれません。
Inkcheck 0.7: Rules That Matter
Inkcheck 0.7 は、作者が宣言した不変条件を、ローカル設定、CI、MCP だけでなくホスト型チェッカーでも第一級のものにします。ライターは、Webフローで gold >= 0 のようなオプションの数値ルールを1つ追加できます; 実行前に平易な言葉と生成された型付き設定で表示され、通常の制限付きQA中にチェックされ、違反した場合は正確なリプレイ証人とともに報告されます。Webフローは宣言された Ink 変数を検出して選択を支援しますが、サーバーは引き続き権威を持ちます: 未知の変数、無効な型、サポートされていない文法は探索前に失敗します; 一時的なルール設定はアップロードとともに削除されます。エージェントは型付きルール提案をドラフトできますが、黙って承認することはできません。バージョン 0.7.2 はプライベートQAエビデンスピンも追加します: 承認されたランタイム、アサーション、またはゴール証人は、編集後に検索をやり直すことなく再チェックできますが、広範な検証には新たな制限付き実行が必要です。
別のアサーション指向スペシャリストは、引き続きオプトインかつ実験的です。デフォルトの予算を受け取らず、スコアカードを変更せず、事前登録されたエビデンスゲートを通過するまで、より良いカバレッジを主張しません。Rules That Matter 契約 は両方の境界を定義します。
エージェントキャンペーンのポリシー
MCP エージェントは、エクスプローラーの重みを独自に考案する代わりに、高レベルの quick、balanced、deep、overnight、または campaign モードで耐久キャンペーンを開始できます。balanced は新しいエージェントのデフォルトです; fixed は明示的なレガシー制御を保持します。制限付きオーバーライドは、状態/ウィンドウ/時間/メモリ/ディスク/締め切りのポスチャ、希少/均衡/豊富なリソース、優先値(broad_qa、runtime_assertions、outcomes、または approved_goals)、保護されたロングテール作業、および ceilings 対 knee の停止を変更できます。正確なベースウィンドウはアサーション/ゴールなしのままで、再開可能です。保護されたロングテール割り当ては、正確なベースチェックポイントを保持しながら、代替の検索シードとより深いバウンドを持つ決定論的なルート開始ポートフォリオ子を起動します。runtime_assertions キャンペーンは add_assertions で検証済みアサーションウィンドウを追加できます; approved_goals キャンペーンは add_goal で検証済みゴールを追加できます。すべての子は明示的な許可を使用し、個別のエビデンスレポートを保存し、キャンペーン新規のクリティカル、意図、作者ノット、またはターミナルエビデンスに対してのみクレジットを受け取ります。
最初の作者ストーリーのキャンペーン子評価では、The Intercept において、信頼できる古い変数のレビューの手がかりが1件、棄却されたアサーション仮説が1件見つかりました。段階的なゴールは外れ、高予算の子は両方とも5M前にメモリで停止し、500Kの共有ベースは耐久チェックポイントの上限を超えました。これは有望なアサーション価値と明確な警告です: エージェント作成のルールには人間の検証が必要であり、スペシャリストにはプローブから拡張への経済性が必要であり、大規模キャンペーンが日常的になる前にコンパクトなチェックポイントが必要です。
マッチした独立ロングテール評価は、成長する共有フロンティアと保護されたルート開始ポートフォリオパーティションを比較しました。5Mの Intercept キャンペーンでは、共有アームは786,559総状態でメモリにより停止しました; 9つの独立した子は、より低いピークヒープで全5Mを完了し、407に対して3,558件のキャンペーン新規ターミナルバリアントをクレジットしました。新しいクリティカルイシュー、作者ノット、または可視のエンディングは見つかりませんでした。これは、リソース効率の高い多様性と測定可能な逓減利益の証拠であり、普遍的なQA価値の主張ではありません。
その後の3ファミリー0.6プロモーションゲートは、動的な停止または拡張を促進しませんでした。Dog Ink Adventure と Heresy II はどちらも、500Kベースが再開可能なチェックポイントを生成する前にリソース上限に達したため、ロングテールポリシーは何も実行できませんでした。The Intercept では、独立パーティションは1.40 GiBのピークヒープで4.66M状態に到達しましたが、成長するフロンティアは787K状態と3.70 GiBで停止しました; ターミナルの再発見は34%から94%に上昇し、新しいクリティカルイシュー、作者ノット、または可視の結果はありませんでした。inkcheck はこれらの推奨事項をシャドウのみに保ち、動的な最初のウィンドウサイズ設定をより強力な次期製品要件として扱います。
すべての結果ウィンドウは、安定したポリシーID、割り当て理由、測定された優先収量、スループット/リソースの証拠、別のウィンドウに対する不確実性ラベル付きの経験的範囲、何らかの制約条件、および完全な曲線または発見を検査するためのレポートIDを返します。コンパクトな検査は、最新ウィンドウの目的、パーティション、限界収量も示します。ニー(knee)は、優先収量のない3つの連続したウィンドウを必要とし、保護されたプローブを消費することはできません。これは、実際に実行された軌跡に対する制限付きの観察であり、ストーリーがカバーされている、または後の発見が存在しないという主張ではありません。キャンペーンポリシー契約 と MCP結果ウィンドウガイド を参照してください。
After independent children run, the compact decision also includes a versioned shadow-only long-tail recommendation: expand the same family, rotate to another partition, or stop after the protected floor. It uses campaign-new value under the selected preference, reports recent yield per state and second, requires progressively more dry probes for scarce/balanced/abundant postures, and exposes compact selected-value rediscovery plus factual report-local discovery gaps. Older ledgers mark those signals unavailable. Rediscovery is identity overlap with earlier campaign reports, not raw duplicate-state work; widening gaps are observations, not plateau proof. liveEffect: false means this evidence cannot change allocation yet.
Humans can use the same durable policy without learning its controls: inkcheck campaign story.ink runs the balanced intent, while --mode quick, deep, or overnight chooses an outcome-and-time posture. It returns immutable source-bound result windows as work progresses, preserves the latest partial report on a deadline or cancellation between windows, and keeps technical state/time/memory/disk ceilings available as expert overrides. Result windows separate work spent, actionable yield, forecast uncertainty, and whether search can continue. A quiet discovery interval or observed knee is never described as complete coverage.
Quick start
With Node.js 18 or newer:
npx -y inkcheck path/to/main.inkNo global install is required. The first run downloads the pinned official ink compiler, verifies its SHA-256 hash, and processes the story locally.
Project configuration
Commit an inkcheck.yml when a project should use the same entrypoint and bounded CI settings for every human or agent session:
schemaVersion: 1
entrypoint: story.ink
ci:
maxDepth: 100
maxStates: 1000000
goalMaxStates: 250000
seed: 1
storySeed: 1
search: portfolio
concurrency: auto
strict: true
assertions:
- id: gold_nonnegative
description: Gold never goes negative
when: always
condition:
left: { variable: gold }
operator: ">="
right: { literal: 0 }
goals:
- id: depleted_gold
description: Seek paths where the player runs out of gold
condition:
left: { variable: gold }
operator: "<="
right: { literal: 0 }Run inkcheck validate-config to check it. From that directory, inkcheck uses the configured entrypoint and defaults; explicit CLI flags still win. Unknown keys fail validation so unsupported external behavior and edit-policy fields cannot appear implemented. The published contract is config schema v1.
Assertions are typed data, never JavaScript or arbitrary Ink expressions. Operands are variables or scalar literals; comparisons use ==, !=, <, <=, >, or >=, and conditions can compose with all, any, and not. Rules run always, at terminal states, or when entering a named knot. Unknown variables/knots and invalid cross-type comparisons fail before exploration spends its state budget. A violation always fails CI and includes the observed values plus an exact indexed replay witness. A bounded clean run means only “no violation observed”; only an exhaustive run reports the rule as exhaustively verified.
Goals use the same non-executable condition grammar, but guide exploration instead of failing CI. General exploration always receives the full maxStates budget. Set goalMaxStates in config or --goal-states on the CLI to add an explicit deterministic goal-proximity slice; it defaults to zero and the combined budget may not exceed 100,000,000 states. Goals are still observed during ordinary exploration when no extra slice is requested. A reached goal includes exact choice indices; a miss says not_reached_within_limits unless exhaustive exploration actually proves it unreachable. Reports expose baseline, goal, and total budgets separately so steering cannot silently displace general QA findings. See the comparison evidence in search experiments.
For a late compound dependency, replace condition with two or more ordered stages. Each stage uses the same typed grammar. Inkcheck seeks the first unmet cumulative milestone, so a later stage is reached only on a path whose state also satisfies every earlier stage. A missed prerequisite leaves later stages blocked_by_stage; it does not call them unreachable. This first staged contract uses one shared additional goal budget and restarts deterministically from the story root rather than serializing runtime checkpoints.
For a new project containing one .ink file, inkcheck init creates this config. Multi-file projects must name the root with --entrypoint. inkcheck agent-kit --format codex adds the config when needed, a pinned GitHub Actions example, .inkcheck/ artifact ignore rules, and compact version-matched agent instructions. Both commands are idempotent and preflight every target; they refuse the whole operation rather than overwrite or partially modify existing authored files. The npm artifact also includes the canonical skills/inkcheck/SKILL.md, progressive Ink/workflow references, and ten executable golden exercises. inkcheck capabilities --json advertises this as features.bundledAgentSkill and remains the authority for the installed schema contract.
--save-report atomically stores a versioned report under .inkcheck/reports/ and returns its stable content-and-entrypoint-derived ID. A later session can use inkcheck artifacts list --json and inkcheck artifacts show <report-id> --json; reopening reports whether the saved evidence is current, stale, or path_changed against the present entrypoint. Reports can contain story text, variables, and exact witnesses, so the agent kit ignores them by default. See local report artifacts for the trust, privacy, and compatibility contract.
Long base-shared runs can also persist their exact live frontier locally. Start with --search=shared --no-min-repro --save-checkpoint, then continue later with inkcheck resume <checkpoint-id> --max-states N; N is the larger total grant, not extra hidden work. inkcheck checkpoints list/show reports bounded metadata, durable compressed size, storage encoding, and source freshness. New checkpoint files are streamed gzip artifacts; older plain schema-v1 JSON remains readable. Checkpoints are private, atomic, source/config-bound, ignored by default, and retention-capped; they may contain authored text and runtime state. See local resumable checkpoints. MCP agents can use the same exact foundation through durable start_search / inspect_search / continue_search / cancel_search result windows. They can also use add_goal for an explicit additive directed probe that starts from the story root and leaves that exact base frontier untouched. Portfolio, shared-variable, assertions, directed-frontier resume, and hosted jobs do not use this checkpoint contract yet.
Hosted checker
The repository now includes a self-hosted web interface for writers who do not want to use a terminal. Hosted mode temporarily uploads authorized .ink source, offers Quick (earlier 250K-state result) and Balanced (deeper 1M-state result) intents, creates a short-lived private job, streams real work, yield, and uncertainty signals, and deletes the temporary job directory after completion, cancellation, or failure. Completed hosted checks return a source-bound result-window identity and stable finding IDs. It does not make reports public or retain story text in application logs. Optional first-party usage metrics keep daily aggregate counts plus a privacy-preserving, approximate daily unique-browser estimate: no IPs, user agents, browser tokens, or visitor profiles are retained.
The local CLI remains the privacy-first option because no story upload occurs. See Hosted checker deployment for the threat model, Docker deployment, operating limits, and a current sub-$50/month budget.
What it catches
Compile errors and warnings — broken diverts, unresolved variables, loose ends, with file and line numbers (via inklecate, the official compiler)
Runtime errors with a reproduction path — the exact sequence of choices that triggers a divide-by-zero, a bad external call, or out-of-content, e.g.
repro: [Enter in darkness → Descend to the cellar]Possible non-terminating forced choice cycles — a conservative review warning when the only available choice returns to the same control state with the same author-visible variables; optional exits, random behavior, turn counts, visit counts, and EXTERNAL calls are intentionally excluded
Unvisited content, triaged — knots no explored path visits within the configured limits, each classified with an inbound-divert scan: "no authored divert points here — possible orphan" versus "has inbound diverts — likely beyond this run's limits"
Distinct terminal states — with a choice trail that reaches each one; differing final variables are retained as distinct outcomes
vs. the alternatives
Catches syntax errors | Explores choice branches | Finds unvisited content | Repro path for crashes | Runs in CI | |
| ✓ | — | — | — | ✓ |
Manual playtesting | — | only what you click | by luck | if you remember your clicks | — |
Ink-Tester | ✓ | random repeated runs | line coverage | limited | manual/CLI |
inkcheck | ✓ | systematic + seeded random, bounded | knot coverage | ✓ | ✓ |
The compiler tells you the story is valid. Clicking through tells you the paths you happened to click work. Ink-Tester repeatedly samples random playthroughs and reports line-level frequency; inkcheck instead walks choice states systematically and returns short failure paths. The key difference is repeatability: after you fix a reported path, the same configured run can check that path again. The approaches are complementary, especially for stories with randomness or engine integrations.
Example
$ inkcheck examples/manor.ink
✓ compiled — 92 words, 7 knots, 6 choices
✓ explored 18050 states within limits (depth 100, 10000000 states, seed 1) — exhaustive (every reachable state visited) — 5 distinct terminal state(s)
terminal via [Enter in darkness → Search the study → Leave with your loot]: "You slip out the servant door, heavier by half a purse."
...
✗ 1 runtime error(s):
obj is null or undefined (at cellar.3)
repro: [Enter in darkness → Descend to the cellar] (found by dfs:last)
⚠ 1 knot(s) never visited on any explored path — unreached is not necessarily unreachable:
treasure_vault (manor.ink line 35) — no authored divert points here — possible orphanWhen a run is cut short, the report names the limit that actually bound it — for example ⚠ coverage is partial, not a proof — paths were cut at 30 choices deep; raise --max-depth to follow longer trails. Depth and state budget are separate axes: in local runs on The Intercept, raising --max-depth from 30 to 100 reached more late-story content with a 1,000,000-state budget than a 10× larger budget did at depth 30.
Exit code is non-zero on compile or runtime errors. Add --strict to also fail on warnings, unvisited knots, truncation, or external stubs, so partial coverage cannot silently pass CI.
A story does not have to be long to exceed the default budget. Inkle's published The Intercept is considered a relatively small source file by the community, yet Inkcheck still reports it partial at 5,000,000 states: branching plus persistent variables creates a reachable-state graph far larger than the visible choice count suggests. Exhaustion is an observed proof, not an expectation inferred from source size. A finite-valued story may be exhaustible in principle but impractical to enumerate; turn, random, or unbounded variable state can make the semantic graph unbounded. A bounded run stops on whichever comes first — state, depth, time, or memory — and says which. The hosted checker caps shared jobs at 1,000,000 states; larger jobs (up to the CLI's 100M ceiling) belong locally. See Performance and memory for sizing guidance.
1回の実行内で、inkcheckは状態予算を相補的な探索パスに分散して使うので、単一の走査順序にすべてを賭けることはありません。現在のCLIポートフォリオは、最後の選択肢優先・最初の選択肢優先・内側から外側へのDFSスライスを探索し、決定的パスが繰り返しがちな初期選択プレフィックスを変えるシード付きランダムサンプリングスライスを追加し、BFSのようにレベルごとに進みながら変数シグネチャの系統ごとに1つの状態を保持するフロンティア上限付きダイバーシティビームを追加し、さらに再現パスを短縮するための小さな幅優先スライスを確保します。ランダムスライスは固定のデフォルトシードを使用し、ビームはシードをまったく必要としないため、CIで実行の再現性が保たれます。報告されるすべてのエンディングとランタイムエラーは、それを見つけたパス(とシード)を明示します。これにより、同じ--max-states制限下でも、より多くのエンディングと到達可能なノットが見つかることがよくありますが、それでもこれは制限付きQAです。切り詰められたレポートは有益な証拠であり、網羅的な証明ではありません。
--search=sharedは実験的な代替手段を選択します。deep、novelty-first、シード付きの各ビューは、1つの重複排除済みフロンティアから引き出され、各到達可能状態は最大で1回だけ展開されます。これにより、複数の戦略が同じ状態を再発見してしまうような場合に、限られた予算をより効率的に使えます。JSONテレメトリは、保留中およびアクティブなチェックポイントJSON/変数、保持された証跡祖先、重複排除インデックスとセマンティックインデックス、フロンティア参照、発見結果を分離し、解放された祖先と古いビューの圧縮も報告します。これらは決定的に算出されたペイロード/構造の見積もりであり、正確なV8ヒープ使用量ではありません。これはまだデフォルトではありません。一部の初期選択構造では、ポートフォリオの独立したランダムパスとビームパスの方が依然として有利な場合があるためです。
長時間実行されるsharedジョブを評価するライブラリ利用者は、exploreSharedResumable(...)を使用できます。予算が残っている場合、正確なライブのbase-sharedフロンティアを含む、ソースに結び付けられたバージョン付きJSONチェックポイントを返します。後続の呼び出しで総グラントを引き上げ(たとえば100kから1mへ)、最初の100kを再実行することなく続行します。分割実行の等価性は、中断のない実行との比較で回帰テストされています。これはエンジンの基盤であり、まだCLIの永続化機能ではありません。チェックポイントには、作成されたテキスト、変数、ランタイム状態、証跡パスが含まれることがあり、スキーマv1はアサーション、ゴール、変数/ゴール対応のsharedモードを意図的に除外しています。shared checkpoint schema v1を参照してください。
--search=shared-variableはより限定的な実験です。sharedフロンティアの選択の12.5%を、珍しい変数スナップショットまたは遷移を通じて到達した状態に割り当てます。このブーストには上限があり、deep、novelty-first、シード付きの各ビューは引き続き有効です。機械駆動のストーリーレットグラフには役立つことがありますが、一様に優れているわけではありません。チェックイン済みの比較表には、改善と後退の両方が含まれています。
アダプティブポートフォリオは、汎用のデフォルトとして残ります。実験モードはその重みや動作を変更しません。inkcheckの検索戦略ポリシーは、将来デフォルトを変更する前に必要となるベンチマークの範囲と回帰ゲートを定義しています。
制限付き検索とランダムサンプリング
inkcheckは、非自明なストーリーのすべての可能な状態を訪問することを約束するものではありません。分岐、ループ、変数、ランダムな動作、ホストゲーム統合により、網羅的なカバレッジが物理的に非現実的になることがあります。ランダムサンプリングに対する実際的な利点は再現性です。同じストーリーと制限が与えられれば、inkcheckは選択グラフを体系的に歩き、失敗に対して正確な選択パスを返し、未訪問ノットの手がかりを報告し、実行が部分的であったことを明示します。
ランダムサンプリングは、特にランダム性や巨大な状態空間を持つストーリーでは依然として有用です。これらのアプローチは相補的と見なしてください。ランダムなプレイは意外なパスに偶然出会うことがありますが、inkcheckは宣言された予算内で決定的でCIに適した証拠を提供します。
The Interceptの深さ制限30でのローカルテストでは、予算を増やすとより多くの終端状態が見つかりましたが、完全なカバレッジを証明するには至りませんでした。タイミングは1台のローカル開発マシンによるものであり、普遍的なベンチマークではなく、スケールの証拠として読むべきです。
状態予算 | 時間 | 異なる終端状態の数 | ランタイムエラー | 未訪問ノット | 結果 |
50,000 | 9.4s | 7 | 0 | 9 | 切り詰め |
100,000 | 19.9s | 10 | 0 | 9 | 切り詰め |
500,000 | 100.2s | 17 | 0 | 8 | 切り詰め |
1,000,000 | 205.5s | 25 | 0 | 8 | 切り詰め |
それが意図された解釈です。各実行は実際に到達可能な状態をテストし、実際の壊れたパスを表面化させることができますが、切り詰められたレポートは訪問された内容についての証拠であり、すべてが到達可能であるか正しいことを証明するものではありません。
パフォーマンスとメモリ
デフォルトの予算は10,000,000状態で、上限は100,000,000です。そのため、大規模な実行にどれだけコストがかかるかを知っておく価値があります。実行を制約するリソースは2つあります。時間とメモリです。小さなストーリーや使い尽くせるストーリーはどちらにも触れません。体系的パスが到達可能空間の完全性を証明した瞬間にポートフォリオは早期終了するため、inkcheck small.inkはデフォルトに関係なく、その持っているわずかな状態で完了します。以下の数値が重要になるのは、大規模で網羅不可能なストーリーの場合だけです。
時間は探索した状態数にほぼ線形にスケールします。ある開発マシンでは、The Interceptは100万状態あたり約200秒かかりました(上の表を参照)。したがって、10M状態の実行は数十分、100M実行は数時間になります。ローカルCLIには壁時計時間の制限がないため、CIや対話的な使用では、デフォルトに頼るのではなく、実際に必要なカバレッジに--max-statesを固定してください。あるいは、デフォルトのまま--progress(対話的ターミナルではデフォルトでオン)を付けて実行し、進行を監視して中断できるようにしてください。
メモリは異なる成長率を持つ項の合計であり、上限が危険ではなく高い理由です。
増大するもの | スケールの仕方 | 備考 |
重複排除ハッシュセット ( | ほぼ線形、異なる状態あたり≈200バイト | 支配的な項です。inkcheckは状態そのものではなく状態ごとのハッシュを保存するため、数百万の状態を扱うことが可能になっています。 |
DFS / ビームフロンティア | フラット | DFSは深さに制約され、ビームには厳格なフロンティア上限があります。どちらも予算に応じて増大しません。 |
ランダムサンプリング | フラット(O(発見数)) | 重複排除構造を保持しません。 |
BFS再現短縮フロンティア | 唯一の超線形リスク | 深く、ループが少なく、分岐の多いストーリーでは膨張する可能性があります(研究実行では約631Kの完全状態がキューに入りました)。 |
実験的な共有フロンティア | 形状依存、潜在的に線形 | 直列化された保留中チェックポイントと証跡祖先を保持します。レポートはコンポーネントごとのハイウォーターマークを公開します。オプションの |
そこから得られる2つの実用的な経験則:
状態だけでなくヒープにも予算を割り当てる。 最悪ケースの見積もり(状態の重複排除なし)として、異なる状態1,000万ごとに約2GBのヒープを計画してください。ループのあるストーリーは重複排除が大きく進み、はるかに少ないメモリで済みます。重複排除が少ないストーリーは最悪ケースに近づきます。したがって、10M状態の実行の最悪ケース(約2GB)はNodeのデフォルトのヒープ上限付近になります。ループ中心のストーリーはその上限を十分に下回りますが、大きな低重複のストーリーは、デフォルトの予算でも終了前にメモリガードに達する可能性があります。1億状態の実行は通常のデフォルトヒープを超えるため、
--max-old-space-sizeを引き上げない限り、ガードで停止します。いずれにしても、部分的なレポートとともにクリーンに停止します。ガードがあるからこそ、高い上限を安全に設定できるのであり、実行が完了するという約束ではありません。メモリガードが真の制限要因であり、上限ではありません。 実行はV8ヒープの85%(または
--max-memory)でクリーンに停止し、クラッシュせずにtruncatedBy.memoryを含む部分的なレポートを返します。したがって、--max-states 100000000を設定しても無謀ではありません。通常のマシンでは、上限ではなくガードが停止位置を決定します。さらに進めるには、Nodeにより多くのヒープを割り当ててください。NODE_OPTIONS=--max-old-space-size=8192 inkcheck big.ink --max-states 100000000安全制限は効率の決定ではありません。 状態・時間・メモリの上限は「このジョブはどこまで進めてよいか」に答えるものです。マシン全体を使うことが価値があるとか、見かけ上のプラトーが完了であると主張するものではありません。0.6リサーチパスは、時間経過に伴うポートフォリオへの新規発見数、スループット、リカバリギャップ、ピークRSS、保持フロンティアのバイト数を測定し、将来のquick/balanced/deepポリシーが、ロングテールのプローブを確保しつつ、有用な結果ウィンドウを選択できるようにします。固定制限はCIと監査のために引き続き利用可能です。
ストーリーが大きすぎて完了できない場合の、影響度順のレバー: --max-old-space-sizeを引き上げる(より多くのヘッドルームを得る)、--no-min-reproを渡す(超線形のBFSフロンティアを削除する)、--max-statesを下げる(時間とメモリの両方を制限する)、またはストーリーを分割して各部分を個別にチェックする。実験的なsharedモードでは、保留中チェックポイントのキュー自体に厳しい上限が必要な場合は--max-frontier-memoryまたは--max-frontier-statesを設定し、そのレポートが有用な証拠が引き続き到着していることを示す場合にのみ、そのエンベロープを引き上げてください。nextRunの判定は各実行後に制約となった上限を明示するため、どのレバーが該当するかがわかります。
測定済みのリソース安全なディープラン評価には、作成された5M上限ジョブでガードがどのように動作するかが記録されており、sharedフロンティアの保留状態と直列化バイトのハイウォーターマークの証拠も含まれています。
MCPサーバー
inkストーリーに取り組むAIエージェント向けのツール:
ツールまたは論理操作 | 機能 |
| バージョン管理されたスキーマ、制限、検索モード、明示的な機能の有無 |
| ソースのみのプロジェクトマップ: includes、形状、セマンティクス、外部参照、knots、変数、静的コンディションゲート |
| 構造化されたコンパイル問題(重大度、ファイル、行) |
| 永続的な正確な共有検索結果ウィンドウを1つ開始し、ベアラー能力を受け取る |
| 発見後検索、キャンペーン、ファインディング、リプレイ、リグレッション、アサーション、ゴール、キャンセル、プレイテスト操作を1つの境界のあるスキーマにルーティング |
Claude Code に追加:
claude mcp add inkcheck -- npx -y inkcheck mcpまたは任意の MCP クライアント設定:
{
"mcpServers": {
"inkcheck": { "command": "npx", "args": ["-y", "inkcheck", "mcp"] }
}
}デフォルトの MCP プロファイルは5つのツールを公開します: inkcheck_capabilities、inspect_story、compile_story、start_search、inkcheck_workflow。これにより、新しいエージェントのブートストラップコンテキストを小さく保ちます。capabilities はルーターの論理操作とリクエストフィールドを一覧表示します。INKCHECK_MCP_PROFILE=full は、すべての操作を個別の名前付きツールとして必要とするクライアントでのみ設定してください。
コンパクトなエージェントループは、inkcheck_capabilities -> inspect_story -> compile_story -> start_search -> ファインディング/リプレイ/リグレッション操作を inkcheck_workflow 経由でルーティング -> 修正 -> コンパイルと検証、です。結果ウィンドウセッションは、永続的で、境界があり、ページングされ、ソースにバインドされているため、デフォルトのエージェントパスです。論理操作 start_campaign / continue_campaign は、同じ正確な共有フロンティアの周囲に集約ポリシーと測定された支出/来歴を追加します。通常の start_search / continue_search は、明示的な累積付与制御を保持します。呼び出しは同期であるため、キャンセルは返された永続的な境界では信頼できますが、ウィンドウ途中のプリエンプションでは信頼できません。inspect_search はプライバシー最小限のままです。add_goal は、正確なベース検索を弱めることなく、別途報告される指示付き予算を消費できます。replay_witness は、1つの現在のトランスクリプト、選択トレイル、変数状態を返す明示的な境界です。実行時障害、アサーション違反、承認済みゴールウィットネスの場合、編集前に pin_regression を使用し、編集後に check_regression を使用すると、検索を再実行せずに1つの正確なプライベートウィットネスをリプレイします。ピンは広範な再検証ではありません。意味のある編集後は、新しい境界のある検索を実行してください。QAエビデンスピン、バンドルされたスキル、MCP結果ウィンドウセッションを参照してください。
作成者またはエージェントがストーリールールを提案する場合、inkcheck_workflow は最初に review_contract を実行できます。このレビューは、型付きアサーションとゴールをコンパイル済みストーリーに対して検証し、既存のコントラクトを一覧化し、作成者の承認を要求し、デフォルトでは指示付き予算ゼロで広範なQAを推奨します。これは読み取り専用です。設定を編集したり、検索予算を消費したり、ゴールプローブを黙って昇格させたりすることはできません。エージェント指示型QAコントラクトを参照してください。
CLI
inkcheck capabilities [--json]
inkcheck inspect <story.ink> [--json]
inkcheck <story.ink> [--max-depth N] [--max-states N] [--seed N] [--story-seed N] [--search=portfolio|shared|shared-variable] [--concurrency auto|N] [--max-frontier-states N] [--max-frontier-memory MB] [--auto] [--profile] [--next] [--no-min-repro] [--strict] [--save-report] [--save-checkpoint] [--progress=auto|human|ndjson|off] [--human|--json|--json-stream|--markdown]
inkcheck artifacts list [--json]
inkcheck artifacts show <report-id> [--json]
inkcheck artifacts findings <report-id> [--limit N] [--cursor C] [--json]
inkcheck artifacts finding <report-id> <finding-id> [--json]
inkcheck artifacts replay <report-id> <finding-id> [--json]
inkcheck artifacts delete <report-id> [--apply] [--json]
inkcheck artifacts prune --keep N [--apply] [--json]
inkcheck checkpoints list [--json]
inkcheck checkpoints show <checkpoint-id> [--json]
inkcheck resume <checkpoint-id> --max-states N [--json]
inkcheck mcp # start the MCP server on stdioinkcheck capabilities --json を使用すると、エージェントはスキーマバージョン、制限、検索モード、明示的にサポートされている機能または利用できない機能を、それらに依存する前に確認できます。inkcheck inspect story.ink --json は、コンパイルや探索を行わずに決定論的なソースのみのディスカバリを実行します。プロジェクトローカルの includes を追跡し、ストーリーの形状、セマンティクス、外部参照、knots/関数、変数の宣言/読み取り/書き込み、実際の代入箇所を伴う静的コンディションゲートの境界のあるマップを返します。永続的な MCP セッションは、明示的に選択されたサポート済みゲートを、別の境界のある probe_gate ゴール実行に変換できます。そのルート起点のプローブは、正確なベースフロンティアを保持し、ウィットネスまたは境界のあるミスを報告します。ゲート検査と代入箇所は前提条件のヒントであり、到達可能性の証明やデフォルト検索割り当ての変更ではありません。複合ゲート検査コントラクトとエージェントディスカバリコントラクトを参照してください。
ゲートプローブ評価プロトコルは、初期選択のコンビネーションロックとオプトインの5M The Intercept セルにおいて、通常の共有検索を同じ予算の明示的プローブと比較します。これは、さらなる前提条件のステアリングが価値があるかどうかの証拠であり、カバレッジやプロモーションの主張ではありません。
JSON チェックは、バージョン管理されたレポートスキーマを使用します。ファインディングには安定した ID と正規化された種類があります。終了および実行時エラーのウィットネスは、人間が読める選択テキストとゼロ起点の選択インデックスの両方を保持するため、重複したラベルも playtest_story を通じて正確にリプレイ可能です。エンベロープは、確立された compile、stats、explore、nextRun セクションを保持しながら、Inkcheck バージョン、コンパイル済みストーリーフィンガープリント、有効な設定、バインディング制限、観察専用の shadowDecision を記録します。
--concurrency auto はローカルポートフォリオのデフォルトです。これは4レーンの上限を設定するものであり、無条件の4ワーカーではありません。1つの内側から外側への DFS パスは最大1,024状態で実行され、その後、バージョン管理された分類器は、ストーリーが尽きた場合、深さが制約になる場合、作成された knots がすでに飽和している場合、ハードウェアが1コアの場合、またはメモリが安全にワーカーを供給できない場合に、シーケンシャルのままになります。開かれた持続フロンティアは、そのライブパスを親プロセスに保持し、未処理のパスは永続ワーカーで開始されます。--concurrency 1 はハードなシーケンシャルオプトアウトです。明示的な値 2〜16 は、ワークロード分類なしで固定ワーカー上限を維持します。共有検索と加算ゴール実行は、互換性のない固定値が明示的に要求されない限り、自動的にシーケンシャルのままになります。
レポートは、concurrencyMode、解決された上限、アクティベーションポリシー/決定/理由、パイロット作業、有効なワーカー数、集約ヒープ計画、重複評価(本番ポリシーではゼロ)を公開します。ワーカー障害は、最新の完了したエビデンスを保持し、truncatedBy.worker を報告します。状態予算による停止を装うことは決してありません。ホステッドデプロイメントは、独自の明示的なジョブごとの上限を渡し、本番コンテナではデフォルトで1になり、実際の子プロセスのキャンセルは一時アップロードをクリーンアップします。ピーク RSS は、V8/ランタイムオーバーヘッドがヒープではないため、より高くなる可能性があります。分類器はワークロードの形状を推定するのであって、カバレッジの完全性を推定するわけではありません。
MCP はデフォルトでコンパクトなマシン出力を使用します。検査は16 KiB に制限され、コンパイル、統計、ワンショット探索、結果ウィンドウ応答は32 KiB に制限されます。出力の省略は、境界のある検索の切り詰めとは別に報告されます。完全なストーリーを含むレポートは、明示的な詳細またはドリルダウン呼び出しを通じてのみ利用可能です。
保存されたレポートは、完全なレポートを読み込まずに、境界のあるファインディングのドリルダウンをサポートします。artifacts findings は、デフォルトで最大20件のプライバシー最小限のサマリー(最大100件)とレポートにバインドされたカーソルを返します。サマリーは、ストーリーの散文、変数、選択テキスト、ウィットネスパスを省略します。artifacts finding は、1つの完全な安定したファインディングを取得します。artifacts replay は、保存されたエントリポイントを再コンパイルし、保存されたストーリーシードを使用してそのファインディングのインデックス付き選択を追跡します。ただし、アーティファクトの鮮度が current の場合のみです。古い、または移動されたソースはフェイルクローズします。
レポートストレージはプライベートで境界があります。1つのレポートは最大256 MiB、1つのプロジェクト内のすべてのレポートは最大1 GiB を使用できます。どちらかの上限を超える保存は、古いエビデンスを削除せずに失敗します。artifacts delete と artifacts prune --keep N はデフォルトでプレビューし、--apply でのみ変更します。prune はエントリポイントごとに最新の N 個のレポートを保持し、1回の呼び出しで最大100件を削除します。この明示的なライフサイクルにより、別の実行が完了したという理由だけで安定したレポート ID が消えることはありません。
メンテナは、マニフェスト駆動のシャドウポリシー評価器を使用して、独立した予算実行間のシャドウ推奨を比較できます。別の検索プロモーションベンチマークは、チェックインされた20ファミリーのコーパスと、固定された同意安全な作成プロジェクト層にわたって、対応するベースライン/候補マトリクスを実行し、リソース観測と最悪ファミリー/プロジェクト損失を報告し、勝者を宣言することはありません。最初の作成プロジェクト評価では、セルが完了した場所で同等性と、意味のあるプロジェクト形状のリソース制限が見つかり、policy-v2 の利点は見つかりませんでした。どちらのツールも、境界のある大規模実行をオラクルと呼んだり、デフォルトポリシーを変更したりしません。
--max-depth は1〜1,000、--max-states は1〜100,000,000 を受け付け、デフォルトの予算は10,000,000 です。これらのハードな上限により、不正な自動化入力が偶発的に探索境界を無効化することを防ぎます。デフォルトが意図的に野心的なのは、3つのことが大きな予算を無謀ではなく安全にするからです。完全に探索可能なストーリーは、体系的なパスが網羅性を証明した瞬間に早期終了する(そのため小さなストーリーはほんのわずかな状態で完了する)、メモリガードがメモリ不足クラッシュの前にきれいに停止する、進行状況レポートにより長時間の実行を監視して中断できる。したがって、大規模で網羅的でないストーリーはその予算を使用します — CI で実行する前にパフォーマンスとメモリを参照し、カバレッジの深さよりも実行時間の制約が重要な場合は、そこでより小さな --max-states を固定してください。
--max-states は実行の総予算であり、単一の DFS ウォークがすべての状態を消費するという約束ではありません。デフォルトでは、CLI はその予算のほとんどを、選択ツリーの3つの補完的な DFS ビューと、シード付きランダムサンプリングスライスに分割し、短い失敗および終了の再現パス用に小さな幅優先スライスを保持します。幅優先の短縮がより広範な検索ほど重要でない場合は、--no-min-repro を使用して、その再現スライスを DFS ポートフォリオに費やします。
--seed(デフォルト1)は、Inkcheck のランダムサンプリング検索スライスのみを制御します。--story-seed(デフォルト1)は、RANDOM() とシャッフル動作のための Ink の初期ランタイム RNG 状態を独立して設定します。再現可能な CI と正確なウィットネスリプレイのために両方を固定してください。--seed を変更して異なる選択ウォークをサンプリングするか、--story-seed を意図的に変更して別の有効なストーリーランダム性シーケンスを実行してください。作成された SEED_RANDOM(...) コマンドは引き続き有効で、初期ストーリーシードを上書きできます。Inkcheck は両方のシードを記録し、リプレイ指示に storySeed を含めますが、1回の実行で考えられるすべてのストーリーシードを列挙するわけではありません。--json 出力の各ファインディングの foundBy フィールドは、それを発見したパスを指定します。例: dfs:last または random:seed=1。
--search=shared は実験的な共有状態マルチフロンティアエンジンを選択します。--search=portfolio は変更されていないデフォルトです。共有モードは固定シードに対して決定論的であり、深さ、状態、メモリ、時間、進行状況、再現短縮制御を引き続き尊重します。
--save-checkpoint は、通常の共有検索よりも意図的に狭い範囲です。同じコマンド内で --search=shared --no-min-repro を必要とし、アサーション、ゴール、--auto、--next、レポートアーティファクトを許可しません。ライブ作業が残っている場合、JSON 出力にはソースにバインドされたチェックポイント ID が含まれます。inkcheck resume <id> --max-states N は、ソースと検索バインディングが一致し、N がチェックポイントの以前の総付与を超えることを要求します。次世代を自動的に保存します。完了した検索とリソース停止された検索は、再開可能なチェックポイントをでっち上げずにレポートを返します。
--search=shared-variable は、共有検索に小さな変数レアリティフロンティアを追加します。観測された珍しい変数値を優先し、機械的に変更します。AI を使用したり、ストーリーの意味を理解したり、どの値が望ましいかを推論したりしません。
--max-frontier-states と --max-frontier-memory は、保持された保留中チェックポイントに対するオプションの共有検索セーフティエンベロープです。どちらにもデフォルトはありません。Inkcheck は低い普遍的なフロンティア上限を課しません。明示的なエンベロープが制約として働く場合、実行は発見内容を保持し、truncatedBy.frontier を報告し、その停止を状態予算の枯渇と誤って表示しません。同じ制御は ci.maxFrontierStates / ci.maxFrontierMb および MCP の explore_story 入力としても利用できます。
--max-memory <mb> は、実行全体がクリーンに停止するまでに使用できるヒープ量を制限します。V8 ヒープのメモリ不足によるアボートは事後には捕捉できないため、inkcheck は探索中にメモリを監視し、クラッシュする前に停止して、これまでに見つかったすべてを保持し、実行を失う代わりに部分レポート付きで truncatedBy.memory を報告します。明示的な上限では、最終結果の構築とフラッシュのために最大 25%(最大 1 GiB)を保持します。制限付きストリームは、完全なエンベロープとより低い検索ウォーターマークの両方を報告します。デフォルトの上限は V8 ヒープ制限の 85% です(設定した NODE_OPTIONS=--max-old-space-size が尊重されます)。そのため、控えめなハードウェアでの大規模な実行は停止するのではなく、グレースフルに劣化します。明示的な値を渡すと、上限を厳しくしたり緩めたりできます。メモリ停止時、nextRun の判定は investigate です(--max-old-space-size を上げる、--max-states を下げる、またはストーリーを分割する)。broaden は決してありません。予算を増やしても、より早く限界に達するだけだからです。
--max-time <s> は、合計の壁時計時間に相当する制御です。期限はコンパイルとソーススキャンの前に開始し、実行は保持した発見をマージして結果をフラッシュするために、付与時間の 10%(最小 250 ms、最大 60 秒)を保持します。探索は状態予算まで実行する代わりに truncatedBy.time で停止します。ローカル CLI にはデフォルトの時間制限はありません。これは CI や、実行時間を制限しつつもそこまでの発見を必要とするあらゆるコンテキストを対象としています。メモリガードと同じ、グレースフルな部分報告の考え方を時間に適用したものです。ホスト型 Web チェッカーはこれを、ハードタイムアウトの直前に自動設定するため、遅いストーリーは強制終了される代わりに部分レポートを返します。
--profile は、ストーリーの安価な静的シェイププロファイルを出力します。変数とその代入位置、選択肢の密度、最も長い divert パスに加えて、inkcheck がそのシェイプに対して選択する深さ制限とパスの重みも出力します。探索は実行されません。--auto はこれらの提案を適用します。静的 divert パスがデフォルトを上回る場合に --max-depth を引き上げます(下げることはなく、明示的なフラグが常に優先されます)。そして、プロファイルのパスの重みをポートフォリオに渡します。メインパスが 40 選択肢の深さのストーリーでは、デフォルト設定は何も見つけられませんが、--auto はエンディングに到達し、約 111 状態でそのストーリーが網羅されていることを証明します。
対話型ターミナルでは、デフォルトで簡潔なライブ進行行が表示されます。実際のフェーズ、設定された作業予算に対する探索済み状態数、発見数、経過時間です。--progress=human は CI ログ用に読みやすいスナップショットを強制し、--progress=ndjson はエージェントやパーサー向けのバージョン付きイベントを書き出し、--progress=off は進行状況を無効にします。これらのパーセンテージはどれもストーリーのカバレッジを主張するものではありません。最終的な stdout レポートが引き続き信頼できる情報源であり、進行状況にストーリーの散文、選択肢、変数、ソーススニペットが含まれることはありません。
すべてのレポートには nextRun 判定も含まれます。これは小さな閉じた語彙(stop、deepen、broaden、reseed、investigate)であり、レポート自体から決定論的に計算され、具体的なフラグ、使用したフィールドを引用する根拠、証拠に裏打ちされた期待利益を伴います。--next はこれに基づいて動作します。チェック後、inkcheck は推奨されるエスカレーションを適用して再実行します。最大 3 回まで、stop/investigate 判定、フラグの上限、またはエスカレーションした実行が新しいものを何も見つけなかった場合(不動点)に停止します。実行ごとのトレイルは --json 出力の runs に入ります。ホップの説明は stderr に送られ、機械出力はクリーンに保たれます。推奨事項は文書化されたハード上限を決して超えません。フラグの増加に証拠がない場合、判定は investigate に格下げされ、見直す価値のあるノットを指し示します。
GitHub Actions:
- uses: actions/setup-node@v4
with: { node-version: 22 }
- name: Check the story and publish a readable summary
shell: bash
run: |
set -o pipefail
npx -y inkcheck story/main.ink --strict --markdown --max-states 500000 | tee -a "$GITHUB_STEP_SUMMARY"この例は --max-states 500000 を固定しているため、ジョブの実行時間は予測可能です。デフォルトの予算は 10,000,000 であり、大規模で網羅的でないストーリーは実際にこれを消費します(パフォーマンスとメモリ を参照)。最大カバレッジよりも実行時間の制約が重要な場合は、CI で予算を固定してください。
--strict は、警告や未訪問のノットだけでなく、探索が切り詰められた場合や EXTERNAL 関数をスタブする必要があった場合にも失敗します。これにより、部分的なチェックが緑色の「完了」バッジをまとうことを防ぎます。
ライター向けのセットアップとレポート解釈のヘルプについては、InkJam QA ガイド を参照してください。
誤解を招く結果を見つけましたか?公開 issue フォームを使用して、誤った結果や見逃した結果を報告する、ライセンス済みの最小フィクスチャを提供する、または オプトインの QA クリニックチェックをリクエストする ことができます。非公開、秘匿、またはジャム制限付きのストーリー素材を公開 issue に添付しないでください。
人間、CI、エージェント向け
inkcheck は、ターミナルで操作する人間、CI ジョブ、またはオプションの AI コーディングエージェントによって駆動できます。ツール自体は依然として AI を使用しません。エージェントは単に CLI または MCP サーバーのもう 1 つの呼び出し元です。
機械可読インターフェース: リポジトリルートの
tool.jsonは、CLI フラグ、MCP ツール、終了コード、--json/--json-streamの出力形式を 1 つのファイルで説明します。--jsonは、レポート全体を単一の JSON オブジェクト({ compile, stats, explore })として stdout に出力します。見栄えのする出力をスクレイピングする代わりにこれをパースしてください。explore.passesは、制限付きのパスローカルなdiscoveryCurve(「このエクスプローラーが見つけたもの」)と、ポートフォリオ専用のportfolioMarginalCurve(「このエクスプローラーが最初に追加したもの」)を保持し、正確な終端、可視の結果、ランタイムエラー、アサーション、ゴール/ステージ、ノット、および比較可能な新規性を分離します。サマリーは、圧縮後でも最初/最新の発見状態とドライギャップの事実を保持します。ポートフォリオレポートには、実際のインターリーブ実行順序での実行全体のカーブも含まれます。壁時計時間は進行イベント内では観察用のままです。explore.scheduleは、適応型ラウンドが予算をどのように使ったかを示します。バージョン付きのshadowDecisionは、将来の anytime ポリシーが何を推奨するか、そしてその理由を示します。保護されたパスごとの下限や不確実性も含まれます。これは観察専用です(applied: false)。今日の検索を変更することはなく、制限付きカバレッジが証明であると主張することもありません。--json-streamは、発見証拠が保持された際に、再生可能な数値の発見証拠を NDJSON として出力し、その後、完全な拡張レポートやレポート 1 つ分のサイズの JSON 文字列を実体化する代わりに、制限付きの最終サマリーを出力します。現在は--concurrency 1が必要で、1 回の探索実行のみをサポートし(--nextや--profileは不可)、--save-reportとは組み合わせられません。予約済みの数値タグモードは、オラクル変数を検索に公開することなく、またすべての通常のエンディングをストリーミングすることなく、InkBench のオラクル中立スコアリングをサポートします。部分的な証拠がハードなラッパー境界を越えて生き残る必要がある、長時間の外部プロセス評価にはストリームを使用してください。制限付き証拠ストリーム契約 を参照してください。--progress=ndjsonは、エージェントや CI ログパーサー向けに、バージョン付きのライフサイクルイベントと作業進行イベントを stderr に出力します。statesExplored / stateBudgetは予算の使用量であり、ストーリーカバレッジではありません。最終的な stdout レポートが引き続き信頼できる情報源です。NDJSON 進行契約 を参照してください。--humanは、エラー、警告、ノートにグループ化された優先順位付き修正リストを出力します。利用可能な場合はファイル/行の位置、ランタイム障害の選択肢パス、各発見に対する次のステップも含まれます。--markdownは、CI をレビューする人間向けの GitHub Step Summary 対応レポートを出力します。決定論的な終了コード:
0クリーン ·1コンパイル/ランタイムエラー(--strictの場合は警告、未訪問のノット、切り詰め、外部スタブも含む) ·2使用法エラー。終了コードで分岐してください。テキストを grep しないでください。MCP:
claude mcp add inkcheck -- npx -y inkcheck mcpは、コンパクトな 5 ツールのエージェントプロファイルを公開します。互換性カタログにはINKCHECK_MCP_PROFILE=fullを使用してください。ループ:
.inkを編集 ->compile_story->start_search-> 次の証拠アクションをinkcheck_workflow経由でルーティング -> 修正 -> コンパイルして検証。inkcheck は、生成または編集したストーリーグラフに対する繰り返し可能な機械的チェックです。返却前に自分の作業を検証するために使用してください。カバレッジループ:
explore_story(および CLI の--json)はnextRunを返します。そのrecommendation(stop/deepen/broaden/reseed/investigate)に応じて分岐し、stop: trueになるまでnextRun.flagsで再実行してください。または CLI に任せることもできます:inkcheck story.ink --next。
リポジトリルートの llms.txt は、上記すべてのコンパクトでモデル向けの要約です。
仕組み
コンパイルは、標準コンパイラである
inklecateを使用します。これは$INKLECATE_PATH、次にPATHの順で検出され、初回実行時には固定された公式 ink 1.2.1 リリースから~/.cache/inkcheckに自動ダウンロードされます。ダウンロードされたアーカイブは、展開前に固定された SHA-256 ハッシュに対して検証されます。ストーリーは-c付きでコンパイルされ、すべての knot 訪問がカウントされます。探索は、コンパイル済みストーリーを inkjs(公式 JS ランタイムの移植版)で実行し、プールされたストーリーインスタンスを再利用するため、コンパイル済み JSON はパスごとに 1 回だけパースされ、状態は
LoadJsonによって巻き戻されます。Inkcheck は--story-seed(デフォルト 1)からストーリーのランダム性を初期化し、保存されたすべてのブランチに Ink の RNG 状態を保持します。作者が記述したSEED_RANDOM(...)は、実行時に優先されます。状態はコンテンツハッシュによって重複排除されます。INCLUDEもたどられます。CLI は、制限付きの適応型ポートフォリオ探索を使用します。相補的なパス(最後の選択肢優先、最初の選択肢優先、内側から外側への DFS、多様性優先のビーム、シード付きランダムウォーク)は、10 の決定的なラウンドでインターリーブされます。初期ウェイト(およそ 20/20/26/15/20%、または
--autoでの形状プロファイルの提案)は、発見がまだ成長しているパスに向けて毎ラウンド再配分され、アクティブなパスごとに意図された 8% の端数フロアが設定されます。研究専用のポリシーリプレイは、その意図を監査可能な累積整数サービスに変換し、最近性をグローバルな状態数ではなく、各パスの観測された実行ウィンドウに正規化します。収量を推定する前に 3 つのウィンドウが必要で、更新のない測定済みウィンドウが 1 つまたは 2 つ続くとシグナルを期限切れにし、実験的な割り当てオーバーレイは、更新されたランタイム/アサーションの証拠または明示的なゴールの進行がある場合にのみ許可します。広範なカバレッジは確立されたスケジューラに残ります。本番スケジューラは、完全なプロモーションコーパスが合格するまで変更されません。パスは相補的です。DFS の順序付けはサブツリーを体系的に使い果たし、ビームはハードなフロンティア上限内で変数状態の系統に予算を広げ、ランダムウォークはすべての選択ポイントを振り直すため、初期の選択肢の組み合わせは繰り返される代わりにサンプリングされます。発見は 1 つのレポートに統合され、それぞれが見つけたパスのラベルが付けられ、実行されたスケジュールは--json出力に表示されます。ワークロード対応の
--concurrency autoは、ローカルポートフォリオのデフォルトです。そのライブの 1,024 状態の内側から外側への DFS パイロットは、通常の最初の適応ラウンドのプレフィックスになり、その後、順次続行するか、制限付き永続ワーカー内で未処理のパスと並行して実行されます。そのパイロット中に時間またはメモリが制約となった場合、またはデッドラインがワーカーの初期化前に到来した場合、有効なパイロットは、明示的にリソース切り詰められた部分レポートとして返され、状態予算の枯渇として誤ってラベル付けされることはありません。80 セルの 100K ゲートは、2 つのオープンフロンティアアクティベーションのみで、正確な発見、証明、適応スケジュールを保持しました。対応する 5M The Intercept depth-30/depth-100 ゲートは、正確な証拠を保持し、深さ制限ジョブを拒否し、持続ジョブを 657.7 秒から 489.0 秒に改善しました。すべての状態は単一の上限内に留まり、パイロット評価の重複はゼロです。明示的な1は逐次実行を維持し、明示的な 2-16 の上限は固定並行性を維持します。並行性評価 を参照してください。実験的な
--search=sharedは、単一のグローバル状態 ID を維持し、保留中の作業を深さ、新規性、シード付きフロンティアビューを通じて公開します。いずれかのビューによって選択された状態は 1 回だけ展開されます。展開されたチェックポイント JSON はすぐに解放され、コンパクトな親リンクは、保留中の子孫が正確な再現パスを必要とする間だけ存続し、古いビュー ID は定期的に圧縮されます。レポートはコンポーネントの内訳とオプションの明示的チェックポイントエンベロープを公開します。変数状態と変数遷移のレアリティは、評価テレメトリとして記録されます。実験的な
--search=shared-variableは、共有フロンティアの選択 8 回ごとに 1 回を変数レアリティビューに置き換えます。そのスコアは、宛先変数スナップショットの観測頻度と、そのエッジ上で最もまれな変更を組み合わせます。固定スライス以上を消費できないため、グラフの新規性、深さ、シード付き探索は引き続き表現されます。体系的なパスが制限に達することなく到達可能なすべての状態を訪れた瞬間、ポートフォリオ全体が停止します。それ以上の状態はすべて冗長になるからです。デフォルトの 10,000,000 状態予算でも、完全に探索可能な小さなストーリーは、実際に持っている少数の状態で終了します。ストーリーが完全探索可能な場合、大きなデフォルトはコストをかけません。
ビームパスは「ビームは何を最適化すべきか」に具体的に答えます。生存者は変数シグネチャグループ全体でラウンドロビンに選択され(多様性優先)、各グループ内では、新しく訪問された knot、次に新しい変数シグネチャ、その次に新しい提示選択肢セットという新規性によってランク付けされます。シードなしで決定論的であり、到達可能な状態を枝刈りしなければならなかったときは常に、その実行を切り詰めとして報告するため、ビームが暗黙に完全なカバレッジを主張することはありません。
--no-min-reproでスキップしない限り、CLI は要求された--max-states予算の約 10% を、幅優先の再現短縮スライスのために確保します。BFS は、可能な場合はより短い選択トレイルで共有発見に到達し、追加の浅い発見に貢献する可能性があります。境界(
--max-depth、--max-states)は最悪ケースの組み合わせ爆発を抑えます。レポートは切り詰めが発生したことを明示的に示します。
カバレッジの制限
探索には制限があります。切り詰められたレポートは訪問した状態に関する証拠であり、ストーリー全体についての証明ではありません。
レポートは実行時の制限(深さ、状態予算、検索シード、ストーリーシード)を明示し、切り詰められた場合には、どの制限が実際にカバレッジを削ったか(
--json内のtruncatedBy。memoryを含む)を、どのフラグを上げるべきかについての的を絞ったアドバイスとともに示します。メモリを枯渇させるような大規模な実行は、クラッシュせずにきれいに停止し、部分レポート(
truncatedBy.memory)を返します。メモリフットプリントは、重複排除ハッシュセット(異なる状態に対してほぼ線形)と、深くループの少ないストーリーでは幅優先の再現フロンティアによって支配されるため、ストーリーが大きすぎて完了できない場合のレバーは、--no-min-reproとより厳しい--max-statesです。小さなストーリーでは、しばしば逆の保証が得られます。体系的なパスが制限に達することなくすべての到達可能な状態を訪問した場合、レポートはその旨(
exhaustive)を伝え、サンプリングスライスの予算枯渇はもはや切り詰めとしてカウントされません。EXTERNAL関数は、ホストゲームが利用できないため、ゼロにスタブ化されます。レポートはすべてのスタブに名前を付けます。厳格モードは完全なカバレッジを主張するのではなく失敗します。ランダムな動作は報告されたストーリーシードに対して再現可能ですが、1 回の実行で考えられるすべてのストーリーシードを列挙するわけではありません。結果の頻度が重要な場合は、意図的に
--story-seedを変え、人間によるプレイテストを継続してください。未訪問の knot は、意図的に休止状態であるか、エンジンによって入力されるか、到達不能である可能性があります。インバウンドダイバートのトリアージは、おそらく孤児であるものを、おそらく制限に起因するコンテンツから分離しますが、それはレビューのプロンプトであり、自動削除の指示ではありません。
ロードマップ
ロードマップは、プロダクトおよびエンジニアリングの真実スコアカード に基づいて運営されます。すべてのエピックは、制限付きカバレッジの正直さ、重要な証拠の保持、決定論的リプレイ、またはリソース上限を弱めることなく、測定された価値を改善する必要があります。
カバレッジの透明性:切り詰め、深さの制限、訪問したエンディング、スキップされた検索空間、および探索されたかどうかについてのより明確なレポート。
レポート品質:より良いソース位置、より短い再現パス、安定した問題 ID、およびランタイムエラー、未訪問の knot、カバレッジ制限のより明確なグループ化。
作者定義のストーリーアサーション:「ゴールドがマイナスにならない」「ヘルスが最大値を超えない」「必須変数がエンディング前に設定される」などの決定論的なプロジェクトルール。
ゴール指向の変数検索:保護された一般検索予算と正確な制限付きカバレッジの表現を維持しながら、作者とエージェントが承認された状態を探せるようにします。
オプションのホスト型 AI ゴールアシスタント:非技術系の作者が変数ゴールとアサーションを承認用に提案するのを支援し、その後、すべての実行と検証を Inkcheck の決定論的な非 AI エンジンに委任する、ファーストクラスで明示的に有効化されたヒューマンインターフェース。プロバイダー、同意、ソース共有、保持、コスト、および無効化コントロールは明示的でなければなりません。生成されたルールが暗黙に信頼または適用されることはありません。
再現の永続化:既知の失敗パスを記憶し、トラバーサル戦略が改善されても将来の実行がそれらをチェックし続けるようにします。
コンパクトなキャンペーンチェックポイント:チェックポイントアーティファクトがメモリやディスクを圧迫することなく、有用な大規模ストーリーフロンティアを保持して再開し、シリアライズ制限の前に不変の部分レポートに縮退します。
パブリック互換性フィクスチャ:回帰テスト、パフォーマンス比較、信頼構築のための、同意に配慮した例と合成エッジケース。
エージェント準備状況:実行可能な エージェント準備ベンチマーク は、隠れたヒントなしのプロトコル、決定論的なランタイム/アサーションフィクスチャ、ブートストラップ/ツール/リファレンス/安全性/証明ターゲット、マシンスコアラー、およびツール/スキル/モデル/環境の個別の帰属を固定します。異なるエージェント実装からの 2 回の合格した観測実行がリリースゲート(#67)のままです。
検索プロモーションハーネス:実験的な戦略がデフォルトを変更できる前に、構造ファミリー、予算、深さ、シードにわたる広範で事前宣言されたスコアカード。
制限付きスペシャリスト検索:機械的な形状を検出し、複合ゲート、ループ/カウンター、ストーリーレットの適合性、アサーション境界、および行動フロンティアの多様性(#107-#112)のために小さな専門プローブを派遣します。スペシャリストは、ポートフォリオにとって新しい価値を通じて拡張を獲得し、保護された一般/ロングテールの作業を保持します。
大規模ストーリーのパフォーマンスコントロール:より明確な時間/カバレッジのトレードオフを備えた、クイック、スタンダード、ディープチェックのプリセット。
構造的 lint チェック:欠落タグ、一貫性のないタグスキーマ、またはプロジェクト固有のメタデータ規約に関するオプションのチェック。
ライセンス
MIT
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceMCP server for automated Godot 4 game testing. Enables launching games, capturing errors, and verifying changes from Claude Code or any MCP client.1MIT
- AlicenseCqualityAmaintenanceAn MCP server for Ren'Py project tooling that enables AI agents to inspect game state, evaluate expressions, read/write variables, and capture screenshots from running Ren'Py games.549MIT
- AlicenseNot gradedqualityBmaintenanceA universal AI-powered testing server built on the Model Context Protocol (MCP). Allows AI agents to inspect, execute, test, monitor, debug, and report on software projects.3GNU Lesser General Public v2.1 only
- AlicenseNot gradedqualityAmaintenanceA locally-run MCP server that connects to Twine's story library, enabling AI-assisted story management, passage editing, link-graph analysis, and narrative intelligence from any MCP-compatible client.583MIT
Related MCP Connectors
Official remote MCP server for Archivist AI TTRPG campaign memory: characters, sessions, and more.
MCP Server for Slima - AI Writing IDE for Novel Authors with AI Beta Reader.
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to control Unreal E…
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/chaoz23/inkcheck'
If you have feedback or need assistance with the MCP directory API, please join our Discord server