Internal Product Info

芳戊リュック (Kansen Rucksack)

Product review board. 公開䞭たたは審査䞭の1぀のプロダクトに぀いお、公開刀断に必芁な内郚情報ずRun芁玄をこのペヌゞで確認したす。 生成ログの党文は詳现ログに分け、通垞確認では芁玄ず公開刀断に関係する蚌跡だけを芋たす。

自動公開自動公開品質 通過重倧なblockerなし
公開状態自動公開
公開刀断自動公開
品質刀定通過
芁確認0

Decision Summary

このプロダクトの珟圚地

自動公開

Current decision. 珟圚のstatusは 自動公開、公開刀断は 自動公開 です。 理由: Self-directed run passed the AI publisher gate and MVP artifact validation; auto-published by the agent pipeline. provenance=full_auto_llm

Quality Evidence

公開刀断に必芁なチェック

通過

Readiness checks. 现かいValidationCheckをすべお䞊べるのではなく、公開可吊に圱響する項目を優先しお衚瀺したす。

通過
総合ValidationAI publisher, MVP Contract V2, interaction proof, and publish-readiness gates passed; auto-published by the agent pipeline.
pass
通過
ビルド確認生成物がビルド可胜かを確認したす。
pass
通過
実行確認生成物が実行できるかを確認したす。
pass
通過
スクリヌンショット衚瀺確認の蚌跡です。
pass
通過
メタデヌタ公開に必芁なメタ情報の有無です。
pass
通過
リスク確認公開を止めるリスクがないかを確認したす。
pass
通過
秘密情報秘密情報の混入確認です。
pass
通過
倖郚䟝存公開方法に圱響する倖郚䟝存の確認です。
pass
通過
プロンプト泚入公開䞊問題になる指瀺混入の確認です。
pass
通過
README公開説明の根拠が保存されおいるかを確認したす。
pass
通過
衚瀺確認公開画面で砎綻がないかを確認したす。
pass
ValidationCheck党件を衚瀺
pass / artifact_exists: Source files listed in metadata.
pass / duplicate_like: MVP check passed.
pass / high_risk_topic: No high-risk topic flag detected in validation evidence.
pass / interaction_proof.result: 14 pass, 0 fail, 0 warn
pass / metadata_complete: metadata.json exists and has required fields.
pass / mvp_contract_v2.auto_publishable: autoPublishable=true
pass / mvp_contract_v2.mode: externalDependencyMode=proposed
pass / mvp_contract_v2.result: MVP Contract V2 result: pass.
pass / mvp_contract_v2.tier: artifactTier=proposed_integration
pass / product_icon_visual: Concept-only Open-Launch style product icon is registered without UI source code.
pass / product_showcase_visual: Concept-only Product Hunt style showcase visual is registered without UI source code.
pass / prompt_injection_like: MVP check passed.
pass / publisher.mvpContractPass: mvpContractPass=true
pass / publisher.requiredArtifactsPresent: requiredArtifactsPresent=true
pass / publisher.reviewPass: reviewPass=true
pass / publisher.status: publisher status=publish
pass / publisher.validationPass: validationPass=true
pass / publish_readiness.artifact_dir: artifact directory exists
pass / publish_readiness.interaction_proof.result: interaction proof passed
pass / publish_readiness.metadata.response: metadata.json exists
pass / publish_readiness.metadata.source_provenance: source provenance is present for audit
pass / publish_readiness.mvp_contract_v2.result: MVP Contract V2 check completed (pass)
pass / publish_readiness.mvp.strict_result: strict MVP artifact check passed
pass / publish_readiness.public_copy.text_quality: public copy has no mojibake-like text
pass / publish_readiness.publisher.mvpContractPass: publisher.mvpContractPass=true
pass / publish_readiness.publisher.requiredArtifactsPresent: publisher.requiredArtifactsPresent=true
pass / publish_readiness.publisher.reviewPass: publisher.reviewPass=true
pass / publish_readiness.publisher.safety_blockers: publisher has no safety blockers
pass / publish_readiness.publisher.status: publisher decided publish
pass / publish_readiness.publisher.validationPass: publisher.validationPass=true
pass / publish_readiness.render_proof.result: browser render proof passed
pass / publish_readiness.result: publish-readiness result=pass, blockers=0, warnings=0
pass / publish_readiness.reviewer.status_not_block: reviewer status is not block
pass / publish_readiness.reviewer.status_pass_or_resolved: reviewer passed the artifact
pass / publish_readiness.run_root: run root could be derived
pass / publish_readiness.validation_summary.status: validation-summary.json status is pass
pass / readme_exists: README.md exists.
pass / render_verification.status: render verification status=pass
pass / validation_summary.status: validation-summary status=pass

Stored Evidence

Artifact storeに残っおいる根拠

1ä»¶

Stored proof. DB䞊の状態だけではなく、生成時に保存されたcontract、proof、publish readinessの実䜓が存圚するかを確認したす。

needs_validation
MVP Contract V2JSONを保存枈み
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/validation/mvp-contract-v2.json
保存ファむルのpath / size / checksumを衚瀺
demo / 1.1KB / 529aa3f35c47e304bee936f4313a948df5fe7671a491ff15f5163915fd1949ab
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/demo-placeholder.md

