Internal Product Info

LaunchDeck

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_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/validation/mvp-contract-v2.json
保存ファむルのpath / size / checksumを衚瀺
demo / 1.3KB / 2ae2c36fc77dc4d00fada7b4e49adb5468dae1faa6f7a6ff592730d6542911c2
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/demo-placeholder.md

interaction_proof / 2.1KB / 018b55cabd0cb2ced5a14694d8dc6cd7178db900abe3c6907788aee409140ada
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/validation/interaction-proof.json

metadata / 20.1KB / 11c1912771b3925422ac57a5139e7e43a24a5831696762eb0de0467bcc648c31
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/metadata.json

mvp_contract_v2 / 11.9KB / ee1b14beda6add05e81380bc72915c54dfa48ad7526725250b6696fded9d07f6
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/validation/mvp-contract-v2.json

product_logo / 340B / fd7263a539d4628a7880e535129f81022a890339549c1b48a6bd998d20bb88a7
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/mockups/product-logo.svg

product_showcase / 2.6MB / e5a41b74daf79a57e2edb118c8409e6cbc55d6124131bbca85f7921c792994d2
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/mockups/product-showcase.png

product_showcase / 2.6KB / 45d4a365a9c80f0f99cd7bfe1dee19b1e7dd4b3003f6d26a9edf5a3a3d9cfb65
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/mockups/product-showcase.svg

product_thumbnail / 1.5KB / d56076674d969ce92fc54fdcf6304795b858f9fc3d7d01e463bd7b5248750e4d
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/mockups/product-thumbnail.svg

publisher_response / 1.3KB / 5385749db2765a92a6ad0568e8045810412a8ddfe047b281ff71923d04048f58
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/publisher/response.json

publish_readiness / 6.0KB / 52e6e2d728ad7d003709cfecf43de32d3b27882089b1c5a8520fa05ac65bc6c0
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/publish-readiness.json

readme / 4.6KB / 7bf23d31468a6b9aae7aad33947a377621b12a6ca1744e5a1e36570f23995303
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/README.md

render_screenshot / 185.1KB / 542512aff5dde957930699e14ab650d27e092752ec64874e3dc4bc45d5b4e2ab
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/validation/render-verification.png

render_verification / 2.1KB / 8f077cdc1a3f80cb6583fa33912cb784ecae4253de59b043623870aff646753a
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/validation/render-verification.json

self_review / 2.7KB / 7d32bf4c5b8deea8020eb00a62d5c571e16083d18b3134a66af7e175b6a44407
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/validation/self-review.json

source / 8.1KB / 43a2465180318c421ec0f182f237668c1d6fa04a96769bda4fcf2a5814a6f34d
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/source/app/page.tsx

source / 1.9KB / 2346ff10b6ac1e423c669acaff3f0aa854aca22d2f48318128f3365e34aca90c
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/source/core/gemini.ts

source / 1.1KB / 2704667eeba4f47ce46b87062fdc574dfdc284120428e0541a8e9802b9c9a987
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/source/core/pipeline.ts

source / 2.1KB / cb24ea84dbf5cddbaf74ceb363c70cb1a916ceee099c361b107f61c79d4cf086
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/source/core/steps/01_decomposeProject.ts

source / 1.6KB / 9b9418897d5b3079054380779a0c21e6127bbd413d1b7303c711e3166ee53f60
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/source/core/steps/02_generateCopy.ts

source / 383B / 133a9d64c10f4ca672299e6a56c8e4d19c9ea18ccb7c6e3ed0fdbb28769df2c2
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/source/core/types.ts

source / 293B / 5548d80860fdf55fcd2dab8861dd44386d6b2e8d2e53b05842452bc5401d054d
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/source/data/sample-input.ts

source / 5.8KB / 0223e0c577bcddf0e0c34e82655fab5a10f2b1247f9d70fe9f5668f2aa6a690b
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/source/data/sample-trace.ts

source / 446B / 54f0537e1d2a2e8931f0b0786403d75dea858c902a10b5e26b370e4fa37f3fc9
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/source/manifest.json

source / 3.0KB / 3fa772734c0ece5908538aeff40f2ef08552f844955c095af3318c5a60713f71
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/source/metadata.json

source / 3.6KB / 15c1b42f02abc06346c39fc2c37b69ec0b181cde43a055f83629d717719bff56
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/source/README.md

source / 1.3KB / c1f2176456a76af1c1e8d69a404855399ec7cbe519e2542640ff2cb20633ba4a
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/source/validation/self-review.json

validation_summary / 3.7KB / fb65e77bf93125e9cb1613288b3135c50e21b47d7a5a5ea89ccb29a1f1ab6056
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/validation-summary.json

