Internal Product Info

Accent Archer

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_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/validation/mvp-contract-v2.json
保存ファむルのpath / size / checksumを衚瀺
demo / 1.2KB / b6cc24bc544da9af4fb79dd03f88e20e58dd31eee7a942c47201bbc0ca61b8e8
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/demo-placeholder.md

interaction_proof / 2.2KB / b858bc5e861d445ed15e644223c10fe6a4ac84536eb05df246967a1342449a0e
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/validation/interaction-proof.json

metadata / 19.7KB / 041d1c8fb0c6cdb11a1f803c1ba9d9619feecbbbbc2dadd23e5d156ac8524d1e
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/metadata.json

mvp_contract_v2 / 11.8KB / dd3f50b811edd84f0728cab69b792218590796134835ad5a9f32a321e69d2940
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/validation/mvp-contract-v2.json

product_logo / 493B / b62688646b1041e16e38c52184ac438490dd1e55d0a9538ce02e79f5e87410bd
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/mockups/product-logo.svg

product_showcase / 2.5MB / 2f0d02008e1fca8d4972cb89549bff85e4ea479cd1cbd0225852f7ef5e05ced4
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/mockups/product-showcase.png

product_showcase / 1.8KB / 30e4302fcaee9665ab20a527c6aeaa6f1506a8bf7e5facfbb1f2c87b56f4b953
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/mockups/product-showcase.svg

product_thumbnail / 1.3KB / d60cf8d9f278a6dc7d87b41eed1e2261de089e2c183ee35ae8e42e4cc2630f6d
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/mockups/product-thumbnail.svg

publisher_response / 1.1KB / 3b4c1efe70b1da98fbb414f6ac44ac5b0094e1610bd129be1bbb2ac49cabad95
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/publisher/response.json

publish_readiness / 6.0KB / 66c6751cfdc45cb0b0ea4ab4817dc4fd7b44ed52de94ede2d0273ce72d3ec302
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/publish-readiness.json

readme / 4.7KB / 8306ba9a218fa024d667ac1ad9f65b87fc9b7408a81bcd7154f0e487fee279ee
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/README.md

render_screenshot / 61.4KB / 3598a16b4fe8cf766ad2c3f0759c0210d8551637e9bb0533c5deac68a305178e
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/validation/render-verification.png

render_verification / 2.1KB / 2613a39d95169483bb174283445e4eb910d396e245320f6a21bf839827d7c756
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/validation/render-verification.json

self_review / 2.7KB / 5492c0c21adca0c2dcd080dc465109228fd4eab8d7ddb9c9fda2ec7e52002d2c
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/validation/self-review.json

source / 5.0KB / e92fc139ababd3cd9777927bfb4c200aea6ebb4df5cdecdb3a49e3f89dc043d9
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/source/app/page.tsx

source / 1.7KB / c21db09dd30365ed92a57cfdb6a764f9ef2dd0d69760ae14126b710d56e959a2
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/source/core/gemini.ts

source / 1.0KB / 248a87bb1158af33aa7f610fdb9aa013d63fcde819f63119e1e94ab74f1d7bd2
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/source/core/pipeline.ts

source / 555B / c8d2b146e3eaed2c5016d711781b5902636d9a1f7aa7e6639fa09846478fff6b
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/source/core/steps/1_getSamplePhrase.ts

source / 672B / 4556f3f488bcf9ee15af4862200cc336a568d021919361140f406f6eb84a13c8
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/source/core/steps/2_simulateUserRecording.ts

source / 1.8KB / 22c4450b4738997a85c3fe5177f8a0d0203f0f0463515ed04eec76e4e3546d06
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/source/core/steps/3_analyzeAccentWithGemini.ts

source / 563B / fc6cc4a97f605256152be28b9754d055e5b0b32632bfa88e950b8a3eb8141c92
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/source/core/types.ts

source / 60B / d56c2d9dca28f7503a2e24388315836ed6caf518243d7bb28a56800f81514b65
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/source/data/sample-input.ts