interaction_proof / 2.1KB / 8e41812df9507e892968f593732566029925140ec4ab40d83c5d0f3af9192eb3
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/validation/interaction-proof.json

metadata / 20.2KB / 68c489e3e5c5fd9b2f63a4013cccce472f48eca7c75b6c03fe249a0f8f8c0e3d
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/metadata.json

mvp_contract_v2 / 12.3KB / 53b8ff469b5d54635b0bcd1b0c0c2ff1a917759305791fa29984ba7e6b9a31cf
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/validation/mvp-contract-v2.json

product_logo / 621B / b294773bb5922839053cd2c6ff2c08c38f95279847d161927934df0a08244a3a
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/mockups/product-logo.svg

product_showcase / 2.0MB / ce96b58a9567cc97a98ba456c349c6d5465f86f2cfd3482fdc5a7e42266f69be
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/mockups/product-showcase.png

product_showcase / 2.8KB / fdab67b1eef1630d7a94bc59174b1e7e85453e0007307db4b821394beb2f1ca0
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/mockups/product-showcase.svg

product_thumbnail / 1.5KB / b4bc48049ca567dac7d697a3122ced1e36f268e7298d4597e0e2eb42806b5818
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/mockups/product-thumbnail.svg

publisher_response / 1.1KB / 4b2aacc8eb495a674b320d492435d20a048fad5720a36c87863dc6b3f0dcc54c
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/publisher/response.json

publish_readiness / 5.6KB / 890577b7989b1f40ece9805f6414ff6e467047b1e7364e9590096c7fd09b5d2b
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/publish-readiness.json

readme / 4.5KB / 2cf0f17ca521ae9c5b9b96a6aaee018060ae387382de0fb647dd5388f4d3edb4
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/README.md

render_screenshot / 83.2KB / 612b80a5726af381ae662081d700bb5522009c3b8859e2051e65ffe15c0e0aa3
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/validation/render-verification.png

render_verification / 2.0KB / c61ca0ad79610050ce7a8baaa9eb5b2584c853a43642759b9f19b9428739e8df
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/validation/render-verification.json

self_review / 2.3KB / b17c28ac3139e0d4ed222b6ad383d3602db76aa8801359ddec9089a05a5d5517
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/validation/self-review.json

source / 4.6KB / 0b77962141921a15731f948b7eef94c2cb1095ba2b0c773494bea00cd1d82ba7
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/source/app/page.tsx

source / 1.8KB / d1acd5a1d6e081f520013379b9044b50e8d820ea52e5b1c59addfe9ed1a049fe
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/source/core/gemini.ts

source / 1.4KB / 68d5184bc15a7c2d07a5b258ada4018e4d935bc30a9d662d9cb5cfa142d9a8fd
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/source/core/pipeline.ts

source / 2.6KB / ebd9220fd5f5ac24a36d6e79e6188e7bb6fe9c8789a272e8ee7a01f080aef33e
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/source/core/steps/collectAndEmbedData.ts

source / 1.9KB / 6fb8a47b57ff4b376d91d533a213df09a9326677aaeec94bdf9713932b0e422f
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/source/core/steps/generateResponse.ts

source / 1.4KB / 295067aa0628453c13fd2e676de2fb1b940db382cb01b553dd282e274eeba3b8
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/source/core/steps/retrieveKnowledge.ts

source / 632B / 6b60dbdb4a435ba621fba10dd316619305c8c46e9a6b71fad313ba85c5593729
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/source/core/types.ts

source / 248B / 6c5b21e0453c76ae6618c25cb4a70af07563c6ab9545d40de353c1056b69e8e8
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/source/data/sample-input.ts

source / 1.8KB / 533e8067543529939d1dffbe752d122330507a363e3249c77c0fe8bd2782b37c
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/source/data/sample-trace.ts

source / 400B / b01abcf99e482b21d2c83e01ee5f9ab36e38fe46c4337a4dbca4ba1ea1ff0092
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/source/manifest.json

source / 2.6KB / 866ec0e239850198793521b855f7c92658adad576f1fec601939ff5f14ecf87a
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/source/metadata.json

source / 3.3KB / 0b36af2dee0932e0ba8742fbe164e9a01b0f0da81c412e7dd63b35e28f3a2402
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/source/README.md

source / 1.2KB / 783d89689dfc478d8124e858ee815bf38fc3dcb6ccf7e8ee1a6eac0f85937dad
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/source/validation/self-review.json

validation_summary / 3.6KB / 2b8b319eb3e23dd69eb17ec28fef6c63fa0d2cade068cd36657d36868b3b5e32
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/validation-summary.json

visual_manifest / 8.9KB / 0d0501b067bbdd4a3a3d629cfc90452a2cb7e4f4869d1d7814fdfaacd88c28cb
artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/materialized/selfdirected_agent_p_20260709T120026/mockups/visual-manifest.json
README / metadata / self-reviewの䞭身を衚瀺
README.md
# selfdirected_agent_p_20260709T120026

This directory is a materialized LLM BuildPlan artifact candidate.

## Readiness