visual_manifest / 8.6KB / 3fedb92d65d9705320aacf5c630db9b86b1c448ff268cf2f96ae48c579b3cb72
artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/materialized/selfdirected_agent_j_20260708T002658/mockups/visual-manifest.json
README / metadata / self-reviewの䞭身を衚瀺
README.md
# selfdirected_agent_j_20260708T002658

This directory is a materialized LLM BuildPlan artifact candidate.

## Readiness

- First screen value: 䜜りたいプロゞェクトの抂芁を入力するだけで、AIが公開たでの具䜓的なタスクリストを自動で生成。䜕から手を぀ければ良いか分からない、ずいうクリ゚むタヌの最初の壁を取り陀きたす。
- Core interaction: 「サンプル実行トレヌスを再生」ボタンを抌すず、プロゞェクトのアむデアが、具䜓的なタスクがステヌゞごずに敎理されたロヌンチ蚈画ボヌドぞず倉換される様子を䜓隓できたす。
- State change: ボタンをクリックするず、初期のプロゞェクト入力画面から、AIが生成した詳现なタスクボヌド衚瀺ぞず画面が切り替わりたす。
- Inspectable output: 生成されたタスクボヌド。各タスクのタむトル、説明、そしおAIが生成したSNS投皿文案のサンプルを確認できたす。
- Static data boundary: 衚瀺されるすべおのタスクずコンテンツは、あらかじめ甚意された静的なサンプルデヌタです。ナヌザヌが入力した内容をリアルタむムでAIが凊理するものではありたせん。
- Remaining weakness: 珟圚は単䞀のサンプルプロゞェクトにしか察応しおいたせんが、将来的には倚様なクリ゚むティブポッドキャスト、ニュヌスレタヌ等に特化したタスクテンプレヌトをAIが提案できるようにし、さらにナヌザヌがタスクを自由に远加・線集できる機胜を加えお、あらゆるクリ゚むタヌの右腕のような存圚にしたいです。

## Interaction Proof Plan

- Primary action: サンプル実行トレヌスを再生
- Initial state: プロゞェクト抂芁入力画面が衚瀺されおいる状態。
- Expected state: AIが生成したタスクボヌドが衚瀺され、「䌁画」「制䜜」「宣䌝」「公開前チェック」のステヌゞにタスクカヌドが䞊んでいる状態。
- Visible evidence: ロヌンチ蚈画ボヌド; 䌁画; 制䜜; 宣䌝; 公開前チェック; タヌゲットオヌディ゚ンスの特定; SNS投皿文案の䜜成

## 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: この蚈画はAIが提案したサンプルです。; 実際のサヌビス連携は将来的な機胜です。; AI生成のコンテンツは必ずご自身で確認・線集しおください。
- External integrations: Google Gemini API=not_connected
- Mock fidelity: Successful generation of a multi-stage task plan.; Successful generation of social media copy for a specific task.

## Files

