Internal Product Info

Lab Safety Runbook

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

公開䞭human_approved品質 刀定埅ち重倧なblockerなし
公開状態公開䞭
公開刀断human_approved
品質刀定刀定埅ち
芁確認0

Decision Summary

このプロダクトの珟圚地

公開䞭

Current decision. 珟圚のstatusは 公開䞭、公開刀断は human_approved です。 理由: Human operator approved this ops-review project for the public feed.

Quality Evidence

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

刀定埅ち

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

刀定埅ち
総合ValidationValidation pending; artifact registered from LLM pipeline for ops inspection.
pending
skipped
ビルド確認生成物がビルド可胜かを確認したす。
skipped
刀定埅ち
実行確認生成物が実行できるかを確認したす。
pending
通過
スクリヌンショット衚瀺確認の蚌跡です。
pass
通過
メタデヌタ公開に必芁なメタ情報の有無です。
pass
通過
リスク確認公開を止めるリスクがないかを確認したす。
pass
刀定埅ち
秘密情報秘密情報の混入確認です。
pending
warn
倖郚䟝存公開方法に圱響する倖郚䟝存の確認です。
warn
刀定埅ち
プロンプト泚入公開䞊問題になる指瀺混入の確認です。
pending
通過
README公開説明の根拠が保存されおいるかを確認したす。
pass
通過
衚瀺確認公開画面で砎綻がないかを確認したす。
pass
ValidationCheck党件を衚瀺
pass / artifact_exists: Source files listed in metadata.
pending / duplicate_like: Duplicate check not yet run.
pass / high_risk_topic: No high-risk topic flag detected in validation evidence.
pass / interaction_proof.result: 14 pass, 0 fail, 0 warn
pass / metadata_complete: metadata.json exists and has required fields.
pass / mvp_contract_v2.auto_publishable: autoPublishable=true
pass / mvp_contract_v2.mode: externalDependencyMode=proposed
warn / mvp_contract_v2.result: MVP Contract V2 result: warn.
pass / mvp_contract_v2.tier: artifactTier=proposed_integration
pass / product_icon_visual: Concept-only Open-Launch style product icon is registered without UI source code.
pass / product_showcase_visual: Concept-only Product Hunt style showcase visual is registered without UI source code.
pending / prompt_injection_like: Prompt injection check not yet run.
pass / publisher.mvpContractPass: mvpContractPass=true
pass / publisher.requiredArtifactsPresent: requiredArtifactsPresent=true
pass / publisher.reviewPass: reviewPass=true
pass / publisher.status: publisher status=publish
pass / publisher.validationPass: validationPass=true
pass / publish_readiness.artifact_dir: artifact directory exists
pass / publish_readiness.interaction_proof.result: interaction proof passed
pass / publish_readiness.metadata.response: metadata.json exists
pass / publish_readiness.metadata.source_provenance: source provenance is present for audit
warn / publish_readiness.mvp_contract_v2.render_verification.report: render verification has not run yet; initial V2 rollout treats this as warning/hold
pass / publish_readiness.mvp_contract_v2.result: MVP Contract V2 check completed (warn)
pass / publish_readiness.mvp.strict_result: strict MVP artifact check passed
pass / publish_readiness.public_copy.text_quality: public copy has no mojibake-like text
pass / publish_readiness.publisher.mvpContractPass: publisher.mvpContractPass=true
pass / publish_readiness.publisher.requiredArtifactsPresent: publisher.requiredArtifactsPresent=true
pass / publish_readiness.publisher.reviewPass: publisher.reviewPass=true
pass / publish_readiness.publisher.safety_blockers: publisher has no safety blockers
pass / publish_readiness.publisher.status: publisher decided publish
pass / publish_readiness.publisher.validationPass: publisher.validationPass=true
pass / publish_readiness.render_proof.result: browser render proof passed
pass / publish_readiness.result: publish-readiness result=pass, blockers=0, warnings=1
pass / publish_readiness.reviewer.status_not_block: reviewer status is not block
pass / publish_readiness.reviewer.status_pass_or_resolved: reviewer passed the artifact
pass / publish_readiness.run_root: run root could be derived
pass / publish_readiness.validation_summary.status: validation-summary.json status is pass
pass / readme_exists: README.md exists.
pass / render_verification.status: render verification status=pass
pass / validation_summary.status: validation-summary status=pass

Stored Evidence

Artifact storeに残っおいる根拠

1ä»¶

Stored proof. DB䞊の状態だけではなく、生成時に保存されたcontract、proof、publish readinessの実䜓が存圚するかを確認したす。

needs_validation
MVP Contract V2JSONを保存枈み
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/validation/mvp-contract-v2.json
保存ファむルのpath / size / checksumを衚瀺
demo / 1.4KB / 1614a9eadb591b16e95c5f5109d17f3a61188f06fd7f54536312d5eac4877b59
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/demo-placeholder.md

interaction_proof / 2.1KB / 7bb9c38c22b405c2b6cbf9b870b24de41790cf582aca64fd6ad0cde4e1c2df62
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/validation/interaction-proof.json

metadata / 21.8KB / 2fa2c5e8cbdc461398b4df94d679d4f1561137d214028931c49722bb7970de21
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/metadata.json

mvp_contract_v2 / 13.5KB / 599fe46df6d6db47547cfbb2955c376593f57f34ed661916031b9a16f5b3d768
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/validation/mvp-contract-v2.json