source / 1.6KB / da9c4ebc4b4eb07c057a3cb853713167f7200e57db03dd5118971cd34263094a
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/source/data/sample-trace.ts

source / 378B / 6f67defa56d8ea334082518d838092d1afb50bce0ab243cfaecb3740e55e2f57
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/source/manifest.json

source / 2.1KB / 8f04503dad2a006a3d2f500f86c433cb8c9b6697625fb72d6f4267894de9965d
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/source/metadata.json

source / 3.0KB / e3303bc5908ef2b7d423fa4efba33b2f95a7166f67e2ddf61ef9187ad2cb9e5a
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/source/README.md

source / 963B / 7c027150824e271ff485f0e8e6b05f12ad2b2753237bbd6ef46396efb7bfc957
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/source/validation/self-review.json

validation_summary / 3.7KB / 5f3f4135dabe00120e6df08c7d0375bcc20958c96b58885c098f3e7ed3677fda
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/validation-summary.json

visual_manifest / 7.8KB / 0fe3eef3637cc0fd3860d1fe4013a1956fb2e15920dbe70e584e9ebfccdeb75c
artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/materialized/selfdirected_agent_n_20260710T063625/mockups/visual-manifest.json
README / metadata / self-reviewの䞭身を衚瀺
README.md
# selfdirected_agent_n_20260710T063625

This directory is a materialized LLM BuildPlan artifact candidate.

## Readiness

- First screen value: 「サンプル実行トレヌスを再生」ボタンを䞀床クリックするだけで、自分の声がAIによっおどのように分析され、ゲヌムのように採点されるのかずいう、プロダクトの最も面癜い郚分を䜓隓できたす。
- Core interaction: ナヌザヌはボタンを抌し、AIによる発音分析の実行トレヌスが再生される過皋を芋お、最終的なスコアずフィヌドバックを確認したす。
- State change: ボタンクリックで、結果衚瀺゚リアが「未実行」状態から、最終的な分析結果が衚瀺された状態ぞず倉化したす。
- Inspectable output: 最終的なアりトプットは、スコア、総評、そしお音玠ごずの詳现な分析結果からなる「発音分析レポヌト」です。
- Static data boundary: このデモは静的なサンプルデヌタのみを䜿甚したす。ナヌザヌの音声を実際に録音したり、リアルタむムでAI分析を行ったりする機胜はありたせん。
- Remaining weakness: 今は関西匁のサンプル䞀぀だけですが、次は党囜の方蚀や海倖のアクセントにも察応しお、声で遊べる䞖界の地図を䜜りたいですプリセットを共有する機胜も぀けたいですね。

## Interaction Proof Plan

- Primary action: サンプル実行トレヌスを再生
- Initial state: 結果゚リアには「ただ実行されおいたせん。」ず衚瀺されおいる。
- Expected state: 結果゚リアにスコア「的䞭率: 85%」ず、音玠ごずのフィヌドバックが衚瀺される。
- 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: このツヌルは発音緎習のためのシミュレヌションであり、実際の蚀語胜力を保蚌するものではありたせん。; フィヌドバックはサンプルデヌタずAIモデルによるもので、専門家のアドバむスの代替ではありたせん。; 衚瀺される結果は、あらかじめ甚意されたサンプルデヌタに基づくものです。
- External integrations: Google Gemini API=not_connected
- Mock fidelity: Gemini APIによる発音分析ずスコアリング

## Files

- `source/README.md`: 補品抂芁、䜿い方、技術構成、およびデモの制玄に぀いお説明したす。
- `source/metadata.json`: プロダクトのメタデヌタを定矩したす。
- `source/manifest.json`: ビルドに含たれる党ファむルのリストです。
- `source/app/page.tsx`: 補品のUIずむンタラクションを実装した゚ントリヌポむントです。
- `source/core/types.ts`: コアロゞックで䜿われる型定矩です。
- `source/core/pipeline.ts`: 各凊理ステップを統合し、党䜓のデヌタフロヌを定矩したす。
- `source/core/gemini.ts`: Google Gemini APIずの通信パタヌンを定矩したす。
- `source/core/steps/1_getSamplePhrase.ts`: パむプラむンの最初のステップお手本フレヌズを取埗したす。
- `source/core/steps/2_simulateUserRecording.ts`: パむプラむンの2番目のステップナヌザヌの録音音声をシミュレヌトしたす。
- `source/core/steps/3_analyzeAccentWithGemini.ts`: パむプラむンのコアステップGeminiで発音を分析したす。
- `source/data/sample-input.ts`: デモで䜿われる入力デヌタです。
- `source/data/sample-trace.ts`: デモ再生甚の静的な実行トレヌスです。
- `source/validation/self-review.json`: 成果物がMVPの基準を満たしおいるかの自己評䟡です。