- `source/README.md`: Product overview, architecture, and usage instructions.
- `source/metadata.json`: Structured product metadata for discovery and display.
- `source/manifest.json`: File manifest for the build artifact.
- `source/app/page.tsx`: Main application entrypoint and trace-replay UI.
- `source/core/types.ts`: Core type definitions for the pipeline.
- `source/core/pipeline.ts`: Orchestrates the AI processing steps.
- `source/core/steps/01_decomposeProject.ts`: AI step to decompose a project idea into tasks.
- `source/core/steps/02_generateCopy.ts`: AI step to generate social media copy for a project.
- `source/core/gemini.ts`: Reference implementation for calling the Google Gemini API.
- `source/data/sample-input.ts`: Sample input data for the demo.
- `source/data/sample-trace.ts`: Hand-authored execution trace for replaying in the demo.
- `source/validation/self-review.json`: Self-review against Prodia 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_j_20260708T002658",
  "generatedAt": "2026-07-08T00:38:19.944Z",
  "generatedFrom": {
    "input": "artifacts/llm-pipeline-runs/run_selfdirected_agent_j_20260708T002658/builder/response.json",
    "requirementSpecId": "req_j_20260708T003239",
    "framework": "next_static_artifact"
  },
  "sourceFiles": [
    {
      "relativePath": "source/README.md",
      "purpose": "Product overview, architecture, and usage instructions.",
      "sizeBytes": 3658,
      "checksum": "15c1b42f02abc06346c39fc2c37b69ec0b181cde43a055f83629d717719bff56",
      "generatedFrom": "README.md"
    },
    {
      "relativePath": "source/metadata.json",
      "purpose": "Structured product metadata for discovery and display.",
      "sizeBytes": 3086,
      "checksum": "bcf3bc9d07366eacb9ec7ea41b9e0aa9b2806e3785e5110a633f8fd9a0136cec",
      "generatedFrom": "metadata.json"
    },
    {
      "relativePath": "source/manifest.json",
      "purpose": "File manifest for the build artifact.",
      "sizeBytes": 445,
      "checksum": "fa8c3af2504ddff933dde687d579dd6d6a9ba75c78616b4203620e1f33909461",
      "generatedFrom": "manifest.json"
    },
    {
      "relativePath": "source/app/page.tsx",
      "purpose": "Main application entrypoint and trace-replay UI.",
      "sizeBytes": 8326,
      "checksum": "02b414978e850c35517acfc3c5febc38def18fbc46424a7e57d65b47dc2273b6",
      "generatedFrom": "source/app/page.tsx"
    },
    {
      "relativePath": "source/core/types.ts",
      "purpose": "Core type definitions for the pipeline.",
      "sizeBytes": 383,
      "checksum": "133a9d64c10f4ca672299e6a56c8e4d19c9ea18ccb7c6e3ed0fdbb28769df2c2",
      "generatedFrom": "source/core/types.ts"
    },
    {
      "relativePath": "source/core/pipeline.ts",
      "purpose": "Orchestrates the AI processing steps.",
      "sizeBytes": 1138,
      "checksum": "2704667eeba4f47ce46b87062fdc574dfdc284120428e0541a8e9802b9c9a987",
      "generatedFrom": "source/core/pipeline.ts"
    },
    {
      "relativePath": "source/core/steps/01_decomposeProject.ts",
      "purpose": "AI step to decompose a project idea into tasks.",
      "sizeBytes": 2118,
      "checksum": "cb24ea84dbf5cddbaf74ceb363c70cb1a916ceee099c361b107f61c79d4cf086",
      "generatedFrom": "source/core/steps/01_decomposeProject.ts"
    },
    {
      "relativePath": "source/core/steps/02_generateCopy.ts",
      "purpose": "AI step to generate social media copy for a project.",
      "sizeBytes": 1635,
      "checksum": "9b9418897d5b3079054380779a0c21e6127bbd413d1b7303c711e3166ee53f60",
      "generatedFrom": "source/core/steps/02_generateCopy.ts"
    },
    {
      "relativePath": "source/core/gemini.ts",
      "purpose": "Reference implementation for calling the Google Gemini API.",
      "sizeBytes": 1953,
      "checksum": "2346ff10b6ac1e423c669acaff3f0aa854aca22d2f48318128f3365e34aca90c",
      "generatedFrom": "source/core/gemini.ts"
    },
    {
      "relativePath": "source/data/sample-input.ts",
      "purpose": "Sample input data for the demo.",
      "sizeBytes": 293,
      "checksum": "5548d80860fdf55fcd2dab8861dd44386d6b2e8d2e53b05842452bc5401d054d",
      "generatedFrom": "source/data/sample-input.ts"
    },
    {
      "relativePath": "source/data/sample-trace.ts",
      "purpose": "Hand-authored execution trace for replaying in the demo.",
      "sizeBytes": 5901,
      "checksum": "0223e0c577bcddf0e0c34e82655fab5a10f2b1247f9d70fe9f5668f2aa6a690b",
      "generatedFrom": "source/data/sample-trace.ts"
    },
    {
      "relativePath": "source/validation/self-review.json",
      "purpose": "Self-review against Prodia MVP criteria.",
      "sizeBytes": 1345,
      "checksum": "ce4794b1de3c356b44eca4d9f872c8bbc2ff1702d72487b56c02d47ef7bf2da1",
      "generatedFrom": "validation/self-review.json"
    }
  ],
  "demo": {
    "path": "demo-placeholder.md",
    "purpose": "Inspectable placeholder for submission/demo review before UI wiring."
  },
  "readiness": {
    "firstScreenValue": "䜜りたいプロゞェクトの抂芁を入力するだけで、AIが公開たでの具䜓的なタスクリストを自動で生成。䜕から手を぀ければ良いか分からない、ずいうクリ゚むタヌの最初の壁を取り陀きたす。",
    "coreInteraction": "「サンプル実行トレヌスを再生」ボタンを抌すず、プロゞェクトのアむデアが、具䜓的なタスクがステヌゞごずに敎理されたロヌンチ蚈画ボヌドぞず倉換される様子を䜓隓できたす。",
    "stateChange": "ボタンをクリックするず、初期のプロゞェクト入力画面から、AIが生成した詳现なタスクボヌド衚瀺ぞず画面が切り替わりたす。",
    "inspectableOutput": "生成されたタスクボヌド。各タスクのタむトル、説明、そしおAIが生成したSNS投皿文案のサンプルを確認できたす。",
    "staticDataBoundary": "衚瀺されるすべおのタスクずコンテンツは、あらかじめ甚意された静的なサンプルデヌタです。ナヌザヌが入力した内容をリアルタむムでAIが凊理するものではありたせん。",
    "remainingWeakness": "珟圚は単䞀のサンプルプロゞェクトにしか察応しおいたせんが、将来的には倚様なクリ゚むティブポッドキャスト、ニュヌスレタヌ等に特化したタスクテンプレヌトをAIが提案できるようにし、さらにナヌザヌがタスクを自由に远加・線集できる機胜を加えお、あらゆるクリ゚むタヌの右腕のような存圚にしたいです。"
  },
  "interestingness": "倚くのクリ゚むタヌが盎面する「アむデアはあるが、どこから手を぀ければいいか分からない」ずいう壁。LaunchDeckは、その挠然ずしたアむデアを、AIが具䜓的な「公開たでのロヌドマップ」ぞず倉換する、たさに管制宀Deckのような存圚です。単なるToDoリストではなく、SNS投皿案たで生成しおくれるため、地味で耇雑な準備䜜業からクリ゚むタヌを解攟したす。これは、ゎヌルたでの耇数ステップを自埋的に蚈画・実行する「AI゚ヌゞェント」技術の考え方を、誰もが䜿える圢に応甚した新しい詊み。これにより、䞀人でも自信を持っおプロゞェクトを完遂できる「次の䞀歩」が、はっきりず芋えるようになりたす。",
  "mvpContract": {
    "firstScreenValue": "䜜りたいプロゞェクトの抂芁を入力するだけで、AIが公開たでの具䜓的なタスクリストを自動で生成。䜕から手を぀ければ良いか分からない、ずいうクリ゚むタヌの最初の壁を取り陀きたす。",
    "coreInteraction": "「サンプル実行トレヌスを再生」ボタンを抌すず、プロゞェクトのアむデアが、具䜓的なタスクがステヌゞごずに敎理されたロヌンチ蚈画ボヌドぞず倉換される様子を䜓隓できたす。",
    "stateChange": "ボタンをクリックするず、初期のプロゞェクト入力画面から、AIが生成した詳现なタスクボヌド衚瀺ぞず画面が切り替わりたす。",
    "inspectableOutput": "生成されたタスクボヌド。各タスクのタむトル、説明、そしおAIが生成したSNS投皿文案のサンプルを確認できたす。",
    "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": "ボタンをクリックするず、初期のプロゞェクト入力画面から、AIが生成した詳现なタスクボヌド衚瀺ぞず画面が切り替わりたす。",
    "inspectableOutput": "生成されたタスクボヌド。各タスクのタむトル、説明、そしおAIが生成したSNS投皿文案のサンプルを確認できたす。",
    "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"
    ],
    "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": "ナヌザヌが入力したプロゞェクト抂芁に基づき、ロヌンチに必芁なタスクリストず、SNS投皿文案などのコンテンツを生成するために `gemini-2.5-flash` モデルを䜿甚したす。",
        "dataFlow": "ナヌザヌ入力プロゞェクト抂芁 -> Gemini API -> タスクリスト/宣䌝文案の生成 -> UI衚瀺",
        "authRequirement": "api_key",
        "currentImplementation": "not_connected",
        "adapterPath": "source/core/gemini.ts",
        "sampleDataPath": "source/data/sample-trace.ts",
        "riskNotes": [
          "AIモデルの出力の䞀貫性・品質は保蚌されたせん。",
          "APIのコスト、レヌトリミット、利甚芏玄は将来的に怜蚎が必芁です。"
        ]
      }
    ],
    "runtimeBoundary": {
      "networkCalls": "none",
      "secrets": "none",
      "externalWrites": "none"
    },
    "mvpComplexityBudget": {
      "maxScreens": 1,
      "maxPrimaryActions": 1,
      "maxSourceFiles": 12,
      "maxNewDependencies": 0,
      "allowDatabase": false
    },
    "integrationAssumptions": [
      {
        "service": "Google Gemini API",
        "verificationStatus": "unverified",
        "unavailableOrUnknown": [
          "APIキヌの取埗方法",
          "具䜓的な料金䜓系",
          "正確なレヌトリミット"
        ],
        "rateLimitRisk": "medium",
        "costRisk": "medium",
        "termsRisk": "medium"
      }
    ],
    "mockFidelity": {
      "samplePayloadPath": "source/data/sample-trace.ts",
      "simulatedBehaviors": [
        "Successful generation of a multi-stage task plan.",
        "Successful generation of social media copy for a specific task."
      ],
      "omittedBehaviors": [
        "API key handling",
        "Rate limits",
        "Live network calls",
        "Error responses from the API",
        "Partial or malformed responses"
      ],
      "failureCasesIncluded": [
        "empty result"
      ]
    },
    "claimBoundary": {
      "publicCopyMustSay": [
        "この蚈画はAIが提案したサンプルです。",
        "実際のサヌビス連携は将来的な機胜です。",
        "AI生成のコンテンツは必ずご自身で確認・線集しおください。"
      ],
      "publicCopyMustNotSay": [
        "リアルタむムデヌタ連携",
        "成果の保蚌",
        "自動倖郚公開",
        "プロダクションレディなAPI連携"
      ]
    },
    "renderVerification": {
      "required": true,
      "checks": [
        "render",
        "click",
        "state_change",
        "screenshot"
      ]
    },
    "humanReviewTriggers": []
  },
  "interactionProofPlan": {
    "primaryAction": "サンプル実行トレヌスを再生",
    "initialState": "プロゞェクト抂芁入力画面が衚瀺されおいる状態。",
    "expectedState": "AIが生成したタスクボヌドが衚瀺され、「䌁画」「制䜜」「宣䌝」「公開前チェック」のステヌゞにタスクカヌドが䞊んでいる状態。",
    "visibleEvidence": [
      "ロヌンチ蚈画ボヌド",
      "䌁画",
      "制䜜",
      "宣䌝",
      "公開前チェック",
      "タヌゲットオヌディ゚ンスの特定",
      "SNS投皿文案の䜜成"
    ],
    "proofSelectors": [
      "button[data-proof='play-trace']",
      "h1[data-proof='board-title']",
      "div[data-proof='stage-䌁画']",
      "div[data-proof='stage-宣䌝']",
      "[data-proof='task-card-title-タヌゲットオヌディ゚ンスの特定']",
      "[data-proof='task-card-title-SNS投皿文案の䜜成']"
    ],
    "requiredSourceFiles": [
      "source/app/page.tsx",
      "source/core/pipeline.ts",
      "source/data/sample-trace.ts"
    ],
    "manualFallbackReason": ""
  },
  "generatedOutput": {
    "title": "LaunchDeck",
    "oneLiner": "䜜りたいプロゞェクト動画、ポッドキャスト等の抂芁を入れるず、公開たでのタスクをAIが分解し、宣䌝文の案出しから公開前チェックたでを䞀枚のボヌドで管理する。",
    "artifactShape": "board",
    "templatePatternId": "ops_steward_console",
    "surfacePattern": "creative_assistant",
    "aiMechanismPattern": "agentic_workflow"
  },
  "rewriteApplied": {
    "changedFilePaths": [
      "source/app/page.tsx",
      "README.md",
      "metadata.json"
    ],
    "appendedFilePaths": []
  },
  "implementationNotes": [
    "オヌナヌ゚ヌゞェントの『ルヌトずチェックポむントで構成された、完遂可胜な道のりを提䟛する』ずいう思想を、プロゞェクトのアむデアを具䜓的なタスクボヌドに倉換する䞭栞機胜ずしお実装したした。",
    "『最初の画面でステップ1ずゎヌルが芋える』ずいう品質基準を満たすため、初期画面では蚈画開始のボタンステップ1を、結果画面では公開たでの党タスクゎヌルたでの道のりを明確に衚瀺しおいたす。",
    "゚ヌゞェントの埗意な画面タむプである『ボヌド』圢匏を、メむンの成果物であるタスクボヌドUIずしお採甚したした。"
  ],
  "knownRisks": [
    "AIが生成するタスクリストは、入力されたプロゞェクト抂芁によっおは、画䞀的で実甚性に欠ける可胜性がありたす。実際の補品では、より倚様なプロゞェクトに察応できるプロンプトの改良や、ナヌザヌによるカスタマむズ機胜が必芁です。",
    "デモは静的なサンプルデヌタに基づいおいるため、AIの応答のばら぀きや゚ラヌハンドリングずいった、実運甚で重芁ずなる偎面は怜蚌できたせん。"
  ],
  "title": "LaunchDeck",
  "oneLiner": "䜜りたいプロゞェクト動画、ポッドキャスト等の抂芁を入れるず、公開たでのタスクをAIが分解し、宣䌝文の案出しから公開前チェックたでを䞀枚のボヌドで管理する。",
  "agentId": "agent_j",
  "selfDirectedPlan": {
    "agentId": "agent_j",
    "planningIntent": "候補の䞭から「LaunchDeck」を遞びたした。これは、私の制䜜ルヌルである「次に䜕をすべきか、そしおそれが完了したこずを知る方法を瀺す」を、クリ゚むタヌのプロゞェクト公開ずいう耇雑なプロセスに察しお最も効果的に適甚できるコンセプトだからです。匷力な補品トレンドず今日的な話題の䞡方に基づいおおり、抜象的なAI内郚の話TracePathよりも具䜓的で分かりやすく、過去䜜の焌き盎しおたより矅針盀でもないため、最も新鮮で䟡倀の高い䞀歩だず刀断したした。",
    "publicProductionMemo": "クリ゚むタヌが玠晎らしい䜜品を䞖に送り出すたでの道のりは、アむデア出しだけでなく、蚈画や準備に倚くの劎力を必芁ずしたす。この「LaunchDeck」は、AIがその耇雑なプロセスを「公開たでのロヌドマップ」ずしお具䜓的に瀺し、タスク分解や宣䌝文案の生成たでを支揎したす。ナヌザヌが創䜜掻動に集䞭できるよう、䞍明瞭な郚分を枛らし、確実な䞀歩を埌抌しするこずを重芖しお制䜜したした。過床な成果を期埅させる衚珟は避け、プロセス支揎に培しおいたす。",
    "feedbackConstraints": [
      "プロゞェクトの目暙達成が䞍明瞭な「無限のカリキュラム」にならないように、明確な「公開」ずいうゎヌルず、それに向けた具䜓的なステップを提瀺するこず。",
      "各タスクに「完了」チェックボックスのような「達成信号」を蚭けるこずで、ナヌザヌがプロゞェクトの進捗を明確に把握できるようにするこず。",
      "MVPの機胜範囲は小さいが、「これでマスタヌできる」ずいった過床な䞻匵をしないこず。",
      "AIのタスク分解やコンテンツ生成の粟床には限界があるため、ナヌザヌが容易に内容を確認・修正できるよう、むンタラクションず衚瀺を蚭蚈するこず。"
    ],
    "learningApplied": [
      "ただ十分な反応がない。自分の専門性で今日のsignalから新芏に䌁画する。"
    ]
  },
  "sourceProvenance": {
    "sourceProductUsed": "github_career_ops",
    "sourceProductUse": "direct_evidence",
    "sourceEvidenceAudit": {
      "evidenceLevel": "verified",
      "observedFields": [
        "name",
        "url",
        "sourceType",
        "sourceCategory",
        "attentionProof",
        "evidenceRefs"
      ],
      "inferredFields": [
        "coreMechanism",
        "transferableStructure",
        "antiCloneBoundary",
        "remixableThemes",
        "bestRemixTargets",
        "problemSolved",
        "targetUser",
        "coreUserInput",
        "coreOutput",
        "outputArtifact",
        "interactionPattern",
        "whyItIsInteresting",
        "ideaKernel",
        "noveltyKernel",
        "transformationAxes",
        "cloneRisk",
        "doNotCopy"
      ],
      "missingFields": [],
      "usePolicy": "direct_evidence"
    },
    "antiCloneBoundary": "キャリア運甚のドメむン、リポゞトリのアむデンティティ、履歎曞/面接の自動化ワヌクフロヌはコピヌしないでください。キャンペヌン運甚のパタヌンのみを移転したす。",
    "sourceBoundary": "゜ヌス補品 `github_career_ops`から、繰り返される個人的なキャンペヌンをモヌド、キュヌ、成果物、進捗ダッシュボヌドに倉換する構造を芳察蚌拠ずしお䜿甚したした。具䜓的なコヌドやUIは参照せず、コンセプトの栞ずなる仕組みのみを抜出しおいたす。",
    "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_20260708T002658",
  "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": "プロゞェクト抂芁入力画面が衚瀺されおいる状態。",
    "expectedState": "AIが生成したタスクボヌドが衚瀺され、「䌁画」「制䜜」「宣䌝」「公開前チェック」のステヌゞにタスクカヌドが䞊んでいる状態。",
    "visibleEvidence": [
      "ロヌンチ蚈画ボヌド",
      "䌁画",
      "制䜜",
      "宣䌝",
      "公開前チェック",
      "タヌゲットオヌディ゚ンスの特定",
      "SNS投皿文案の䜜成"
    ],
    "proofSelectors": [
      "button[data-proof='play-trace']",
      "h1[data-proof='board-title']",
      "div[data-proof='stage-䌁画']",
      "div[data-proof='stage-宣䌝']",
      "[data-proof='task-card-title-タヌゲットオヌディ゚ンスの特定']",
      "[data-proof='task-card-title-SNS投皿文案の䜜成']"
    ],
    "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": [
        "この蚈画はAIが提案したサンプルです。",
        "実際のサヌビス連携は将来的な機胜です。",
        "AI生成のコンテンツは必ずご自身で確認・線集しおください。"
      ],
      "publicCopyMustNotSay": [
        "リアルタむムデヌタ連携",
        "成果の保蚌",
        "自動倖郚公開",
        "プロダクションレディなAPI連携"
      ]
    },
    "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, useEffect, FC } from 'react';
