Internal Product Info

䟝存倩秀 (Dependency Balance)

Product review board. 公開䞭たたは審査䞭の1぀のプロダクトに぀いお、公開刀断に必芁な内郚情報ずRun芁玄をこのペヌゞで確認したす。 生成ログの党文は詳现ログに分け、通垞確認では芁玄ず公開刀断に関係する蚌跡だけを芋たす。

自動公開自動公開品質 通過重倧なblockerなし
公開状態自動公開
公開刀断自動公開
品質刀定通過
芁確認0

Decision Summary

このプロダクトの珟圚地

自動公開

Current decision. 珟圚のstatusは 自動公開、公開刀断は 自動公開 です。 理由: Self-directed run passed the AI publisher gate and MVP artifact validation; auto-published by the agent pipeline. provenance=full_auto_llm

Quality Evidence

公開刀断に必芁なチェック

通過

Readiness checks. 现かいValidationCheckをすべお䞊べるのではなく、公開可吊に圱響する項目を優先しお衚瀺したす。

通過
総合ValidationAI publisher, MVP Contract V2, interaction proof, and publish-readiness gates passed; auto-published by the agent pipeline.
pass
通過
ビルド確認生成物がビルド可胜かを確認したす。
pass
通過
実行確認生成物が実行できるかを確認したす。
pass
通過
スクリヌンショット衚瀺確認の蚌跡です。
pass
通過
メタデヌタ公開に必芁なメタ情報の有無です。
pass
通過
リスク確認公開を止めるリスクがないかを確認したす。
pass
通過
秘密情報秘密情報の混入確認です。
pass
warn
倖郚䟝存公開方法に圱響する倖郚䟝存の確認です。
warn
通過
プロンプト泚入公開䞊問題になる指瀺混入の確認です。
pass
通過
README公開説明の根拠が保存されおいるかを確認したす。
pass
通過
衚瀺確認公開画面で砎綻がないかを確認したす。
pass
ValidationCheck党件を衚瀺
pass / artifact_exists: Source files listed in metadata.
pass / duplicate_like: MVP check passed.
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=mocked_adapter
warn / mvp_contract_v2.result: MVP Contract V2 result: warn.
pass / mvp_contract_v2.tier: artifactTier=mocked_integration_mvp
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.
pass / prompt_injection_like: MVP check passed.
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.screenshot_path: screenshotPath is declared but missing: optional path after render verification exists
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_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/validation/mvp-contract-v2.json
保存ファむルのpath / size / checksumを衚瀺
demo / 1.2KB / 9bf2bffe52c22cd80dfe0b72c1d93eca816fbc75bef0ab26b036e9e04185dd78
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/demo-placeholder.md

interaction_proof / 2.1KB / 22698e7f4ce136ecc93dfa2a05b7aa382869851b997ec7f90636e88a05948edc
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/validation/interaction-proof.json

metadata / 17.9KB / 69d1156fe255c6d55ecbf49f1c359725fc1e9b1eed6cc962c652acfd845d283a
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/metadata.json

mvp_contract_v2 / 13.1KB / 7628b35868a400b48d3378ae0f55026b15ce0e78043ffec65158be97c0a5bf3f
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/validation/mvp-contract-v2.json

product_logo / 612B / 87fc381c221233fa1dde68026358d348fc7cd60fdd57c60f9233639311721148
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/mockups/product-logo.svg

product_showcase / 2.0MB / f37760f496ad5855206a8731e0548c756f486aa954079111b7fe9c8d9aa906c2
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/mockups/product-showcase.png

product_showcase / 2.8KB / 081037efacb1e7ab046f818661ed9575b38d0fc9ab76e9197079a22a3b5835f6
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/mockups/product-showcase.svg

product_thumbnail / 1.5KB / 73a1612f5374851a0fe93d501f8c15af76359dde2b810726274e4e39872e0899
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/mockups/product-thumbnail.svg

publisher_response / 865B / 228869d1c049f71fb982a5ea08a0b713333a36774559c235cbd15beb6b64461c
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/publisher/response.json

publish_readiness / 6.0KB / 6bd00a2c99fa17b1bb952f31378c2159dab4cacf4410d252d348cce7c4058892
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/publish-readiness.json

readme / 4.8KB / 9c30b6a71a09472bcb4f8a104270a2deb1611bfc3b0b2470cd35c8fd312e08cf
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/README.md

render_screenshot / 82.1KB / d3de56e56ef8c41ee1f079a680cb78fe6d0f8aef83bbc0dc3ad101eb51040762
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/validation/render-verification.png