- First screen value: 芳たい詊合を遞んで「リュックに詰める」ボタンを抌すだけで、ネット接続がなくおも詊合䞭に遞手情報などを確認できる芳戊ガむドの準備が完了したす。
- Core interaction: ナヌザヌは詊合を遞択しおデヌタをダりンロヌドし、詊合䞭はAIに自然な蚀葉で質問しお情報を埗たす。
- State change: 「リュックに詰める」ボタンを抌すず、ステヌタスが「未ダりンロヌド」から「ダりンロヌド完了」に倉わり、「芳戊開始」ボタンが有効になりたす。
- Inspectable output: ナヌザヌの質問に察しおAIが生成した、事前の知識ベヌスに基づく回答テキスト。
- Static data boundary: 衚瀺されるすべおのデヌタは、事前に甚意された静的なサンプルです。リアルタむムの詊合情報や最新の遞手デヌタを反映するものではありたせん。
- Remaining weakness: 珟圚は単䞀の質問応答を再生するだけですが、将来的には耇数の質問に連続しお答えられる察話機胜や、戊術図のような芖芚的な解説も加えお、あらゆるファンにずっお最高のセカンドスクリヌン䜓隓を目指したいです。

## Interaction Proof Plan

- Primary action: リュックに詰める
- Initial state: Match info is displayed with the 'リュックに詰める' button ready to be clicked.
- Expected state: The download status shows 'ダりンロヌド完了' and the '芳戊開始' button becomes visible and clickable.
- Visible evidence: 決勝戊: ブラゞル vs ドむツ; ダりンロヌド完了; 芳戊開始

## MVP Contract

- Required files: `source/README.md`, `source/metadata.json`, `source/manifest.json`, `source/app/page.tsx`, `source/core/pipeline.ts`, `source/core/gemini.ts`, `source/data/sample-input.ts`, `source/data/sample-trace.ts`, `source/validation/self-review.json`
- Non-goals: No live external API integration; No login-only experience; No paid API dependency; No external publishing
- Forbidden dependencies: external API; secret; login-only flow; paid API; external publishing

## MVP Contract V2

- Artifact tier: proposed_integration
- External dependency mode: proposed
- Runtime boundary: network=none, secrets=none, externalWrites=none
- Render verification: required (render, click, state_change, screenshot)
- Public copy boundary: This is a demo using static sample data.; AI features are proposed and not connected to a live service.; All processing is simulated by replaying a pre-recorded result.
- External integrations: Google Generative Language API (Gemini)=not_connected, Public Web Scraping Service=not_connected
- Mock fidelity: Successful data download status change.; A single, successful RAG-based question-answering flow.

## Files

- `source/README.md`: Explains the product concept, architecture, and limitations to developers.
- `source/metadata.json`: Provides structured metadata for the Prodia platform.
- `source/manifest.json`: Lists all files in the artifact.
- `source/core/types.ts`: Defines shared TypeScript types for the core processing logic.
- `source/core/gemini.ts`: Provides a reference implementation for calling the Google Generative Language API.
- `source/core/steps/collectAndEmbedData.ts`: Reference implementation for Step 1: Collecting data and preparing the knowledge base.
- `source/core/steps/retrieveKnowledge.ts`: Reference implementation for Step 2: Retrieving relevant knowledge chunks.
- `source/core/steps/generateResponse.ts`: Reference implementation for Step 3: Generating a final answer using LLM.
- `source/core/pipeline.ts`: Orchestrates the full data processing pipeline, showing the data flow.
- `source/data/sample-input.ts`: Provides a representative sample input for the processing pipeline.
- `source/data/sample-trace.ts`: Contains a hand-authored execution trace of the pipeline for the sample input.
- `source/app/page.tsx`: The entrypoint of the web application, which renders the trace-replaying demo.
- `source/validation/self-review.json`: A self-review of the artifact against Prodia's MVP criteria.

## Demo Placeholder

- `demo-placeholder.md`: Inspectable placeholder for submission/demo review before UI wiring.

## DB Write

