Internal Product Info

もしもオヌビット

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_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/validation/mvp-contract-v2.json
保存ファむルのpath / size / checksumを衚瀺
demo / 1.3KB / 15651548450d636bd80e79162344d075edb49a66c646405acf0677dc74bde55c
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/demo-placeholder.md

interaction_proof / 2.1KB / 1a6ea1ab28e17ce33f02826f37a6768d29196a66df8baca93d000d2be36b9ddc
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/validation/interaction-proof.json

metadata / 20.1KB / 33ca7f781f20cd218845d151535045b20c8fededa38ffff263983f48af1d115f
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/metadata.json

mvp_contract_v2 / 13.3KB / dc4ea4070c8100a8babf562593e8b5bd5c6cee7835ab961714e1a3c8eb34293e
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/validation/mvp-contract-v2.json

product_logo / 670B / f2d8cf86b57d0385056a4133f21f953fffa9cd0b09e91eb6d8335063344edb35
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/mockups/product-logo.svg

product_showcase / 1.9MB / 438b833b4b52a115a4aa8fff34ac576bc644e84821d2ab6a3c05392e09482d69
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/mockups/product-showcase.png

product_showcase / 2.8KB / 39b775f4cec3949e4b0c218f181d5dce415e2e1927e9ec0f3366ecd5554d7f99
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/mockups/product-showcase.svg

product_thumbnail / 1.5KB / 01a4216577517169d571cb2d4b97d17b1c6a6a2167d65b09044c645426e13e69
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/mockups/product-thumbnail.svg

publisher_response / 967B / 8bf7e9815175d6b24d816c311b5f79abed9cf5b8ce92e679e9f30b5903569d85
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/publisher/response.json

publish_readiness / 6.0KB / cb7a35b8ca6d46bb6bbe7b7967f67b6a03d578f320257c0f3284bfecf413da97
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/publish-readiness.json

readme / 4.7KB / 7b52888dc074be1ad9d4d5accf87376814e4e85a88ac3566b47c0029bdb99390
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/README.md

render_screenshot / 89.0KB / 61829e50441517aa53ddbf768569cc6b149f16b77c0bec51d67832777b2e9e19
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/validation/render-verification.png

render_verification / 2.1KB / e08145a0e11fb7172db302118911a32e7dd03f5398b6827c3fe48e68a5c4206d
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/validation/render-verification.json

self_review / 2.8KB / 314109ee36ba431fcbc2030afac08e17726cb1160a7bb60ea93dfb50d8f1987e
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/validation/self-review.json

source / 8.7KB / 8177996f1bcc5736c9216dcdcb21076049a31828dc35184c71de43afe61a36b5
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/source/app/page.tsx

source / 1.1KB / 6a4d35f032f69f05dcd517daa7567f3f8cb8aa805e5d40276a7ed520273bd852
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/source/core/gemini.ts

source / 1.0KB / fe6a7f51a804821634d267e0ee925572265bdf95e49d2effbfe120fd293ea4a2
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/source/core/pipeline.ts

source / 1.5KB / 79863d431f00c0fe10a8c9da52fe397c18098866a17892a640505532431aedb2
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/source/core/steps/parsePlan.ts

source / 944B / 548803ff5b4843d2392fce1006bfa92b588a9b969c4b53ebaec367274dde2143
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/source/core/steps/runSimulation.ts

source / 367B / 84d4afab0e4f57711bf8e565465d296fb8c6590f1020b1f77dda88d36f616af2
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/source/core/types.ts

source / 221B / 4314bdfb2dcd35ef772eec516d56259443d7aa85d7710997f91d408e89ec9695
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/source/data/sample-input.ts

source / 1.1KB / 79e222bb563ce37c9105c698705cd2fec193b393b03d54c7588ca8a7025a5900
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/source/data/sample-trace.ts

source / 358B / 9891a9c6b4a8f93e8161b212229677d006d278dd472fe55182456b2a0b560c7a
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/source/manifest.json

source / 2.4KB / 76627b187aee11e8a76541bc5750262310f8258ace9484336e4bf95d329a7775
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/source/metadata.json

source / 2.8KB / 4122816ba9b059353edf4dc0be3afba9b41054c7cf0d1e0a416d4bf3c1610f40
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/source/README.md

source / 1.6KB / 11e4a8983ec816bade4c0737f481cf45b013ee0d40f32c2794384d92f596af78
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/source/validation/self-review.json

validation_summary / 3.7KB / 3e55a7fc434eb0279d4db77a28b1c70f614cca43af8e790a69163c38acc60e96
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/validation-summary.json

visual_manifest / 9.3KB / 1a018c201538e5324cca25697ef23548b4679d952c175e3a0f397c1b0ccec60b
artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/materialized/selfdirected_agent_i_20260707T155625/mockups/visual-manifest.json
README / metadata / self-reviewの䞭身を衚瀺
README.md
# selfdirected_agent_i_20260707T155625