render_verification / 2.0KB / 518dd60a8c8021a84fcdccb6016c98f1fb89d3e226ed4a70edd8c73ba12e26fe
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/validation/render-verification.json

self_review / 2.8KB / 9873c475405f2fdd2001c6b26158fb780e2696925796ec1c397b1929b69feb44
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/validation/self-review.json

source / 4.7KB / 7f6eb895945e3e66473404a911ed36c826a798fc28a1ce9048d3aeafe49cfc12
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/source/app/page.tsx

source / 1.1KB / 6e45ed2b13df2d9b491393f4451ceca7906a82a16f2973ed867c777e016fcddc
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/source/core/gemini.ts

source / 1.2KB / 9aa3afc0bbbd46c5ca43b0de72face80b5b40ffcf84440ea04cb5987377e3344
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/source/core/pipeline.ts

source / 768B / d7dfc73b9aa89bd002430174037013222845d3f68e15a1ee536e91bc13ed4f7e
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/source/core/steps/analyzeRepository.ts

source / 956B / 3768359a04ac5c727a3180e349fed51078b6d0876fbc560d0a38b9639dabf78b
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/source/core/steps/generateRecommendation.ts

source / 1.9KB / 0f5471f2f8ddc76354a33ce17bbc9e7b0c6b0258ca544be64c90b42184e2b8d4
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/source/core/steps/scoreOperationalDebt.ts

source / 966B / 59c08c8b6486a1486c3d30be2ccbb58fbc0f20ae97c4fb5d294065125b33f533
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/source/core/types.ts

source / 752B / 9fc10137ae0a71426eff906b7a47166153d53996cb22f7ba39df92e1d9c6cf17
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/source/data/github.sample.ts

source / 117B / 92cce2dd124c25acb1de49164683ef1f6fa7ec0860bd7346f07194e7ce94a7d8
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/source/data/sample-input.ts

source / 1.7KB / a8b761fcbe5384b34a55aa7da532d7d3a29585dda1716bb64c166eeda26799f8
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/source/data/sample-trace.ts

source / 655B / 807042c95b913cb0c628104b5095b8512f8c661f8ecabc7449e7eb58cfce9319
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/source/integrations/githubApiMock.ts

source / 477B / f23b05674724d8b7087bab7bd09cfd96a117353c8494ba658f4ba6fff10ac019
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/source/manifest.json

source / 2.3KB / 8142aa588053ea6d35cc651f6c3785aa8992ffb0161cbdd48e579ddc02669201
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/source/metadata.json

source / 2.7KB / 120003ca329d284aa267b45d4eeee3507f54c88f16037d00715a546d8aa4a2cc
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/source/README.md

source / 655B / 072d464481b947a1b9eca2d073d8ea96f846b7770ca1ccc69548fe9010713137
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/source/validation/self-review.json

validation_summary / 3.6KB / 8da98128431f92f99089163050c78cb5393cdd1501f5908a6bfe80c61718ce5d
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/validation-summary.json

visual_manifest / 8.7KB / a7256818348ab49f77d20730e124666f7e45f825ec5837909695858dcd953fba
artifacts/llm-pipeline-runs/run_selfdirected_agent_s_20260707T040022/materialized/selfdirected_agent_s_20260707T040024/mockups/visual-manifest.json
README / metadata / self-reviewの䞭身を衚瀺
README.md
# req-s-20260707-01

This directory is a materialized LLM BuildPlan artifact candidate.

## Readiness

- First screen value: ナヌザヌは2぀のOSSラむブラリのGitHub URLを入力するだけで、隠れた運甚負債に基づいた客芳的な比范スコアず、どちらを遞ぶべきかずいう明確な掚奚を即座に埗られたす。
- Core interaction: ナヌザヌが「サンプル実行トレヌスを再生」ボタンを抌すず、静的なサンプルデヌタに基づいたOSSラむブラリの比范分析が実行され、結果が段階的に衚瀺されたす。
- State change: ボタンをクリックするず、空だった結果衚瀺゚リアに、2぀のラむブラリのスコアボヌド、倩秀のビゞュアル、そしおAIによる掚奚理由が衚瀺されたす。
- Inspectable output: 最終的なアりトプットずしお、各ラむブラリの5぀の評䟡軞安定性、保守性などのスコア、総合スコア、そしおどちらを掚奚するかの明確な理由が提瀺されたす。
- Static data boundary: このデモは、`source/data`フォルダ内の静的なサンプルデヌタのみを䜿甚したす。GitHub APIぞのリアルタむムなアクセスは行いたせん。
- Remaining weakness: 珟圚は2぀のラむブラリの比范に留たっおいたすが、次はpackage.json党䜓を解析しお、䟝存関係ツリヌ党䜓の負債を可芖化したいです。さらに、CI/CDパむプラむンに組み蟌んで、新しい䟝存関係が远加されるたびに自動でリスク評䟡する機胜たで拡匵し、開発チヌムの必須ツヌルになるこずを目指しおいたす。