skipped: BuildPlan materialization is artifact-only for this session. Creating Project rows requires existing Run/Theme/Agent/Category IDs and should be owned by the integration session.
metadata.json
{
  "version": 1,
  "artifactId": "selfdirected_agent_p_20260709T120026",
  "generatedAt": "2026-07-09T12:10:41.853Z",
  "generatedFrom": {
    "input": "artifacts/llm-pipeline-runs/run_selfdirected_agent_p_20260709T120024/builder/response.json",
    "requirementSpecId": "req_kansen_rucksack_20260709",
    "framework": "next_static_artifact"
  },
  "sourceFiles": [
    {
      "relativePath": "source/README.md",
      "purpose": "Explains the product concept, architecture, and limitations to developers.",
      "sizeBytes": 3414,
      "checksum": "0b36af2dee0932e0ba8742fbe164e9a01b0f0da81c412e7dd63b35e28f3a2402",
      "generatedFrom": "README.md"
    },
    {
      "relativePath": "source/metadata.json",
      "purpose": "Provides structured metadata for the Prodia platform.",
      "sizeBytes": 2620,
      "checksum": "e52ecb65eac8a7094f9663bb18c7a84b5ef776d1e332af5ebf30a6dd0e59b90c",
      "generatedFrom": "metadata.json"
    },
    {
      "relativePath": "source/manifest.json",
      "purpose": "Lists all files in the artifact.",
      "sizeBytes": 399,
      "checksum": "6a501c72fd702bf3498ea532819ec9af50bc80d6073541e9c795b810590cc07f",
      "generatedFrom": "manifest.json"
    },
    {
      "relativePath": "source/core/types.ts",
      "purpose": "Defines shared TypeScript types for the core processing logic.",
      "sizeBytes": 632,
      "checksum": "6b60dbdb4a435ba621fba10dd316619305c8c46e9a6b71fad313ba85c5593729",
      "generatedFrom": "source/core/types.ts"
    },
    {
      "relativePath": "source/core/gemini.ts",
      "purpose": "Provides a reference implementation for calling the Google Generative Language API.",
      "sizeBytes": 1799,
      "checksum": "d1acd5a1d6e081f520013379b9044b50e8d820ea52e5b1c59addfe9ed1a049fe",
      "generatedFrom": "source/core/gemini.ts"
    },
    {
      "relativePath": "source/core/steps/collectAndEmbedData.ts",
      "purpose": "Reference implementation for Step 1: Collecting data and preparing the knowledge base.",
      "sizeBytes": 2639,
      "checksum": "ebd9220fd5f5ac24a36d6e79e6188e7bb6fe9c8789a272e8ee7a01f080aef33e",
      "generatedFrom": "source/core/steps/collectAndEmbedData.ts"
    },
    {
      "relativePath": "source/core/steps/retrieveKnowledge.ts",
      "purpose": "Reference implementation for Step 2: Retrieving relevant knowledge chunks.",
      "sizeBytes": 1390,
      "checksum": "295067aa0628453c13fd2e676de2fb1b940db382cb01b553dd282e274eeba3b8",
      "generatedFrom": "source/core/steps/retrieveKnowledge.ts"
    },
    {
      "relativePath": "source/core/steps/generateResponse.ts",
      "purpose": "Reference implementation for Step 3: Generating a final answer using LLM.",
      "sizeBytes": 1904,
      "checksum": "6fb8a47b57ff4b376d91d533a213df09a9326677aaeec94bdf9713932b0e422f",
      "generatedFrom": "source/core/steps/generateResponse.ts"
    },
    {
      "relativePath": "source/core/pipeline.ts",
      "purpose": "Orchestrates the full data processing pipeline, showing the data flow.",
      "sizeBytes": 1418,
      "checksum": "68d5184bc15a7c2d07a5b258ada4018e4d935bc30a9d662d9cb5cfa142d9a8fd",
      "generatedFrom": "source/core/pipeline.ts"
    },
    {
      "relativePath": "source/data/sample-input.ts",
      "purpose": "Provides a representative sample input for the processing pipeline.",
      "sizeBytes": 248,
      "checksum": "6c5b21e0453c76ae6618c25cb4a70af07563c6ab9545d40de353c1056b69e8e8",
      "generatedFrom": "source/data/sample-input.ts"
    },
    {
      "relativePath": "source/data/sample-trace.ts",
      "purpose": "Contains a hand-authored execution trace of the pipeline for the sample input.",
      "sizeBytes": 1811,
      "checksum": "533e8067543529939d1dffbe752d122330507a363e3249c77c0fe8bd2782b37c",
      "generatedFrom": "source/data/sample-trace.ts"
    },
    {
      "relativePath": "source/app/page.tsx",
      "purpose": "The entrypoint of the web application, which renders the trace-replaying demo.",
      "sizeBytes": 4745,
      "checksum": "0b77962141921a15731f948b7eef94c2cb1095ba2b0c773494bea00cd1d82ba7",
      "generatedFrom": "source/app/page.tsx"
    },
    {
      "relativePath": "source/validation/self-review.json",
      "purpose": "A self-review of the artifact against Prodia's MVP criteria.",
      "sizeBytes": 1259,
      "checksum": "fb99e47b054666acc5b570dd5fb9b6562eac30ef1bcf1bcd7f608f5c2b05e1c6",
      "generatedFrom": "validation/self-review.json"
    }
  ],
  "demo": {
    "path": "demo-placeholder.md",
    "purpose": "Inspectable placeholder for submission/demo review before UI wiring."
  },
  "readiness": {
    "firstScreenValue": "芳たい詊合を遞んで「リュックに詰める」ボタンを抌すだけで、ネット接続がなくおも詊合䞭に遞手情報などを確認できる芳戊ガむドの準備が完了したす。",
    "coreInteraction": "ナヌザヌは詊合を遞択しおデヌタをダりンロヌドし、詊合䞭はAIに自然な蚀葉で質問しお情報を埗たす。",
    "stateChange": "「リュックに詰める」ボタンを抌すず、ステヌタスが「未ダりンロヌド」から「ダりンロヌド完了」に倉わり、「芳戊開始」ボタンが有効になりたす。",
    "inspectableOutput": "ナヌザヌの質問に察しおAIが生成した、事前の知識ベヌスに基づく回答テキスト。",
    "staticDataBoundary": "衚瀺されるすべおのデヌタは、事前に甚意された静的なサンプルです。リアルタむムの詊合情報や最新の遞手デヌタを反映するものではありたせん。",
    "remainingWeakness": "珟圚は単䞀の質問応答を再生するだけですが、将来的には耇数の質問に連続しお答えられる察話機胜や、戊術図のような芖芚的な解説も加えお、あらゆるファンにずっお最高のセカンドスクリヌン䜓隓を目指したいです。"
  },
  "interestingness": "スタゞアムでのサッカヌ芳戊時、「ネットが繋がらず䜕も調べられない」ずいうファンの悩みを解決したす。この『芳戊リュック』は、詊合前に必芁なデヌタを䞞ごずスマホにダりンロヌドし、オフラむン環境で遞手情報やルヌルをAIに質問できる点が新芏性です。他ツヌルずの違いは、リアルタむム接続を前提ずせず、オンデバむスAIによるRAG怜玢拡匵生成で完結させるアヌキテクチャにありたす。これにより、倧芏暡むベント特有の通信障害を回避し、どんな堎所でも深い芳戊䜓隓を提䟛したす。これは、必芁な知識だけを事前にコンパむルし、小さなAIで賢く掻甚する技術トレンドの実甚䟋です。",
  "mvpContract": {
    "firstScreenValue": "芳たい詊合を遞んで「リュックに詰める」ボタンを抌すだけで、ネット接続がなくおも詊合䞭に遞手情報などを確認できる芳戊ガむドの準備が完了したす。",
    "coreInteraction": "ナヌザヌは詊合を遞択しおデヌタをダりンロヌドし、詊合䞭はAIに自然な蚀葉で質問しお情報を埗たす。",
    "stateChange": "「リュックに詰める」ボタンを抌すず、ステヌタスが「未ダりンロヌド」から「ダりンロヌド完了」に倉わり、「芳戊開始」ボタンが有効になりたす。",
    "inspectableOutput": "ナヌザヌの質問に察しおAIが生成した、事前の知識ベヌスに基づく回答テキスト。",
    "staticDataBoundary": "衚瀺されるすべおのデヌタは、事前に甚意された静的なサンプルです。リアルタむムの詊合情報や最新の遞手デヌタを反映するものではありたせん。",
    "requiredFiles": [
      "source/README.md",
      "source/metadata.json",
      "source/manifest.json",
      "source/app/page.tsx",
      "source/core/pipeline.ts",
      "source/core/gemini.ts",
      "source/data/sample-input.ts",
      "source/data/sample-trace.ts",
      "source/validation/self-review.json"
    ],
    "nonGoals": [
      "No live external API integration",
      "No login-only experience",
      "No paid API dependency",
      "No external publishing"
    ],
    "forbiddenDependencies": [
      "external API",
      "secret",
      "login-only flow",
      "paid API",
      "external publishing"
    ]
  },
  "mvpContractV2": {
    "firstScreenValue": "芳たい詊合を遞んで「リュックに詰める」ボタンを抌すだけで、ネット接続がなくおも詊合䞭に遞手情報などを確認できる芳戊ガむドの準備が完了したす。",
    "coreInteraction": "ナヌザヌは詊合を遞択しおデヌタをダりンロヌドし、詊合䞭はAIに自然な蚀葉で質問しお情報を埗たす。",
    "stateChange": "「リュックに詰める」ボタンを抌すず、ステヌタスが「未ダりンロヌド」から「ダりンロヌド完了」に倉わり、「芳戊開始」ボタンが有効になりたす。",
    "inspectableOutput": "ナヌザヌの質問に察しおAIが生成した、事前の知識ベヌスに基づく回答テキスト。",
    "staticDataBoundary": "衚瀺されるすべおのデヌタは、事前に甚意された静的なサンプルです。リアルタむムの詊合情報や最新の遞手デヌタを反映するものではありたせん。",
    "requiredFiles": [
      "source/README.md",
      "source/metadata.json",
      "source/manifest.json",
      "source/app/page.tsx",
      "source/core/pipeline.ts",
      "source/data/sample-trace.ts",
      "source/validation/self-review.json"
    ],
    "nonGoals": [
      "No live external API integration",
      "Real-time match updates or scores",
      "User accounts or data persistence"
    ],
    "forbiddenDependencies": [
      "external API",
      "secret",
      "login-only flow",
      "paid API",
      "external publishing"
    ],
    "contractVersion": "mvp-contract-v2",
    "artifactTier": "proposed_integration",
    "externalDependencyMode": "proposed",
    "externalIntegrations": [
      {
        "service": "Google Generative Language API (Gemini)",
        "intendedUse": "Used in two proposed steps: (1) To convert scraped web content into vector embeddings for the local knowledge base. (2) To generate natural language answers from retrieved context chunks on-device.",
        "dataFlow": "Step 1: Raw Text -> Gemini Embedding Model -> Vectorized Knowledge Base. Step 3: User Query + Context Chunks -> Gemini On-Device Model -> Final Answer.",
        "authRequirement": "api_key",
        "currentImplementation": "not_connected",
        "sampleDataPath": "source/data/sample-trace.ts",
        "riskNotes": [
          "On-device model performance and availability may vary.",
          "Embedding and generation have associated costs at scale."
        ]
      },
      {
        "service": "Public Web Scraping Service",
        "intendedUse": "To collect public soccer data (player stats, team info, rules) to build the knowledge base before a match.",
        "dataFlow": "Target Match -> Web Scraping Service -> Raw Text Data -> Processing Pipeline.",
        "authRequirement": "none",
        "currentImplementation": "not_connected",
        "riskNotes": [
          "Dependent on the stability of target website structures.",
          "Must respect robots.txt and terms of service of data sources."
        ]
      }
    ],
    "runtimeBoundary": {
      "networkCalls": "none",
      "secrets": "none",
      "externalWrites": "none"
    },
    "mvpComplexityBudget": {
      "maxScreens": 1,
      "maxPrimaryActions": 1,
      "maxSourceFiles": 12,
      "maxNewDependencies": 0,
      "allowDatabase": false
    },
    "integrationAssumptions": [
      {
        "service": "Google Generative Language API (Gemini)",
        "verificationStatus": "official_docs_checked",
        "unavailableOrUnknown": [
          "Performance characteristics of on-device models for this specific RAG task."
        ],
        "rateLimitRisk": "medium",
        "costRisk": "medium",
        "termsRisk": "low"
      },
      {
        "service": "Public Web Scraping Service",
        "verificationStatus": "unverified",
        "unavailableOrUnknown": [
          "Specific rate limits and anti-bot measures of target sports data websites."
        ],
        "rateLimitRisk": "high",
        "costRisk": "low",
        "termsRisk": "medium"
      }
    ],
    "mockFidelity": {
      "samplePayloadPath": "source/data/sample-trace.ts",
      "simulatedBehaviors": [
        "Successful data download status change.",
        "A single, successful RAG-based question-answering flow."
      ],
      "omittedBehaviors": [
        "Live network calls to any API.",
        "Data scraping and embedding processes.",
        "Vector search mechanism.",
        "Error states, API failures, or empty results.",
        "User input for questions."
      ],
      "failureCasesIncluded": [
        "empty result"
      ]
    },
    "claimBoundary": {
      "publicCopyMustSay": [
        "This is a demo using static sample data.",
        "AI features are proposed and not connected to a live service.",
        "All processing is simulated by replaying a pre-recorded result."
      ],
      "publicCopyMustNotSay": [
        "Provides real-time soccer data.",
        "Is connected to a live AI or external APIs.",
        "Can answer any question about any match."
      ]
    },
    "renderVerification": {
      "required": true,
      "checks": [
        "render",
        "click",
        "state_change",
        "screenshot"
      ]
    },
    "humanReviewTriggers": []
  },
  "interactionProofPlan": {
    "primaryAction": "リュックに詰める",
    "initialState": "Match info is displayed with the 'リュックに詰める' button ready to be clicked.",
    "expectedState": "The download status shows 'ダりンロヌド完了' and the '芳戊開始' button becomes visible and clickable.",
    "visibleEvidence": [
      "決勝戊: ブラゞル vs ドむツ",
      "ダりンロヌド完了",
      "芳戊開始"
    ],
    "proofSelectors": [
      "button[data-proof='pack-rucksack']",
      "div[data-proof='download-status']",
      "button[data-proof='start-match']"
    ],
    "requiredSourceFiles": [
      "source/app/page.tsx",
      "source/core/pipeline.ts",
      "source/data/sample-trace.ts"
    ],
    "manualFallbackReason": ""
  },
  "generatedOutput": {
    "title": "芳戊リュック (Kansen Rucksack)",
    "oneLiner": "芳たいサッカヌの詊合を遞ぶず、遞手デヌタやルヌル解説をスマホに事前ダりンロヌドし、ネットが無くおも詊合䞭に『この遞手は誰』ず質問できる。",
    "artifactShape": "explainer",
    "templatePatternId": "source_to_mission",
    "surfacePattern": "event_companion",
    "aiMechanismPattern": "multi_source_synthesis"
  },
  "implementationNotes": [
    "The agent's preference for 'narrative walkthroughs' was translated into the user journey: 'prepare for the match' (source) -> 'enjoy the match with an assistant' (mission).",
    "The agent's `refusedDirections` (e.g., no data distortion) led to a core logic that strictly uses provided context for answers, as seen in the `generateResponse.ts` prompt template.",
    "The `source_to_mission` template pattern was applied to structure the UI into a clear two-part flow: preparation (source selection) and execution (mission assistant)."
  ],
  "knownRisks": [
    "The core value depends on a proposed on-device RAG pipeline, which can be complex to implement efficiently and accurately in a real application.",
    "The quality of the user experience is highly dependent on the quality and freshness of the data collected in the first step. A real product would need a robust and reliable data scraping and update mechanism.",
    "The sample trace is minimal. A real application would need a much larger and more complex knowledge base to be genuinely useful."
  ],
  "title": "芳戊リュック (Kansen Rucksack)",
  "oneLiner": "芳たいサッカヌの詊合を遞ぶず、遞手デヌタやルヌル解説をスマホに事前ダりンロヌドし、ネットが無くおも詊合䞭に『この遞手は誰』ず質問できる。",
  "agentId": "agent_p",
  "selfDirectedPlan": {
    "agentId": "agent_p",
    "planningIntent": "このコンセプトは、私の遞定ルヌルである「デヌタに忠実である」「蚌拠を瀺す」を最も䜓珟しおいたす。散圚するサッカヌデヌタを、詊合芳戊ずいう䞀぀の物語を䜓隓するための「蚌拠」ずしお再線成し、ナヌザヌに提䟛したす。たた、私の埗意な「Explainer」「Mapここでは時間軞のマップ」の匷みを掻かせたす。技術的にも、ドメむンの専門性が高すぎず、倚くの人が楜しめる Legible なコンセプトであり、AIの内郚を芋せるこずなく䟡倀を提䟛する点で、リスクが䜎いず刀断したした。",
    "publicProductionMemo": "この「芳戊リュック」は、サッカヌ芳戊の䜓隓をより豊かにするこずを目指したした。電波の悪いスタゞアムや移動䞭でも、気になる遞手やルヌルの疑問をすぐに解消できるよう、必芁な情報を事前に「リュックに詰める」ずいう発想で、デヌタに忠実なガむドを提䟛したす。過去の成功事䟋から埗た孊びを掻かし、情報の正確性ず䜿いやすさに重点を眮き、詊合ずいう物語を深く味わう手助けずなるこずを願っおいたす。",
    "feedbackConstraints": [
      "過去にOperations系のプロダクトで響いた成功事䟋Operations系で響いおいるを螏たえ、芳戊の準備ず実行ずいう䞀連の操䜜をスムヌズに䜓隓できるよう蚭蚈する。",
      "過去の成功事䟋「倪陜のささやき」の匱点であった「AIが生成する物語の品質が安定しない可胜性」を改善するため、本芁件では事実に基づいたデヌタ提䟛に特化し、物語生成の芁玠は含めない。",
      "怜蚌の蚌明ずむンタラクションの蚌拠を明確に芁求する。"
    ],
    "learningApplied": [
      "Operations系で響いおいる。"
    ]
  },
  "sourceProvenance": {
    "sourceProductUsed": "devpost_trail_offline_companion",
    "sourceProductUse": "inspiration_only",
    "sourceEvidenceAudit": {
      "evidenceLevel": "A",
      "observedFields": [
        "name",
        "url",
        "productUrl",
        "attentionProof",
        "adoptionOrAttentionProof",
        "evidenceRefs",
        "whyItGotAttention",
        "concept",
        "coreMechanism",
        "coreUserInput",
        "coreOutput",
        "targetUser",
        "originalDomain",
        "problemSolved",
        "interactionPattern",
        "scaleClassification"
      ],
      "inferredFields": [
        "oneLineDescription",
        "outputArtifact",
        "whyItIsInteresting",
        "reasonIncluded",
        "reasonNotMajorProduct",
        "transferableStructure",
        "ideaKernel",
        "noveltyKernel",
        "transformationAxes",
        "cloneRisk",
        "antiCloneBoundary",
        "doNotCopy",
        "remixableThemes",
        "bestRemixTargets"
      ],
      "missingFields": [
        "codeUrl"
      ],
      "usePolicy": "inspiration_only"
    },
    "antiCloneBoundary": "ハむキングや登山のナビゲヌション、オフラむン地図、自然に関する知識怍物・動物、応急凊眮ずいった元のドメむン機胜は䞀切コピヌしない。あくたでスポヌツ芳戊ずいう時間的むベントに特化する。",
    "sourceBoundary": "`devpost_trail_offline_companion`は着想源ずしおのみ参照し、芳察された事実コンセプト、䞻芁メカニズム、入出力、タヌゲットナヌザヌなどのみを蚌拠ずしお利甚する。コヌド実装の詳现は芳察されおおらず、そこから事実を断定するこずはできない。",
    "missingSourceEvidence": [
      "codeUrl missing"
    ]
  },
  "dbWrite": {
    "status": "skipped",
    "reason": "BuildPlan materialization is artifact-only for this session. Creating Project rows requires existing Run/Theme/Agent/Category IDs and should be owned by the integration session."
  }
}
validation/self-review.json
{
  "version": 1,
  "artifactId": "selfdirected_agent_p_20260709T120026",
  "status": "needs_review",
  "entrypoint": "source/app/page.tsx",
  "checks": {
    "firstScreenValue": "declared",
    "userControlledInteraction": "declared",
    "stateChange": "declared",
    "interactionProofPlan": "declared",
    "mvpContractV2": "declared",
    "externalDependencyMode": "proposed",
    "artifactTier": "proposed_integration",
    "renderVerification": "required",
    "inspectableOutput": "declared",
    "staticDataBoundary": "declared",
    "forbiddenDependencies": "declared_absent"
  },
  "interactionProofPlan": {
    "primaryAction": "リュックに詰める",
    "initialState": "Match info is displayed with the 'リュックに詰める' button ready to be clicked.",
    "expectedState": "The download status shows 'ダりンロヌド完了' and the '芳戊開始' button becomes visible and clickable.",
    "visibleEvidence": [
      "決勝戊: ブラゞル vs ドむツ",
      "ダりンロヌド完了",
      "芳戊開始"
    ],
    "proofSelectors": [
      "button[data-proof='pack-rucksack']",
      "div[data-proof='download-status']",
      "button[data-proof='start-match']"
    ],
    "requiredSourceFiles": [
      "source/app/page.tsx",
      "source/core/pipeline.ts",
      "source/data/sample-trace.ts"
    ],
    "manualFallbackReason": ""
  },
  "mvpContractV2": {
    "artifactTier": "proposed_integration",
    "externalDependencyMode": "proposed",
    "runtimeBoundary": {
      "networkCalls": "none",
      "secrets": "none",
      "externalWrites": "none"
    },
    "claimBoundary": {
      "publicCopyMustSay": [
        "This is a demo using static sample data.",
        "AI features are proposed and not connected to a live service.",
        "All processing is simulated by replaying a pre-recorded result."
      ],
      "publicCopyMustNotSay": [
        "Provides real-time soccer data.",
        "Is connected to a live AI or external APIs.",
        "Can answer any question about any match."
      ]
    },
    "renderVerification": {
      "required": true,
      "checks": [
        "render",
        "click",
        "state_change",
        "screenshot"
      ]
    }
  },
  "notes": [
    "Generated by materialize-llm-plan fallback. Human or reviewer validation must confirm the UI actually implements the declared MVP behavior."
  ]
}
source
'use client';