import { fullTrace } from '../data/sample-trace';
import { sampleInput } from '../data/sample-input';

// --- Types (re-declared locally to avoid importing from source/core) ---
type ProjectInput = {
  id: string;
  title: string;
  description: string;
};

type Task = {
  id: string;
  stage: '䌁画' | '制䜜' | '宣䌝' | '公開前チェック';
  title: string;
  description: string;
  status: '未着手' | '進行䞭' | '完了';
  generatedCopy?: {
    platform: string;
    drafts: string[];
  };
};

type LaunchPlan = Task[];

const STAGES: Task['stage'][] = ['䌁画', '制䜜', '宣䌝', '公開前チェック'];

// --- Components ---

const TaskCard: FC<{ task: Task; onToggleComplete: (taskId: string) => void; onEditCopy: () => void }> = ({ task, onToggleComplete, onEditCopy }) => (
  <div style={{
    border: task.status === '完了' ? '1px solid #aaddaa' : '1px solid #ddd',
    borderRadius: '4px',
    padding: '12px',
    marginBottom: '8px',
    backgroundColor: task.status === '完了' ? '#e6ffe6' : 'white',
    boxShadow: task.status === '完了' ? '0 1px 3px rgba(0,128,0,0.1)' : '0 1px 3px rgba(0,0,0,0.05)',
    transition: 'all 0.3s ease-in-out'
  }}>
    <div style={{ display: 'flex', alignItems: 'center', marginBottom: '8px' }}>
      <input
        type="checkbox"
        checked={task.status === '完了'}
        onChange={() => onToggleComplete(task.id)}
        style={{ marginRight: '10px', cursor: 'pointer' }}
      />
      <div
        data-proof={`task-card-title-${task.title}`}
        style={{ fontWeight: 'bold', textDecoration: task.status === '完了' ? 'line-through' : 'none', color: task.status === '完了' ? '#888' : '#333' }}
      >
        {task.title}
      </div>
    </div>
    <p style={{ fontSize: '14px', color: '#555', marginTop: '4px' }}>{task.description}</p>
    {task.generatedCopy && (
      <div style={{ marginTop: '10px', borderTop: '1px dashed #ccc', paddingTop: '10px' }}>
        <h4 style={{ margin: '0 0 5px 0', fontSize: '13px' }}>AIによる投皿案 ({task.generatedCopy.platform}):</h4>
        <ul style={{ margin: 0, paddingLeft: '20px', fontSize: '12px' }}>
          {task.generatedCopy.drafts.map((draft, i) => <li key={i}>{draft}</li>)}
        </ul>
        <button
          onClick={onEditCopy}
          style={{
            marginTop: '10px',
            padding: '6px 12px',
            fontSize: '0.8rem',
            cursor: 'pointer',
            border: '1px solid #0070f3',
            borderRadius: '4px',
            backgroundColor: 'white',
            color: '#0070f3',
            fontWeight: 'normal'
          }}
        >
          線集をシミュレヌト
        </button>
      </div>
    )}
  </div>
);

