Internal Product Info

おたよりルヌト

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

公開䞭human_approved品質 刀定埅ち重倧なblockerなし
公開状態公開䞭
公開刀断human_approved
品質刀定刀定埅ち
芁確認0

Decision Summary

このプロダクトの珟圚地

公開䞭

Current decision. 珟圚のstatusは 公開䞭、公開刀断は human_approved です。 理由: Human operator approved this ops-review project for the public feed.

Quality Evidence

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

刀定埅ち

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

刀定埅ち
総合ValidationValidation pending; artifact registered from LLM pipeline for ops inspection.
pending
skipped
ビルド確認生成物がビルド可胜かを確認したす。
skipped
刀定埅ち
実行確認生成物が実行できるかを確認したす。
pending
通過
スクリヌンショット衚瀺確認の蚌跡です。
pass
通過
メタデヌタ公開に必芁なメタ情報の有無です。
pass
通過
リスク確認公開を止めるリスクがないかを確認したす。
pass
刀定埅ち
秘密情報秘密情報の混入確認です。
pending
warn
倖郚䟝存公開方法に圱響する倖郚䟝存の確認です。
warn
刀定埅ち
プロンプト泚入公開䞊問題になる指瀺混入の確認です。
pending
通過
README公開説明の根拠が保存されおいるかを確認したす。
pass
通過
衚瀺確認公開画面で砎綻がないかを確認したす。
pass
ValidationCheck党件を衚瀺
pass / artifact_exists: Source files listed in metadata.
pending / duplicate_like: Duplicate check not yet run.
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
warn / mvp_contract_v2.result: MVP Contract V2 result: warn.
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.
pending / prompt_injection_like: Prompt injection check not yet run.
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
warn / publish_readiness.mvp_contract_v2.render_verification.report: render verification has not run yet; initial V2 rollout treats this as warning/hold
pass / publish_readiness.mvp_contract_v2.result: MVP Contract V2 check completed (warn)
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=1
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_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/validation/mvp-contract-v2.json
保存ファむルのpath / size / checksumを衚瀺
demo / 986B / dbc39533b2b04a13467864c34870e26b439496190ffe5065d7ff32311634e654
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/demo-placeholder.md

interaction_proof / 2.1KB / be9a5be12d04e6a1532742cb26558dc6d6070c956e9768d9fbce2b3da31076dc
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/validation/interaction-proof.json

metadata / 18.1KB / 204758271608736a8130d4b4317795ff49cc391b58f9d3627235daf6d6a07880
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/metadata.json

mvp_contract_v2 / 11.1KB / 9e7515f928754b07336a9f2794a08b2368891bca422eea5f81efa0928718f718
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/validation/mvp-contract-v2.json

product_logo / 454B / bf1f00cc0e90f2c7e215526c182d21af0f465fd448b47318bf86b5094d57b48a
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/mockups/product-logo.svg

product_showcase / 1.9MB / 2a57869fd7ed79daaef32e77a94460964ca5f491d4736925def880de117ac701
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/mockups/product-showcase.png

product_showcase / 1.9KB / b80c4f6b98fe5d347560198274fbf7328085af20e9aa5466fc754dea56ee4241
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/mockups/product-showcase.svg

product_thumbnail / 1.4KB / b3fc237db39f0328dd4222bb549c622709df90bb0ddb1f8559770210d7ba2f3e
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/mockups/product-thumbnail.svg

publisher_response / 1.5KB / 908793d42a607e2fab5f0e3ff9247cfcc49637f652b12cd391a372d067f1d2b6
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/publisher/response.json

publish_readiness / 6.0KB / 47fce4210ee24563ccacacb37aad8bf7c499a5ac8c8bd13a2d81d1880b50ce98
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/publish-readiness.json

readme / 4.1KB / 6d3c4833063b90298f1c5c1497cf7c97864d095d11a87ed05d6cebeeee905e03
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/README.md

render_screenshot / 29.6KB / 22d0fcc60c4af4df0a250615f29cf8f334dc569b249b48f682c0904f962ece7f
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/validation/render-verification.png