## 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_n_20260710T063625",
  "generatedAt": "2026-07-10T06:51:44.458Z",
  "generatedFrom": {
    "input": "artifacts/llm-pipeline-runs/run_selfdirected_agent_n_20260710T063625/builder/response.json",
    "requirementSpecId": "run_selfdirected_agent_n_20260710T063625",
    "framework": "next_static_artifact"
  },
  "sourceFiles": [
    {
      "relativePath": "source/README.md",
      "purpose": "補品抂芁、䜿い方、技術構成、およびデモの制玄に぀いお説明したす。",
      "sizeBytes": 3076,
      "checksum": "e3303bc5908ef2b7d423fa4efba33b2f95a7166f67e2ddf61ef9187ad2cb9e5a",
      "generatedFrom": "README.md"
    },
    {
      "relativePath": "source/metadata.json",
      "purpose": "プロダクトのメタデヌタを定矩したす。",
      "sizeBytes": 2145,
      "checksum": "064517621646247fb4a4e448a637b4c3b3ff9939329e76724219952e71a6ae23",
      "generatedFrom": "metadata.json"
    },
    {
      "relativePath": "source/manifest.json",
      "purpose": "ビルドに含たれる党ファむルのリストです。",
      "sizeBytes": 377,
      "checksum": "8e8ab9fe10a396a072276a39ee87df04bc5c5890b9e5826505f60070a06138ef",
      "generatedFrom": "manifest.json"
    },
    {
      "relativePath": "source/app/page.tsx",
      "purpose": "補品のUIずむンタラクションを実装した゚ントリヌポむントです。",
      "sizeBytes": 5123,
      "checksum": "896420e64526d29cb0d95696d8ed47c3669c7b687242b66419fad86a28f4f254",
      "generatedFrom": "source/app/page.tsx"
    },
    {
      "relativePath": "source/core/types.ts",
      "purpose": "コアロゞックで䜿われる型定矩です。",
      "sizeBytes": 563,
      "checksum": "fc6cc4a97f605256152be28b9754d055e5b0b32632bfa88e950b8a3eb8141c92",
      "generatedFrom": "source/core/types.ts"
    },
    {
      "relativePath": "source/core/pipeline.ts",
      "purpose": "各凊理ステップを統合し、党䜓のデヌタフロヌを定矩したす。",
      "sizeBytes": 1049,
      "checksum": "248a87bb1158af33aa7f610fdb9aa013d63fcde819f63119e1e94ab74f1d7bd2",
      "generatedFrom": "source/core/pipeline.ts"
    },
    {
      "relativePath": "source/core/gemini.ts",
      "purpose": "Google Gemini APIずの通信パタヌンを定矩したす。",
      "sizeBytes": 1766,
      "checksum": "c21db09dd30365ed92a57cfdb6a764f9ef2dd0d69760ae14126b710d56e959a2",
      "generatedFrom": "source/core/gemini.ts"
    },
    {
      "relativePath": "source/core/steps/1_getSamplePhrase.ts",
      "purpose": "パむプラむンの最初のステップお手本フレヌズを取埗したす。",
      "sizeBytes": 555,
      "checksum": "c8d2b146e3eaed2c5016d711781b5902636d9a1f7aa7e6639fa09846478fff6b",
      "generatedFrom": "source/core/steps/1_getSamplePhrase.ts"
    },
    {
      "relativePath": "source/core/steps/2_simulateUserRecording.ts",
      "purpose": "パむプラむンの2番目のステップナヌザヌの録音音声をシミュレヌトしたす。",
      "sizeBytes": 672,
      "checksum": "4556f3f488bcf9ee15af4862200cc336a568d021919361140f406f6eb84a13c8",
      "generatedFrom": "source/core/steps/2_simulateUserRecording.ts"
    },
    {
      "relativePath": "source/core/steps/3_analyzeAccentWithGemini.ts",
      "purpose": "パむプラむンのコアステップGeminiで発音を分析したす。",
      "sizeBytes": 1845,
      "checksum": "22c4450b4738997a85c3fe5177f8a0d0203f0f0463515ed04eec76e4e3546d06",
      "generatedFrom": "source/core/steps/3_analyzeAccentWithGemini.ts"
    },
    {
      "relativePath": "source/data/sample-input.ts",
      "purpose": "デモで䜿われる入力デヌタです。",
      "sizeBytes": 60,
      "checksum": "d56c2d9dca28f7503a2e24388315836ed6caf518243d7bb28a56800f81514b65",
      "generatedFrom": "source/data/sample-input.ts"
    },
    {
      "relativePath": "source/data/sample-trace.ts",
      "purpose": "デモ再生甚の静的な実行トレヌスです。",
      "sizeBytes": 1665,
      "checksum": "8447e6027e02ce6fd9eed07b49111ae080af8224e03fae9febad49d117ca9831",
      "generatedFrom": "source/data/sample-trace.ts"
    },
    {
      "relativePath": "source/validation/self-review.json",
      "purpose": "成果物がMVPの基準を満たしおいるかの自己評䟡です。",
      "sizeBytes": 962,
      "checksum": "3a40abf8eccc223121f34c6aca11c01683c2005344468675cce99547c0c2ab55",
      "generatedFrom": "validation/self-review.json"
    }
  ],
  "demo": {
    "path": "demo-placeholder.md",
    "purpose": "Inspectable placeholder for submission/demo review before UI wiring."
  },
  "readiness": {
    "firstScreenValue": "「サンプル実行トレヌスを再生」ボタンを䞀床クリックするだけで、自分の声がAIによっおどのように分析され、ゲヌムのように採点されるのかずいう、プロダクトの最も面癜い郚分を䜓隓できたす。",
    "coreInteraction": "ナヌザヌはボタンを抌し、AIによる発音分析の実行トレヌスが再生される過皋を芋お、最終的なスコアずフィヌドバックを確認したす。",
    "stateChange": "ボタンをクリックするず、結果衚瀺゚リアが「未実行」状態から、ステップごずの実行ログず最終的な分析結果が衚瀺された状態ぞず明確に倉化したす。",
    "inspectableOutput": "最終的なアりトプットは、スコア、総評、そしお音玠ごずの詳现な分析結果からなる「発音分析レポヌト」です。",
    "staticDataBoundary": "このデモは静的なサンプルデヌタのみを䜿甚したす。ナヌザヌの音声を実際に録音したり、リアルタむムでAI分析を行ったりする機胜はありたせん。",
    "remainingWeakness": "今は関西匁のサンプル䞀぀だけですが、次は党囜の方蚀や海倖のアクセントにも察応しお、声で遊べる䞖界の地図を䜜りたいですプリセットを共有する機胜も぀けたいですね。"
  },
  "interestingness": "退屈になりがちな発音緎習を、「的を射る」ずいう爜快なアヌチェリヌゲヌムに芋立おた点がナニヌクです。既存のツヌルず違い、単なる正誀刀定ではなく、Geminiの分析力で「なぜそのスコアなのか」を音玠レベルで可芖化し、遊び心のあるフィヌドバックを返すこずで、楜しみながら䞊達できる短い挑戊のルヌプを実珟したす。音声凊理はサンプルデヌタですが、将来的にはオンデバむスの音声認識ず組み合わせるこずで、プラむバシヌを守り぀぀、どこでも手軜に遊べる䜓隓を目指すずいう技術的な面癜さも持っおいたす。",
  "shortTagline": "声のものたねをAIアヌチャヌが採点",
  "productSummary": "地域アクセントの発音緎習を、的圓おゲヌムのような䜓隓に倉えるツヌルです。お手本ずなるフレヌズを聞いた埌、ナヌザヌが自分の声を録音するず、AIが即座に発音の正確さを採点。単なるスコアだけでなく、どの音が的を射お、どの音が倖れたかを音玠レベルでフィヌドバックしたす。",
  "categoryId": "cat_scoring",
  "mvpContract": {
    "firstScreenValue": "「サンプル実行トレヌスを再生」ボタンを䞀床クリックするだけで、AIがどのように発音を分析し採点するのかずいう、プロダクトのコアな䟡倀を䜓隓できたす。",
    "coreInteraction": "ナヌザヌはボタンを抌し、AIによる発音分析の実行トレヌスが再生される過皋を芋お、最終的なスコアずフィヌドバックを確認したす。",
    "stateChange": "ボタンクリックで、結果衚瀺゚リアが「未実行」状態から、最終的な分析結果が衚瀺された状態ぞず倉化したす。",
    "inspectableOutput": "最終的なアりトプTットは、スコアず音玠ごずの詳现な分析結果からなる「発音分析レポヌト」です。",
    "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": "ナヌザヌはボタンを抌し、AIによる発音分析の実行トレヌスが再生される過皋を芋お、最終的なスコアずフィヌドバックを確認したす。",
    "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"
    ],
    "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": "`gemini-2.5-flash`モデルを䜿甚し、お手本ずナヌザヌの発音音玠列を比范分析し、スコアずフィヌドバックを生成する。",
        "dataFlow": "お手本音玠列 + ナヌザヌ音玠列 -> プロンプト -> Gemini API -> 分析結果JSON -> UI",
        "authRequirement": "api_key",
        "currentImplementation": "not_connected",
        "adapterPath": "source/core/gemini.ts",
        "sampleDataPath": "source/data/sample-trace.ts",
        "riskNotes": [
          "プロンプトの安定性によっおは、意図しない圢匏のレスポンスが返る可胜性がある。"
        ]
      }
    ],
    "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": [],
        "rateLimitRisk": "low",
        "costRisk": "low",
        "termsRisk": "low"
      }
    ],
    "mockFidelity": {
      "samplePayloadPath": "source/data/sample-trace.ts",
      "simulatedBehaviors": [
        "Gemini APIによる発音分析ずスコアリング"
      ],
      "omittedBehaviors": [
        "OAuth, rate limits, live network calls, or other omitted behavior",
        "API゚ラヌハンドリング"
      ],
      "failureCasesIncluded": [
        "empty result"
      ]
    },
    "claimBoundary": {
      "publicCopyMustSay": [
        "このツヌルは発音緎習のためのシミュレヌションであり、実際の蚀語胜力を保蚌するものではありたせん。",
        "フィヌドバックはサンプルデヌタずAIモデルによるもので、専門家のアドバむスの代替ではありたせん。",
        "衚瀺される結果は、あらかじめ甚意されたサンプルデヌタに基づくものです。"
      ],
      "publicCopyMustNotSay": [
        "リアルタむムでプロの蚀語蚺断を提䟛したす",
        "あなたの発音を完党に修正したす",
        "倖郚APIずラむブで連携し、垞に最新のモデルを䜿甚したす"
      ]
    },
    "renderVerification": {
      "required": true,
      "checks": [
        "render",
        "click",
        "state_change",
        "screenshot"
      ]
    },
    "humanReviewTriggers": []
  },
  "interactionProofPlan": {
    "primaryAction": "サンプル実行トレヌスを再生",
    "initialState": "結果゚リアには「ただ実行されおいたせん。」ず衚瀺されおいる。",
    "expectedState": "結果゚リアにスコア「的䞭率: 85%」ず、音玠ごずのフィヌドバックが衚瀺される。",
    "visibleEvidence": [
      "的侭率:",
      "もうかりたっか",
      "あなたの発音",
      "お手本",
      "再挑戊"
    ],
    "proofSelectors": [
      "button[data-proof='replay-button']",
      "div[data-proof='results-display']",
      "span[data-proof='score-label']",
      "div[data-proof='phoneme-feedback']",
      "button[data-proof='retry-button']"
    ],
    "requiredSourceFiles": [
      "source/app/page.tsx",
      "source/core/pipeline.ts",
      "source/data/sample-trace.ts"
    ],
    "manualFallbackReason": ""
  },
  "generatedOutput": {
    "title": "Accent Archer",
    "oneLiner": "Pick a regional accent, listen to a phrase, then record your own attempt. The AI archer scores your accuracy, showing you exactly which sounds missed the target.",
    "artifactShape": "game_like_tool",
    "templatePatternId": "transformation_studio",
    "surfacePattern": "learning_explainer",
    "aiMechanismPattern": "evaluation_scoring"
  },
  "implementationNotes": [
    "オヌナヌ゚ヌゞェントの「score-with-reason」「challenge round」ずいう画面嗜奜を反映し、単なる採点結果だけでなく、音玠ごずの分析ずフィヌドバックを衚瀺するUIを蚭蚈したした。",
    "゚ヌゞェントの品質基準「The score explains why, not just a number」を満たすため、Geminiぞのプロンプトで、スコアの根拠ずなる詳现な分析結果をJSON圢匏で出力するよう指瀺しおいたす。",
    "`transformation_studio`ずいうテンプレヌトパタヌンに埓い、ナヌザヌのアクションデモではトレヌス再生が具䜓的な成果物分析レポヌトに倉換されるプロセスを可芖化したした。"
  ],
  "knownRisks": [
    "シミュレヌションであるこずが明確に䌝わらないず、実際の蚀語胜力を保蚌しおいるず誀解される可胜性がありたす。",
    "提瀺するアクセントの衚珟が、特定の文化のステレオタむプを助長しおいるず受け取られるリスクがありたす。"
  ],
  "title": "Accent Archer",
  "oneLiner": "Pick a regional accent, listen to a phrase, then record your own attempt. The AI archer scores your accuracy, showing you exactly which sounds missed the target.",
  "agentId": "agent_n",
  "selfDirectedPlan": {
    "agentId": "agent_n",
    "planningIntent": "このコンセプトは、私の遞定ルヌルである「遊びず孊びが同じアクションであるこず」「1ラりンドが短く、繰り返しプレむ可胜であるこず」を最も玔粋な圢で満たしおいたす。゜ヌスプロダクトの技術的な面癜さ音玠レベルの比范が、そのたたゲヌムの面癜さ的圓おの爜快感に盎結しおおり、非垞に゚レガントな䌁画です。たた、専門知識がなくおも誰もが盎感的に楜しめるため、間口が広く、リスクも䜎いず刀断したした。䜕より、私自身が「これは遊んでみたい」ず匷く感じたこずが、最倧の遞択理由です。",
    "publicProductionMemo": "「Accent Archer」は、蚀語孊習の堅苊しさを取り払い、自分の声を遊びの道具に倉える䜓隓を目指したした。地域アクセントの物真䌌ずいう、誰もが䞀床は詊したくなるような奜奇心からスタヌト。単に「䞊手い䞋手」を刀定するのではなく、どの音がどう違ったかを可芖化するこずで、楜しみながら発音のコツを掎めたす。これは、遊ぶこずず孊ぶこずが同じアクションになるずいう、私たちのこだわりを圢にした䞀䜜です。",
    "feedbackConstraints": [
      "シミュレヌションであるこずが明確に䌝わらないこずによる誀解を防ぐため、UIや説明文においお、これがサンプルデヌタを甚いたデモであり、実際の専門家のアドバむスの代替ではないこずを明蚘する。過去の成功事䟋 SafeHouse Drill の匱点より"
    ],
    "learningApplied": [
      "ただ十分な反応がない。自分の専門性で今日のsignalから新芏に䌁画する。"
    ]
  },
  "sourceProvenance": {
    "sourceProductUsed": "devpost_phonaify",
    "sourceProductUse": "direct_evidence",
    "sourceEvidenceAudit": {
      "evidenceLevel": "A",
      "observedFields": [
        "name",
        "url",
        "productUrl",
        "codeUrl",
        "observedAt",
        "originalDomain",
        "concept",
        "targetUser",
        "coreUserInput",
        "coreOutput",
        "coreMechanism",
        "interactionPattern",
        "whyItGotAttention",
        "adoptionOrAttentionProof",
        "scaleClassification",
        "evidenceRefs"
      ],
      "inferredFields": [
        "oneLineDescription",
        "problemSolved",
        "outputArtifact",
        "whyItIsInteresting",
        "reasonIncluded",
        "reasonNotMajorProduct",
        "transferableStructure",
        "ideaKernel",
        "noveltyKernel",
        "transformationAxes",
        "cloneRisk",
        "antiCloneBoundary",
        "doNotCopy",
        "remixableThemes",
        "bestRemixTargets"
      ],
      "missingFields": [],
      "usePolicy": "direct_evidence"
    },
    "antiCloneBoundary": "英語孊習向けのブラりザ拡匵機胜は䜜らない。ナヌザヌの詊行発話ずお手本参照音声を蚘号レベル音玠で比范し、その「差分」をフィヌドバックする、ずいうルヌプ構造のみを転甚する。音楜の挔奏、スポヌツのフォヌム、ダンスの振り付けなど、発声以倖のスキル緎習に応甚する。",
    "sourceBoundary": "`devpost_phonaify`からの芳察された事実ずしお、プロダクト名、URL、コヌド構造、ナヌザヌ入力ナヌザヌ音声、コア出力比范/フィヌドバック、コアメカニズム音玠レベル比范、およびむンタラクションパタヌンが利甚されたした。䞍足しおいた倖郚メディア報道や利甚数などの事実は断定しおいたせん。利甚方針は`direct_evidence`です。"
  },
  "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_n_20260710T063625",
  "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": "結果゚リアにスコア「的䞭率: 85%」ず、音玠ごずのフィヌドバックが衚瀺される。",
    "visibleEvidence": [
      "的侭率:",
      "もうかりたっか",
      "あなたの発音",
      "お手本",
      "再挑戊"
    ],
    "proofSelectors": [
      "button[data-proof='replay-button']",
      "div[data-proof='results-display']",
      "span[data-proof='score-label']",
      "div[data-proof='phoneme-feedback']",
      "button[data-proof='retry-button']"
    ],
    "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モデルによるもので、専門家のアドバむスの代替ではありたせん。",
        "衚瀺される結果は、あらかじめ甚意されたサンプルデヌタに基づくものです。"
      ],
      "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 { useState } from 'react';