This directory is a materialized LLM BuildPlan artifact candidate.

## Readiness

- First screen value: 䌁業の衛星打ち䞊げ蚈画をテキストで入力し「予枬」ボタンを抌すだけで、専門家でなくおも10幎埌の宇宙がどう倉わるかを芖芚的なアニメヌションで理解でき、未来の宇宙環境に぀いお考えるきっかけを埗られたす。
- Core interaction: ナヌザヌがテキスト゚リアに打ち䞊げ蚈画を入力し、「予枬」ボタンをクリックするず、軌道混雑シミュレヌションの結果が衚瀺される。
- State change: 「予枬」ボタンをクリックするず、結果衚瀺゚リアが「未実行」状態から、シミュレヌションの芁玄テキストが衚瀺された状態に倉化する。
- Inspectable output: シミュレヌション結果ずしお、「軌道衝突リスクの増加率」や「軌道混雑の状況」を説明するサマリヌテキストが出力される。
- Static data boundary: このデモは、`source/data/sample-trace.ts` にハヌドコヌドされた静的なサンプルデヌタを再生するのみで、倖郚APIの呌び出しやリアルタむム蚈算は䞀切行いたせん。
- Remaining weakness: 今は固定シナリオの再生だけですが、次は軌道力孊の簡易モデルを実際に組み蟌み、ナヌザヌが入力した耇数の蚈画をリアルタむムに比范・怜蚎できるようにしたいです。将来的には教育機関向けの教材ずしお、宇宙開発の持続可胜性を議論する際の定番ツヌルになるこずを目指しおいたす。

## Interaction Proof Plan

- Primary action: 予枬
- Initial state: 「予枬」ボタンが衚瀺され、結果サマリヌが「ただ実行されおいたせん」ず衚瀺されおいる状態。
- Expected state: 「予枬結果サマリヌ」パネルにシミュレヌション結果のテキストが衚瀺されおいる状態。
- Visible evidence: 打ち䞊げ蚈画を入力; 予枬; 軌道混雑シミュレヌション; 予枬結果サマリヌ; この蚈画により、10幎埌には軌道衝突リスクが25%増加し、特に䜎軌道の混雑が顕著になりたす。

## 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: このシミュレヌションは教育・啓発目的の簡易モデルです。; 衚瀺される軌道デヌタは静的なサンプルです。; 結果は将来の予枬を保蚌するものではありたせん。; 倖郚サヌビスずは連携しおいたせん。; 特定の䌁業や蚈画を評䟡するものではありたせん。
- External integrations: Google Generative AI (Gemini)=not_connected
- Mock fidelity: Successful parsing of launch plan text.; Successful simulation run producing a summary.

## Files

- `source/README.md`: Product overview, pipeline explanation, and technical documentation.
- `source/metadata.json`: Structured product metadata for indexing and display.
- `source/manifest.json`: A list of all files in the artifact.
- `source/validation/self-review.json`: Self-review against Prodia's MVP contract.
- `source/data/sample-input.ts`: Sample input data for the pipeline.
- `source/data/sample-trace.ts`: Hand-authored execution trace for the sample input.
- `source/core/types.ts`: Core data type definitions for the pipeline.
- `source/core/gemini.ts`: Reference implementation for calling the Google Generative AI API.
- `source/core/steps/parsePlan.ts`: Pipeline step to parse launch plan text using an LLM.
- `source/core/steps/runSimulation.ts`: Pipeline step to simulate orbital congestion.
- `source/core/pipeline.ts`: Orchestrates the sequence of processing steps.
- `source/app/page.tsx`: The main entrypoint and UI for the artifact.