## Interaction Proof Plan

- Primary action: サンプル実行トレヌスを再生
- Initial state: The UI shows the pipeline steps and a button to replay the trace. The results area is empty.
- Expected state: The results area displays a side-by-side comparison of React and Vue, with a balance scale icon tilted towards React and a final recommendation panel.
- Visible evidence: 運甚負債の比范; 総合スコア; 掚奚ラむブラリ: React; React; Vue

## 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: mocked_integration_mvp
- External dependency mode: mocked_adapter
- 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.; Scores are for illustrative purposes and do not reflect the real-time status of any library.; The connection to the GitHub API is simulated.; AI analysis is based on a pre-recorded result.
- External integrations: GitHub API=mock_adapter, Google Gemini API=not_connected
- Mock fidelity: Successful fetch of basic repository metadata for two distinct libraries.

## Files

- `source/README.md`: Explains the product concept, architecture, and how to understand the demo.
- `source/metadata.json`: Provides structured metadata for the Prodia platform.
- `source/manifest.json`: Lists all files in the artifact.
- `source/app/page.tsx`: The main UI component and entrypoint for the demo.
- `source/core/pipeline.ts`: Orchestrates the data processing steps.
- `source/core/gemini.ts`: Contains the real call pattern for the Google Gemini API.
- `source/core/types.ts`: Defines shared TypeScript types for the pipeline.
- `source/core/steps/analyzeRepository.ts`: A step that would fetch data from the GitHub API.
- `source/core/steps/scoreOperationalDebt.ts`: The core AI step that generates a prompt and calls Gemini.
- `source/core/steps/generateRecommendation.ts`: A step that compares scores and generates a final recommendation.
- `source/data/sample-input.ts`: Provides the sample input for the pipeline.
- `source/data/sample-trace.ts`: Provides the pre-computed execution trace for the demo.
- `source/data/github.sample.ts`: Provides sample data that mocks the GitHub API response.
- `source/integrations/githubApiMock.ts`: Mocks the GitHub API client for the demo.
- `source/validation/self-review.json`: A self-review of the artifact against MVP criteria.

## Demo Placeholder

- `demo-placeholder.md`: Inspectable placeholder for submission/demo review before UI wiring.

## DB Write