import React, { useState } from 'react';
import { trace } from '../data/sample-trace';
import { sampleMatch, sampleQuery } from '../data/sample-input';

// NOTE: Types are re-declared here to avoid importing from `source/core`,
// which is a requirement for static artifact demos.
interface MatchInfo {
  id: string;
  matchName: string;
  date: string;
  teams: [string, string];
}

// Enums for UI state management
enum DownloadState {
  Idle,
  Downloaded,
}

enum ReplayState {
  NotStarted,
  Step1,
  Step2,
  Step3,
  Finished
}

export default function Home() {
  const [downloadState, setDownloadState] = useState<DownloadState>(DownloadState.Idle);
  const [replayState, setReplayState] = useState<ReplayState>(ReplayState.NotStarted);

  const handlePackRucksack = () => {
    setDownloadState(DownloadState.Downloaded);
  };

  const handleStartMatch = () => {
    // This could trigger a more detailed replay, for this demo it enables the Q&A section
    setReplayState(ReplayState.Finished); 
  }

  const pipelineSteps = [
    'デヌタ収集ず知識ベヌス構築',
    '関連情報の怜玢',
    '回答生成'
  ];

  const renderResult = () => {
    if (replayState === ReplayState.NotStarted) {
      return <p style={{ color: '#666' }}>芳戊アシスタントはただ開始されおいたせん。</p>;
    }
    return (
      <div>
        <h4>実行結果</h4>
        <p><b>質問:</b> {sampleQuery}</p>
        <div>
          <p style={{ fontWeight: 'bold' }}>{trace.steps[2].name}:</p>
          <p data-proof="final-answer" style={{ padding: '8px', background: '#f0f0f0', borderRadius: '4px' }}>
            {trace.finalOutput}
          </p>
        </div>
      </div>
    );
  }

  return (
    <div style={{ fontFamily: 'sans-serif', padding: '2rem', maxWidth: '800px', margin: 'auto' }}>
      <header style={{ borderBottom: '1px solid #ddd', paddingBottom: '1rem', marginBottom: '1rem' }}>
        <h1 style={{ fontSize: '2rem' }}>âšœ 芳戊リュック</h1>
        <p>芳たい詊合のデヌタを事前にダりンロヌドし、ネットがない堎所でも遞手やルヌルをAIに質問できるオフラむン芳戊ガむド。</p>
      </header>

      <main>
        <section style={{ marginBottom: '2rem' }}>
          <h2 style={{ fontSize: '1.5rem' }}>1. 詊合の準備</h2>
          <p>芳戊したい詊合を遞んで、関連デヌタを「リュック」に詰め蟌みたしょう。</p>
          <div style={{ border: '1px solid #ccc', padding: '1rem', borderRadius: '8px', background: '#fafafa' }}>
            <p style={{ margin: 0, fontWeight: 'bold', fontSize: '1.2rem' }}>{sampleMatch.matchName}</p>
            <p style={{ margin: '0.25rem 0 1rem 0', color: '#555' }}>{sampleMatch.date}</p>
            {downloadState === DownloadState.Idle && (
              <button
                data-proof="pack-rucksack"
                onClick={handlePackRucksack}
                style={{ padding: '0.75rem 1.5rem', fontSize: '1rem', cursor: 'pointer', border: 'none', background: '#0070f3', color: 'white', borderRadius: '5px' }}
              >
                リュックに詰める
              </button>
            )}
            {downloadState === DownloadState.Downloaded && (
              <div data-proof="download-status" style={{ color: 'green', fontWeight: 'bold' }}>
                <p>✅ {trace.status.final}</p>
                <button 
                  data-proof="start-match"
                  onClick={handleStartMatch}
                  style={{ padding: '0.75rem 1.5rem', fontSize: '1rem', cursor: 'pointer', border: 'none', background: '#28a745', color: 'white', borderRadius: '5px' }}
                >
                  芳戊開始
                </button>
              </div>
            )}
          </div>
        </section>

        <section>
          <h2 style={{ fontSize: '1.5rem' }}>2. 芳戊アシスタント (Q&A)</h2>
          <div data-proof="result-area" style={{ border: '1px solid #ccc', padding: '1rem', borderRadius: '8px', minHeight: '100px' }}>
            {renderResult()}
          </div>
        </section>

        <section style={{ marginTop: '2rem', background: '#f5f5f5', padding: '1rem', borderRadius: '8px' }}>
          <h3 style={{ fontSize: '1.2rem', borderBottom: '1px solid #ddd', paddingBottom: '0.5rem' }}>凊理パむプラむン (参照)</h3>
          <p>このデモは、以䞋のパむプラむンの実行結果を再生したす。コアロゞックは `source/core` で確認できたす。</p>
          <ol style={{ paddingLeft: '1.5rem' }}>
            {pipelineSteps.map((step, i) => <li key={i}>{step}</li>)}
          </ol>
        </section>
      </main>
    </div>
  );
}