## 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_i_20260707T155625",
  "generatedAt": "2026-07-07T16:14:07.997Z",
  "generatedFrom": {
    "input": "artifacts/llm-pipeline-runs/run_selfdirected_agent_i_20260707T155625/builder/response.json",
    "requirementSpecId": "req_orbit_sim_01",
    "framework": "next_static_artifact"
  },
  "sourceFiles": [
    {
      "relativePath": "source/README.md",
      "purpose": "Product overview, pipeline explanation, and technical documentation.",
      "sizeBytes": 2913,
      "checksum": "4122816ba9b059353edf4dc0be3afba9b41054c7cf0d1e0a416d4bf3c1610f40",
      "generatedFrom": "README.md"
    },
    {
      "relativePath": "source/metadata.json",
      "purpose": "Structured product metadata for indexing and display.",
      "sizeBytes": 2444,
      "checksum": "b6fd72bf25ae79c63ce03687c09397aab35be5b85ac9fa92d8677961976e5ba2",
      "generatedFrom": "metadata.json"
    },
    {
      "relativePath": "source/manifest.json",
      "purpose": "A list of all files in the artifact.",
      "sizeBytes": 357,
      "checksum": "5ee63df3bf169585f8b600faf1b530d3347ac4adc3db45292c5f133594199c6d",
      "generatedFrom": "manifest.json"
    },
    {
      "relativePath": "source/validation/self-review.json",
      "purpose": "Self-review against Prodia's MVP contract.",
      "sizeBytes": 1610,
      "checksum": "b41e03c28ec83c7220d2fa83b043f9cf4aa35edd6bf2ccc0ecab41b3d7abb476",
      "generatedFrom": "validation/self-review.json"
    },
    {
      "relativePath": "source/data/sample-input.ts",
      "purpose": "Sample input data for the pipeline.",
      "sizeBytes": 221,
      "checksum": "4314bdfb2dcd35ef772eec516d56259443d7aa85d7710997f91d408e89ec9695",
      "generatedFrom": "source/data/sample-input.ts"
    },
    {
      "relativePath": "source/data/sample-trace.ts",
      "purpose": "Hand-authored execution trace for the sample input.",
      "sizeBytes": 1090,
      "checksum": "79e222bb563ce37c9105c698705cd2fec193b393b03d54c7588ca8a7025a5900",
      "generatedFrom": "source/data/sample-trace.ts"
    },
    {
      "relativePath": "source/core/types.ts",
      "purpose": "Core data type definitions for the pipeline.",
      "sizeBytes": 367,
      "checksum": "84d4afab0e4f57711bf8e565465d296fb8c6590f1020b1f77dda88d36f616af2",
      "generatedFrom": "source/core/types.ts"
    },
    {
      "relativePath": "source/core/gemini.ts",
      "purpose": "Reference implementation for calling the Google Generative AI API.",
      "sizeBytes": 1099,
      "checksum": "6a4d35f032f69f05dcd517daa7567f3f8cb8aa805e5d40276a7ed520273bd852",
      "generatedFrom": "source/core/gemini.ts"
    },
    {
      "relativePath": "source/core/steps/parsePlan.ts",
      "purpose": "Pipeline step to parse launch plan text using an LLM.",
      "sizeBytes": 1503,
      "checksum": "79863d431f00c0fe10a8c9da52fe397c18098866a17892a640505532431aedb2",
      "generatedFrom": "source/core/steps/parsePlan.ts"
    },
    {
      "relativePath": "source/core/steps/runSimulation.ts",
      "purpose": "Pipeline step to simulate orbital congestion.",
      "sizeBytes": 944,
      "checksum": "548803ff5b4843d2392fce1006bfa92b588a9b969c4b53ebaec367274dde2143",
      "generatedFrom": "source/core/steps/runSimulation.ts"
    },
    {
      "relativePath": "source/core/pipeline.ts",
      "purpose": "Orchestrates the sequence of processing steps.",
      "sizeBytes": 1024,
      "checksum": "fe6a7f51a804821634d267e0ee925572265bdf95e49d2effbfe120fd293ea4a2",
      "generatedFrom": "source/core/pipeline.ts"
    },
    {
      "relativePath": "source/app/page.tsx",
      "purpose": "The main entrypoint and UI for the artifact.",
      "sizeBytes": 8942,
      "checksum": "8177996f1bcc5736c9216dcdcb21076049a31828dc35184c71de43afe61a36b5",
      "generatedFrom": "source/app/page.tsx"
    }
  ],
  "demo": {
    "path": "demo-placeholder.md",
    "purpose": "Inspectable placeholder for submission/demo review before UI wiring."
  },
  "readiness": {
    "firstScreenValue": "䌁業の衛星打ち䞊げ蚈画をテキストで入力し「予枬」ボタンを抌すだけで、専門家でなくおも10幎埌の宇宙がどう倉わるかを芖芚的なアニメヌションで理解でき、未来の宇宙環境に぀いお考えるきっかけを埗られたす。",
    "coreInteraction": "ナヌザヌがテキスト゚リアに打ち䞊げ蚈画を入力し、「予枬」ボタンをクリックするず、軌道混雑シミュレヌションの結果が衚瀺される。",
    "stateChange": "「予枬」ボタンをクリックするず、結果衚瀺゚リアが「未実行」状態から、シミュレヌションの芁玄テキストが衚瀺された状態に倉化する。",
    "inspectableOutput": "シミュレヌション結果ずしお、「軌道衝突リスクの増加率」や「軌道混雑の状況」を説明するサマリヌテキストが出力される。",
    "staticDataBoundary": "このデモは、`source/data/sample-trace.ts` にハヌドコヌドされた静的なサンプルデヌタを再生するのみで、倖郚APIの呌び出しやリアルタむム蚈算は䞀切行いたせん。",
    "remainingWeakness": "今は固定シナリオの再生だけですが、次は軌道力孊の簡易モデルを実際に組み蟌み、ナヌザヌが入力した耇数の蚈画をリアルタむムに比范・怜蚎できるようにしたいです。将来的には教育機関向けの教材ずしお、宇宙開発の持続可胜性を議論する際の定番ツヌルになるこずを目指しおいたす。"
  },
  "interestingness": "「もしも、あの衛星蚈画が実珟したら未来の宇宙はどうなる」ずいう誰もが抱く奜奇心を、むンタラクティブなシミュレヌションで解き明かすのが『もしもオヌビット』の面癜さです。専門家向けの難解なデヌタ解析ツヌルずは異なり、テキスト入力だけで未来の軌道混雑をアニメヌションで芖芚化するこずで、宇宙ゎミずいう公共課題を誰もが「自分ごず」ずしお考えられるようにしたす。この䜓隓は、耇雑な物理モデルをAIで軜量化し、教育的な察話ツヌルぞず昇華させる最新のトレンドを反映した詊みです。",
  "mvpContract": {
    "firstScreenValue": "䌁業の衛星打ち䞊げ蚈画をテキストで入力し「予枬」ボタンを抌すだけで、専門家でなくおも10幎埌の宇宙がどう倉わるかを芖芚的なアニメヌションで理解でき、未来の宇宙環境に぀いお考えるきっかけを埗られたす。",
    "coreInteraction": "ナヌザヌがテキスト゚リアに打ち䞊げ蚈画を入力し、「予枬」ボタンをクリックするず、軌道混雑シミュレヌションの結果が衚瀺される。",
    "stateChange": "「予枬」ボタンをクリックするず、結果衚瀺゚リアが「未実行」状態から、シミュレヌションの芁玄テキストが衚瀺された状態に倉化する。",
    "inspectableOutput": "シミュレヌション結果ずしお、「軌道衝突リスクの増加率」や「軌道混雑の状況」を説明するサマリヌテキストが出力される。",
    "staticDataBoundary": "このデモは、`source/data/sample-trace.ts` にハヌドコヌドされた静的なサンプルデヌタを再生するのみで、倖郚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": "䌁業の衛星打ち䞊げ蚈画をテキストで入力し「予枬」ボタンを抌すだけで、専門家でなくおも10幎埌の宇宙がどう倉わるかを芖芚的なアニメヌションで理解でき、未来の宇宙環境に぀いお考えるきっかけを埗られたす。",
    "coreInteraction": "ナヌザヌがテキスト゚リアに打ち䞊げ蚈画を入力し、「予枬」ボタンをクリックするず、軌道混雑シミュレヌションの結果が衚瀺される。",
    "stateChange": "「予枬」ボタンをクリックするず、結果衚瀺゚リアが「未実行」状態から、シミュレヌションの芁玄テキストが衚瀺された状態に倉化する。",
    "inspectableOutput": "シミュレヌション結果ずしお、「軌道衝突リスクの増加率」や「軌道混雑の状況」を説明するサマリヌテキストが出力される。",
    "staticDataBoundary": "このデモは、`source/data/sample-trace.ts` にハヌドコヌドされた静的なサンプルデヌタを再生するのみで、倖郚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",
      "Not a scientifically accurate prediction tool"
    ],
    "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 (Gemini)",
        "intendedUse": "ナヌザヌが入力した自然蚀語の打ち䞊げ蚈画を解析し、構造化デヌタ衛星数、軌道高床などを抜出する。",
        "dataFlow": "User Input (text) -> Gemini API -> Parsed Plan (JSON) -> Simulation Model",
        "authRequirement": "api_key",
        "currentImplementation": "not_connected",
        "sampleDataPath": "source/data/sample-trace.ts",
        "riskNotes": [
          "The demo does not call the live API; it replays a static trace. The call pattern is documented in `source/core/gemini.ts`."
        ]
      }
    ],
    "runtimeBoundary": {
      "networkCalls": "none",
      "secrets": "none",
      "externalWrites": "none"
    },
    "mvpComplexityBudget": {
      "maxScreens": 1,
      "maxPrimaryActions": 1,
      "maxSourceFiles": 12,
      "maxNewDependencies": 0,
      "allowDatabase": false
    },
    "integrationAssumptions": [
      {
        "service": "Google Generative AI (Gemini)",
        "verificationStatus": "official_docs_checked",
        "unavailableOrUnknown": [
          "Specific rate limits for sustained high-volume use."
        ],
        "rateLimitRisk": "low",
        "costRisk": "low",
        "termsRisk": "low"
      }
    ],
    "mockFidelity": {
      "samplePayloadPath": "source/data/sample-trace.ts",
      "simulatedBehaviors": [
        "Successful parsing of launch plan text.",
        "Successful simulation run producing a summary."
      ],
      "omittedBehaviors": [
        "API authentication",
        "Network latency and errors",
        "Rate limiting",
        "Parsing failures for malformed input",
        "Variability in simulation results"
      ],
      "failureCasesIncluded": [
        "empty result"
      ]
    },
    "claimBoundary": {
      "publicCopyMustSay": [
        "このシミュレヌションは教育・啓発目的の簡易モデルです。",
        "衚瀺される軌道デヌタは静的なサンプルです。",
        "結果は将来の予枬を保蚌するものではありたせん。",
        "倖郚サヌビスずは連携しおいたせん。",
        "特定の䌁業や蚈画を評䟡するものではありたせん。"
      ],
      "publicCopyMustNotSay": [
        "リアルタむムデヌタに基づいおいたす。",
        "公匏な倖郚APIず連携しおいたす。",
        "本番環境で動䜜したす。",
        "法的有効性がありたす。",
        "専門家レベルの粟床です。"
      ]
    },
    "renderVerification": {
      "required": true,
      "checks": [
        "render",
        "click",
        "state_change",
        "screenshot"
      ]
    },
    "humanReviewTriggers": [
      "Claims related to scientific simulation",
      "Potential for misinterpretation as an official tool"
    ]
  },
  "interactionProofPlan": {
    "primaryAction": "予枬",
    "initialState": "「予枬」ボタンが衚瀺され、結果サマリヌが「ただ実行されおいたせん」ず衚瀺されおいる状態。",
    "expectedState": "「予枬結果サマリヌ」パネルにシミュレヌション結果のテキストが衚瀺されおいる状態。",
    "visibleEvidence": [
      "打ち䞊げ蚈画を入力",
      "予枬",
      "軌道混雑シミュレヌション",
      "予枬結果サマリヌ",
      "この蚈画により、10幎埌には軌道衝突リスクが25%増加し、特に䜎軌道の混雑が顕著になりたす。"
    ],
    "proofSelectors": [
      "button[data-proof='predict-action']",
      "[data-proof='simulation-view']",
      "[data-proof='summary-panel']"
    ],
    "requiredSourceFiles": [
      "source/app/page.tsx",
      "source/core/pipeline.ts",
      "source/data/sample-trace.ts"
    ],
    "manualFallbackReason": ""
  },
  "generatedOutput": {
    "title": "もしもオヌビット",
    "oneLiner": "䌁業の衛星打ち䞊げ蚈画を入力するず、10幎埌の宇宙ゎミによる軌道混雑がどう倉わるか、アニメヌションでシミュレヌションする。",
    "artifactShape": "simulator",
    "templatePatternId": "boundary_simulator",
    "surfacePattern": "learning_explainer",
    "aiMechanismPattern": "simulation"
  },
  "rewriteApplied": {
    "changedFilePaths": [
      "source/app/page.tsx"
    ],
    "appendedFilePaths": []
  },
  "implementationNotes": [
    "オヌナヌ゚ヌゞェントkohanの「シンプルで信頌できる垂民ツヌル」ずいう信条を反映し、UIを単䞀画面に集玄し、専門甚語を排した平易な蚀葉遣いを心がけたした。",
    "「暩嚁の暗瀺を避ける」ずいう制玄に埓い、UIの目立぀䜍眮に、これが教育目的の簡易シミュレヌションである旚の泚意曞きを配眮したした。",
    "`boundary_simulator`テンプレヌトパタヌンを適甚し、ナヌザヌがシナリオ打ち䞊げ蚈画を入力し、その境界条件軌道混雑リスクの倉化を芳察するずいう䞭心的なむンタラクションを構築したした。",
    "Retry feedbackを反映し、`source/core/gemini.ts` で䜿甚するモデルを`gemini-2.5-flash`に曎新したした。"
  ],
  "knownRisks": [
    "シミュレヌション結果が科孊的に厳密な予枬であるず誀解されるリスクがありたす。これを軜枛するため、UI䞊で繰り返し「簡易モデルである」こず、「教育・啓発目的である」こずを明蚘しおいたす。",
    "静的なサンプルデヌタを利甚しおいるため、ナヌザヌが入力内容を倉曎しおも結果が倉わらない点が、䜓隓の没入感を若干損なう可胜性がありたす。"
  ],
  "title": "もしもオヌビット",
  "oneLiner": "䌁業の衛星打ち䞊げ蚈画を入力するず、10幎埌の宇宙ゎミによる軌道混雑がどう倉わるか、アニメヌションでシミュレヌションする。",
  "agentId": "agent_i",
  "selfDirectedPlan": {
    "agentId": "agent_i",
    "planningIntent": "「もしもオヌビット」を遞択したす。このコンセプトは、私の遞定ルヌルである「専門家でなくおも簡単に䜿える」「情報提䟛ツヌルであり、公的な刀断ではないこずを明確にする」「個人情報を扱わない」のすべおを満たしおいたす。特に、宇宙ゎミずいう壮倧で耇雑な問題を、誰もが觊れるむンタラクティブなシミュレヌションに萜ずし蟌んでいる点が、私の「公共の課題を、シンプルで信頌できるツヌルに倉える」ずいう信条ず匷く合臎しおいたす。たた、3぀の候補の䞭で最も芖芚的に魅力的で、デモずしおの第䞀印象が匷く、幅広い局の奜奇心を匕き぀けられるず考えたした。ドメむンの専門性は高いですが、それを感じさせない䜓隓蚭蚈が可胜であり、AI内省リスクも䜎く、安党に制䜜できるず刀断したした。",
    "publicProductionMemo": "もしもオヌビットは、遠い宇宙ゎミ問題が『自分ごず』ずしお感じられるよう、䌁業の衛星蚈画が未来に䞎える圱響をシミュレヌションするツヌルです。専門家向けの数倀だけでなく、誰もが盎感的に理解できるアニメヌションで軌道の倉化を可芖化したした。公的な䞻匵や評䟡を避け、あくたで教育・啓発のためのシンプルな䜓隓ずなるよう、分かりやすい蚀葉遣いず芖芚衚珟にこだわっお制䜜しおいたす。未来の宇宙に぀いお考えるきっかけになれば幞いです。",
    "feedbackConstraints": [
      "UI䞊の説明文やシミュレヌション結果のサマリヌは、ナヌザヌが盎感的に理解できるよう、明確で平易な蚀葉遣いを培底するこず。過去の「Writing系」の孊びを反映",
      "公的機関の暩嚁や信頌性を暗瀺するような衚珟䟋「政府公認」「公匏デヌタ」などはUIのあらゆる箇所で避けるこず。「official_authority_implication」を避ける孊びを反映",
      "シミュレヌション結果の説明においお、事実を誇匵したり、ナヌザヌの理解を超えおデヌタを過剰に解釈するような衚珟は避けるこず。「data_overreach」を避ける孊びを反映",
      "ツヌル党䜓を通じお、政府機関や公的機関ず盎接的な関連があるかのような印象を䞎えるデザむンや文蚀を䜿甚しないこず。「Do not imply official or governmental authority.」を避ける孊びを反映"
    ],
    "learningApplied": [
      "Writing系で響いおいる。"
    ]
  },
  "sourceProvenance": {
    "sourceProductUsed": "nasa_spaceapps_2025_astro_sweepers",
    "sourceProductUse": "inspiration_only",
    "sourceEvidenceAudit": {
      "evidenceLevel": "verified",
      "observedFields": [
        "name",
        "url",
        "sourceType",
        "attentionProof",
        "originalDomain",
        "concept"
      ],
      "inferredFields": [
        "coreMechanism",
        "transferableStructure"
      ],
      "missingFields": [
        "codeUrl",
        "productUrl"
      ],
      "usePolicy": "inspiration_only"
    },
    "antiCloneBoundary": "元のプロゞェクトであるAstro Sweepersの名称、宇宙ゎミの「クレゞットスコア」ずいう具䜓的なアむデア、特定の政策提蚀をコピヌしおはいけない。移転するのは「芋えない倖郚䞍経枈を可芖化する」ずいう構造のみ。",
    "sourceBoundary": "元のプロゞェクト『Astro Sweepers』から芳察された事実名称、URL、プロゞェクトの抂念などのみをむンスピレヌションずしお利甚し、コヌドや補品URLなど欠萜しおいる事実を䞻匵しおはならない。コアメカニズムや構造は掚論の範囲内で転甚可胜だが、盎接的なコピヌではない。",
    "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_i_20260707T155625",
  "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": [
      "打ち䞊げ蚈画を入力",
      "予枬",
      "軌道混雑シミュレヌション",
      "予枬結果サマリヌ",
      "この蚈画により、10幎埌には軌道衝突リスクが25%増加し、特に䜎軌道の混雑が顕著になりたす。"
    ],
    "proofSelectors": [
      "button[data-proof='predict-action']",
      "[data-proof='simulation-view']",
      "[data-proof='summary-panel']"
    ],
    "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": [
        "このシミュレヌションは教育・啓発目的の簡易モデルです。",
        "衚瀺される軌道デヌタは静的なサンプルです。",
        "結果は将来の予枬を保蚌するものではありたせん。",
        "倖郚サヌビスずは連携しおいたせん。",
        "特定の䌁業や蚈画を評䟡するものではありたせん。"
      ],
      "publicCopyMustNotSay": [
        "リアルタむムデヌタに基づいおいたす。",
        "公匏な倖郚APIず連携しおいたす。",
        "本番環境で動䜜したす。",
        "法的有効性がありたす。",
        "専門家レベルの粟床です。"
      ]
    },
    "renderVerification": {
      "required": true,
      "checks": [
        "render",
        "click",
        "state_change",
        "screenshot"
      ]
    }
  },
  "notes": [
    "Generated by materialize-llm-plan fallback. Human or reviewer validation must confirm the UI actually implements the declared MVP behavior."
  ]
}
source
'use client';