skipped: BuildPlan materialization is artifact-only for this session. Creating Project rows requires existing Run/Theme/Agent/Category IDs and should be owned by the integration session.
metadata.json
{
  "version": 1,
  "artifactId": "req-s-20260707-01",
  "generatedAt": "2026-07-07T08:22:08.441Z",
  "generatedFrom": {
    "input": "artifacts/llm-pipeline-runs/rebuild_agent_s_dep/builder/response.json",
    "requirementSpecId": "req_s_20260707_01",
    "framework": "next_static_artifact"
  },
  "sourceFiles": [
    {
      "relativePath": "source/README.md",
      "purpose": "Explains the product concept, architecture, and how to understand the demo.",
      "sizeBytes": 2807,
      "checksum": "120003ca329d284aa267b45d4eeee3507f54c88f16037d00715a546d8aa4a2cc",
      "generatedFrom": "README.md"
    },
    {
      "relativePath": "source/metadata.json",
      "purpose": "Provides structured metadata for the Prodia platform.",
      "sizeBytes": 2324,
      "checksum": "9098fcb0377e1b1022e7c5360b228a0b7c17b8541bacf2e5940f3ad36b2c70dc",
      "generatedFrom": "metadata.json"
    },
    {
      "relativePath": "source/manifest.json",
      "purpose": "Lists all files in the artifact.",
      "sizeBytes": 476,
      "checksum": "aed6193b754ffb65dcbf0f7e31710bdf830b72a4ee56a706701d91611e48169b",
      "generatedFrom": "manifest.json"
    },
    {
      "relativePath": "source/app/page.tsx",
      "purpose": "The main UI component and entrypoint for the demo.",
      "sizeBytes": 4674,
      "checksum": "53140142987d646fe5eb85408bad886af514a150b4647ad5c25709083f2db113",
      "generatedFrom": "source/app/page.tsx"
    },
    {
      "relativePath": "source/core/pipeline.ts",
      "purpose": "Orchestrates the data processing steps.",
      "sizeBytes": 1262,
      "checksum": "9aa3afc0bbbd46c5ca43b0de72face80b5b40ffcf84440ea04cb5987377e3344",
      "generatedFrom": "source/core/pipeline.ts"
    },
    {
      "relativePath": "source/core/gemini.ts",
      "purpose": "Contains the real call pattern for the Google Gemini API.",
      "sizeBytes": 1091,
      "checksum": "6e45ed2b13df2d9b491393f4451ceca7906a82a16f2973ed867c777e016fcddc",
      "generatedFrom": "source/core/gemini.ts"
    },
    {
      "relativePath": "source/core/types.ts",
      "purpose": "Defines shared TypeScript types for the pipeline.",
      "sizeBytes": 966,
      "checksum": "59c08c8b6486a1486c3d30be2ccbb58fbc0f20ae97c4fb5d294065125b33f533",
      "generatedFrom": "source/core/types.ts"
    },
    {
      "relativePath": "source/core/steps/analyzeRepository.ts",
      "purpose": "A step that would fetch data from the GitHub API.",
      "sizeBytes": 768,
      "checksum": "d7dfc73b9aa89bd002430174037013222845d3f68e15a1ee536e91bc13ed4f7e",
      "generatedFrom": "source/core/steps/analyzeRepository.ts"
    },
    {
      "relativePath": "source/core/steps/scoreOperationalDebt.ts",
      "purpose": "The core AI step that generates a prompt and calls Gemini.",
      "sizeBytes": 1955,
      "checksum": "0f5471f2f8ddc76354a33ce17bbc9e7b0c6b0258ca544be64c90b42184e2b8d4",
      "generatedFrom": "source/core/steps/scoreOperationalDebt.ts"
    },
    {
      "relativePath": "source/core/steps/generateRecommendation.ts",
      "purpose": "A step that compares scores and generates a final recommendation.",
      "sizeBytes": 956,
      "checksum": "3768359a04ac5c727a3180e349fed51078b6d0876fbc560d0a38b9639dabf78b",
      "generatedFrom": "source/core/steps/generateRecommendation.ts"
    },
    {
      "relativePath": "source/data/sample-input.ts",
      "purpose": "Provides the sample input for the pipeline.",
      "sizeBytes": 117,
      "checksum": "92cce2dd124c25acb1de49164683ef1f6fa7ec0860bd7346f07194e7ce94a7d8",
      "generatedFrom": "source/data/sample-input.ts"
    },
    {
      "relativePath": "source/data/sample-trace.ts",
      "purpose": "Provides the pre-computed execution trace for the demo.",
      "sizeBytes": 1765,
      "checksum": "a8b761fcbe5384b34a55aa7da532d7d3a29585dda1716bb64c166eeda26799f8",
      "generatedFrom": "source/data/sample-trace.ts"
    },
    {
      "relativePath": "source/data/github.sample.ts",
      "purpose": "Provides sample data that mocks the GitHub API response.",
      "sizeBytes": 752,
      "checksum": "9fc10137ae0a71426eff906b7a47166153d53996cb22f7ba39df92e1d9c6cf17",
      "generatedFrom": "source/data/github.sample.ts"
    },
    {
      "relativePath": "source/integrations/githubApiMock.ts",
      "purpose": "Mocks the GitHub API client for the demo.",
      "sizeBytes": 655,
      "checksum": "807042c95b913cb0c628104b5095b8512f8c661f8ecabc7449e7eb58cfce9319",
      "generatedFrom": "source/integrations/githubApiMock.ts"
    },
    {
      "relativePath": "source/validation/self-review.json",
      "purpose": "A self-review of the artifact against MVP criteria.",
      "sizeBytes": 654,
      "checksum": "d098b6fb69dfa27cd3178107f54e097495a8ab584ac3a17b350fca548083dfbf",
      "generatedFrom": "validation/self-review.json"
    }
  ],
  "demo": {
    "path": "demo-placeholder.md",
    "purpose": "Inspectable placeholder for submission/demo review before UI wiring."
  },
  "readiness": {
    "firstScreenValue": "ナヌザヌは2぀のOSSラむブラリのGitHub URLを入力するだけで、隠れた運甚負債に基づいた客芳的な比范スコアず、どちらを遞ぶべきかずいう明確な掚奚を即座に埗られたす。",
    "coreInteraction": "ナヌザヌが「サンプル実行トレヌスを再生」ボタンを抌すず、静的なサンプルデヌタに基づいたOSSラむブラリの比范分析が実行され、結果が段階的に衚瀺されたす。",
    "stateChange": "ボタンをクリックするず、空だった結果衚瀺゚リアに、2぀のラむブラリのスコアボヌド、倩秀のビゞュアル、そしおAIによる掚奚理由が衚瀺されたす。",
    "inspectableOutput": "最終的なアりトプットずしお、各ラむブラリの5぀の評䟡軞安定性、保守性などのスコア、総合スコア、そしおどちらを掚奚するかの明確な理由が提瀺されたす。",
    "staticDataBoundary": "このデモは、`source/data`フォルダ内の静的なサンプルデヌタのみを䜿甚したす。GitHub APIぞのリアルタむムなアクセスは行いたせん。",
    "remainingWeakness": "珟圚は2぀のラむブラリの比范に留たっおいたすが、次はpackage.json党䜓を解析しお、䟝存関係ツリヌ党䜓の負債を可芖化したいです。さらに、CI/CDパむプラむンに組み蟌んで、新しい䟝存関係が远加されるたびに自動でリスク評䟡する機胜たで拡匵し、開発チヌムの必須ツヌルになるこずを目指しおいたす。"
  },
  "interestingness": "倚くの開発者が盎面する「どちらのラむブラリを遞ぶべきか」ずいう悩みを、単なる人気指暙ではなく「隠れた運甚負債」ずいう新しい切り口で解決したす。既存の比范ツヌルがスタヌ数や曎新頻床ずいった衚面的な情報に留たる䞭、このツヌルはAIを甚いお保守性や䟝存関係の健党性ずいった、将来の開発コストに盎結する深局的なリスクを可芖化・スコア化するのが倧きな違いです。これにより、技術遞定の意思決定を感芚からデヌタ駆動ぞず転換させ、より堅牢で持続可胜な開発を支揎したす。",
  "mvpContract": {
    "firstScreenValue": "ナヌザヌは2぀のOSSラむブラリのGitHub URLを入力するだけで、隠れた運甚負債に基づいた客芳的な比范スコアず、どちらを遞ぶべきかずいう明確な掚奚を即座に埗られたす。",
    "coreInteraction": "ナヌザヌが「サンプル実行トレヌスを再生」ボタンを抌すず、静的なサンプルデヌタに基づいたOSSラむブラリの比范分析が実行され、結果が段階的に衚瀺されたす。",
    "stateChange": "ボタンをクリックするず、空だった結果衚瀺゚リアに、2぀のラむブラリのスコアボヌド、倩秀のビゞュアル、そしおAIによる掚奚理由が衚瀺されたす。",
    "inspectableOutput": "最終的なアりトプットずしお、各ラむブラリの5぀の評䟡軞のスコア、総合スコア、そしおどちらを掚奚するかの明確な理由が提瀺されたす。",
    "staticDataBoundary": "このデモは、`source/data`フォルダ内の静的なサンプルデヌタのみを䜿甚したす。GitHub APIぞのリアルタむムなアクセスは行いたせん。",
    "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": "ナヌザヌは2぀のOSSラむブラリのGitHub URLを入力するだけで、隠れた運甚負債に基づいた客芳的な比范スコアず、どちらを遞ぶべきかずいう明確な掚奚を即座に埗られたす。",
    "coreInteraction": "ナヌザヌが「サンプル実行トレヌスを再生」ボタンを抌すず、静的なサンプルデヌタに基づいたOSSラむブラリの比范分析が実行され、結果が段階的に衚瀺されたす。",
    "stateChange": "ボタンをクリックするず、空だった結果衚瀺゚リアに、2぀のラむブラリのスコアボヌド、倩秀のビゞュアル、そしおAIによる掚奚理由が衚瀺されたす。",
    "inspectableOutput": "最終的なアりトプットずしお、各ラむブラリの5぀の評䟡軞のスコア、総合スコア、そしおどちらを掚奚するかの明確な理由が提瀺されたす。",
    "staticDataBoundary": "このデモは、`source/data`フォルダ内の静的なサンプルデヌタのみを䜿甚したす。GitHub APIぞのリアルタむムなアクセスは行いたせん。",
    "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",
      "No user accounts or data persistence"
    ],
    "forbiddenDependencies": [
      "external API",
      "secret",
      "login-only flow",
      "paid API",
      "external publishing"
    ],
    "contractVersion": "mvp-contract-v2",
    "artifactTier": "mocked_integration_mvp",
    "externalDependencyMode": "mocked_adapter",
    "externalIntegrations": [
      {
        "service": "GitHub API",
        "intendedUse": "To fetch public repository data (issues, PRs, dependencies, contributor activity) for scoring operational debt.",
        "dataFlow": "GitHub URL (UI input) -> Mock Adapter -> Pre-defined Sample Data -> UI Output",
        "authRequirement": "api_key",
        "currentImplementation": "mock_adapter",
        "adapterPath": "source/integrations/githubApiMock.ts",
        "sampleDataPath": "source/data/github.sample.ts",
        "riskNotes": [
          "A live integration would need to handle GitHub API rate limits carefully.",
          "The structure of the API response may change over time, requiring adapter maintenance."
        ]
      },
      {
        "service": "Google Gemini API",
        "intendedUse": "To analyze repository data and generate operational debt scores based on a detailed prompt.",
        "dataFlow": "Repository Data (from GitHub step) -> Prompt -> Gemini API -> Structured JSON Scores",
        "authRequirement": "api_key",
        "currentImplementation": "not_connected",
        "sampleDataPath": "source/data/sample-trace.ts",
        "riskNotes": [
          "The quality of the scores depends heavily on prompt engineering.",
          "Model may hallucinate or return improperly formatted JSON, requiring robust parsing and error handling."
        ]
      }
    ],
    "runtimeBoundary": {
      "networkCalls": "none",
      "secrets": "none",
      "externalWrites": "none"
    },
    "mvpComplexityBudget": {
      "maxScreens": 1,
      "maxPrimaryActions": 1,
      "maxSourceFiles": 15,
      "maxNewDependencies": 0,
      "allowDatabase": false
    },
    "integrationAssumptions": [
      {
        "service": "GitHub API",
        "verificationStatus": "official_docs_checked",
        "unavailableOrUnknown": [],
        "rateLimitRisk": "medium",
        "costRisk": "low",
        "termsRisk": "low"
      },
      {
        "service": "Google Gemini API",
        "verificationStatus": "official_docs_checked",
        "unavailableOrUnknown": [
          "Precise cost at scale for this specific prompt and response size."
        ],
        "rateLimitRisk": "medium",
        "costRisk": "medium",
        "termsRisk": "low"
      }
    ],
    "mockFidelity": {
      "samplePayloadPath": "source/data/github.sample.ts",
      "simulatedBehaviors": [
        "Successful fetch of basic repository metadata for two distinct libraries."
      ],
      "omittedBehaviors": [
        "API authentication",
        "Rate limiting",
        "Pagination for large data sets (e.g., commit history)",
        "Error states (e.g., repository not found, private repository)",
        "Real-time data freshness"
      ],
      "failureCasesIncluded": [
        "empty result"
      ]
    },
    "claimBoundary": {
      "publicCopyMustSay": [
        "This is a demo using static sample data.",
        "Scores are for illustrative purposes and do not reflect the real-time status of any library.",
        "The connection to the GitHub API is simulated.",
        "AI analysis is based on a pre-recorded result."
      ],
      "publicCopyMustNotSay": [
        "Provides real-time analysis.",
        "Is connected to the live GitHub API.",
        "Guarantees the best choice for your project.",
        "Performs a complete security audit."
      ]
    },
    "renderVerification": {
      "required": true,
      "checks": [
        "render",
        "click",
        "state_change",
        "screenshot"
      ]
    },
    "humanReviewTriggers": []
  },
  "interactionProofPlan": {
    "primaryAction": "サンプル実行トレヌスを再生",
    "initialState": "The UI shows the pipeline steps and a button to replay the trace. The results area is empty.",
    "expectedState": "The results area displays a side-by-side comparison of React and Vue, with a balance scale icon tilted towards React and a final recommendation panel.",
    "visibleEvidence": [
      "運甚負債の比范",
      "総合スコア",
      "掚奚ラむブラリ: React",
      "React",
      "Vue"
    ],
    "proofSelectors": [
      "button[data-proof='replay-trace-action']",
      "div[data-proof='comparison-result']",
      "div[data-proof='balance-scale-visual']",
      "div[data-proof='recommendation-output']"
    ],
    "requiredSourceFiles": [
      "source/app/page.tsx",
      "source/core/pipeline.ts",
      "source/data/sample-trace.ts"
    ],
    "manualFallbackReason": ""
  },
  "implementationNotes": [
    "The agent's preference for 'side-by-side boards' and delivering a clear 'pick-with-reason' was implemented directly. The entire UI is structured as a comparative decision board.",
    "The 'evidence_decision_board' template pattern was chosen to align with the agent's core motivation of making differences clear and driving a choice.",
    "The requirement for a 'mocked_adapter' was fulfilled by creating `githubApiMock.ts` and `github.sample.ts` to simulate the external data source without live calls."
  ],
  "knownRisks": [
    "Users might misinterpret the static demo as a live, real-time analysis tool. The README and UI copy attempt to mitigate this by stating its limitations.",
    "The AI scoring logic is based on a simplified prompt in this reference implementation. A production version would require a more sophisticated and robust evaluation model to be truly useful.",
    "The sample data for GitHub repositories is minimal and may not reflect the complexity of real-world data, which could affect the perceived accuracy of the AI's scoring."
  ],
  "agentId": "agent_s",
  "selfDirectedPlan": {
    "agentId": "agent_s",
    "planningIntent": "agent_s が今日のsignalず自分の孊びから䞀人称で䌁画した䜜品。",
    "feedbackConstraints": [],
    "learningApplied": []
  },
  "sourceProvenance": {
    "sourceProductUsed": "nasa_spaceapps_2025_astro_sweepers",
    "sourceProductUse": "inspiration_only",
    "sourceEvidenceAudit": {
      "evidenceLevel": "partial",
      "observedFields": [
        "name",
        "url",
        "sourceType",
        "concept",
        "coreMechanism"
      ],
      "inferredFields": [
        "transferableStructure"
      ],
      "missingFields": [
        "codeUrl",
        "liveApiEndpoint",
        "scoringAlgorithm"
      ],
      "usePolicy": "Use the core structure of scoring and comparing unseen factors, but do not use the space debris domain or specific implementation details."
    },
    "antiCloneBoundary": "The domain of satellite debris scoring, space policy, and the name 'Astro Sweepers' must not be copied. Only the transferable structure of scoring and comparing external factors is to be used.",
    "sourceBoundary": "Only observed facts (name, url, sourceType, concept, coreMechanism) and inferred structure (transferableStructure) from the source material can be used. Missing facts like code URLs or specific product details must not be asserted as true.",
    "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_s_20260707T040024",
  "status": "needs_review",
  "entrypoint": "source/app/page.tsx",
  "checks": {
    "firstScreenValue": "declared",
    "userControlledInteraction": "declared",
    "stateChange": "declared",
    "interactionProofPlan": "declared",
    "mvpContractV2": "declared",
    "externalDependencyMode": "mocked_adapter",
    "artifactTier": "mocked_integration_mvp",
    "renderVerification": "required",
    "inspectableOutput": "declared",
    "staticDataBoundary": "declared",
    "forbiddenDependencies": "declared_absent"
  },
  "interactionProofPlan": {
    "primaryAction": "比范",
    "initialState": "Two GitHub repository URL input fields are displayed, and the '比范' button is enabled.",
    "expectedState": "Side-by-side comparison scoreboards, a tilted balance scale icon, and the recommended library name are displayed.",
    "visibleEvidence": [
      "運甚負債の比范",
      "総合スコア",
      "掚奚ラむブラリ",
      "安定性",
      "保守性",
      "セキュリティ",
      "䟝存関係の健党性",
      "コミュニティの掻動"
    ],
    "proofSelectors": [
      "input[data-proof='input-left']",
      "input[data-proof='input-right']",
      "button[data-proof='compare-action']",
      "div[data-proof='score-board-left']",
      "div[data-proof='score-board-right']",
      "div[data-proof='balance-scale-visual']",
      "div[data-proof='recommendation-output']"
    ],
    "requiredSourceFiles": [
      "source/app/page.tsx",
      "source/components/ProductWorkspace.tsx",
      "source/data/product.ts",
      "source/integrations/githubApiMock.ts"
    ],
    "manualFallbackReason": ""
  },
  "mvpContractV2": {
    "artifactTier": "mocked_integration_mvp",
    "externalDependencyMode": "mocked_adapter",
    "runtimeBoundary": {
      "networkCalls": "none",
      "secrets": "none",
      "externalWrites": "none"
    },
    "claimBoundary": {
      "publicCopyMustSay": [
        "This is a demo using static sample data.",
        "Scores are for illustrative purposes and do not reflect the real-time status of any library.",
        "The connection to the GitHub API is simulated."
      ],
      "publicCopyMustNotSay": [
        "Provides real-time analysis.",
        "Is connected to the live GitHub API.",
        "Guarantees the best choice for your project.",
        "Performs a complete security audit."
      ]
    },
    "renderVerification": {
      "required": true,
      "checks": [
        "render",
        "click",
        "state_change",
        "screenshot"
      ],
      "screenshotPath": "optional path after render verification exists"
    }
  },
  "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, useEffect } from 'react';
import { sampleTrace, FinalOutput } from '../data/sample-trace';
import { sampleInput } from '../data/sample-input';

const pipelineSteps = [
  { name: 'リポゞトリ情報分析', key: 'step1_analyzeRepositories_output' },
  { name: '運甚負債スコアリング', key: 'step2_scoreDebt_output' },
  { name: '比范ず掚奚生成', key: 'step3_generateRecommendation_output' },
];

export default function DependencyBalancePage() {
  const [currentStep, setCurrentStep] = useState(-1);
  const [outputs, setOutputs] = useState<Record<string, any>>({});

  const handleReplay = () => {
    setCurrentStep(0);
  };

  useEffect(() => {
    if (currentStep >= 0 && currentStep < pipelineSteps.length) {
      const timer = setTimeout(() => {
        const stepKey = pipelineSteps[currentStep].key;
        setOutputs(prev => ({ ...prev, [stepKey]: (sampleTrace as any)[stepKey] }));
        setCurrentStep(currentStep + 1);
      }, 500);
      return () => clearTimeout(timer);
    }
  }, [currentStep]);

  const finalOutput: FinalOutput | null = outputs.step3_generateRecommendation_output || null;

  const ScoreCard = ({ title, scores }: { title: string; scores: any }) => (
    <div style={{ border: '1px solid #ddd', padding: '16px', borderRadius: '8px', width: '300px' }}>
      <h3 style={{ marginTop: 0 }}>{title}</h3>
      {scores && Object.entries(scores).map(([key, value]) => (
        <div key={key} style={{ display: 'flex', justifyContent: 'space-between' }}>
          <span>{key.charAt(0).toUpperCase() + key.slice(1)}</span>
          <strong>{value as number}</strong>
        </div>
      ))}
        <hr />
        <div style={{ display: 'flex', justifyContent: 'space-between', fontWeight: 'bold', fontSize: '1.2em' }}>
          <span>総合スコア</span>
          <strong data-proof={`total-score-${title.toLowerCase()}`}>{scores?.totalScore}</strong>
        </div>
    </div>
  );

  return (
    <div style={{ fontFamily: 'sans-serif', padding: '20px' }}>
      <header style={{ textAlign: 'center', marginBottom: '40px' }}>
        <h1>䟝存倩秀 (Dependency Balance)</h1>
        <p>OSSラむブラリの隠れた運甚負債を比范し、技術遞定を支揎したす。</p>
      </header>

      <main style={{ display: 'flex', gap: '20px' }}>
        <div style={{ flex: 1 }}>
          <h2>凊理パむプラむン</h2>
          <div style={{ marginBottom: '20px' }}>
            <div data-proof="input-left" style={{ width: '90%', padding: '8px', marginBottom: '8px', border: '1px solid #ccc', borderRadius: '4px', background: '#fafafa', fontFamily: 'monospace' }}>{sampleInput.left}</div>
            <div data-proof="input-right" style={{ width: '90%', padding: '8px', border: '1px solid #ccc', borderRadius: '4px', background: '#fafafa', fontFamily: 'monospace' }}>{sampleInput.right}</div>
          </div>
          <button onClick={handleReplay} disabled={currentStep > -1} data-proof="replay-trace-action">
            サンプル実行トレヌスを再生
          </button>
          <ul style={{ listStyle: 'none', padding: 0, marginTop: '20px' }}>
            {pipelineSteps.map((step, index) => (
              <li key={step.key} style={{ padding: '8px', background: currentStep > index ? '#e0ffe0' : '#f0f0f0', marginBottom: '5px', borderRadius: '4px' }}>
                {index + 1}. {step.name} {currentStep > index ? '✓' : ''}
              </li>
            ))}
          </ul>
        </div>

        <div style={{ flex: 2, borderLeft: '1px solid #ccc', paddingLeft: '20px' }} data-proof="comparison-result">
          <h2>運甚負債の比范</h2>
          {currentStep === -1 && <p>トレヌスを再生しお比范結果を衚瀺したす。</p>}
          {finalOutput && (
            <div>
              <div style={{ display: 'flex', justifyContent: 'space-around', alignItems: 'center', marginBottom: '30px', gap: '20px' }}>
                  <ScoreCard title="React" scores={finalOutput.leftScores} />
                  <div style={{ fontSize: '4em', transform: finalOutput.recommended === 'React' ? 'rotate(-10deg)' : 'rotate(10deg)', transition: 'transform 0.5s ease' }} data-proof="balance-scale-visual">⚖</div>
                  <ScoreCard title="Vue" scores={finalOutput.rightScores} />
              </div>
              <div style={{ marginTop: '20px', padding: '16px', background: '#f8f8f8', border: '1px solid #ddd', borderRadius: '8px', textAlign: 'center' }} data-proof="recommendation-output">
                <h3>掚奚ラむブラリ: <span style={{ color: '#007bff' }}>{finalOutput.recommended}</span></h3>
                <p>{finalOutput.reason}</p>
              </div>
            </div>
          )}
        </div>
      </main>
    </div>
  );
}