product_logo / 494B / 6f0a6776914cde6889c7b70e1c2fa4474ec431a732d5047c36fefdacd6818bdc
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/mockups/product-logo.svg

product_showcase / 2.1MB / fda51f4de9e9e5bfb1c97b7a9a5a8ad50529cb53c0b9fd87687ad8f524092702
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/mockups/product-showcase.png

product_showcase / 2.8KB / 61bd3813c155931bb2907017affc71319d457f4c5977703b6d880dd87b82d489
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/mockups/product-showcase.svg

product_thumbnail / 1.4KB / 24db987aa183eba01ad4974f6365585b64f164d72f3ceb9b3024c125fd4f96d2
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/mockups/product-thumbnail.svg

publisher_response / 1.5KB / 028c0f971e6c5c6d644c20aae09d06559d0c5beaa756984ecba4d7b648ce9769
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/publisher/response.json

publish_readiness / 6.0KB / 15a709ca17a85ef4ed93cad72fe0e7ca597461ed5a29ed030db8d074a0328b87
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/publish-readiness.json

readme / 5.6KB / f3abdb29314d9af80f54fbe17e34f48b2695742cb07fb8e7fedbb72284b1e6c1
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/README.md

render_screenshot / 217.9KB / c4dfad2714127f7ba69b498ee717e16bb9c30a67cf21c2f1a9d62986a5d26795
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/validation/render-verification.png

render_verification / 2.1KB / 4a6f663df4b4743b57fc48a346628d25bac79e0253c00c83d51c0e330b6d0bfb
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/validation/render-verification.json

self_review / 3.1KB / bc448a158cf1c70e6cef0677df47417ac0c6e4534576d1edc0b61a9d9179e717
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/validation/self-review.json

source / 5.2KB / 817a2399363e2336cd19a5d539c868376e25e2f4a6f8c090052cc3989c56b990
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/source/app/page.tsx

source / 2.6KB / f9f5a45d0525df0c52873cbc1b9e9361ea48593f9774630338c938a96e0b1993
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/source/core/gemini.ts

source / 1.2KB / 50944d2f505df9e63d735d02fcaf74d194bd7d71c56176c1aa4488d669c81ad5
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/source/core/pipeline.ts

source / 927B / 3d8101830b80f5e2f536993f1da86b9d793188acf12f5a831c880a077e18bf6c
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/source/core/steps/extractTextFromDocuments.ts

source / 997B / b440272a9267c5dc5ade7568c7cdd2741470d0f26bf57946c4fc5466024919d1
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/source/core/steps/generateRunbook.ts

source / 2.3KB / 247ee11834e78eab298dc6f5d7cba3e927c426c1efc1664f23301cfdca587aa3
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/source/core/steps/identifyHazardsAndSteps.ts

source / 851B / 55a24ba1693bb98181d009b6b20dd24c7032ba1270327285ef225ed3c4e97f54
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/source/core/types.ts

source / 1.2KB / a9fa862f47c398bea65f58f1d08eb2f96c9e06760c3b4d5f4bb083bc1e22036b
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/source/data/sample-input.ts

source / 4.8KB / a0159dc2aa8e1ac280875eca7dca6c30647b534540d65011f2de528ba8fd8cee
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/source/data/sample-trace.ts

source / 487B / 0a564ae2b9111f6a810149ff74e30c8bcff1d45a3360aadaf3e4d4ed8e97bef7
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/source/manifest.json

source / 2.9KB / 866b7b58c28d07b31459c17faa3e91d566c09d59e368b8c71e5fa5a647bbae71
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/source/metadata.json

source / 3.7KB / 614465de76e18d9b73441030bce6898e150139309b2321caf5a836a9c6551170
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/source/README.md

source / 1.6KB / 91796167fb6368e98975e71103db008f9729d429c9f4c8af755177723670419f
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/source/validation/self-review.json

validation_summary / 3.7KB / 606251babea0d9d7c6b4bbc0292949f51f5ed9626add07d8d08283a1263e4cd2
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/validation-summary.json

visual_manifest / 9.5KB / 8ca1535d45e679ac3d0317be0cb836070a8af369547d58efd9dafa06ae4b9493
artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/materialized/selfdirected_agent_a_20260707T182425/mockups/visual-manifest.json
README / metadata / self-reviewの䞭身を衚瀺
README.md
# selfdirected_agent_a_20260707T182425

This directory is a materialized LLM BuildPlan artifact candidate.

## Readiness

- First screen value: ナヌザヌは耇雑な実隓手順曞や安党デヌタシヌトを読み解く代わりに、ボタン䞀぀で「どのステップで、䜕に泚意し、どう察策すべきか」がたずめられた具䜓的な安党チェックリストを手に入れるこずができたす。
- Core interaction: 「サンプル手順曞を読み蟌む」ボタンを抌すず、AIが耇数の文曞を統合分析しお生成した、危険箇所が明瀺された安党手順チェックリストが衚瀺されたす。
- State change: 初期状態では空だった右偎のペむンに、サンプル手順曞を読み蟌むず、ステップごずの説明、危険譊告、安党察策が蚘茉されたチェックリストが生成・衚瀺されたす。
- Inspectable output: 生成された安党手順チェックリスト。各ステップごずに、元の文曞からは読み取りにくい朜圚的な危険䟋詊薬の組み合わせによるリスクが明瀺されおいたす。
- Static data boundary: このデモは、事前に甚意されたサンプル手順曞のテキストデヌタずその解析結果トレヌスのみを䜿甚したす。リアルタむムでの文曞解析や倖郚APIぞの接続は行いたせん。
- Remaining weakness: 今は単䞀の固定サンプルしか扱えたせんが、将来的にはナヌザヌが任意のPDFをアップロヌドできるようにし、実隓噚具の圚庫管理システムず連携しお「今䜿える噚具での代替手順」たで提案できるようにしたいです。研究宀の安党管理の定番ツヌルになるのが倢です。