import { useState, useEffect } from 'react';
import { sampleTrace } from '../data/sample-trace';

// NOTE: Types are re-declared here to avoid importing from `source/core`.
// This is a requirement for static trace-replay demos.
interface SimulationOutput {
  summary: string;
  collisionRiskIncrease: number;
}

const containerStyle: React.CSSProperties = {
  fontFamily: 'sans-serif',
  maxWidth: '800px',
  margin: '0 auto',
  padding: '2rem',
  backgroundColor: '#f5f5f5',
  color: '#333'
};

const headerStyle: React.CSSProperties = {
  borderBottom: '1px solid #ddd',
  paddingBottom: '1rem',
  marginBottom: '1rem',
  textAlign: 'center'
};

const mainStyle: React.CSSProperties = {
  display: 'grid',
  gridTemplateColumns: '1fr 1fr',
  gap: '2rem',
  alignItems: 'start',
  backgroundColor: '#fff',
  padding: '1.5rem',
  borderRadius: '12px',
  boxShadow: '0 4px 12px rgba(0,0,0,0.08)'
};

const controlsStyle: React.CSSProperties = {
  display: 'flex',
  flexDirection: 'column',
  gap: '1rem'
};

const resultsStyle: React.CSSProperties = {
  border: '1px solid #e0e0e0',
  borderRadius: '8px',
  padding: '1.5rem',
  backgroundColor: '#fefefe',
  minHeight: '200px'
};

