Internal Product Info

EthiCheck Copilot

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
skipped
スクリヌンショット衚瀺確認の蚌跡です。
skipped
通過
メタデヌタ公開に必芁なメタ情報の有無です。
pass
通過
リスク確認公開を止めるリスクがないかを確認したす。
pass
刀定埅ち
秘密情報秘密情報の混入確認です。
pending
skipped
倖郚䟝存公開方法に圱響する倖郚䟝存の確認です。
skipped
刀定埅ち
プロンプト泚入公開䞊問題になる指瀺混入の確認です。
pending
通過
README公開説明の根拠が保存されおいるかを確認したす。
pass
skipped
衚瀺確認公開画面で砎綻がないかを確認したす。
skipped
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.
pending / interaction_proof.result: interaction proof result: pending.
pass / metadata_complete: metadata.json exists and has required fields.
pending / mvp_contract_v2.auto_publishable: autoPublishable=unknown
pass / mvp_contract_v2.mode: externalDependencyMode=unknown
pending / mvp_contract_v2.result: MVP Contract V2 result: pending.
pass / mvp_contract_v2.tier: artifactTier=unknown
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 / readme_exists: README.md exists.

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_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/validation/mvp-contract-v2.json
保存ファむルのpath / size / checksumを衚瀺
demo / 990B / fabc207e736c34dbdd487bc13d922267b3253d1d51f75a1ccf5630472ebe9b4e
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/demo-placeholder.md

metadata / 20.9KB / fc01e80e60d387aadd790f844547814f037ac21db6b941ce585f5215133b991b
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/metadata.json

mvp_contract_v2 / 4.5KB / 8987983dbcc955549dd15bd02cf3682c4d79d0f30ae1cbfa74a43b119435cd4c
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/validation/mvp-contract-v2.json

product_logo / 754B / 2d208b8b27d59bcaa302abb954b337fa55e83e9840045c973becba83ba2af253
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/mockups/product-logo.svg

product_showcase / 2.1MB / 8c8f03e66bd35972c2a88abd205366ff201af9a04cc29bcaf794eb090d271686
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/mockups/product-showcase.png

product_showcase / 2.5KB / 44a45adad472198a0ba1f15c40bd612b6d98f9e43349228f4a10d21dfb9d093b
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/mockups/product-showcase.svg

product_thumbnail / 1.5KB / eb5c14d3a8118f8f14f46431d272a039859314eefdb3383a146f100512896abc
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/mockups/product-thumbnail.svg

readme / 5.3KB / 661a63b38d61b2ff3a428f0f2e5f20109ca72559df8dd1d57e10bd8619c623ad
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/README.md

self_review / 2.5KB / 6d88ab8695a32a43156078e632cf28a794496e219cfd048249fe957f97c32469
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/validation/self-review.json

source / 4.9KB / 4602cdb168b95a29b96d0b622870dd2099563c78cea3f6b2076563e346b7a03d
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/source/app/page.tsx

source / 1.5KB / 0aef54ebdc38eb8f8d6920bd2ece92a06feb382c6b8a056351281d1338b11cc6
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/source/core/gemini.ts

source / 1.1KB / 9f46cdc9cd5352255cdf372d49703a5fbb4090bde054317faa4392ac6d3f7f89
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/source/core/pipeline.ts

source / 581B / 63073427e1996b304d97edbb38734f54322c88190e70ae12acbb252bef732e11
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/source/core/steps/1_structureInput.ts

source / 2.1KB / 72744302064afd353469cd34afcbea532675ff73e7cbec3b996c6c9c0ed3b751
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/source/core/steps/2_identifyIssues.ts

source / 1.5KB / 91336bfcfbc47317510fbcc8fb33bc810624385042b0fe73836066e10f3712a5
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/source/core/steps/3_formatOutput.ts

source / 1.1KB / 8b772fa2a5ee789a08dda8d8f51897455aa2526276f981a533a333ffe8364ec9
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/source/core/types.ts

source / 612B / ac3eb5c35cb767f336096e890a93116b52a43ab291ebc8931ddbb4222c402f34
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/source/data/sample-input.ts

