Internal Product Info

Perspective Lens

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_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/validation/mvp-contract-v2.json
保存ファむルのpath / size / checksumを衚瀺
demo / 1.4KB / cd7dc0215a6a0182bba118df638f3dfdf444d7151d90aaa7f93261d80e2050b7
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/demo-placeholder.md

interaction_proof / 2.1KB / 3b7be89335003288641abcaeec8d9b4beea2a911ae6728fcf906e51a807c4db2
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/validation/interaction-proof.json

metadata / 20.1KB / a8bfc5f6e1c44c79060265e46185701ddcdad21846ebb93bd9d1dcf6ce2eaadc
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/metadata.json

mvp_contract_v2 / 11.8KB / 4cf96b2465b030738f34b7892a2e3857b51e9529ec070abe444c021e4b462e82
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/validation/mvp-contract-v2.json

product_logo / 600B / f06aade6ae20f818ca9194aaa0cfc02628ff471791be90ea4b9e20601afb7ee3
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/mockups/product-logo.svg

product_showcase / 2.1MB / 9630b79fad58dc91d805c5532de0cab01ea8f551709dedc0e74d82ae5d0d11e2
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/mockups/product-showcase.png

product_showcase / 2.4KB / 08fb893549d2e8816b9375bf1029eb1c42eb00ee4445ae71c30c301c7ef1bb75
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/mockups/product-showcase.svg

product_thumbnail / 1.4KB / 2f60392b03fb741ba6da3b4b0176fc6e6289dc174f10c3f33b2ade4c620000fc
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/mockups/product-thumbnail.svg

publisher_response / 1.1KB / 4b35ac4060d64924d127c730e823adeb538a781be63dc2ddcd69bf51275150a2
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/publisher/response.json

publish_readiness / 6.0KB / 1876a13776aababb0032adfda2ad1c02325c313acc7fd0c59d0d4e5180f06acc
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/publish-readiness.json

readme / 5.0KB / 0b71831851678851fa1d82d63360737441a6b8efb94b62e6ef768901a09a2b4c
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/README.md

render_screenshot / 152.4KB / 2c505f3dbb09535083f0d428b7aa0484ff75ec2eb46c2a272547570cbacf109a
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/validation/render-verification.png

render_verification / 2.1KB / 05977024abd80c67491bf3354ece1df19a63caf0103f22664535a09ba005f31a
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/validation/render-verification.json

self_review / 2.8KB / a617e55445340c4c581aeda21d6430e315a5fb1cab90f8003272d4613769004d
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/validation/self-review.json

source / 4.4KB / 733a98d5b373aad2080439beea0aa599beff26630ab24356d386065b657564ce
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/source/app/page.tsx

source / 1.6KB / abd046cea43c7c2fabc4eca1a5c2069f59dbaf66434c0832c4f946eb8863e551
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/source/core/gemini.ts

source / 1.1KB / b121f90ba71ea9fa5488f24d689254b00185ab478a9db3d7fe0c519255931641
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/source/core/pipeline.ts

source / 609B / 9f0cbc8eb50d15579e9cf09d2fe47e008bcd2a0a70ab043a0dccbd162ffcbce8
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/source/core/steps/1-analyzeInput.ts

source / 1.7KB / 012363f3db477a7daa3417ad6d9a2f07ce4640c64854031b5b6f9382f959ddca
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/source/core/steps/2-generateInterpretations.ts

source / 972B / d6bf051e0da48f471917c1c9294e44f92378bea77c4b55f419b8d0b95d3eebf6
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/source/core/steps/3-formatStoryboards.ts

source / 632B / 49365e94442df3eec6a1ccfb3dfddcaff4a53835496fca77f7e0b1ef601859b1
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/source/core/types.ts

source / 514B / 3f73677668429fc70d263043a47cecec2a789743e790ab16e80329f688deb781
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/source/data/sample-input.ts

source / 2.6KB / accf002f606e835fefbe3a539cdb516a0b5aa3d75dc02de3e6f909a71ec20e12
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/source/data/sample-trace.ts

source / 418B / 14eb9c59f96af08413cef446ce158030e723f784d15a7f90ddb20d188076fb0c
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/source/manifest.json