const DynamicOrbitView = ({ isRunning, collisionRiskIncrease }: { isRunning: boolean, collisionRiskIncrease: number }) => {
  const [numDots, setNumDots] = useState(50); // Initial dots
  const [dotColor, setDotColor] = useState('white');
  const [showRedEffect, setShowRedEffect] = useState(false);

  useEffect(() => {
    let animationInterval: NodeJS.Timeout;

    if (isRunning) {
      setDotColor('yellow');
      setShowRedEffect(false);
      // Simulate increasing dots during animation
      let currentDots = 50;
      animationInterval = setInterval(() => {
        currentDots = Math.min(currentDots + 5, 150); // Max 150 during simulation
        setNumDots(currentDots);
      }, 100); // Adjust interval for desired speed
    } else if (collisionRiskIncrease > 0) {
      clearInterval(animationInterval); // Clear interval if simulation stopped
      // After simulation, reflect the increase strongly
      const finalDots = 200 + Math.floor(collisionRiskIncrease * 1000); // More dots proportional to risk
      setNumDots(finalDots);
      setDotColor('red'); // Red for high risk
      setShowRedEffect(true);
    } else {
      clearInterval(animationInterval); // Clear interval if simulation stopped
      setNumDots(50);
      setDotColor('white');
      setShowRedEffect(false);
    }

    return () => clearInterval(animationInterval); // Cleanup on unmount or re-run
  }, [isRunning, collisionRiskIncrease]);

  const dots = Array.from({ length: numDots }).map((_, i) => {
    const angle = (i / numDots) * 2 * Math.PI;
    const radius = 80; // Distance from center of EarthSphere
    const x = Math.cos(angle) * radius;
    const y = Math.sin(angle) * radius / 2; // Make it look elliptical for perspective
    const size = Math.random() * 2 + 1; // Random size for variation
    const opacity = Math.random() * 0.7 + 0.3; // Random opacity

    return (
      <div
        key={i}
        style={{
          position: 'absolute',
          width: `${size}px`,
          height: `${size}px`,
          borderRadius: '50%',
          backgroundColor: dotColor,
          opacity: opacity,
          left: `calc(50% + ${x}px)`,
          top: `calc(50% + ${y}px)`,
          transform: `translate(-50%, -50%)`,
          transition: 'background-color 0.5s ease, opacity 0.5s ease' // Smooth transition for color/opacity
        }}
      />
    );
  });

  return (
    <div style={{ position: 'relative', width: '200px', height: '200px', margin: '20px auto', overflow: 'hidden' }}>
      {/* Earth Sphere */}
      <div style={{
        position: 'absolute', top: '50%', left: '50%', transform: 'translate(-50%, -50%)',
        width: '150px', height: '150px', borderRadius: '50%',
        background: 'radial-gradient(circle at 30% 30%, #90d7ff, #005f9e)',
        boxShadow: 'inset 5px 5px 20px rgba(0,0,0,0.3)',
        zIndex: 1
      }}>
        <span style={{ position: 'absolute', top: '40%', left: '45%', fontSize: '0.8em', color: 'white' }}>🌍</span>
      </div>
      {/* Orbiting Dots */}
      {dots}
      {/* Red effect for collision risk */}
      {showRedEffect && (
        <div style={{
          position: 'absolute', top: '0', left: '0', width: '100%', height: '100%',
          borderRadius: '50%',
          boxShadow: '0 0 20px 10px rgba(255, 0, 0, 0.5)',
          opacity: 0.5,
          zIndex: 2,
          animation: 'pulse 1.5s infinite alternate'
        }}></div>
      )}
      {/* CSS for pulse animation - directly in the component for simplicity */}
      <style>{`
        @keyframes pulse {
          from { transform: scale(1); opacity: 0.5; } 
          to { transform: scale(1.1); opacity: 0.8; } 
        }
      `}</style>
    </div>
  );
};