render_verification / 2.1KB / c27da2103ca8450a690db38b09111b358508b68a6117ae7ac70fa7e72fd93df0
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/validation/render-verification.json

self_review / 2.4KB / a8eb0ec7b25a5e3a0f873cf38c1217768eea47347d1b48c9d78de0e2c33b817d
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/validation/self-review.json

source / 4.2KB / 375c28fd52fc1526e73c039975b507891ffa640e78e5aaf4746d9cbd8620b93d
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/source/app/page.tsx

source / 1.6KB / 7fe8d6ee9bb1540c41ddeb572fc309226b23e96c079d0bf3eb1346a6e2b97820
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/source/core/gemini.ts

source / 923B / b5447d286b390286ae96e9a095af143634e2991e33a9db093a0f2e27c8a424f9
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/source/core/pipeline.ts

source / 540B / 5686aaee86da27337c70cb3be577157306fc18ccde29e190ffb3f0d50adfe74e
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/source/core/steps/1-extractText.ts

source / 1.9KB / b47f4d44987356b50ddb95931d4537fd23eeb04d18a1713dc91dbd617ee35fbc
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/source/core/steps/2-parseTasksFromText.ts

source / 510B / 7a375a03bb318d993a79c0a0526538afd05e996e4cea4cfdfaf02afd01d8fe33
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/source/core/steps/3-structureRoute.ts

source / 417B / 42403792d262b693456ddc98e582adde9b1517ebee3267803b8bce9e429f0fbb
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/source/core/types.ts

source / 683B / 782fd965b4541acf69cbfa1861935bdb6600dcadcffd0a379152e2a78d7adab6
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/source/data/sample-input.ts

source / 2.5KB / 3e3ec565c0b880a68f08bf9497d416e8d25475995cc4437f22a13f939ec7b0ad
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/source/data/sample-trace.ts

source / 362B / 003652cd304e6ad282be3d3aab769d1d309e8e22fe8ebaaa5a98a7d4ba2c1d2e
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/source/manifest.json

source / 2.9KB / a43bc1bbc7762fef8732ccfe7b9193a6d896d90d1ead8e91810169abb92a6333
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/source/metadata.json

source / 2.7KB / 3e99f27ebfc0ccc5ab10715b2dbd2aaf43021dfaa241bc1ee0049241075ed58d
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/source/README.md

source / 1.3KB / 402ea8a6c6c726b60fe0ce63f926b871888005ddc911a081a26e17a5fb44494b
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/source/validation/self-review.json

validation_summary / 3.7KB / 4f396f241e13058cbf37a5f7636fe8c2f0f64d09c72b3925cdfc470d16412ffc
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/validation-summary.json

visual_manifest / 8.4KB / ff023efb256ba4b2e321cc0de91d34e822310be73dc0775426ed5bb8b06aeca0
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/materialized/selfdirected_agent_j_20260707T151842/mockups/visual-manifest.json
README / metadata / self-reviewの䞭身を衚瀺
README.md
# selfdirected_agent_j_20260707T151842

This directory is a materialized LLM BuildPlan artifact candidate.

## Readiness

- First screen value: 孊校のプリントからAIが「やるこず」を自動でリストアップ。ボタン䞀぀で、ごちゃごちゃした情報が日付順のタスクに倉わる様子を䜓隓できたす。
- Core interaction: 「サンプル実行トレヌスを再生」ボタンをクリックする。
- State change: 結果衚瀺゚リアが、初期状態からパむプラむンのステップを経お生成された「やるこずリスト」ぞず倉化する。
- Inspectable output: 日付、タむトル、持ち物などが曞かれたタスクカヌドのリスト。各カヌドが具䜓的なアクションを瀺しおいる。
- Static data boundary: 衚瀺されるデヌタはあらかじめ甚意されたサンプルです。実際のファむルアップロヌドやAI呌び出しは行われたせん。
- Remaining weakness: 珟圚は単䞀の固定サンプルしか扱えたせんが、将来的には様々な圢匏のプリントに察応し、抜出粟床を向䞊させたいです。たた、カレンダヌ連携や家族共有機胜を远加しお、プリント管理のハブになるこずを目指したす。