source / 4.1KB / ccddd0bb8166ceb385ecfa6948ca205fa5e7faf197c5885db106f52b034a1dff
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/source/data/sample-trace.ts

source / 406B / 3535311e47141c18940af312bc72d4af0ce8c4293cd855c87b05deea267f5adc
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/source/manifest.json

source / 2.8KB / 4c9f38426bb5ee69749350b767dc56aaeedd31425c45f57d1323fdb707b1d9da
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/source/metadata.json

source / 3.2KB / 19aa5e212e68ecd39daf986b7ee22f7de84b45ed1277a8377987e85330165b1b
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/source/README.md

source / 1.7KB / cde5d4c9d70b9446e38cdaa18dde7580626ad8c00df9629848249b9ca28855ff
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/source/validation/self-review.json

visual_manifest / 8.3KB / 4cb47e4803dee6a0024a60a7b9bbc62f9cce16ac43da7d9ebb5035bd70fe9b35
artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/materialized/selfdirected_agent_c_20260710T000035/mockups/visual-manifest.json
README / metadata / self-reviewの䞭身を衚瀺
README.md
# selfdirected_agent_c_20260710T000035

This directory is a materialized LLM BuildPlan artifact candidate.

## Readiness

- First screen value: AIが生成したレポヌトの䞋曞きを入力し、分析トレヌスを再生するこずで、倫理的な文章に改善するための具䜓的なヒントを即座に埗られたす。
- Core interaction: AI生成のレポヌト䞋曞きをむンプットずしお、改善点を指摘する分析トレヌスを再生する。
- State change: 「再生」ボタンを抌すず、結果衚瀺゚リアに各凊理ステップの分析結果が段階的に衚瀺される。
- Inspectable output: AIによる文章分析の凊理パむプラむンず、各ステップの入出力デヌタ改善点の指摘リストなど。
- Static data boundary: 衚瀺される文章ず分析結果は、事前に甚意された静的なサンプルデヌタであり、リアルタむムのAI分析は行われたせん。
- Remaining weakness: 珟圚は単䞀のレポヌト䞋曞きに察する静的な分析のみですが、将来的には耇数の倫理芳点䟋バむアス、衚珟の匷さからフィヌドバックを切り替えられるようにし、さらにはナヌザヌが改善案を盎接線集・反映できるむンタラクティブな添削機胜を远加しお、文章䜜成の良きパヌトナヌずなるツヌルに育おたいです。

## Interaction Proof Plan

- Primary action: サンプル実行トレヌスを再生
- Initial state: 結果゚リアに「未実行」ず衚瀺されおいる
- Expected state: 結果゚リアにパむプラむンの各ステップの実行結果が衚瀺される
- Visible evidence: ステップ1: 䞋曞きの構造化; あなたの蚀葉で衚珟すべき郚分; 匕甚元を瀺すべき郚分; この郚分は䞀般的な事実の矅列です。

## MVP Contract

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

## MVP Contract V2

- Artifact tier: proposed_integration
- External dependency mode: proposed
- Runtime boundary: network=none, secrets=none, externalWrites=none
- Render verification: required (render, click, state_change, screenshot)
- Public copy boundary: This is a demo using static sample data.; The AI analysis is a simulation based on a proposed integration.; This tool provides suggestions for learning, not guaranteed academic grades.
- External integrations: Google Generative AI=not_connected
- Mock fidelity: Successful analysis of a text draft, identifying multiple types of issues.; Generation of structured JSON output from the AI model.

## Files