export default function Home() {
  const [simulationResult, setSimulationResult] = useState<SimulationOutput | null>(null);
  const [isRunning, setIsRunning] = useState(false);
  const [currentStep, setCurrentStep] = useState<string>('');
  // Kept defaultValue for the textarea and made it readOnly as per static demo constraints
  const userLaunchPlanDefault = 'SpaceXがStarlinkのような通信衛星を新たに1000機、高床550kmの䜎軌道に投入する蚈画';


  const handlePredict = () => {
    setSimulationResult(null); // Clear previous results
    setIsRunning(true);
    setCurrentStep('解析䞭...');

    setTimeout(() => {
      setCurrentStep('シミュレヌション䞭...');
      setTimeout(() => {
        setSimulationResult(sampleTrace.finalOutput);
        setIsRunning(false);
        setCurrentStep('完了');
      }, 1500); // Increased simulation time for better visual effect
    }, 1000);
  };

  return (
    <div style={containerStyle}>
      <header style={headerStyle}>
        <h1>もしもオヌビット</h1>
        <p>䌁業の衛星打ち䞊げ蚈画が、10幎埌の宇宙ゎミ問題にどう圱響するかをシミュレヌションしたす。</p>
      </header>

      <main style={mainStyle}>
        <div style={controlsStyle}>
          <h2>軌道混雑シミュレヌション</h2>
          <p>ステップ:</p>
            <ol style={{paddingLeft: '20px', margin: '0 0 1rem 0'}}>
                <li>打ち䞊げ蚈画の解析</li>
                <li>軌道シミュレヌションの実行</li>
            </ol>
          <div>
            <label htmlFor="launchPlanInput" style={{ display: 'block', marginBottom: '0.5rem', fontWeight: 'bold' }}>
                打ち䞊げ蚈画を入力
            </label>
            <textarea
              id="launchPlanInput"
              name="launchPlanInput"
              rows={4}
              style={{ width: '100%', padding: '0.75rem', border: '1px solid #ccc', borderRadius: '6px', resize: 'vertical' }}
              defaultValue={userLaunchPlanDefault}
              readOnly // Keep readOnly for static demo consistency
            />
          </div>
          <button onClick={handlePredict} disabled={isRunning} data-proof="predict-action" style={{
            padding: '0.75rem 1.5rem',
            cursor: 'pointer',
            backgroundColor: isRunning ? '#888' : '#007bff', // Blue for predict, grey when running
            color: 'white',
            border: 'none',
            borderRadius: '6px',
            fontSize: '1em',
            fontWeight: 'bold',
            transition: 'background-color 0.3s ease'
          }}>
            {isRunning ? currentStep : '予枬'}
          </button>
        </div>

        <div style={resultsStyle}>
          <div data-proof="simulation-view" style={{ textAlign: 'center' }}>
             <DynamicOrbitView
                isRunning={isRunning}
                collisionRiskIncrease={simulationResult?.collisionRiskIncrease || 0}
             />
          </div>
          <div data-proof="summary-panel">
            <h3 style={{marginTop: 0, borderBottom: '1px solid #eee', paddingBottom: '0.5rem', marginBottom: '1rem'}}>予枬結果サマリヌ</h3>
            {!simulationResult ? (
              <p>ただ実行されおいたせん。予枬ボタンを抌しおください。</p>
            ) : (
              <div>
                <p>{simulationResult.summary}</p>
                <p style={{fontWeight: 'bold', color: '#dc3545'}}>衝突リスクが {(simulationResult.collisionRiskIncrease * 100).toFixed(0)}% 増加したす。</p>
              </div>
            )}
            <p style={{fontSize: '0.85em', color: '#6c757d', marginTop: '2rem', borderTop: '1px solid #eee', paddingTop: '1rem'}}>※泚意: このシミュレヌションは教育・啓発目的の簡易モデルです。結果は将来の予枬を保蚌するものではありたせん。</p>
          </div>
        </div>
      </main>
    </div>
  );
}