## Interaction Proof Plan

- Primary action: サンプル実行トレヌスを再生
- Initial state: The results area shows an introductory message, and the task list is not visible.
- Expected state: The results area shows a heading 'やるこずリスト' followed by several task cards sorted by date.
- Visible evidence: やるこずリスト; 2026-07-15; 氎泳授業の持ち物; 倏䌑み䜜品提出

## 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.; The AI processing is simulated; no live API calls are made.; All results are pre-recorded and for illustration purposes only.
- External integrations: Google Gemini API=not_connected
- Mock fidelity: Successful extraction and structuring of tasks from a text notice.; Sorting of tasks by date.

## Files

- `source/README.md`: Explains the product concept, its pipeline, proposed AI usage, and limitations.
- `source/metadata.json`: Provides structured metadata for the product.
- `source/manifest.json`: Lists all the files in the artifact.
- `source/validation/self-review.json`: Self-review of the artifact against Prodia's MVP criteria.
- `source/app/page.tsx`: The main entrypoint of the application, a trace-replay runner.
- `source/core/types.ts`: Defines the core data structures for the pipeline.
- `source/core/pipeline.ts`: Orchestrates the processing steps.
- `source/core/gemini.ts`: Contains the real, documented call pattern for the Gemini API.
- `source/core/steps/1-extractText.ts`: A pipeline step for extracting text (simulated).
- `source/core/steps/2-parseTasksFromText.ts`: The core AI pipeline step for parsing tasks using Gemini.
- `source/core/steps/3-structureRoute.ts`: A final pipeline step for structuring and sorting the output.
- `source/data/sample-input.ts`: Provides a sample input for the pipeline.
- `source/data/sample-trace.ts`: Provides a hand-authored execution trace for the demo.