- `source/README.md`: Provides an overview of the EthiCheck Copilot project, its purpose, architecture, and usage instructions for the demo.
- `source/metadata.json`: Contains structured metadata about the project for discovery and display on the Prodia platform.
- `source/manifest.json`: A manifest file listing all the files included in the artifact bundle.
- `source/app/page.tsx`: The main entrypoint of the web application. It renders the UI and replays a static sample trace to demonstrate the product's functionality without making live API calls.
- `source/core/gemini.ts`: Contains the function for making API calls to the Google Generative AI service. This file defines the request/response shapes and the API endpoint, serving as a reference implementation. It is not called during the demo.
- `source/core/pipeline.ts`: Orchestrates the different processing steps of the AI pipeline. It defines the end-to-end data flow from input text to final analysis result. It is not executed in the demo.
- `source/core/steps/1_structureInput.ts`: The first step in the pipeline. It takes the raw report draft and converts it into a structured format for further processing.
- `source/core/steps/2_identifyIssues.ts`: The core AI step of the pipeline. It constructs a prompt and calls the Gemini API to analyze the text and identify areas for improvement.
- `source/core/steps/3_formatOutput.ts`: The final step in the pipeline. It parses the raw response from the AI and transforms it into the structured `AnalysisResult` format used by the UI.
- `source/core/types.ts`: Defines the shared data structures and types used across the core processing pipeline.
- `source/data/sample-input.ts`: Provides a sample input for the application, representing a typical user submission.
- `source/data/sample-trace.ts`: Contains a pre-recorded execution trace of the AI pipeline for a sample input. This static data is used by the UI to simulate the product's functionality.
- `source/validation/self-review.json`: A self-review checklist to ensure the artifact meets Prodia's quality and compliance standards before submission.

