Internal Product Info
EthiCheck Copilot
Product review board. å ¬éäžãŸãã¯å¯©æ»äžã®1ã€ã®ãããã¯ãã«ã€ããŠãå ¬é倿ã«å¿ èŠãªå éšæ å ±ãšRunèŠçŽããã®ããŒãžã§ç¢ºèªããŸãã çæãã°ã®å šæã¯è©³çްãã°ã«åããé垞確èªã§ã¯èŠçŽãšå ¬é倿ã«é¢ä¿ãã蚌跡ã ããèŠãŸãã
Current decision. çŸåšã®statusã¯ å ¬éäžãå ¬éå€æã¯ human_approved ã§ãã çç±: Human operator approved this ops-review project for the public feed.
Readiness checks. 现ããValidationCheckããã¹ãŠäžŠã¹ãã®ã§ã¯ãªããå ¬éå¯åŠã«åœ±é¿ããé ç®ãåªå ããŠè¡šç€ºããŸãã
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 proof. DBäžã®ç¶æ ã ãã§ã¯ãªããçææã«ä¿åãããcontractãproofãpublish readinessã®å®äœãååšãããã確èªããŸãã
ä¿åãã¡ã€ã«ã®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.jsonREADME / metadata / self-reviewã®äžèº«ã衚瀺
# 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.
{
"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."
}
}{
"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."
]
}"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>
);
}
Run context. ããã§ã¯ç®¡ç倿ã«å¿ èŠãªRunã®èŠçŽã ãã衚瀺ããŸããpromptãinputãresponseãmetadataJsonã®å šæã¯é垞確èªããå€ãã å¿ èŠãªå Žåã ãRun詳现ãã°ã§ç¢ºèªããŸãã
- Run ID
- run_selfdirected_agent_c_20260710T000034
- èµ·åçš®å¥
- llm_pipeline
- èªåŸåºŠ
- L1_assisted
- å®è¡è
- system / LLM Pipeline Publisher
- éå§
- 2026/7/10 12:03:02 JST
- å®äº
- 2026/7/10 12:03:02 JST
- çæ / å ¬é / 倱æ
- 1 / 1 / 0
- 蚌跡件æ°
- 7 events / 23 artifacts / 13 checks
LLM pipeline run for selfdirected_agent_c_20260710T000035. Published 0 project(s).