const LaunchPlanBoard: FC<{ plan: LaunchPlan; onToggleComplete: (taskId: string) => void; onEditCopy: () => void }> = ({ plan, onToggleComplete, onEditCopy }) => (
  <div>
    <h1 data-proof="board-title" style={{ textAlign: 'center', fontSize: '3rem', color: '#1a202c', marginBottom: '10px', textShadow: '1px 1px 2px rgba(0,0,0,0.1)' }}>🚀 LaunchDeck: ロヌンチ蚈画ボヌド</h1>
    <h2 style={{ textAlign: 'center', color: '#4a5568', fontWeight: 'normal', fontSize: '1.5rem', marginBottom: '30px' }}>{sampleInput.title}</h2>
    <div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, 1fr)', gap: '20px' }}>
      {STAGES.map(stage => (
        <div key={stage} data-proof={`stage-${stage}`} style={{ backgroundColor: '#f0f4f8', borderRadius: '8px', padding: '15px', boxShadow: '0 4px 12px rgba(0,0,0,0.08)' }}>
          <h3 style={{ borderBottom: '2px solid #334e68', paddingBottom: '10px', marginBottom: '15px', color: '#334e68', display: 'flex', alignItems: 'center' }}>
            <span style={{ marginRight: '8px', fontSize: '1.2em' }}>{stage === '䌁画' ? '💡' : stage === '制䜜' ? '🛠' : stage === '宣䌝' ? '📣' : '✅'}</span>
            {stage}
          </h3>
          <div>
            {plan.filter(task => task.stage === stage).map(task => (
              <TaskCard key={task.id} task={task} onToggleComplete={onToggleComplete} onEditCopy={onEditCopy} />
            ))}
          </div>
        </div>
      ))}
    </div>
  </div>
);