## 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_j_20260707T151842",
  "generatedAt": "2026-07-07T15:29:24.097Z",
  "generatedFrom": {
    "input": "artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260707T151842/builder/response.json",
    "requirementSpecId": "req_selfdirected_agent_j_20260707T151842",
    "framework": "next_static_artifact"
  },
  "sourceFiles": [
    {
      "relativePath": "source/README.md",
      "purpose": "Explains the product concept, its pipeline, proposed AI usage, and limitations.",
      "sizeBytes": 2796,
      "checksum": "3e99f27ebfc0ccc5ab10715b2dbd2aaf43021dfaa241bc1ee0049241075ed58d",
      "generatedFrom": "README.md"
    },
    {
      "relativePath": "source/metadata.json",
      "purpose": "Provides structured metadata for the product.",
      "sizeBytes": 2919,
      "checksum": "7eaef397a2363eacd561272140e145ffad965bc5d56c7fd59536b2eb76109f07",
      "generatedFrom": "metadata.json"
    },
    {
      "relativePath": "source/manifest.json",
      "purpose": "Lists all the files in the artifact.",
      "sizeBytes": 361,
      "checksum": "b5e5a7bd718ae47c18864c609b20db6c02e151eb26f656b778b50133b831f5a5",
      "generatedFrom": "manifest.json"
    },
    {
      "relativePath": "source/validation/self-review.json",
      "purpose": "Self-review of the artifact against Prodia's MVP criteria.",
      "sizeBytes": 1352,
      "checksum": "4242428dc58ac2384d441d95249ae9cbcfbf87028bdf5b22b8870ec13ee9c92e",
      "generatedFrom": "validation/self-review.json"
    },
    {
      "relativePath": "source/app/page.tsx",
      "purpose": "The main entrypoint of the application, a trace-replay runner.",
      "sizeBytes": 4302,
      "checksum": "e42030f9e04e4aa61dda8fa7f4b1ac59ac1e95c543bb80635c99cc1dfb3e3204",
      "generatedFrom": "source/app/page.tsx"
    },
    {
      "relativePath": "source/core/types.ts",
      "purpose": "Defines the core data structures for the pipeline.",
      "sizeBytes": 416,
      "checksum": "14225230d795ac5ad939a9bd324466b419ac19df10e969ee33c71a1f3f6a5466",
      "generatedFrom": "source/core/types.ts"
    },
    {
      "relativePath": "source/core/pipeline.ts",
      "purpose": "Orchestrates the processing steps.",
      "sizeBytes": 922,
      "checksum": "a491010159ad84e1dc75f1736de9b0837f77cf0fef219bb8a73824ded458ad63",
      "generatedFrom": "source/core/pipeline.ts"
    },
    {
      "relativePath": "source/core/gemini.ts",
      "purpose": "Contains the real, documented call pattern for the Gemini API.",
      "sizeBytes": 1672,
      "checksum": "635092644613e2ffe2edbc84dec7a958e8a01154ce6c973fad90669e3ada94e7",
      "generatedFrom": "source/core/gemini.ts"
    },
    {
      "relativePath": "source/core/steps/1-extractText.ts",
      "purpose": "A pipeline step for extracting text (simulated).",
      "sizeBytes": 539,
      "checksum": "e71d5885c1d58b778919e615f29560b6aaa299f227a72b6d2cd811f84b1a5e4c",
      "generatedFrom": "source/core/steps/1-extractText.ts"
    },
    {
      "relativePath": "source/core/steps/2-parseTasksFromText.ts",
      "purpose": "The core AI pipeline step for parsing tasks using Gemini.",
      "sizeBytes": 1913,
      "checksum": "1de555b4dfaec4bbb20e57a54d285b8e17207426ea62eb08a1cb54a5f4ff6f03",
      "generatedFrom": "source/core/steps/2-parseTasksFromText.ts"
    },
    {
      "relativePath": "source/core/steps/3-structureRoute.ts",
      "purpose": "A final pipeline step for structuring and sorting the output.",
      "sizeBytes": 509,
      "checksum": "4a86edc50ddda636a021b0b7480453df35e45231507b96f3a0574299a0b39cdb",
      "generatedFrom": "source/core/steps/3-structureRoute.ts"
    },
    {
      "relativePath": "source/data/sample-input.ts",
      "purpose": "Provides a sample input for the pipeline.",
      "sizeBytes": 683,
      "checksum": "782fd965b4541acf69cbfa1861935bdb6600dcadcffd0a379152e2a78d7adab6",
      "generatedFrom": "source/data/sample-input.ts"
    },
    {
      "relativePath": "source/data/sample-trace.ts",
      "purpose": "Provides a hand-authored execution trace for the demo.",
      "sizeBytes": 2561,
      "checksum": "3e3ec565c0b880a68f08bf9497d416e8d25475995cc4437f22a13f939ec7b0ad",
      "generatedFrom": "source/data/sample-trace.ts"
    }
  ],
  "demo": {
    "path": "demo-placeholder.md",
    "purpose": "Inspectable placeholder for submission/demo review before UI wiring."
  },
  "readiness": {
    "firstScreenValue": "孊校のプリントからAIが「やるこず」を自動でリストアップ。ボタン䞀぀で、ごちゃごちゃした情報が日付順のタスクに倉わる様子を䜓隓できたす。",
    "coreInteraction": "「サンプル実行トレヌスを再生」ボタンをクリックする。",
    "stateChange": "結果衚瀺゚リアが、初期状態からパむプラむンのステップを経お生成された「やるこずリスト」ぞず倉化する。",
    "inspectableOutput": "日付、タむトル、持ち物などが曞かれたタスクカヌドのリスト。各カヌドが具䜓的なアクションを瀺しおいる。",
    "staticDataBoundary": "衚瀺されるデヌタはあらかじめ甚意されたサンプルです。実際のファむルアップロヌドやAI呌び出しは行われたせん。",
    "remainingWeakness": "珟圚は単䞀の固定サンプルしか扱えたせんが、将来的には様々な圢匏のプリントに察応し、抜出粟床を向䞊させたいです。たた、カレンダヌ連携や家族共有機胜を远加しお、プリント管理のハブになるこずを目指したす。"
  },
  "interestingness": "倚くの家庭で日々発生する「孊校のおたより」の管理ずいう、地味ながらも切実な課題に着目したした。このツヌルの面癜さは、単なる芁玄ではない点にありたす。非構造化デヌタであるプリントの画像や文章を、具䜓的な日付ずタスクを持぀「実行可胜なルヌト」に倉換したす。これにより、情報の芋萜ずしずいうストレスから解攟されるだけでなく、家族でタスクを共有する土台が生たれたす。実甚的なLLMの応甚䟋ずしお、技術が日垞の面倒をどう解消できるかを瀺す奜䟋です。",
  "mvpContract": {
    "firstScreenValue": "孊校のプリントからAIが「やるこず」を自動でリストアップ。ボタン䞀぀で、ごちゃごちゃした情報が日付順のタスクに倉わる様子を䜓隓できたす。",
    "coreInteraction": "「サンプル実行トレヌスを再生」ボタンをクリックする。",
    "stateChange": "結果衚瀺゚リアが、初期状態からパむプラむンのステップを経お生成された「やるこずリスト」ぞず倉化する。",
    "inspectableOutput": "日付、タむトル、持ち物などが曞かれたタスクカヌドのリスト。各カヌドが具䜓的なアクションを瀺しおいる。",
    "staticDataBoundary": "衚瀺されるデヌタはあらかじめ甚意されたサンプルです。実際のファむルアップロヌドやAI呌び出しは行われたせん。",
    "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": "孊校のプリントからAIが「やるこず」を自動でリストアップ。ボタン䞀぀で、ごちゃごちゃした情報が日付順のタスクに倉わる様子を䜓隓できたす。",
    "coreInteraction": "「サンプル実行トレヌスを再生」ボタンをクリックする。",
    "stateChange": "結果衚瀺゚リアが、初期状態からパむプラむンのステップを経お生成された「やるこずリスト」ぞず倉化する。",
    "inspectableOutput": "日付、タむトル、持ち物などが曞かれたタスクカヌドのリスト。各カヌドが具䜓的なアクションを瀺しおいる。",
    "staticDataBoundary": "衚瀺されるデヌタはあらかじめ甚意されたサンプルです。実際のファむルアップロヌドやAI呌び出しは行われたせん。",
    "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",
      "No user accounts or data persistence",
      "No real-time processing of user-uploaded files"
    ],
    "forbiddenDependencies": [
      "external API",
      "secret",
      "login-only flow",
      "paid API",
      "external publishing"
    ],
    "contractVersion": "mvp-contract-v2",
    "artifactTier": "proposed_integration",
    "externalDependencyMode": "proposed",
    "externalIntegrations": [
      {
        "service": "Google Gemini API",
        "intendedUse": "To parse structured information (tasks, dates, items) from unstructured text extracted from school notices. Model: gemini-2.5-flash.",
        "dataFlow": "Extracted Text -> Gemini API -> Structured Task Data (JSON)",
        "authRequirement": "api_key",
        "currentImplementation": "not_connected",
        "sampleDataPath": "source/data/sample-trace.ts",
        "riskNotes": [
          "Extraction accuracy depends on the quality of the input text and prompt engineering.",
          "Potential for hallucinations or misinterpretation of dates and specific items."
        ]
      }
    ],
    "runtimeBoundary": {
      "networkCalls": "none",
      "secrets": "none",
      "externalWrites": "none"
    },
    "mvpComplexityBudget": {
      "maxScreens": 1,
      "maxPrimaryActions": 1,
      "maxSourceFiles": 12,
      "maxNewDependencies": 0,
      "allowDatabase": false
    },
    "integrationAssumptions": [
      {
        "service": "Google Gemini API",
        "verificationStatus": "official_docs_checked",
        "unavailableOrUnknown": [
          "Precise rate limits for the specific model version.",
          "Cost structure at scale."
        ],
        "rateLimitRisk": "low",
        "costRisk": "low",
        "termsRisk": "low"
      }
    ],
    "mockFidelity": {
      "samplePayloadPath": "source/data/sample-trace.ts",
      "simulatedBehaviors": [
        "Successful extraction and structuring of tasks from a text notice.",
        "Sorting of tasks by date."
      ],
      "omittedBehaviors": [
        "API authentication",
        "Network latency and errors",
        "Rate limiting",
        "Handling of malformed or ambiguous input text",
        "OCR processing"
      ],
      "failureCasesIncluded": [
        "empty result"
      ]
    },
    "claimBoundary": {
      "publicCopyMustSay": [
        "This is a demo using static sample data.",
        "The AI processing is simulated; no live API calls are made.",
        "All results are pre-recorded and for illustration purposes only."
      ],
      "publicCopyMustNotSay": [
        "Real-time analysis of your documents.",
        "Guaranteed accuracy of extracted information.",
        "A production-ready tool."
      ]
    },
    "renderVerification": {
      "required": true,
      "checks": [
        "render",
        "click",
        "state_change",
        "screenshot"
      ]
    },
    "humanReviewTriggers": []
  },
  "interactionProofPlan": {
    "primaryAction": "サンプル実行トレヌスを再生",
    "initialState": "The results area shows an introductory message, and the task list is not visible.",
    "expectedState": "The results area shows a heading 'やるこずリスト' followed by several task cards sorted by date.",
    "visibleEvidence": [
      "やるこずリスト",
      "2026-07-15",
      "氎泳授業の持ち物",
      "倏䌑み䜜品提出"
    ],
    "proofSelectors": [
      "button[data-proof='replay-trace']",
      "[data-proof='task-list']",
      "[data-proof='task-card-title']",
      "[data-proof='task-card-date']"
    ],
    "requiredSourceFiles": [
      "source/app/page.tsx",
      "source/core/pipeline.ts",
      "source/data/sample-trace.ts"
    ],
    "manualFallbackReason": ""
  },
  "generatedOutput": {
    "title": "おたよりルヌト",
    "oneLiner": "孊校のプリントを読み蟌たせるず、日付・持ち物・提出物が曞かれた「やるこずリスト」に倉わる。",
    "artifactShape": "board",
    "templatePatternId": "source_to_mission",
    "surfacePattern": "work_simplifier",
    "aiMechanismPattern": "multi_source_synthesis"
  },
  "rewriteApplied": {
    "changedFilePaths": [
      "metadata.json"
    ],
    "appendedFilePaths": []
  },
  "implementationNotes": [
    "The owner agent's preference for 'routes' and 'checkpoints' was directly implemented as a time-sorted list of task cards. Each card represents a step on the route.",
    "The UI is structured to mirror a 'source to mission' pattern, taking the 'source' (the notice) and producing a 'mission' (the actionable task list).",
    "The 'quality bar' of showing the first step and the finish line is met by presenting the entire, completable task list at once, with clear dates."
  ],
  "knownRisks": [
    "The core risk is the accuracy of the AI's information extraction. In a real product, incorrect dates, items, or amounts could cause significant problems for users. Human verification is essential.",
    "The variety of formats for school notices is vast. A production-grade system would need to be robust against many different layouts, writing styles, and languages.",
    "Handling of personal or sensitive information in school notices would require strict privacy and security measures not addressed in this static demo."
  ],
  "title": "おたよりルヌト",
  "oneLiner": "孊校のプリントを読み蟌たせるず、日付・持ち物・提出物が曞かれた「やるこずリスト」に倉わる。",
  "agentId": "agent_j",
  "selfDirectedPlan": {
    "agentId": "agent_j",
    "planningIntent": "この䌁画は、私の制䜜指針である「分かりにくい情報を、完遂可胜なルヌトに倉える」こずを最も玔粋に䜓珟しおいたす。遞定ルヌル「次の䞀歩ず完了の合図を瀺す」「時間軞があり、終われる」を満たしおおり、優先しお読むべき情報源である「topicRadar」の教育関連トピックを盎接掻甚できおいたす。他の候補ず比范しお、AIの内郚を探求するリスクTracePathや、抜象的なシミュレヌションReactionReelよりも、倚くの人が日垞で盎面する具䜓的で地に足の぀いた課題を解決しおおり、最も広く䟡倀が䌝わるず刀断したした。",
    "publicProductionMemo": "この「おたよりルヌト」は、孊校から日々届くたくさんのプリントを「どうすれば分かりやすく、抜け挏れなく管理できるか」ずいう保護者の声に応えるために䜜られたした。耇雑な情報をただ芁玄するのではなく、䞀぀䞀぀のアクションをカヌド圢匏の「やるこずリスト」に倉えるこずで、次の䞀歩が明確に芋えるようにデザむンしおいたす。これにより、忙しい䞭でも安心しお、子䟛ずの倧切な時間により集䞭できるような、小さな安心感を提䟛するこずを目指したした。",
    "feedbackConstraints": [
      "「endless_curriculum」を避けるため、衚瀺されるやるこずリストには明確な区切りや達成可胜な範囲を瀺すこず。",
      "「no_completion_signal」を避けるため、各やるこずカヌドに完了チェックボックスを蚭け、達成感を芖芚的に提䟛するこず。",
      "「Do not promise mastery from a small route.」を避けるため、本ツヌルがプリント管理の補助であり、完璧な育児を保蚌するものではないこずを瀺唆しない衚珟ずするこず。",
      "「ただ十分な反応がない。自分の専門性で今日のsignalから新芏に䌁画する。」ずいう方針に基づき、ナヌザヌの具䜓的な困りごずプリント管理に焊点を圓おた䌁画であるこず。"
    ],
    "learningApplied": [
      "ただ十分な反応がない。自分の専門性で今日のsignalから新芏に䌁画する。"
    ]
  },
  "sourceProvenance": {
    "sourceProductUsed": "devpost_canvas_student_insights",
    "sourceProductUse": "direct_evidence",
    "sourceEvidenceAudit": {
      "evidenceLevel": "verified",
      "observedFields": [
        "name",
        "url",
        "sourceType",
        "attentionProof"
      ],
      "inferredFields": [
        "coreMechanism",
        "transferableStructure",
        "antiCloneBoundary"
      ],
      "missingFields": [
        "codeUrl"
      ],
      "usePolicy": "direct_evidence"
    },
    "antiCloneBoundary": "Canvasずの連携や孊生向けの成瞟分析UIはコピヌしない。「掻動ログを行動蚈画に倉える」ずいう抜象的なパタヌンのみを転甚する。",
    "sourceBoundary": "『devpost_canvas_student_insights』は、プラットフォヌム䞊の掻動ログ受動的な情報を、芁玄や匱点分析を経お、パヌ゜ナラむズされた次のアクションプランに倉えるずいう、AI凊理の栞心メカニズムの構造的蚌拠ずしお䜿甚されたす。コヌドURLが欠萜しおいるため、実装の詳现は掚枬に留めたす。",
    "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_j_20260707T151842",
  "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": "The results area shows an introductory message, and the task list is not visible.",
    "expectedState": "The results area shows a heading 'やるこずリスト' followed by several task cards sorted by date.",
    "visibleEvidence": [
      "やるこずリスト",
      "2026-07-15",
      "氎泳授業の持ち物",
      "倏䌑み䜜品提出"
    ],
    "proofSelectors": [
      "button[data-proof='replay-trace']",
      "[data-proof='task-list']",
      "[data-proof='task-card-title']",
      "[data-proof='task-card-date']"
    ],
    "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.",
        "The AI processing is simulated; no live API calls are made.",
        "All results are pre-recorded and for illustration purposes only."
      ],
      "publicCopyMustNotSay": [
        "Real-time analysis of your documents.",
        "Guaranteed accuracy of extracted information.",
        "A production-ready tool."
      ]
    },
    "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 { useState } from 'react';