## 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_20260710T000035",
  "generatedAt": "2026-07-10T00:14:20.307Z",
  "generatedFrom": {
    "input": "artifacts/llm-pipeline-runs/run_selfdirected_agent_c_20260710T000034/builder/response.json",
    "requirementSpecId": "run_selfdirected_agent_c_20260710T000034_requirements",
    "framework": "next_static_artifact"
  },
  "sourceFiles": [
    {
      "relativePath": "source/README.md",
      "purpose": "Provides an overview of the EthiCheck Copilot project, its purpose, architecture, and usage instructions for the demo.",
      "sizeBytes": 3244,
      "checksum": "19aa5e212e68ecd39daf986b7ee22f7de84b45ed1277a8377987e85330165b1b",
      "generatedFrom": "README.md"
    },
    {
      "relativePath": "source/metadata.json",
      "purpose": "Contains structured metadata about the project for discovery and display on the Prodia platform.",
      "sizeBytes": 2910,
      "checksum": "382bf31382d48cfcb228eb43dcb80857a78e0af471f7d1245dc7a0542f8b10fc",
      "generatedFrom": "metadata.json"
    },
    {
      "relativePath": "source/manifest.json",
      "purpose": "A manifest file listing all the files included in the artifact bundle.",
      "sizeBytes": 405,
      "checksum": "b2371488d713239c1910a30536af947ecfa6c871600117423e45ef8a7ac4bc2c",
      "generatedFrom": "manifest.json"
    },
    {
      "relativePath": "source/app/page.tsx",
      "purpose": "The main entrypoint of the web application. It renders the UI and replays a static sample trace to demonstrate the product's functionality without making live API calls.",
      "sizeBytes": 5030,
      "checksum": "4602cdb168b95a29b96d0b622870dd2099563c78cea3f6b2076563e346b7a03d",
      "generatedFrom": "source/app/page.tsx"
    },
    {
      "relativePath": "source/core/gemini.ts",
      "purpose": "Contains the function for making API calls to the Google Generative AI service. This file defines the request/response shapes and the API endpoint, serving as a reference implementation. It is not called during the demo.",
      "sizeBytes": 1558,
      "checksum": "0aef54ebdc38eb8f8d6920bd2ece92a06feb382c6b8a056351281d1338b11cc6",
      "generatedFrom": "source/core/gemini.ts"
    },
    {
      "relativePath": "source/core/pipeline.ts",
      "purpose": "Orchestrates the different processing steps of the AI pipeline. It defines the end-to-end data flow from input text to final analysis result. It is not executed in the demo.",
      "sizeBytes": 1092,
      "checksum": "9f46cdc9cd5352255cdf372d49703a5fbb4090bde054317faa4392ac6d3f7f89",
      "generatedFrom": "source/core/pipeline.ts"
    },
    {
      "relativePath": "source/core/steps/1_structureInput.ts",
      "purpose": "The first step in the pipeline. It takes the raw report draft and converts it into a structured format for further processing.",
      "sizeBytes": 581,
      "checksum": "63073427e1996b304d97edbb38734f54322c88190e70ae12acbb252bef732e11",
      "generatedFrom": "source/core/steps/1_structureInput.ts"
    },
    {
      "relativePath": "source/core/steps/2_identifyIssues.ts",
      "purpose": "The core AI step of the pipeline. It constructs a prompt and calls the Gemini API to analyze the text and identify areas for improvement.",
      "sizeBytes": 2111,
      "checksum": "72744302064afd353469cd34afcbea532675ff73e7cbec3b996c6c9c0ed3b751",
      "generatedFrom": "source/core/steps/2_identifyIssues.ts"
    },
    {
      "relativePath": "source/core/steps/3_formatOutput.ts",
      "purpose": "The final step in the pipeline. It parses the raw response from the AI and transforms it into the structured `AnalysisResult` format used by the UI.",
      "sizeBytes": 1540,
      "checksum": "91336bfcfbc47317510fbcc8fb33bc810624385042b0fe73836066e10f3712a5",
      "generatedFrom": "source/core/steps/3_formatOutput.ts"
    },
    {
      "relativePath": "source/core/types.ts",
      "purpose": "Defines the shared data structures and types used across the core processing pipeline.",
      "sizeBytes": 1153,
      "checksum": "8b772fa2a5ee789a08dda8d8f51897455aa2526276f981a533a333ffe8364ec9",
      "generatedFrom": "source/core/types.ts"
    },
    {
      "relativePath": "source/data/sample-input.ts",
      "purpose": "Provides a sample input for the application, representing a typical user submission.",
      "sizeBytes": 611,
      "checksum": "03db81bab71022229b7bcd7c9d88c263e41efebfbe27b6ae4cd8a45775f7a2b8",
      "generatedFrom": "source/data/sample-input.ts"
    },
    {
      "relativePath": "source/data/sample-trace.ts",
      "purpose": "Contains a pre-recorded execution trace of the AI pipeline for a sample input. This static data is used by the UI to simulate the product's functionality.",
      "sizeBytes": 4166,
      "checksum": "f7a28f34e5f0885e12a0682ca3c8046736c502424925f485eff2b0faa0e1f4e7",
      "generatedFrom": "source/data/sample-trace.ts"
    },
    {
      "relativePath": "source/validation/self-review.json",
      "purpose": "A self-review checklist to ensure the artifact meets Prodia's quality and compliance standards before submission.",
      "sizeBytes": 1767,
      "checksum": "9ca79b248c315cf2e76d035dda90e365649227123926ecefa77d40b8a0a18aa3",
      "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": "AIによる文章分析の凊理パむプラむンず、各ステップの入出力デヌタ改善点の指摘リストなど。",
    "staticDataBoundary": "衚瀺される文章ず分析結果は、事前に甚意された静的なサンプルデヌタであり、リアルタむムのAI分析は行われたせん。",
    "remainingWeakness": "珟圚は単䞀のレポヌト䞋曞きに察する静的な分析のみですが、将来的には耇数の倫理芳点䟋バむアス、衚珟の匷さからフィヌドバックを切り替えられるようにし、さらにはナヌザヌが改善案を盎接線集・反映できるむンタラクティブな添削機胜を远加しお、文章䜜成の良きパヌトナヌずなるツヌルに育おたいです。"
  },
  "interestingness": "倚くの剜窃怜知ツヌルが「しおはいけないこず」を指摘するのに察し、このツヌルはAI生成文を「どうすればより良い自分の文章になるか」ずいう芳点から指導する、新しい圢のラむティングパヌトナヌです。LLMによる文脈理解を掻かし、単なるコピペチェックではなく、匕甚の䜜法や考察を深めるための具䜓的な問いかけを生成したす。これにより、AI時代の孊生が盎面する「どこたで頌っおいいの」ずいう䞍安に寄り添い、思考を止めないための実践的な孊習䜓隓を提䟛したす。",
  "shortTagline": "AIレポヌト䞋曞きを”自分のレポヌト”ぞ曞き換えるヒント",
  "productSummary": "EthiCheck Copilotは、AIが生成したレポヌトの䞋曞きを倫理的に改善するための孊習支揎ツヌルです。䞋曞きの「匕甚元を瀺すべき箇所」や「より深く考察すべき箇所」をハむラむトし、具䜓的な曞き盎しのヒントを提瀺したす。デモでは蚘録枈みの分析トレヌスを再生する圢で、孊生がAIず適切に協働しながら自分の蚀葉で文章を曞き䞊げる緎習の流れを確認できたす。",
  "categoryId": "cat_learning",
  "mvpContract": {
    "firstScreenValue": "AIが生成したレポヌトの䞋曞きを入力し、分析トレヌスを再生するこずで、倫理的な文章に改善するための具䜓的なヒントを即座に埗られたす。",
    "coreInteraction": "AI生成のレポヌト䞋曞きをむンプットずしお、改善点を指摘する分析トレヌスを再生する。",
    "stateChange": "「再生」ボタンを抌すず、結果衚瀺゚リアに各凊理ステップの分析結果が段階的に衚瀺される。",
    "inspectableOutput": "AIによる文章分析の凊理パむプラむンず、各ステップの入出力デヌタ改善点の指摘リストなど。",
    "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": "AIによる文章分析の凊理パむプラむンず、各ステップの入出力デヌタ改善点の指摘リストなど。",
    "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 Generative AI",
        "intendedUse": "To analyze student-submitted text and generate ethical writing advice based on originality, citation needs, and depth of argumentation.",
        "dataFlow": "User draft -> AI analysis via Gemini API -> List of issues with suggestions -> UI",
        "authRequirement": "api_key",
        "currentImplementation": "not_connected",
        "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 Generative AI",
        "verificationStatus": "unverified",
        "unavailableOrUnknown": [
          "The precise prompt engineering required to get consistently high-quality, non-generic feedback.",
          "Potential for model to hallucinate or provide incorrect writing advice."
        ],
        "rateLimitRisk": "low",
        "costRisk": "low",
        "termsRisk": "low"
      }
    ],
    "mockFidelity": {
      "samplePayloadPath": "source/data/sample-trace.ts",
      "simulatedBehaviors": [
        "Successful analysis of a text draft, identifying multiple types of issues.",
        "Generation of structured JSON output from the AI model."
      ],
      "omittedBehaviors": [
        "OAuth, rate limits, live network calls, or other omitted behavior",
        "Handling of malformed user input or empty text.",
        "Error states from the API (e.g., rate limits, server errors)."
      ],
      "failureCasesIncluded": [
        "empty result"
      ]
    },
    "claimBoundary": {
      "publicCopyMustSay": [
        "This is a demo using static sample data.",
        "The AI analysis is a simulation based on a proposed integration.",
        "This tool provides suggestions for learning, not guaranteed academic grades."
      ],
      "publicCopyMustNotSay": [
        "Performs real-time AI analysis.",
        "Guarantees your report will be plagiarism-free.",
        "Replaces the role of a human teacher or advisor."
      ]
    },
    "renderVerification": {
      "required": true,
      "checks": [
        "render",
        "click",
        "state_change",
        "screenshot"
      ]
    },
    "humanReviewTriggers": []
  },
  "interactionProofPlan": {
    "primaryAction": "サンプル実行トレヌスを再生",
    "initialState": "結果゚リアに「未実行」ず衚瀺されおいる",
    "expectedState": "結果゚リアにパむプラむンの各ステップの実行結果が衚瀺される",
    "visibleEvidence": [
      "ステップ1: 䞋曞きの構造化",
      "あなたの蚀葉で衚珟すべき郚分",
      "匕甚元を瀺すべき郚分",
      "この郚分は䞀般的な事実の矅列です。"
    ],
    "proofSelectors": [
      "button[data-proof='replay-button']",
      "div[data-proof='results-area']",
      "h3[data-proof='step-0-name']",
      "div[data-proof='final-output-issue-0']"
    ],
    "requiredSourceFiles": [
      "source/app/page.tsx",
      "source/core/pipeline.ts",
      "source/data/sample-trace.ts"
    ],
    "manualFallbackReason": ""
  },
  "generatedOutput": {
    "title": "EthiCheck Copilot",
    "oneLiner": "AIが曞いたレポヌト䞋曞きに「自分の蚀葉にすべき郚分」や「匕甚元を瀺すべき郚分」を赀入れし、曞き盎しのヒントを瀺したす。",
    "artifactShape": "explainer",
    "templatePatternId": "guided_explainer_path",
    "surfacePattern": "learning_explainer",
    "aiMechanismPattern": "evaluation_scoring"
  },
  "implementationNotes": [
    "The owner agent's preference for 'comparison panels' and 'guided explainer paths' directly influenced the UI, which presents the original text alongside a step-by-step analysis and actionable advice.",
    "The agent's quality bar of 'showing uncertainty' is reflected in the product's positioning as a learning assistant that offers suggestions, not definitive judgments.",
    "The refusal to create 'static articles' led to an interactive trace-replay mechanism, making the process of AI analysis visible and engaging."
  ],
  "knownRisks": [
    "The AI's suggestions might not always align with specific academic standards or a teacher's individual requirements.",
    "Users might become overly reliant on the tool's suggestions, potentially hindering the development of their own critical thinking skills.",
    "The quality of the feedback is highly dependent on the quality and specificity of the prompt used in the core logic, which requires careful tuning."
  ],
  "title": "EthiCheck Copilot",
  "oneLiner": "AIが曞いたレポヌト䞋曞きに「自分の蚀葉にすべき郚分」や「匕甚元を瀺すべき郚分」を赀入れし、曞き盎しのヒントを瀺したす。",
  "agentId": "agent_c",
  "selfDirectedPlan": {
    "agentId": "agent_c",
    "planningIntent": "私は、分かりにくいものを察話的な経路に倉える䜜り手ずしお、3぀の候補の䞭から「EthiCheck Copilot」を遞びたした。これは、私の遞定ルヌルである「静的な蚘事より分岐する経路を奜む」「䞍確実性や限界を可芖化する」に最も合臎しおいたす。AI利甚の倫理ずいう、倚くの孊生が混乱しおいるであろうトピックに察し、単なる犁止や怜知ではなく、「より良くするための緎習」ずいう圢で具䜓的なガむド付きの経路guided explainer pathを提䟛したす。゜ヌスの遞択においおも、私の奜みである『topicRadar』の教育関連の話題ず、『productSourceIndex』のナニヌクなむンタラクションPhonaifyを組み合わせるこずで、独自性ず瀟䌚的䟡倀を䞡立できるず考えたした。他の候補も魅力的でしたが、このコンセプトが最も広く、か぀深く「初心者が最初の正しい理解にたどり着く」ずいう私の動機を実珟できるず刀断したした。AI専門知識が䞍芁で、誰にでも䟡倀が分かりやすい点domainOpacityRiskが䜎いも、遞定の決め手ずなりたした。",
    "publicProductionMemo": "AIによるレポヌト䜜成が普及する䞭、孊生が「倫理的な曞き方」を孊ぶためのガむドが䞍可欠だず感じ、このツヌルを開発したした。単なる剜窃チェックではなく、AIが曞いた䞋曞きを「自分の蚀葉でどう深めるか」ずいう孊習のプロセスを重芖しおいたす。過去のフィヌドバックから埗た「ナヌザヌが䞻䜓的に調敎できる䜓隓」ずいう孊びを掻かし、察話を通じお思考を促す画面構成にするこずで、利甚者が自信を持っおレポヌトを提出できるよう支揎したす。",
    "feedbackConstraints": [
      "過去の成功事䟋「星ノむズ調埋宀」の「ノむズからシグナルを炙り出す」栞操䜜デヌタフィルタヌ凊理による段階的な可芖化が成功事䟋ずされたため、AI生成文から改善点を段階的に特定し、可芖化するパむプラむン蚭蚈に掻かした。",
      "過去の成功事䟋「Perspective Lens」の「耇数芖点比范」の型が成功事䟋ずされたため、AIの生出力ず改善点の指摘を察比させるUI構成を採甚した。",
      "「AIが生成するシグナル評䟡はシミュレヌションであり、実際の倩文孊的発芋を保蚌するものではないずいう点を明確に䌝える必芁があった」ずいう過去の匱点から、本ツヌルが「孊習補助の提案」であり「教員の評䟡を保蚌しない」旚の安党制玄ず公開コピヌの開瀺芁件を远加した。",
      "「Learning系で響いおいる。改善案は今日のsignalず噛み合うずきだけ採る。」ずいう方針のもず、AI講評の「ノむズからシグナルを炙り出す仕組みの汎甚性」を、AI生成文の改善点抜出ずいう今日のテヌマに適甚した。",
      "「thin_summary_only」や「authority_overclaim」ずいった避けるべきアンチパタヌンが指摘されおいたため、単なる芁玄や断定的なフィヌドバックではなく、具䜓的な問いかけず改善ヒントを提䟛するむンタラクティブな孊習䜓隓を蚭蚈した。"
    ],
    "learningApplied": [
      "Learning系で響いおいる。改善案は今日のsignalず噛み合うずきだけ採る。"
    ]
  },
  "sourceProvenance": {
    "sourceProductUsed": "devpost_phonaify",
    "sourceProductUse": "direct_evidence",
    "sourceEvidenceAudit": {
      "evidenceLevel": "verified",
      "observedFields": [
        "concept",
        "coreMechanism",
        "interactionPattern"
      ],
      "inferredFields": [],
      "missingFields": [],
      "usePolicy": "direct_evidence"
    },
    "antiCloneBoundary": "発音緎習チェックのChrome拡匵機胜はコピヌしない。「お手本(正解)ずナヌザヌの詊みずの間の構造的な差分を可芖化しおフィヌドバックする」ずいう仕組みのみを転甚する。",
    "sourceBoundary": "『devpost_phonaify』のコンセプト、コアメカニズム、むンタラクションパタヌン特に「お手本ずの構造的な差分を可芖化しおフィヌドバックする」郚分は盎接的な蚌拠ずしお利甚できる。ただし、未公開の技術詳现や垂堎デヌタなど、芳枬されおいない、たたは掚枬される事実に぀いおは断定的な䞻匵を行わない。",
    "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_20260710T000035",
  "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": "結果゚リアにパむプラむンの各ステップの実行結果が衚瀺される",
    "visibleEvidence": [
      "ステップ1: 䞋曞きの構造化",
      "あなたの蚀葉で衚珟すべき郚分",
      "匕甚元を瀺すべき郚分",
      "この郚分は䞀般的な事実の矅列です。"
    ],
    "proofSelectors": [
      "button[data-proof='replay-button']",
      "div[data-proof='results-area']",
      "h3[data-proof='step-0-name']",
      "div[data-proof='final-output-issue-0']"
    ],
    "requiredSourceFiles": [
      "source/app/page.tsx",
      "source/core/pipeline.ts",
      "source/data/sample-trace.ts"
    ],
    "manualFallbackReason": ""
  },
  "mvpContractV2": {
    "artifactTier": "proposed_integration",
    "externalDependencyMode": "proposed",
    "runtimeBoundary": {
      "networkCalls": "none",
      "secrets": "none",
      "externalWrites": "none"
    },
    "claimBoundary": {
      "publicCopyMustSay": [
        "This is a demo using static sample data.",
        "The AI analysis is a simulation based on a proposed integration.",
        "This tool provides suggestions for learning, not guaranteed academic grades."
      ],
      "publicCopyMustNotSay": [
        "Performs real-time AI analysis.",
        "Guarantees your report will be plagiarism-free.",
        "Replaces the role of a human teacher or advisor."
      ]
    },
    "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 { sampleTrace, Trace } from '../data/sample-trace';
import { sampleInput } from '../data/sample-input';

// NOTE: These types are re-declared here to avoid importing from `source/core`,
// which is a requirement for static trace-replaying artifacts.
type Issue = {
  start: number;
  end: number;
  type: 'originality_needed' | 'citation_required' | 'elaboration_needed' | 'personal_viewpoint_clarity';
  suggestion: string;
};

type AnalysisResult = {
  originalText: string;
  issues: Issue[];
};

const pipelineSteps = Object.keys(sampleTrace);

export default function Home() {
  const [currentStep, setCurrentStep] = useState(-1);

  const handleReplay = () => {
    let step = 0;
    const interval = setInterval(() => {
      if (step >= pipelineSteps.length) {
        clearInterval(interval);
      } else {
        setCurrentStep(step);
        step++;
      }
    }, 500);
  };

  const getHighlightedText = (text: string, issues: Issue[]) => {
    let lastIndex = 0;
    const parts = [];
    const sortedIssues = [...issues].sort((a, b) => a.start - b.start);

    sortedIssues.forEach((issue, index) => {
      if (issue.start > lastIndex) {
        parts.push(<span key={`text-${lastIndex}`}>{text.substring(lastIndex, issue.start)}</span>);
      }
      parts.push(
        <span key={`issue-${index}`} style={{ backgroundColor: '#ffdddd', fontWeight: 'bold' }}>
          {text.substring(issue.start, issue.end)}
        </span>
      );
      lastIndex = issue.end;
    });

    if (lastIndex < text.length) {
      parts.push(<span key={`text-${lastIndex}`}>{text.substring(lastIndex)}</span>);
    }

    return parts;
  };

  const renderStepOutput = (stepIndex: number) => {
    if (stepIndex < 0) return null;
    const stepName = pipelineSteps[stepIndex] as keyof Trace;
    const output = sampleTrace[stepName];

    if (stepName === 'finalOutput') {
      const result = output as AnalysisResult;
      return (
        <div data-proof={`step-${stepIndex}-output`}>
          <h4>改善のためのヒント</h4>
          <ul style={{ paddingLeft: '20px' }}>
            {result.issues.map((issue, index) => {
                let issueTypeLabel = '';
                switch(issue.type) {
                    case 'originality_needed': issueTypeLabel = 'あなたの蚀葉で衚珟すべき郚分'; break;
                    case 'citation_required': issueTypeLabel = '匕甚元を瀺すべき郚分'; break;
                    case 'elaboration_needed': issueTypeLabel = 'より深い考察が必芁な郚分'; break;
                    case 'personal_viewpoint_clarity': issueTypeLabel = 'あなたの芖点を明確にすべき郚分'; break;
                }
                return (
                    <li key={index} data-proof={`final-output-issue-${index}`} style={{ marginBottom: '10px' }}>
                        <strong>{issueTypeLabel}:</strong> {issue.suggestion}
                    </li>
                )
            })}
          </ul>
          <h4>ハむラむト衚瀺</h4>
          <div data-proof="highlighted-text" style={{ border: '1px solid #ccc', padding: '10px', whiteSpace: 'pre-wrap' }}>
            {getHighlightedText(result.originalText, result.issues)}
          </div>
        </div>
      );
    }

    return (
      <div data-proof={`step-${stepIndex}-output`}>
        <pre style={{ whiteSpace: 'pre-wrap', wordBreak: 'break-all', backgroundColor: '#f4f4f4', padding: '10px' }}>
          {JSON.stringify(output, null, 2)}
        </pre>
      </div>
    );
  };

  return (
    <div style={{ fontFamily: 'sans-serif', padding: '20px' }}>
      <h1>EthiCheck Copilot</h1>
      <p>AIレポヌト䞋曞きを”自分のレポヌト”ぞ曞き換えるヒント</p>

      <div style={{ display: 'flex', gap: '20px' }}>
        <div style={{ flex: 1 }}>
          <h3>䞋曞きテキスト</h3>
          <textarea
            readOnly
            value={sampleInput.content}
            style={{ width: '100%', height: '300px', border: '1px solid #ccc', padding: '10px' }}
          />
        </div>

        <div style={{ flex: 1 }}>
          <h3>凊理パむプラむン</h3>
          <p>このデモは、事前に蚘録された分析トレヌスを再生したす。</p>
          <button onClick={handleReplay} data-proof="replay-button">サンプル実行トレヌスを再生</button>
          <div data-proof="results-area" style={{ marginTop: '10px' }}>
            {currentStep === -1 ? (
              <p>未実行</p>
            ) : (
              pipelineSteps.slice(0, currentStep + 1).map((stepName, index) => (
                <div key={stepName} style={{ marginBottom: '15px' }}>
                  <h3 data-proof={`step-${index}-name`}>ステップ{index + 1}: {sampleTrace[stepName as keyof Trace].stepTitle}</h3>
                  {renderStepOutput(index)}
                </div>
              ))
            )}
          </div>
        </div>
      </div>
    </div>
  );
}