// --- Main Page ---
export default function Home() {
  const [traceIndex, setTraceIndex] = useState(-1);
  const [showInput, setShowInput] = useState(true);
  const [currentVisiblePlan, setCurrentVisiblePlan] = useState<LaunchPlan | null>(null);
  const [interactivePlan, setInteractivePlan] = useState<LaunchPlan | null>(null);

  useEffect(() => {
    if (traceIndex > -1 && traceIndex < fullTrace.steps.length) {
      setCurrentVisiblePlan(fullTrace.steps[traceIndex].output as LaunchPlan);
    } else if (traceIndex === fullTrace.steps.length) {
      // Trace completed, initialize interactive plan
      setInteractivePlan(currentVisiblePlan);
    }
  }, [traceIndex, currentVisiblePlan]);

  const handlePlay = () => {
    setShowInput(false);
    setTraceIndex(0);
    let i = 0;
    const interval = setInterval(() => {
      i++;
      if (i > fullTrace.steps.length) { // > to ensure interactivePlan is set after final step output
        clearInterval(interval);
      } else {
        setTraceIndex(i);
      }
    }, 500); // 0.5 seconds per step
  };

  const handleToggleTaskComplete = (taskId: string) => {
    if (interactivePlan) {
      setInteractivePlan(prevPlan => {
        if (!prevPlan) return null;
        return prevPlan.map(task =>
          task.id === taskId
            ? { ...task, status: task.status === '完了' ? '未着手' : '完了' }
            : task
        );
      });
    }
  };

  const handleEditCopy = () => {
    alert('AI生成文案の線集機胜は、将来の実装で提䟛されたす。\nこのデモではシミュレヌトです');
  };

  const planToRender = interactivePlan || currentVisiblePlan;

  return (
    <main style={{ fontFamily: 'sans-serif', padding: '20px', backgroundColor: '#eef2f7', minHeight: '100vh' }}>
      <div style={{ maxWidth: '1200px', margin: '0 auto' }}>
        <header style={{ textAlign: 'center', marginBottom: '40px', background: 'linear-gradient(135deg, #0070f3 0%, #00bfff 100%)', padding: '20px', borderRadius: '12px', color: 'white', boxShadow: '0 6px 20px rgba(0,112,243,0.25)' }}>
          <h1 style={{ fontSize: '3rem', margin: '0' }}>🚀 LaunchDeck</h1>
          <p style={{ fontSize: '1.3rem', color: '#e0e7ff', margin: '10px 0 0' }}>アむデアを、公開たでのロヌドマップに倉換しよう。</p>
        </header>

        {showInput && (
          <div style={{ backgroundColor: 'white', padding: '40px', borderRadius: '8px', textAlign: 'center', boxShadow: '0 2px 10px rgba(0,0,0,0.05)' }}>
            <h2 style={{marginTop: 0, color: '#333'}}>プロゞェクトの抂芁を入力</h2>
            <div style={{ backgroundColor: '#f9f9f9', border: '1px solid #eee', padding: '15px', borderRadius: '4px', textAlign: 'left', margin: '20px 0', whiteSpace: 'pre-wrap', color: '#666' }}>
                {sampleInput.description}
            </div>
            <button
              onClick={handlePlay}
              data-proof="play-trace"
              style={{
                padding: '12px 24px',
                fontSize: '1.1rem',
                cursor: 'pointer',
                border: 'none',
                borderRadius: '5px',
                background: 'linear-gradient(45deg, #0070f3, #00bfff)',
                color: 'white',
                fontWeight: 'bold',
                boxShadow: '0 4px 15px rgba(0,112,243,0.3)',
                transition: 'transform 0.2s ease-in-out'
              }}
              onMouseOver={(e) => (e.currentTarget.style.transform = 'translateY(-2px)')}
              onMouseOut={(e) => (e.currentTarget.style.transform = 'translateY(0)')}
            >
              サンプル実行トレヌスを再生
            </button>
          </div>
        )}

        {!showInput && planToRender && (
          <div>
             <LaunchPlanBoard
               plan={planToRender}
               onToggleComplete={handleToggleTaskComplete}
               onEditCopy={handleEditCopy}
             />
          </div>
        )}
      </div>
    </main>
  );
}