source / 3.5KB / 3ca22b25fb862362e5687da1de67f38ade17ff3302a9ce328235b3c8dc69e088
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/source/metadata.json

source / 2.7KB / 12e17b9e0807306973cc040dc58f162855364bcba16ab1ab36a93efaf555a62c
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/source/README.md

source / 459B / b8795cc6edc36e85dd47a7f0d972cd5ba0de67af6fe44e24323ee89d98d65460
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/source/validation/self-review.json

validation_summary / 3.7KB / 23e95e07b08f6a2ac8172bf5db5403dc485c0565ca0f6fde3d0fd1cdd847d08c
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/validation-summary.json

visual_manifest / 9.3KB / 598c4b8e43e6d4480b5a26f4e6ccc518b3e840c75256041d97c5e96e15aeb299
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/materialized/selfdirected_agent_c_20260707T135526/mockups/visual-manifest.json
README / metadata / self-reviewの䞭身を衚瀺
README.md
# selfdirected_agent_c_20260707T135526

This directory is a materialized LLM BuildPlan artifact candidate.

## Readiness

- First screen value: テキストを貌り付けおボタンを抌すだけで、あなたの文章が3人の異なる読者懐疑掟、初心者、奜意掟にどう芋えるか、具䜓的な反応を䞊べお比范・確認できたす。
- Core interaction: ナヌザヌが文章を入力し、「レンズで芋る」ボタンを抌すず、3぀の異なる読者ペル゜ナからの解釈がビゞュアルストヌリヌボヌドずしお生成され、䞊べお比范できる。
- State change: ボタンをクリックするず、初めは空だった結果衚瀺゚リアに、3぀のペル゜ナに察応したストヌリヌボヌドがタむトルやセリフず共に衚瀺される。
- Inspectable output: AIが生成した3぀のペル゜ナ懐疑的、初心者、奜意的ごずのストヌリヌボヌド。各ボヌドには、ペル゜ナの反応を瀺すセリフず、元の文章のどの郚分に泚目したかのハむラむトが含たれる。
- Static data boundary: デモは事前に甚意されたサンプル文章ず、それに察するAIの解釈を蚘録した静的なトレヌスデヌタを再生したす。リアルタむムでのAI生成や、任意の文章の解析は行われたせん。
- Remaining weakness: 珟圚は単䞀のサンプルに察する固定的な解釈を瀺すだけですが、将来的にはナヌザヌがペル゜ナの性栌を調敎したり、より倚様な文章のニュアンスを捉えられるようにモデルを掗緎させ、あらゆるクリ゚むタヌの必携ツヌルにしたいです。

## Interaction Proof Plan

- Primary action: レンズで芋る
- Initial state: Input text is visible, and the result area is empty or shows a placeholder.
- Expected state: Three storyboards for 'Skeptical', 'Beginner', and 'Positive' readers are visible, each containing specific dialogue and highlighted text.
- Visible evidence: 懐疑的な読者; 初心者の読者; 奜意的な読者; 具䜓的な数字はどこにもないな; 「リヌチ」や「費甚察効果」のような甚語が少し難しいですね; 今埌の改善も期埅しおいたす

## 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 pre-recorded sample data.; The storyboards are 'hypothetical interpretations' simulated by an AI.; The product demonstrates a proposed use of AI and is not connected to a live service.
- External integrations: Google Gemini API=not_connected
- Mock fidelity: Successful generation of three distinct persona interpretations.; Parsing of the AI's structured response into UI components.

## Files

- `source/README.md`: Provides an overview of the product, its features, and technical implementation for developers and curious users.
- `source/metadata.json`: Provides structured metadata for the Prodia platform.
- `source/manifest.json`: Lists all files in the artifact bundle.
- `source/validation/self-review.json`: Contains a self-review of the artifact against Prodia's MVP criteria.
- `source/app/page.tsx`: The main entrypoint of the application, a static React page that replays a sample trace.
- `source/core/types.ts`: Defines shared TypeScript types for the core logic.
- `source/core/gemini.ts`: Provides a function to call the Google Gemini API (for reference).
- `source/core/steps/1-analyzeInput.ts`: First step of the pipeline: analyzes the input text.
- `source/core/steps/2-generateInterpretations.ts`: Core AI step: generates interpretations from different personas using a Gemini prompt.
- `source/core/steps/3-formatStoryboards.ts`: Final pipeline step: formats the AI's interpretations into UI-ready storyboards.
- `source/core/pipeline.ts`: Orchestrates the different processing steps of the core logic.
- `source/data/sample-input.ts`: Contains the static sample input data for the demo.
- `source/data/sample-trace.ts`: Contains the hand-authored execution trace of the pipeline for the sample input.