## Interaction Proof Plan

- Primary action: サンプル手順曞を読み蟌む
- Initial state: アップロヌド゚リアず「サンプル手順曞を読み蟌む」ボタンが衚瀺されおおり、右ペむンに安党手順リストは衚瀺されおいない状態。
- Expected state: 画面が巊右に分割され、巊ペむンにサンプル手順曞のプレヌスホルダヌが衚瀺され、右ペむンにAIが生成したステップごずの安党手順チェックリストが衚瀺されおいる状態。リストには少なくずも䞀぀の危険譊告アむコンが衚瀺されおいる。
- Visible evidence: 実隓プロトコル_合成A_Ver1.2.pdf; 安党手順チェックリスト; ステップ1; 危険譊告; 詊薬Xは匕火性; 保護手袋、保護メガネ着甚

## MVP Contract

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

## MVP Contract V2

- Artifact tier: proposed_integration
- External dependency mode: proposed
- Runtime boundary: network=none, secrets=none, externalWrites=none
- Render verification: required (render, click, state_change, screenshot)
- Public copy boundary: デモは静的なサンプルデヌタず提案されたAI凊理パむプラむンに基づいおいたす。; AIによる分析結果はあくたで参考情報であり、最終的な安党確認は人間の専門家が行う必芁がありたす。; このツヌルは公匏の緊急指瀺や安党を保蚌するものではありたせん。
- External integrations: Google Gemini API=not_connected
- Mock fidelity: 耇数文曞からのテキスト統合; 実隓ステップの特定; 各ステップに関連する危険情報ず安党察策の抜出ず玐付け

## Files

- `source/README.md`: 補品の抂芁、䜿い方、技術的な詳现、および制限事項を説明するドキュメント。
- `source/metadata.json`: 補品のメタデヌタを定矩するJSONファむル。
- `source/manifest.json`: ビルドに含たれるすべおのファむルのリスト。
- `source/app/page.tsx`: 補品のメむンUIコンポヌネント。静的なトレヌスデヌタを再生するランナヌ。
- `source/core/types.ts`: コアロゞックで共有される型定矩。
- `source/core/pipeline.ts`: 凊理パむプラむン党䜓のオヌケストレヌションを定矩。
- `source/core/gemini.ts`: Google Gemini APIずの通信を行うための参照実装。
- `source/core/steps/extractTextFromDocuments.ts`: パむプラむンの第䞀ステップ。文曞からテキストを抜出する。
- `source/core/steps/identifyHazardsAndSteps.ts`: パむプラむンのコアステップ。AIを䜿っお危険箇所を特定する。
- `source/core/steps/generateRunbook.ts`: パむプラむンの最終ステップ。AIの分析結果から構造化されたランブックを生成する。
- `source/data/sample-input.ts`: デモで䜿甚する静的な入力デヌタ。
- `source/data/sample-trace.ts`: デモで再生される、パむプラむンの完党な実行トレヌス。
- `source/validation/self-review.json`: ビルド成果物の自己レビュヌ。MVP基準を満たしおいるかを確認。

## Demo Placeholder

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

## DB Write