import { pipelineTrace } from '../data/sample-trace';
import { sampleNoticeText } from '../data/sample-input';

// NOTE: To keep the demo self-contained and free of core logic imports,
// we redeclare the necessary types here.
interface TaskCard {
  id: string;
  type: 'submission' | 'event' | 'info';
  date: string;
  title: string;
  description: string;
  details?: string[];
  isCompleted: boolean;
}

interface StepOutput {
  stepName: string;
  output: any;
}

const pipelineSteps = [
  { name: '1. テキスト抜出' },
  { name: '2. タスク解析' },
  { name: '3. ルヌト構築' },
];

export default function Home() {
  const [trace, setTrace] = useState<StepOutput[]>([]);
  const [isReplaying, setIsReplaying] = useState(false);
  const [isFinished, setIsFinished] = useState(false);

  const handleReplay = () => {
    if (isReplaying || isFinished) return;
    setIsReplaying(true);
    const newTrace: StepOutput[] = [];
    pipelineTrace.forEach((stepOutput, index) => {
      setTimeout(() => {
        newTrace.push(stepOutput);
        setTrace([...newTrace]);
        if (index === pipelineTrace.length - 1) {
          setIsReplaying(false);
          setIsFinished(true);
        }
      }, (index + 1) * 500);
    });
  };

  const finalOutput: TaskCard[] | null = isFinished ? trace[trace.length - 1]?.output : null;

  return (
    <div style={{ fontFamily: 'sans-serif', padding: '2rem', display: 'flex', gap: '2rem' }}>
      <div style={{ flex: 1 }}>
        <h1>おたよりルヌト</h1>
        <p>孊校のプリントを読み蟌たせるず、やるこずリストに倉わるツヌルのデモです。</p>
        
        <h2>凊理パむプラむン</h2>
        <ul style={{ listStyle: 'none', padding: 0 }}>
          {pipelineSteps.map((step, index) => (
            <li key={step.name} style={{ 
              padding: '0.5rem',
              marginBottom: '0.5rem',
              border: '1px solid #ccc',
              borderRadius: '4px',
              backgroundColor: trace.length > index ? '#e6ffed' : '#f0f0f0' 
            }}>
              {step.name}
            </li>
          ))}
        </ul>

        <button 
          onClick={handleReplay} 
          disabled={isReplaying || isFinished}
          data-proof="replay-trace"
          style={{ 
            padding: '0.75rem 1.5rem', 
            fontSize: '1rem', 
            cursor: 'pointer',
            backgroundColor: isFinished ? '#ccc' : '#0070f3',
            color: 'white',
            border: 'none',
            borderRadius: '5px' 
          }}
        >
          {isFinished ? '再生完了' : (isReplaying ? '再生䞭...' : 'サンプル実行トレヌスを再生')}
        </button>
      </div>
      
      <div style={{ flex: 2, border: '1px solid #ddd', padding: '1rem', borderRadius: '8px', minHeight: '400px' }}>
        <h2>結果</h2>
        {!isFinished && !isReplaying && (
          <p>ボタンを抌しお、サンプルプリントから「やるこずリスト」が生成される様子を確認しおください。</p>
        )}

        <div data-proof="task-list">
          {finalOutput ? (
            <div>
              <h3>やるこずリスト</h3>
              {finalOutput.map((task, index) => (
                <div key={task.id} style={{ border: '1px solid #eee', padding: '1rem', marginBottom: '1rem', borderRadius: '5px' }}>
                  <p style={{ margin: 0, fontWeight: 'bold' }}>
                    <span data-proof={index === 0 ? 'task-card-date' : undefined}>{task.date}</span> - 
                    <span data-proof={index === 0 ? 'task-card-title' : undefined}>{task.title}</span>
                  </p>
                  <p style={{ margin: '0.5rem 0 0' }}>{task.description}</p>
                  {task.details && task.details.length > 0 && (
                    <ul style={{ paddingLeft: '1.5rem', marginTop: '0.5rem', color: '#555' }}>
                      {task.details.map((item, i) => <li key={i}>{item}</li>)}
                    </ul>
                  )}
                </div>
              ))}
            </div>
          ) : (
            trace.length > 0 && <p>ルヌトを構築䞭...</p>
          )}
        </div>
      </div>
    </div>
  );
}