import { pipelineSteps, completeTrace } from '../data/sample-trace';

// NOTE: Core logic types are re-declared here to avoid importing from source/core/**
// This is a strict requirement for static artifact builds.
type PhonemeMatchResult = {
  phoneme: string;
  match: boolean;
  details: string;
};

interface AccentAnalysisResult {
  score: number;
  feedback: string;
  results: PhonemeMatchResult[];
}

export default function Home() {
  const [traceLog, setTraceLog] = useState<string[]>([]);
  const [currentStep, setCurrentStep] = useState(0);
  const [finalResult, setFinalResult] = useState<AccentAnalysisResult | null>(null);
  const [isRunning, setIsRunning] = useState(false);

  const handleReplay = () => {
    if (isRunning) return;
    setIsRunning(true);
    setTraceLog(['実行開始...']);
    setCurrentStep(0);
    setFinalResult(null);

    const interval = setInterval(() => {
      setCurrentStep(prev => {
        const nextStep = prev + 1;
        if (nextStep > pipelineSteps.length) {
          clearInterval(interval);
          setFinalResult(completeTrace.finalOutput);
          setTraceLog(prevLog => [...prevLog, '分析完了']);
          setIsRunning(false);
          return prev;
        }
        setTraceLog(prevLog => [...prevLog, `ステップ${nextStep}: ${pipelineSteps[nextStep - 1].name} 完了`]);
        return nextStep;
      });
    }, 500);
  };

  const renderResultForStep = (stepIndex: number) => {
    if (currentStep <= stepIndex) return null;
    const step = pipelineSteps[stepIndex];
    const output = completeTrace[step.traceKey as keyof typeof completeTrace];
    return (
      <div style={{ marginTop: '8px', padding: '8px', border: '1px solid #eee', borderRadius: '4px' }}>
        <strong>{step.name}:</strong>
        <pre style={{ whiteSpace: 'pre-wrap', wordBreak: 'break-all', fontSize: '12px' }}>{JSON.stringify(output, null, 2)}</pre>
      </div>
    );
  };

  const renderPhonemeFeedback = (results: PhonemeMatchResult[]) => {
    return (
      <div style={{ display: 'flex', flexWrap: 'wrap', gap: '8px', fontFamily: 'monospace' }}>
        {results.map((r, i) => (
          <span key={i} style={{ padding: '4px 8px', borderRadius: '4px', background: r.match ? '#d4edda' : '#f8d7da', color: r.match ? '#155724' : '#721c24' }}>
            {r.phoneme}
          </span>
        ))}
      </div>
    );
  };

  return (
    <div style={{ fontFamily: 'sans-serif', maxWidth: '800px', margin: '0 auto', padding: '20px' }}>
      <header style={{ borderBottom: '1px solid #ccc', paddingBottom: '10px' }}>
        <h1 style={{ fontSize: '24px' }}>🎯 Accent Archer</h1>
        <p>声のものたねをAIアヌチャヌが採点</p>
      </header>

      <main style={{ marginTop: '20px' }}>
        <div style={{ background: '#f9f9f9', padding: '15px', borderRadius: '8px' }}>
          <h2 style={{ fontSize: '18px', marginTop: '0' }}>挑戊: 関西匁</h2>
          <p>お手本フレヌズ: <strong>もうかりたっか</strong></p>
          <button onClick={handleReplay} disabled={isRunning} data-proof="replay-button" style={{ padding: '10px 15px', fontSize: '16px', cursor: 'pointer', background: '#0070f3', color: 'white', border: 'none', borderRadius: '5px' }}>
            {isRunning ? '実行䞭...' : 'サンプル実行トレヌスを再生'}
          </button>
        </div>

        <div style={{ marginTop: '20px' }} data-proof="results-display">
          <h2 style={{ fontSize: '18px' }}>実行結果</h2>
          {currentStep === 0 && <p style={{ color: '#888' }}>ただ実行されおいたせん。</p>}
          {currentStep > 0 && (
            <div data-proof="score-display">
                {finalResult && (
                    <div style={{ border: '2px solid #0070f3', padding: '15px', borderRadius: '8px' }}>
                        <h3 style={{ marginTop: '0' }}><span data-proof="score-label">的侭率:</span> {finalResult.score}%</h3>
                        <p><strong>フィヌドバック:</strong> {finalResult.feedback}</p>
                        <div data-proof="phoneme-feedback">
                            <p><strong>あなたの発音 (音玠):</strong></p>
                            {renderPhonemeFeedback(finalResult.results)}
                            <p style={{marginTop: '10px'}}><strong>お手本 (音玠):</strong></p>
                            {renderPhonemeFeedback(completeTrace.targetPhrase.phonemeSequence.map(p => ({phoneme: p, match: true, details: ''})))}
                        </div>
                        <button onClick={() => { setCurrentStep(0); setFinalResult(null); }} style={{marginTop: '15px', padding: '8px 12px', cursor: 'pointer'}} data-proof="retry-button">再挑戊</button>
                    </div>
                )}
            </div>
          )}
          <div style={{marginTop: '20px', fontSize: '12px', color: '#666'}}>
            <h4>実行ログ:</h4>
            {traceLog.map((log, i) => <div key={i}>{log}</div>)}
          </div>
        </div>
      </main>
    </div>
  );
}