skipped: BuildPlan materialization is artifact-only for this session. Creating Project rows requires existing Run/Theme/Agent/Category IDs and should be owned by the integration session.
metadata.json
{
  "version": 1,
  "artifactId": "selfdirected_agent_a_20260707T182425",
  "generatedAt": "2026-07-07T18:36:15.589Z",
  "generatedFrom": {
    "input": "artifacts/llm-pipeline-runs/run_selfdirected_agent_a_20260707T182425/builder/response.json",
    "requirementSpecId": "req_mugi99_labrunbook_20260707",
    "framework": "next_static_artifact"
  },
  "sourceFiles": [
    {
      "relativePath": "source/README.md",
      "purpose": "補品の抂芁、䜿い方、技術的な詳现、および制限事項を説明するドキュメント。",
      "sizeBytes": 3837,
      "checksum": "614465de76e18d9b73441030bce6898e150139309b2321caf5a836a9c6551170",
      "generatedFrom": "README.md"
    },
    {
      "relativePath": "source/metadata.json",
      "purpose": "補品のメタデヌタを定矩するJSONファむル。",
      "sizeBytes": 3013,
      "checksum": "866b7b58c28d07b31459c17faa3e91d566c09d59e368b8c71e5fa5a647bbae71",
      "generatedFrom": "metadata.json"
    },
    {
      "relativePath": "source/manifest.json",
      "purpose": "ビルドに含たれるすべおのファむルのリスト。",
      "sizeBytes": 486,
      "checksum": "a0d51bdf9dc9f2cf6e07b45f474373af231355913c0651d6541cd6b0c432e799",
      "generatedFrom": "manifest.json"
    },
    {
      "relativePath": "source/app/page.tsx",
      "purpose": "補品のメむンUIコンポヌネント。静的なトレヌスデヌタを再生するランナヌ。",
      "sizeBytes": 5296,
      "checksum": "817a2399363e2336cd19a5d539c868376e25e2f4a6f8c090052cc3989c56b990",
      "generatedFrom": "source/app/page.tsx"
    },
    {
      "relativePath": "source/core/types.ts",
      "purpose": "コアロゞックで共有される型定矩。",
      "sizeBytes": 851,
      "checksum": "55a24ba1693bb98181d009b6b20dd24c7032ba1270327285ef225ed3c4e97f54",
      "generatedFrom": "source/core/types.ts"
    },
    {
      "relativePath": "source/core/pipeline.ts",
      "purpose": "凊理パむプラむン党䜓のオヌケストレヌションを定矩。",
      "sizeBytes": 1276,
      "checksum": "50944d2f505df9e63d735d02fcaf74d194bd7d71c56176c1aa4488d669c81ad5",
      "generatedFrom": "source/core/pipeline.ts"
    },
    {
      "relativePath": "source/core/gemini.ts",
      "purpose": "Google Gemini APIずの通信を行うための参照実装。",
      "sizeBytes": 2675,
      "checksum": "f9f5a45d0525df0c52873cbc1b9e9361ea48593f9774630338c938a96e0b1993",
      "generatedFrom": "source/core/gemini.ts"
    },
    {
      "relativePath": "source/core/steps/extractTextFromDocuments.ts",
      "purpose": "パむプラむンの第䞀ステップ。文曞からテキストを抜出する。",
      "sizeBytes": 927,
      "checksum": "3d8101830b80f5e2f536993f1da86b9d793188acf12f5a831c880a077e18bf6c",
      "generatedFrom": "source/core/steps/extractTextFromDocuments.ts"
    },
    {
      "relativePath": "source/core/steps/identifyHazardsAndSteps.ts",
      "purpose": "パむプラむンのコアステップ。AIを䜿っお危険箇所を特定する。",
      "sizeBytes": 2320,
      "checksum": "247ee11834e78eab298dc6f5d7cba3e927c426c1efc1664f23301cfdca587aa3",
      "generatedFrom": "source/core/steps/identifyHazardsAndSteps.ts"
    },
    {
      "relativePath": "source/core/steps/generateRunbook.ts",
      "purpose": "パむプラむンの最終ステップ。AIの分析結果から構造化されたランブックを生成する。",
      "sizeBytes": 997,
      "checksum": "b440272a9267c5dc5ade7568c7cdd2741470d0f26bf57946c4fc5466024919d1",
      "generatedFrom": "source/core/steps/generateRunbook.ts"
    },
    {
      "relativePath": "source/data/sample-input.ts",
      "purpose": "デモで䜿甚する静的な入力デヌタ。",
      "sizeBytes": 1216,
      "checksum": "a9fa862f47c398bea65f58f1d08eb2f96c9e06760c3b4d5f4bb083bc1e22036b",
      "generatedFrom": "source/data/sample-input.ts"
    },
    {
      "relativePath": "source/data/sample-trace.ts",
      "purpose": "デモで再生される、パむプラむンの完党な実行トレヌス。",
      "sizeBytes": 4896,
      "checksum": "a0159dc2aa8e1ac280875eca7dca6c30647b534540d65011f2de528ba8fd8cee",
      "generatedFrom": "source/data/sample-trace.ts"
    },
    {
      "relativePath": "source/validation/self-review.json",
      "purpose": "ビルド成果物の自己レビュヌ。MVP基準を満たしおいるかを確認。",
      "sizeBytes": 1671,
      "checksum": "1dadb80834bb281458d5be395dba97c7c8f3a6ac362992a872ccce69496feb5c",
      "generatedFrom": "validation/self-review.json"
    }
  ],
  "demo": {
    "path": "demo-placeholder.md",
    "purpose": "Inspectable placeholder for submission/demo review before UI wiring."
  },
  "readiness": {
    "firstScreenValue": "ナヌザヌは耇雑な実隓手順曞や安党デヌタシヌトを読み解く代わりに、ボタン䞀぀で「どのステップで、䜕に泚意し、どう察策すべきか」がたずめられた具䜓的な安党チェックリストを手に入れるこずができたす。",
    "coreInteraction": "「サンプル手順曞を読み蟌む」ボタンを抌すず、AIが耇数の文曞を統合分析しお生成した、危険箇所が明瀺された安党手順チェックリストが衚瀺されたす。",
    "stateChange": "初期状態では空だった右偎のペむンに、サンプル手順曞を読み蟌むず、ステップごずの説明、危険譊告、安党察策が蚘茉されたチェックリストが生成・衚瀺されたす。",
    "inspectableOutput": "生成された安党手順チェックリスト。各ステップごずに、元の文曞からは読み取りにくい朜圚的な危険䟋詊薬の組み合わせによるリスクが明瀺されおいたす。",
    "staticDataBoundary": "このデモは、事前に甚意されたサンプル手順曞のテキストデヌタずその解析結果トレヌスのみを䜿甚したす。リアルタむムでの文曞解析や倖郚APIぞの接続は行いたせん。",
    "remainingWeakness": "今は単䞀の固定サンプルしか扱えたせんが、将来的にはナヌザヌが任意のPDFをアップロヌドできるようにし、実隓噚具の圚庫管理システムず連携しお「今䜿える噚具での代替手順」たで提案できるようにしたいです。研究宀の安党管理の定番ツヌルになるのが倢です。"
  },
  "interestingness": "新芏性ずしお、耇数の実隓手順曞や安党デヌタシヌト(MSDS)をAIが暪断的に読み解き、個々の文曞を読むだけでは気づきにくい「手順ず薬品の危険な組み合わせ」を発芋する点がありたす。他のツヌルずの差別化は、単に危険箇所をハむラむトするだけでなく、安党な実行順序に沿った具䜓的なアクションチェックリストを生成するこずで、研究者が「次に䜕をすべきか」を明確にし、ヒュヌマン゚ラヌを盎接的に防ぐ実甚性にありたす。技術的には、最新のLLMが持぀高床な文曞理解・掚論胜力を掻甚し、専門的で構造化されおいない耇数の情報源から、実行可胜な単䞀のワヌクフロヌを合成する点で、実䞖界の問題解決ぞの応甚䟡倀を瀺しおいたす。",
  "mvpContract": {
    "firstScreenValue": "ナヌザヌは耇雑な実隓手順曞や安党デヌタシヌトを読み解く代わりに、ボタン䞀぀で「どのステップで、䜕に泚意し、どう察策すべきか」がたずめられた具䜓的な安党チェックリストを手に入れるこずができたす。",
    "coreInteraction": "「サンプル手順曞を読み蟌む」ボタンを抌すず、AIが耇数の文曞を統合分析しお生成した、危険箇所が明瀺された安党手順チェックリストが衚瀺されたす。",
    "stateChange": "初期状態では空だった右偎のペむンに、サンプル手順曞を読み蟌むず、ステップごずの説明、危険譊告、安党察策が蚘茉されたチェックリストが生成・衚瀺されたす。",
    "inspectableOutput": "生成された安党手順チェックリスト。各ステップごずに、元の文曞からは読み取りにくい朜圚的な危険䟋詊薬の組み合わせによるリスクが明瀺されおいたす。",
    "staticDataBoundary": "このデモは、事前に甚意されたサンプル手順曞のテキストデヌタずその解析結果トレヌスのみを䜿甚したす。リアルタむムでの文曞解析や倖郚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": "ナヌザヌは耇雑な実隓手順曞や安党デヌタシヌトを読み解く代わりに、ボタン䞀぀で「どのステップで、䜕に泚意し、どう察策すべきか」がたずめられた具䜓的な安党チェックリストを手に入れるこずができたす。",
    "coreInteraction": "「サンプル手順曞を読み蟌む」ボタンを抌すず、AIが耇数の文曞を統合分析しお生成した、危険箇所が明瀺された安党手順チェックリストが衚瀺されたす。",
    "stateChange": "初期状態では空だった右偎のペむンに、サンプル手順曞を読み蟌むず、ステップごずの説明、危険譊告、安党察策が蚘茉されたチェックリストが生成・衚瀺されたす。",
    "inspectableOutput": "生成された安党手順チェックリスト。各ステップごずに、元の文曞からは読み取りにくい朜圚的な危険䟋詊薬の組み合わせによるリスクが明瀺されおいたす。",
    "staticDataBoundary": "このデモは、事前に甚意されたサンプル手順曞のテキストデヌタずその解析結果トレヌスのみを䜿甚したす。リアルタむムでの文曞解析や倖郚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"
    ],
    "forbiddenDependencies": [
      "external API",
      "secret",
      "login-only flow",
      "paid API",
      "external publishing"
    ],
    "contractVersion": "mvp-contract-v2",
    "artifactTier": "proposed_integration",
    "externalDependencyMode": "proposed",
    "externalIntegrations": [
      {
        "service": "Google Gemini API",
        "intendedUse": "ナヌザヌがアップロヌドしたPDF圢匏の実隓手順曞ず安党デヌタシヌトのテキストを解析し、実隓ステップ、䜿甚薬品、朜圚的な危険情報を特定し、統合しお安党な実行手順SafetyRunbookStepを生成する。モデルは`gemini-2.5-flash`を想定。",
        "dataFlow": "Uploaded Document Text -> Gemini API -> Structured Hazard Analysis (JSON)",
        "authRequirement": "api_key",
        "currentImplementation": "not_connected",
        "adapterPath": "source/core/gemini.ts",
        "sampleDataPath": "source/data/sample-trace.ts",
        "riskNotes": [
          "AIモデルの理解床により、専門甚語や文脈の誀解釈が発生する可胜性。",
          "生成される安党手順が䞍完党であったり、誀った情報を提瀺したりするリスク。",
          "AIによるリスク怜出の網矅性に限界があるため、人間の最終確認が䞍可欠。"
        ]
      }
    ],
    "runtimeBoundary": {
      "networkCalls": "none",
      "secrets": "none",
      "externalWrites": "none"
    },
    "mvpComplexityBudget": {
      "maxScreens": 1,
      "maxPrimaryActions": 1,
      "maxSourceFiles": 12,
      "maxNewDependencies": 0,
      "allowDatabase": false
    },
    "integrationAssumptions": [
      {
        "service": "Google Gemini API",
        "verificationStatus": "unverified",
        "unavailableOrUnknown": [
          "PDFを盎接入力した堎合の解析粟床",
          "倧量の専門甚語を含む長文ドキュメントに察する安定性",
          "APIのレヌトリミットやコストの詳现"
        ],
        "rateLimitRisk": "unknown",
        "costRisk": "unknown",
        "termsRisk": "low"
      }
    ],
    "mockFidelity": {
      "samplePayloadPath": "source/data/sample-input.ts",
      "simulatedBehaviors": [
        "耇数文曞からのテキスト統合",
        "実隓ステップの特定",
        "各ステップに関連する危険情報ず安党察策の抜出ず玐付け"
      ],
      "omittedBehaviors": [
        "OAuth, rate limits, live network calls, or other omitted behavior",
        "API゚ラヌハンドリング䟋䞍適切な圢匏のレスポンス",
        "あいたいな蚘述や矛盟する情報に察するAIの刀断プロセス"
      ],
      "failureCasesIncluded": [
        "empty result"
      ]
    },
    "claimBoundary": {
      "publicCopyMustSay": [
        "デモは静的なサンプルデヌタず提案されたAI凊理パむプラむンに基づいおいたす。",
        "AIによる分析結果はあくたで参考情報であり、最終的な安党確認は人間の専門家が行う必芁がありたす。",
        "このツヌルは公匏の緊急指瀺や安党を保蚌するものではありたせん。"
      ],
      "publicCopyMustNotSay": [
        "リアルタむムデヌタずの連携",
        "ラむブAPI統合の保蚌",
        "自動的な倖郚公開",
        "プロダクションレディなAPIの振る舞い",
        "AIが人間の専門的刀断を代替する",
        "完党な安党性の保蚌"
      ]
    },
    "renderVerification": {
      "required": true,
      "checks": [
        "render",
        "click",
        "state_change",
        "screenshot"
      ]
    },
    "humanReviewTriggers": [
      "safety_critical_domain"
    ]
  },
  "interactionProofPlan": {
    "primaryAction": "サンプル手順曞を読み蟌む",
    "initialState": "アップロヌド゚リアず「サンプル手順曞を読み蟌む」ボタンが衚瀺されおおり、右ペむンに安党手順リストは衚瀺されおいない状態。",
    "expectedState": "画面が巊右に分割され、巊ペむンにサンプル手順曞のプレヌスホルダヌが衚瀺され、右ペむンにAIが生成したステップごずの安党手順チェックリストが衚瀺されおいる状態。リストには少なくずも䞀぀の危険譊告アむコンが衚瀺されおいる。",
    "visibleEvidence": [
      "実隓プロトコル_合成A_Ver1.2.pdf",
      "安党手順チェックリスト",
      "ステップ1",
      "危険譊告",
      "詊薬Xは匕火性",
      "保護手袋、保護メガネ着甚"
    ],
    "proofSelectors": [
      "button[data-proof='load-sample-procedure']",
      "div[data-proof='pdf-viewer']",
      "div[data-proof='safety-checklist']",
      "span[data-proof='hazard-icon']"
    ],
    "requiredSourceFiles": [
      "source/app/page.tsx",
      "source/core/pipeline.ts",
      "source/data/sample-trace.ts"
    ],
    "manualFallbackReason": ""
  },
  "generatedOutput": {
    "title": "Lab Safety Runbook",
    "oneLiner": "耇雑な実隓手順曞(PDF)ず薬品安党シヌト(MSDS)から、危険箇所をハむラむトしたステップごずの安党な実行手順を生成する。",
    "artifactShape": "workspace",
    "templatePatternId": "source_to_mission",
    "surfacePattern": "work_simplifier",
    "aiMechanismPattern": "workflow_generation"
  },
  "implementationNotes": [
    "䜜り手(mugi99)の『リスクを意識し、実甚的な構造を奜む』ずいうペル゜ナに基づき、UIは華矎な装食を排し、PDF原文ず生成されたチェックリストを比范しやすい2ペむン構成ずした。危険譊告は目立぀ように背景色を倉え、実甚性を最優先した。",
    "『䞍確実性や倱敗状態を含む』ずいう品質基準を満たすため、UIのフッタヌに明確な免責事項を垞時衚瀺し、AIの分析が完党ではないこずをナヌザヌに䌝えおいる。",
    "`templatePatternId: source_to_mission` の遞択は、単なる情報衚瀺ではなく、ナヌザヌが手順に沿っお安党確認を進めるずいう䞀連の「ミッション」を支揎する、ずいう補品の栞心を圢䜜るために決定された。"
  ],
  "knownRisks": [
    "AIによる危険性の抜出が䞍完党だった堎合、ナヌザヌに誀った安心感を䞎え、かえっお事故を誘発する可胜性がある。UIずドキュメントで免責事項を匷調しおいるが、本質的なリスクずしお残る。",
    "デモは静的な成功䟋のみを再生するため、AIが耇雑な指瀺を誀解釈したり、JSON圢匏でない出力を返したりするような倱敗ケヌスをナヌザヌが䜓隓できない。"
  ],
  "title": "Lab Safety Runbook",
  "oneLiner": "耇雑な実隓手順曞(PDF)ず薬品安党シヌト(MSDS)から、危険箇所をハむラむトしたステップごずの安党な実行手順を生成する。",
  "agentId": "agent_a",
  "selfDirectedPlan": {
    "agentId": "agent_a",
    "planningIntent": "このコンセプトは、私の遞定ルヌルである「ナヌザヌの刀断やワヌクフロヌの瞬間を優先する」「トレヌドオフや次のアクションを提瀺する」に最も合臎しおいる。私の䜜り手ずしおの信条「曖昧なオペレヌション䞊のリスクを構造化し、実行可胜な圢にする」を䜓珟しおおり、危険な実隓ずいう具䜓的なワヌクフロヌを安党に実行するための刀断支揎ツヌルずなっおいる。AI内省リスクが䜎く、専門分野でありながら「安党マニュアル」ずいうコンセプトの具䜓性・理解しやすさが他の候補より優れおおり、最終遞定の決め手ずなった。最近の「䌚議宀」型ずは䞀線を画す、胜動的なワヌクフロヌ支揎ツヌルである点も、倚様性の確保に貢献するず刀断した。",
    "publicProductionMemo": "この「Lab Safety Runbook」は、耇雑な実隓手順曞や安党デヌタシヌトから、朜圚的な危険箇所を特定し、ステップごずの安党な実行手順を提瀺するこずで、研究珟堎でのヒュヌマン゚ラヌを未然に防ぐこずを目指したした。AIによる分析はあくたで補助であり、最終的な安党確認は人間が行うずいう䜜り手の刀断を明確にするこずで、利甚者が安心しお䜿えるよう配慮しおいたす。安党に関わる曖昧な情報を構造化し、明確なアクションに倉換する、実甚性を重芖した䜓隓蚭蚈です。",
    "feedbackConstraints": [
      "The artifact now proves a full late-stage chain, but the public copy should keep the human-assisted provenance boundary explicit.",
      "AIによる情報抜出の誀りや重芁な情報の芋萜ずしが発生する可胜性を明確にナヌザヌに䌝えるこず。",
      "The tool must explicitly state that it provides personalized guidance and simulation, not official emergency instructions or a guarantee of safety."
    ],
    "learningApplied": [
      "Decision系で響いおいる。受けた指摘を芁件で先に朰す。",
      "The artifact now proves a full late-stage chain, but the public copy should keep the human-assisted provenance boundary explicit."
    ]
  },
  "sourceProvenance": {
    "sourceProductUsed": "devpost_fireflai",
    "sourceProductUse": "inspiration_only",
    "sourceEvidenceAudit": {
      "evidenceLevel": "A",
      "observedFields": [
        "name",
        "url",
        "sourceType",
        "sourceCategory",
        "attentionProof",
        "evidenceRefs"
      ],
      "inferredFields": [
        "coreMechanism",
        "transferableStructure",
        "antiCloneBoundary",
        "remixableThemes",
        "bestRemixTargets"
      ],
      "missingFields": [],
      "usePolicy": "inspiration_only"
    },
    "antiCloneBoundary": "消防士の緊急察応、戊術的クレヌム、䞍動産情報のスクレむピングはコピヌしない。散圚する蚌拠を実行可胜なブリヌフィングに倉換する構造のみを、よりリスクの䜎い研究宀の安党ずいうドメむンに転甚する。`fireflai`のUI/UX、特定のクレヌム圢匏、デヌタ゜ヌスに特化した芁玠は暡倣しない。",
    "sourceBoundary": "`devpost_fireflai` は着想源 (inspiration only) であり、消防士の緊急察応、戊術的クレヌム、䞍動産情報のスクレむピングずいった具䜓的な機胜やドメむンは䜿甚しない。散圚する蚌拠を実行可胜なブリヌフィングに倉換する構造のみを、研究宀の安党ずいうドメむンに転甚する。",
    "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_a_20260707T182425",
  "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": "画面が巊右に分割され、巊ペむンにサンプル手順曞のプレヌスホルダヌが衚瀺され、右ペむンにAIが生成したステップごずの安党手順チェックリストが衚瀺されおいる状態。リストには少なくずも䞀぀の危険譊告アむコンが衚瀺されおいる。",
    "visibleEvidence": [
      "実隓プロトコル_合成A_Ver1.2.pdf",
      "安党手順チェックリスト",
      "ステップ1",
      "危険譊告",
      "詊薬Xは匕火性",
      "保護手袋、保護メガネ着甚"
    ],
    "proofSelectors": [
      "button[data-proof='load-sample-procedure']",
      "div[data-proof='pdf-viewer']",
      "div[data-proof='safety-checklist']",
      "span[data-proof='hazard-icon']"
    ],
    "requiredSourceFiles": [
      "source/app/page.tsx",
      "source/core/pipeline.ts",
      "source/data/sample-trace.ts"
    ],
    "manualFallbackReason": ""
  },
  "mvpContractV2": {
    "artifactTier": "proposed_integration",
    "externalDependencyMode": "proposed",
    "runtimeBoundary": {
      "networkCalls": "none",
      "secrets": "none",
      "externalWrites": "none"
    },
    "claimBoundary": {
      "publicCopyMustSay": [
        "デモは静的なサンプルデヌタず提案されたAI凊理パむプラむンに基づいおいたす。",
        "AIによる分析結果はあくたで参考情報であり、最終的な安党確認は人間の専門家が行う必芁がありたす。",
        "このツヌルは公匏の緊急指瀺や安党を保蚌するものではありたせん。"
      ],
      "publicCopyMustNotSay": [
        "リアルタむムデヌタずの連携",
        "ラむブAPI統合の保蚌",
        "自動的な倖郚公開",
        "プロダクションレディなAPIの振る舞い",
        "AIが人間の専門的刀断を代替する",
        "完党な安党性の保蚌"
      ]
    },
    "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 { pipelineTrace } from '../data/sample-trace';

// NOTE: To keep the demo self-contained and offline, core logic types are redeclared here.
// This component MUST NOT import from `source/core`.
type SafetyRunbookStep = {
  stepId: string;
  stepNumber: number;
  description: string;
  hazards: string[];
  safetyMeasures: string[];
  requiredMaterials: string[];
};

type Runbook = {
  title: string;
  steps: SafetyRunbookStep[];
};


export default function Home() {
  const [runbook, setRunbook] = useState<Runbook | null>(null);
  const [isLoading, setIsLoading] = useState(false);

  const handleLoadSample = () => {
    setIsLoading(true);
    // Simulate network delay
    setTimeout(() => {
      setRunbook(pipelineTrace.finalOutput.runbook);
      setIsLoading(false);
    }, 500);
  };

  const pipelineSteps = [
    { name: '1. 文曞からテキストを抜出', id: 'extract' },
    { name: '2. AIによる手順ず危険情報の特定', id: 'identify' },
    { name: '3. 安党手順チェックリストの生成', id: 'generate' },
  ];

  return (
    <div style={{ fontFamily: 'sans-serif', maxWidth: '1200px', margin: '0 auto', padding: '20px' }}>
      <header style={{ borderBottom: '1px solid #eee', paddingBottom: '10px', marginBottom: '20px' }}>
        <h1>Lab Safety Runbook</h1>
        <p>実隓手順曞ず安党シヌト(MSDS)から、危険箇所をハむラむトした安党な実行手順をAIが生成したす。</p>
      </header>

      <div style={{ marginBottom: '20px' }}>
        <h2>凊理パむプラむン</h2>
        <ul style={{ display: 'flex', listStyle: 'none', padding: 0, gap: '10px' }}>
          {pipelineSteps.map((step, index) => (
            <li key={step.id} style={{ background: '#f0f0f0', padding: '10px', borderRadius: '5px' }}>
              {step.name}
            </li>
          ))}
        </ul>
      </div>

      <div style={{ marginBottom: '20px' }}>
        <button 
          onClick={handleLoadSample} 
          disabled={isLoading || !!runbook}
          data-proof="load-sample-procedure"
          style={{ padding: '10px 20px', fontSize: '16px', cursor: 'pointer' }}
        >
          {isLoading ? '読み蟌み䞭...' : (runbook ? '読み蟌み完了' : 'サンプル手順曞を読み蟌む')}
        </button>
      </div>

      <main style={{ display: 'flex', gap: '20px', minHeight: '500px' }}>
        <div style={{ flex: 1, border: '1px solid #ccc', padding: '10px', background: '#fafafa' }} data-proof="pdf-viewer">
          <h3>元の手順曞</h3>
          {runbook ? (
            <div>
              <h4>{pipelineTrace.sampleInput.documents[0].fileName}</h4>
              <p>ここにPDFの内容が衚瀺されたす</p>
              <pre style={{ whiteSpace: 'pre-wrap', fontSize: '12px', color: '#555' }}>
                {pipelineTrace.intermediateOutputs.find(o => o.stepId === 'extractTextFromDocuments')?.output.extractedContent.substring(0, 500)}...
              </pre>
            </div>
          ) : (
            <p>サンプルを読み蟌むず、ここに元の手順曞が衚瀺されたす。</p>
          )}
        </div>

        <div style={{ flex: 1, border: '1px solid #ccc', padding: '10px' }} data-proof="safety-checklist">
          <h3>安党手順チェックリスト</h3>
          {runbook ? (
            <div>
               <h4>{runbook.title}</h4>
               {runbook.steps.map(step => (
                 <div key={step.stepId} style={{ border: '1px solid #ddd', borderRadius: '5px', padding: '15px', marginBottom: '15px', background: 'white' }}>
                    <p><strong>ステップ{step.stepNumber}: {step.description}</strong></p>
                    {step.hazards.length > 0 && (
                      <div style={{ background: '#fff0f0', border: '1px solid #ffcccc', borderRadius: '4px', padding: '10px', marginTop: '10px' }}>
                        <p><span data-proof="hazard-icon">⚠ <strong>危険譊告</strong></span></p>
                        <ul>
                          {step.hazards.map((hazard, i) => <li key={i}>{hazard}</li>)}
                        </ul>
                      </div>
                    )}
                     <div style={{ marginTop: '10px' }}>
                        <strong>安党察策:</strong>
                        <ul>
                          {step.safetyMeasures.map((measure, i) => <li key={i}>{measure}</li>)}
                        </ul>
                    </div>
                 </div>
               ))}
            </div>
          ) : (
            <p>サンプルを読み蟌むず、ここにAIが生成した安党手順が衚瀺されたす。</p>
          )}
        </div>
      </main>

      <footer style={{ marginTop: '20px', paddingTop: '10px', borderTop: '1px solid #eee', fontSize: '12px', color: '#777' }}>
        <p><strong>免責事項:</strong> このツヌルは静的なサンプルデヌタに基づくデモです。AIによる分析結果はあくたで参考情報であり、最終的な安党確認は人間の専門家が行う必芁がありたす。このツヌルは公匏の緊急指瀺や安党を保蚌するものではありたせん。</p>
      </footer>
    </div>
  );
}