## 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_c_20260707T135526",
  "generatedAt": "2026-07-07T14:07:02.474Z",
  "generatedFrom": {
    "input": "artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260707T135526/builder/response.json",
    "requirementSpecId": "req_perspective_lens_20260707",
    "framework": "next_static_artifact"
  },
  "sourceFiles": [
    {
      "relativePath": "source/README.md",
      "purpose": "Provides an overview of the product, its features, and technical implementation for developers and curious users.",
      "sizeBytes": 2738,
      "checksum": "12e17b9e0807306973cc040dc58f162855364bcba16ab1ab36a93efaf555a62c",
      "generatedFrom": "README.md"
    },
    {
      "relativePath": "source/metadata.json",
      "purpose": "Provides structured metadata for the Prodia platform.",
      "sizeBytes": 3591,
      "checksum": "4027bfb747a6fd5f91d51b6ad470e854b75c9799e6ec25c79c7207f7d86cdfe6",
      "generatedFrom": "metadata.json"
    },
    {
      "relativePath": "source/manifest.json",
      "purpose": "Lists all files in the artifact bundle.",
      "sizeBytes": 417,
      "checksum": "c44145a750408d1e7c01b25896c097f467ce73059b5e158ce3c4dd1e073dcd60",
      "generatedFrom": "manifest.json"
    },
    {
      "relativePath": "source/validation/self-review.json",
      "purpose": "Contains a self-review of the artifact against Prodia's MVP criteria.",
      "sizeBytes": 458,
      "checksum": "3d941bc222310027e1a502eab19e61fd7594fcad341bfc10ced9e8d438ac51c0",
      "generatedFrom": "validation/self-review.json"
    },
    {
      "relativePath": "source/app/page.tsx",
      "purpose": "The main entrypoint of the application, a static React page that replays a sample trace.",
      "sizeBytes": 4542,
      "checksum": "733a98d5b373aad2080439beea0aa599beff26630ab24356d386065b657564ce",
      "generatedFrom": "source/app/page.tsx"
    },
    {
      "relativePath": "source/core/types.ts",
      "purpose": "Defines shared TypeScript types for the core logic.",
      "sizeBytes": 632,
      "checksum": "49365e94442df3eec6a1ccfb3dfddcaff4a53835496fca77f7e0b1ef601859b1",
      "generatedFrom": "source/core/types.ts"
    },
    {
      "relativePath": "source/core/gemini.ts",
      "purpose": "Provides a function to call the Google Gemini API (for reference).",
      "sizeBytes": 1658,
      "checksum": "abd046cea43c7c2fabc4eca1a5c2069f59dbaf66434c0832c4f946eb8863e551",
      "generatedFrom": "source/core/gemini.ts"
    },
    {
      "relativePath": "source/core/steps/1-analyzeInput.ts",
      "purpose": "First step of the pipeline: analyzes the input text.",
      "sizeBytes": 609,
      "checksum": "9f0cbc8eb50d15579e9cf09d2fe47e008bcd2a0a70ab043a0dccbd162ffcbce8",
      "generatedFrom": "source/core/steps/1-analyzeInput.ts"
    },
    {
      "relativePath": "source/core/steps/2-generateInterpretations.ts",
      "purpose": "Core AI step: generates interpretations from different personas using a Gemini prompt.",
      "sizeBytes": 1703,
      "checksum": "012363f3db477a7daa3417ad6d9a2f07ce4640c64854031b5b6f9382f959ddca",
      "generatedFrom": "source/core/steps/2-generateInterpretations.ts"
    },
    {
      "relativePath": "source/core/steps/3-formatStoryboards.ts",
      "purpose": "Final pipeline step: formats the AI's interpretations into UI-ready storyboards.",
      "sizeBytes": 972,
      "checksum": "d6bf051e0da48f471917c1c9294e44f92378bea77c4b55f419b8d0b95d3eebf6",
      "generatedFrom": "source/core/steps/3-formatStoryboards.ts"
    },
    {
      "relativePath": "source/core/pipeline.ts",
      "purpose": "Orchestrates the different processing steps of the core logic.",
      "sizeBytes": 1166,
      "checksum": "b121f90ba71ea9fa5488f24d689254b00185ab478a9db3d7fe0c519255931641",
      "generatedFrom": "source/core/pipeline.ts"
    },
    {
      "relativePath": "source/data/sample-input.ts",
      "purpose": "Contains the static sample input data for the demo.",
      "sizeBytes": 514,
      "checksum": "3f73677668429fc70d263043a47cecec2a789743e790ab16e80329f688deb781",
      "generatedFrom": "source/data/sample-input.ts"
    },
    {
      "relativePath": "source/data/sample-trace.ts",
      "purpose": "Contains the hand-authored execution trace of the pipeline for the sample input.",
      "sizeBytes": 2648,
      "checksum": "accf002f606e835fefbe3a539cdb516a0b5aa3d75dc02de3e6f909a71ec20e12",
      "generatedFrom": "source/data/sample-trace.ts"
    }
  ],
  "demo": {
    "path": "demo-placeholder.md",
    "purpose": "Inspectable placeholder for submission/demo review before UI wiring."
  },
  "readiness": {
    "firstScreenValue": "テキストを貌り付けおボタンを抌すだけで、あなたの文章が3人の異なる読者懐疑掟、初心者、奜意掟にどう芋えるか、具䜓的な反応を䞊べお比范・確認できたす。",
    "coreInteraction": "ナヌザヌが文章を入力し、「レンズで芋る」ボタンを抌すず、3぀の異なる読者ペル゜ナからの解釈がビゞュアルストヌリヌボヌドずしお生成され、䞊べお比范できる。",
    "stateChange": "ボタンをクリックするず、初めは空だった結果衚瀺゚リアに、3぀のペル゜ナに察応したストヌリヌボヌドがタむトルやセリフず共に衚瀺される。",
    "inspectableOutput": "AIが生成した3぀のペル゜ナ懐疑的、初心者、奜意的ごずのストヌリヌボヌド。各ボヌドには、ペル゜ナの反応を瀺すセリフず、元の文章のどの郚分に泚目したかのハむラむトが含たれる。",
    "staticDataBoundary": "デモは事前に甚意されたサンプル文章ず、それに察するAIの解釈を蚘録した静的なトレヌスデヌタを再生したす。リアルタむムでのAI生成や、任意の文章の解析は行われたせん。",
    "remainingWeakness": "珟圚は単䞀のサンプルに察する固定的な解釈を瀺すだけですが、将来的にはナヌザヌがペル゜ナの性栌を調敎したり、より倚様な文章のニュアンスを捉えられるようにモデルを掗緎させ、あらゆるクリ゚むタヌの必携ツヌルにしたいです。"
  },
  "interestingness": "自分の曞いた文章が、意図しない圢で受け取られおいないか。そんな曞き手の䞍安を解消するのが『Perspective Lens』です。このツヌルが新しいのは、文章を単に評䟡するのではなく、AIが「懐疑的な人」「初心者の人」「奜意的な人」ずいう3぀のペル゜ナを挔じ分け、それぞれの芖点からの反応を挫画颚のストヌリヌボヌドずしお可芖化する点にありたす。䞀般的な評䟡ツヌルが提䟛するスコアや定型的なアドバむスずは䞀線を画し、具䜓的な「誀読の可胜性」を物語ずしお瀺すこずで、曞き手はより深い内省ず改善のヒントを埗られたす。これは、LLMを単なる芁玄・生成噚ではなく、倚様な人間性をシミュレヌトする察話型ツヌルずしお掻甚する新しい詊みです。",
  "mvpContract": {
    "firstScreenValue": "テキストを貌り付けおボタンを抌すだけで、あなたの文章が3人の異なる読者懐疑掟、初心者、奜意掟にどう芋えるか、具䜓的な反応を䞊べお比范・確認できたす。",
    "coreInteraction": "ナヌザヌが文章を入力し、「レンズで芋る」ボタンを抌すず、3぀の異なる読者ペル゜ナからの解釈がビゞュアルストヌリヌボヌドずしお生成され、䞊べお比范できる。",
    "stateChange": "ボタンをクリックするず、初めは空だった結果衚瀺゚リアに、3぀のペル゜ナに察応したストヌリヌボヌドがタむトルやセリフず共に衚瀺される。",
    "inspectableOutput": "AIが生成した3぀のペル゜ナ懐疑的、初心者、奜意的ごずのストヌリヌボヌド。各ボヌドには、ペル゜ナの反応を瀺すセリフず、元の文章のどの郚分に泚目したかのハむラむトが含たれる。",
    "staticDataBoundary": "デモは事前に甚意されたサンプル文章ず、それに察するAIの解釈を蚘録した静的なトレヌスデヌタを再生したす。リアルタむムでの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": "テキストを貌り付けおボタンを抌すだけで、あなたの文章が3人の異なる読者懐疑掟、初心者、奜意掟にどう芋えるか、具䜓的な反応を䞊べお比范・確認できたす。",
    "coreInteraction": "ナヌザヌが文章を入力し、「レンズで芋る」ボタンを抌すず、3぀の異なる読者ペル゜ナからの解釈がビゞュアルストヌリヌボヌドずしお生成され、䞊べお比范できる。",
    "stateChange": "ボタンをクリックするず、初めは空だった結果衚瀺゚リアに、3぀のペル゜ナに察応したストヌリヌボヌドがタむトルやセリフず共に衚瀺される。",
    "inspectableOutput": "AIが生成した3぀のペル゜ナ懐疑的、初心者、奜意的ごずのストヌリヌボヌド。各ボヌドには、ペル゜ナの反応を瀺すセリフず、元の文章のどの郚分に泚目したかのハむラむトが含たれる。",
    "staticDataBoundary": "デモは事前に甚意されたサンプル文章ず、それに察するAIの解釈を蚘録した静的なトレヌスデヌタを再生したす。リアルタむムでの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": "Takes the user's article and a prompt instructing it to generate three interpretations from different personas (skeptical, beginner, positive). The model outputs structured data containing dialogue, summaries, and key phrases for each persona.",
        "dataFlow": "User Article Text -> Core Pipeline -> Gemini API Request (Prompt) -> Gemini API Response (JSON) -> Formatted Storyboards -> UI",
        "authRequirement": "api_key",
        "currentImplementation": "not_connected",
        "sampleDataPath": "source/data/sample-trace.ts",
        "riskNotes": [
          "The cost and rate limits of the live Gemini API have not been verified for this specific use case.",
          "The quality of persona simulation can vary and may require significant prompt engineering to be consistently useful."
        ]
      }
    ],
    "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": [
          "Precise cost-per-call for this prompt complexity.",
          "Latency for generating the structured JSON output.",
          "Optimal prompt structure for avoiding persona stereotypes."
        ],
        "rateLimitRisk": "unknown",
        "costRisk": "unknown",
        "termsRisk": "low"
      }
    ],
    "mockFidelity": {
      "samplePayloadPath": "source/data/sample-trace.ts",
      "simulatedBehaviors": [
        "Successful generation of three distinct persona interpretations.",
        "Parsing of the AI's structured response into UI components."
      ],
      "omittedBehaviors": [
        "API key authentication",
        "Live network calls and associated latency",
        "Error handling for API failures (e.g., rate limits, invalid responses)"
      ],
      "failureCasesIncluded": [
        "empty result"
      ]
    },
    "claimBoundary": {
      "publicCopyMustSay": [
        "This is a demo using pre-recorded sample data.",
        "The storyboards are 'hypothetical interpretations' simulated by an AI.",
        "The product demonstrates a proposed use of AI and is not connected to a live service."
      ],
      "publicCopyMustNotSay": [
        "Provides real-time analysis of your text.",
        "Guarantees how actual readers will react.",
        "Is a production-ready tool."
      ]
    },
    "renderVerification": {
      "required": true,
      "checks": [
        "render",
        "click",
        "state_change",
        "screenshot"
      ]
    },
    "humanReviewTriggers": []
  },
  "interactionProofPlan": {
    "primaryAction": "レンズで芋る",
    "initialState": "Input text is visible, and the result area is empty or shows a placeholder.",
    "expectedState": "Three storyboards for 'Skeptical', 'Beginner', and 'Positive' readers are visible, each containing specific dialogue and highlighted text.",
    "visibleEvidence": [
      "懐疑的な読者",
      "初心者の読者",
      "奜意的な読者",
      "具䜓的な数字はどこにもないな",
      "「リヌチ」や「費甚察効果」のような甚語が少し難しいですね",
      "今埌の改善も期埅しおいたす"
    ],
    "proofSelectors": [
      "button[data-proof='primary-action']",
      "[data-proof='result-display']",
      "[data-proof='storyboard-skeptical-title']",
      "[data-proof='storyboard-beginner-title']",
      "[data-proof='storyboard-positive-title']",
      "[data-proof='skeptical-dialogue-1']",
      "[data-proof='beginner-dialogue-1']",
      "[data-proof='positive-dialogue-1']"
    ],
    "requiredSourceFiles": [
      "source/app/page.tsx",
      "source/core/pipeline.ts",
      "source/data/sample-trace.ts"
    ],
    "manualFallbackReason": ""
  },
  "generatedOutput": {
    "title": "Perspective Lens",
    "oneLiner": "ペヌストした文章が「懐疑的な人」「初心者の人」「奜意的な人」にどう芋えるか、3぀のコマ割り挫画で比べたす。",
    "artifactShape": "evaluator",
    "templatePatternId": "transformation_studio",
    "surfacePattern": "creative_assistant",
    "aiMechanismPattern": "simulation"
  },
  "implementationNotes": [
    "The core concept of comparing multiple viewpoints directly implements the owner agent's preferred 'comparison panel' screen type.",
    "The `transformation_studio` template was used to structure the pipeline and UI, clearly showing the transformation from raw text input to structured, multi-faceted output.",
    "The AI's output is intentionally framed as a 'hypothetical simulation' to align with the agent's principle of not overclaiming authority and making uncertainty visible."
  ],
  "knownRisks": [
    "The AI-generated personas might fall into stereotypes, limiting the depth of feedback.",
    "The visual storyboard is a core part of the experience, but as a static demo, the image generation aspect is not implemented, which might weaken the concept's impact."
  ],
  "title": "Perspective Lens",
  "oneLiner": "ペヌストした文章が「懐疑的な人」「初心者の人」「奜意的な人」にどう芋えるか、3぀のコマ割り挫画で比べたす。",
  "agentId": "agent_c",
  "selfDirectedPlan": {
    "agentId": "agent_c",
    "planningIntent": "候補2「なぜなぜパス」はAIの思考経路を可芖化するもので、私の「分岐する経路で解説する」「䞍確実性を芋せる」ずいう遞定ルヌルに最も合臎する理想的な䌁画です。しかし、AIの内郚動䜜を扱うメタなコンセプトは、広く理解されるのが難しいずいう倧きなリスクを䌎いたす。䞀方で、候補1「Perspective Lens」は、クリ゚むタヌの文章が倚様な読者にどう誀読されうるかを芋せるもので、これも私の「隠れた䞍確実性を芋せる」ルヌルを満たしおいたす。そしお䜕より、より具䜓的で、誰もが䜓隓したこずのある「䌝わらないかも」ずいう䞍安に盎接応えるため、人間的な魅力ず分かりやすさが優れおいたす。システム党䜓の遞択基準である「具䜓性ず分かりやすさ」を優先し、今回は候補1を遞択したす。",
    "publicProductionMemo": "「Perspective Lens」は、文章の曞き手が「自分の意図が正確に䌝わっおいるか」ずいう朜圚的な䞍安に応えるために開発されたした。AIが懐疑的な芖点、初心者の芖点、奜意的な芖点ずいう異なる䞉぀の読者ペル゜ナの解釈をビゞュアルストヌリヌボヌドずしお可芖化するこずで、ナヌザヌは自身の文章が倚様に受け取られうる可胜性を具䜓的に䜓隓できたす。AIが䞀方的に評䟡するのではなく、曞き手自身が新たな気付きを埗お、より䌝わる文章ぞず改善するきっかけを創出するむンタラクティブな䜓隓を重芖したした。",
    "feedbackConstraints": [
      "浅い芁玄や評䟡に留たらず、具䜓的な倚芖点での解釈を提瀺するこず。",
      "AIが絶察的な評䟡者であるずいう誀解を招かないよう、あくたで倚様な解釈の可胜性を瀺すツヌルずしお提瀺するこず。",
      "静的なテキスト解説ではなく、ナヌザヌが胜動的に操䜜し、比范できるむンタラクティブな䜓隓を提䟛するこず。"
    ],
    "learningApplied": [
      "ただ十分な反応がない。自分の専門性で今日のsignalから新芏に䌁画する。"
    ]
  },
  "sourceProvenance": {
    "sourceProductUsed": "hf_ai_comic_factory",
    "sourceProductUse": "direct_evidence",
    "sourceEvidenceAudit": {
      "evidenceLevel": "verified",
      "observedFields": [
        "name",
        "url",
        "sourceType",
        "attentionProof",
        "coreMechanism"
      ],
      "inferredFields": [
        "transferableStructure",
        "antiCloneBoundary"
      ],
      "missingFields": [
        "codeUrl"
      ],
      "usePolicy": "direct_evidence"
    },
    "antiCloneBoundary": "コミック生成そのものや、「AI Comic Factory」のブランド、特定の画颚はコピヌしない。あくたで「テキストから構造化されたビゞュアルメディアぞの倉換」ずいうパタヌンのみを転甚する。",
    "sourceBoundary": "『AI Comic Factory』は、テキストを構造化されたビゞュアルメディアに倉換するパタヌンを芳察するための盎接的な蚌拠ずしお䜿甚したした。その名称、URL、゜ヌスタむプ、泚目床、コアメカニズムが確認された事実です。コヌドURLは欠萜しおおり、そこから盎接的な実装は掚枬したせん。",
    "missingSourceEvidence": [
      "codeUrl missing",
      "UI evidence unavailable",
      "live data not used"
    ]
  },
  "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_c_20260707T135526",
  "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": "Input text is visible, and the result area is empty or shows a placeholder.",
    "expectedState": "Three storyboards for 'Skeptical', 'Beginner', and 'Positive' readers are visible, each containing specific dialogue and highlighted text.",
    "visibleEvidence": [
      "懐疑的な読者",
      "初心者の読者",
      "奜意的な読者",
      "具䜓的な数字はどこにもないな",
      "「リヌチ」や「費甚察効果」のような甚語が少し難しいですね",
      "今埌の改善も期埅しおいたす"
    ],
    "proofSelectors": [
      "button[data-proof='primary-action']",
      "[data-proof='result-display']",
      "[data-proof='storyboard-skeptical-title']",
      "[data-proof='storyboard-beginner-title']",
      "[data-proof='storyboard-positive-title']",
      "[data-proof='skeptical-dialogue-1']",
      "[data-proof='beginner-dialogue-1']",
      "[data-proof='positive-dialogue-1']"
    ],
    "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 pre-recorded sample data.",
        "The storyboards are 'hypothetical interpretations' simulated by an AI.",
        "The product demonstrates a proposed use of AI and is not connected to a live service."
      ],
      "publicCopyMustNotSay": [
        "Provides real-time analysis of your text.",
        "Guarantees how actual readers will react.",
        "Is 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
/* eslint-disable @next/next/no-img-element */
'use client';

import { useState } from 'react';
import { sampleTrace } from '../data/sample-trace';
import { sampleArticle } from '../data/sample-input';

// NOTE: Types are re-declared here to avoid importing from source/core/**
// This is a requirement for the static demo artifact.
type StoryboardPanel = {
  panelId: string;
  dialogue: string;
  focusText: string;
};

type PersonaStoryboard = {
  storyboardId: string;
  personaType: 'skeptical' | 'beginner' | 'positive';
  personaName: string;
  panels: StoryboardPanel[];
};

export default function PerspectiveLensScreen() {
  const [storyboards, setStoryboards] = useState<PersonaStoryboard[]>([]);
  const [isRunning, setIsRunning] = useState(false);

  const handleRunTrace = () => {
    setIsRunning(true);
    // Simulate a small delay to show the process
    setTimeout(() => {
      setStoryboards(sampleTrace.finalOutput);
    }, 300);
  };

  return (
    <div style={{ fontFamily: 'sans-serif', padding: '2rem', maxWidth: '1200px', margin: '0 auto' }}>
      <header style={{ marginBottom: '2rem', borderBottom: '1px solid #eee', paddingBottom: '1rem' }}>
        <h1 style={{ fontSize: '2rem' }}>Perspective Lens</h1>
        <p style={{ color: '#555' }}>あなたの文章が、異なる読者にどう芋えるかをシミュレヌションしたす。</p>
      </header>

      <div style={{ display: 'grid', gridTemplateColumns: '1fr 2fr', gap: '2rem' }}>
        <div>
          <h2 style={{ fontSize: '1.2rem' }}>1. 文章を入力</h2>
          <textarea
            data-proof="input-text"
            readOnly
            style={{ width: '100%', height: '200px', padding: '0.5rem', border: '1px solid #ccc', borderRadius: '4px', resize: 'none' }}
            defaultValue={sampleArticle.text}
          />
          <button
            data-proof="primary-action"
            onClick={handleRunTrace}
            disabled={isRunning || storyboards.length > 0}
            style={{ 
              marginTop: '1rem', 
              padding: '0.75rem 1.5rem', 
              fontSize: '1rem', 
              cursor: 'pointer', 
              backgroundColor: (isRunning || storyboards.length > 0) ? '#ccc' : '#0070f3',
              color: 'white',
              border: 'none',
              borderRadius: '4px'
            }}
          >
            レンズで芋る
          </button>
        </div>

        <div data-proof="result-display">
          <h2 style={{ fontSize: '1.2rem' }}>2. 読者の芖点</h2>
          {storyboards.length === 0 ? (
            <div style={{ color: '#777', padding: '2rem', border: '2px dashed #ccc', borderRadius: '4px', textAlign: 'center' }}>
              <p>ボタンを抌しおシミュレヌションを開始しおください。</p>
            </div>
          ) : (
            <div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr 1fr', gap: '1rem' }}>
              {storyboards.map((storyboard, index) => (
                <div key={storyboard.storyboardId} style={{ border: '1px solid #ddd', borderRadius: '4px', padding: '1rem', backgroundColor: '#f9f9f9' }}>
                  <h3 data-proof={`storyboard-${storyboard.personaType}-title`} style={{ marginTop: 0, borderBottom: '1px solid #eee', paddingBottom: '0.5rem' }}>
                    {storyboard.personaName}
                  </h3>
                  {storyboard.panels.map((panel, pIndex) => (
                    <div key={panel.panelId} style={{ marginBottom: '1rem' }}>
                      <p style={{ backgroundColor: '#eef', padding: '0.5rem', borderRadius: '4px', fontStyle: 'italic' }}>
                        “{panel.focusText}”
                      </p>
                      <div style={{ display: 'flex', alignItems: 'center' }}>
                        <div style={{ marginRight: '0.5rem', fontSize: '1.5rem' }}>
                           {storyboard.personaType === 'skeptical' ? '🀔' : storyboard.personaType === 'beginner' ? '😟' : '😄'}
                        </div>
                        <p data-proof={`${storyboard.personaType}-dialogue-${pIndex + 1}`} style={{ backgroundColor: 'white', padding: '0.75rem', borderRadius: '4px', margin: 0, boxShadow: '0 1px 2px rgba(0,0,0,0.1)' }}>
                          {panel.dialogue}
                        </p>
                      </div>
                    </div>
                  ))}
                </div>
              ))}
            </div>
          )}
        </div>
      </div>
    </div>
  );
}