G-ACE commited on
Commit
eeec301
·
verified ·
1 Parent(s): 67b4632

Deploy GitHub main 4d1e86831ecdedb419a1420985356e9c55082c4d

Browse files
.deploy/customer-ai-free-model CHANGED
@@ -1,10 +1,10 @@
1
  customerai-master-v2-hp-public-ai-v2
2
  customerai-index-v2-hp-public-ai-v2
3
  free-local-model=Qwen/Qwen3-0.6B
4
- baseline-live-story-suite=100
5
  hp-public-live-story-suite=100
6
- total-live-story-cases=200
7
  hp-public-source-sha256=8c2de4259b00a4c64dc175bb76ed7187387db1c127e2f3de66fc21278490d8f5
8
- trigger=2026-07-29T21:25:44+09:00
9
  evidence=deployment-evidence/live-story-latest.json,deployment-evidence/hp-public-story-latest.json
10
  mode=private-space-internal-signed-routes
 
1
  customerai-master-v2-hp-public-ai-v2
2
  customerai-index-v2-hp-public-ai-v2
3
  free-local-model=Qwen/Qwen3-0.6B
4
+ full-master-live-story-suite=blocked-without-notion-token
5
  hp-public-live-story-suite=100
6
+ hp-public-bundled-pages=23
7
  hp-public-source-sha256=8c2de4259b00a4c64dc175bb76ed7187387db1c127e2f3de66fc21278490d8f5
8
+ trigger=2026-07-29T22:55:00+09:00
9
  evidence=deployment-evidence/live-story-latest.json,deployment-evidence/hp-public-story-latest.json
10
  mode=private-space-internal-signed-routes
deployment-evidence/hp-public-story-latest.json ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "accepted": false,
3
+ "total": 0,
4
+ "passed": 0,
5
+ "failed": 0,
6
+ "score_percent": 0.0,
7
+ "free_model_invoked": false,
8
+ "failure_stage": "before_hp_public_live_story_report",
9
+ "workflow_status": "failure",
10
+ "workflow_run_id": "30457165765",
11
+ "workflow_sha": "32f7375882072d69812b38ba0c8ef616b18ff8e2",
12
+ "evidence_persisted_at": "2026-07-29T13:43:00.138648+00:00"
13
+ }
deployment-evidence/live-story-latest.json CHANGED
@@ -5,9 +5,9 @@
5
  "failed": 0,
6
  "score_percent": 0.0,
7
  "free_model_invoked": false,
8
- "failure_stage": "before_live_story_report",
9
- "workflow_status": "cancelled",
10
- "workflow_run_id": "30439169739",
11
- "workflow_sha": "c91796bb2515e72c5ede8309bbddbb8daafcfa25",
12
- "evidence_persisted_at": "2026-07-29T09:23:18.229273+00:00"
13
  }
 
5
  "failed": 0,
6
  "score_percent": 0.0,
7
  "free_model_invoked": false,
8
+ "failure_stage": "before_baseline_live_story_report",
9
+ "workflow_status": "failure",
10
+ "workflow_run_id": "30457165765",
11
+ "workflow_sha": "32f7375882072d69812b38ba0c8ef616b18ff8e2",
12
+ "evidence_persisted_at": "2026-07-29T13:43:00.138608+00:00"
13
  }
kb/bundled-hp-public-boundary-v2.json ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": "customerai_master_v2_hp_public_bundle_v2",
3
+ "effective_date": "2026-07-29",
4
+ "source_sha256": "8c2de4259b00a4c64dc175bb76ed7187387db1c127e2f3de66fc21278490d8f5",
5
+ "source": "CustomerAI_Master_v2",
6
+ "scope": "latest_hp_public_ai_gateway_boundary",
7
+ "pages": [
8
+ {
9
+ "id": "3accdcf128e4812ca6aec9c8513cbc29-explicit",
10
+ "url": "https://app.notion.com/p/3accdcf128e4812ca6aec9c8513cbc29",
11
+ "Title": "Webhook GatewayをCustomer AI専用に改造しましたか?",
12
+ "Category": "外部連携・Webhook",
13
+ "Target_Intents": "汎用Gateway Customer AI専用 共通基盤 独立System 専用化 改造",
14
+ "Definitive_Answer": "Customer AI専用には改造していません。Webhook Gatewayは署名検証、永続化、配送、再送、復旧、監査を共通提供する独立した汎用基盤で、Customer AIは汎用配送先の一つとして接続します。",
15
+ "Exceptions_and_Limits": "Customer AIの都合だけでGateway本体を専用化したり、責務やProvider Contractを変更したりしません。回答生成とKB検索は配送先Application側の責務です。",
16
+ "Status": "公開"
17
+ }
18
+ ]
19
+ }
kb/bundled-hp-public-v2.json ADDED
@@ -0,0 +1,229 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": "customerai_master_v2_hp_public_bundle_v2",
3
+ "effective_date": "2026-07-29",
4
+ "source_sha256": "8c2de4259b00a4c64dc175bb76ed7187387db1c127e2f3de66fc21278490d8f5",
5
+ "source": "CustomerAI_Master_v2",
6
+ "scope": "latest_hp_public_ai_and_required_boundaries",
7
+ "pages": [
8
+ {
9
+ "id": "3accdcf128e4814fbd13ecce13106d4f",
10
+ "url": "https://app.notion.com/p/3accdcf128e4814fbd13ecce13106d4f",
11
+ "Title": "Astera v8とは何ですか?",
12
+ "Category": "製品・概要",
13
+ "Target_Intents": "Asteraとは アステラとは 外付けAI強化外装 AIを置き換えない Google V8 多重並列思考 判断素材8項目 主役AI",
14
+ "Definitive_Answer": "Astera v8は、利用中のChatGPT、Claude、Gemini、自作AI・自社AIなどを置き換えず、判断に必要な材料を外側から加える「外付けAI強化外装」です。Google V8を実行基盤として問いを複数工程で整理し、本当の目的、前提不足、事実確認、危機察知、反対視点、比較案、推奨判断、主役AIへの再指示の8項目を作ります。",
15
+ "Exceptions_and_Limits": "「外付けAI強化外装」は一般向けの役割説明です。技術的にはMulti-Perspective Cognition Runtimeであり、V8は生成AI Modelではありません。全8項目を完全同時実行するのではなく、依存関係を守った並列・順次処理を行います。Asteraだけで専門家判断や未確認事実を保証しません。",
16
+ "Status": "公開"
17
+ },
18
+ {
19
+ "id": "3accdcf128e4810284efd90d1f35dc6d",
20
+ "url": "https://app.notion.com/p/3accdcf128e4810284efd90d1f35dc6d",
21
+ "Title": "「外付けAI強化外装」とは何ですか?",
22
+ "Category": "製品・概要",
23
+ "Target_Intents": "外付けAI強化外装 外側から加える AIを置き換えない Astera 公開説明 主役AI",
24
+ "Definitive_Answer": "「外付けAI強化外装」は、AsteraがChatGPT、Claude、Gemini、自作AI・自社AI等を置き換えず、その外側で判断材料を作って主役AIへ渡す役割を示す一般向け表現です。主役AIの生成能力は残したまま、目的、前提、事実、Risk、反対材料、比較案を追加します。",
25
+ "Exceptions_and_Limits": "物理的な外装やBrowser拡張だけを意味する名称ではありません。技術的な正式位置付けはMulti-Perspective Cognition Runtimeであり、公開説明とArchitecture説明を目的に応じて使い分けます。",
26
+ "Status": "公開"
27
+ },
28
+ {
29
+ "id": "3accdcf128e481389164dd1bfba609b6",
30
+ "url": "https://app.notion.com/p/3accdcf128e481389164dd1bfba609b6",
31
+ "Title": "AsteraはAIですか?",
32
+ "Category": "製品・概要",
33
+ "Target_Intents": "Astera AIですか 生成AI 外付けAI強化外装 Runtime 主役AI 置き換えない",
34
+ "Definitive_Answer": "Asteraは、最終回答を作る生成AIそのものではありません。利用者の主役AIをそのまま活かし、その外側で問いを整理して判断素材8項目を作り、回答を深く、安全に、目的へ合わせやすくする認知実行Runtimeです。",
35
+ "Exceptions_and_Limits": "任意のLLMを補強や文章生成に使う構成はありますが、Asteraの本体責務は判断材料の生成です。ChatGPT、Claude、Gemini等のModel能力や専門家の最終判断を置き換えません。",
36
+ "Status": "公開"
37
+ },
38
+ {
39
+ "id": "3accdcf128e481d5b236ff84f1427661",
40
+ "url": "https://app.notion.com/p/3accdcf128e481d5b236ff84f1427661",
41
+ "Title": "Asteraと主役AIの役割はどう違いますか?",
42
+ "Category": "製品・概要",
43
+ "Target_Intents": "主役AIとの違い ChatGPT Claude Gemini 役割分担 外付けAI強化外装 判断素材 再指示",
44
+ "Definitive_Answer": "主役AIは文章、Code、画像、最終回答などを生成します。Asteraはその前段で、本当の目的、足りない前提、事実と推測、危険、反対意見、比較候補、推奨方向を整理し、第8項目として主役AIが回答を作り直せる再指示を渡します。",
45
+ "Exceptions_and_Limits": "Asteraは主役AIのProviderやModelを固定しません。主役AIへ渡す方法は手動Copy、Web Form、製品API、Webhook連携を想定しますが、提供状態は経路ごとに異なり、未実装の連携を現在利用可能とは案内しません。",
46
+ "Status": "公開"
47
+ },
48
+ {
49
+ "id": "3accdcf128e481a2aa23f8c5104641ea",
50
+ "url": "https://app.notion.com/p/3accdcf128e481a2aa23f8c5104641ea",
51
+ "Title": "判断素材8項目とは何ですか?",
52
+ "Category": "仕様・機能",
53
+ "Target_Intents": "判断素材8項目 8つの視点 本当の目的 前提不足 事実確認 危機察知 反対視点 比較案 推奨判断 主役AIへの再指示",
54
+ "Definitive_Answer": "判断素材8項目は、1.本当の目的、2.前提不足、3.事実確認��4.危機察知、5.反対視点、6.比較案、7.推奨判断、8.主役AIへの再指示です。問いを表面のまま主役AIへ渡さず、目的・不足・事実・危険・反論・選択肢を整理し、最後に回答を作り直すための指示へ変換します。",
55
+ "Exceptions_and_Limits": "8項目は公開出力Contractです。内部の5本柱・38 Genre Lens・Overlay等は8項目を作る技術処理であり、8項目と同じ分類ではありません。全項目を完全同時に処理する意味でもありません。",
56
+ "Status": "公開"
57
+ },
58
+ {
59
+ "id": "3accdcf128e4813392ccfb0f9c7774a3",
60
+ "url": "https://app.notion.com/p/3accdcf128e4813392ccfb0f9c7774a3",
61
+ "Title": "「本当の目的」では何を確認しますか?",
62
+ "Category": "仕様・機能",
63
+ "Target_Intents": "本当の目的 真の目的 表面の依頼 ゴール 成功条件 誰向け 優先順位 避けたい失敗",
64
+ "Definitive_Answer": "表面的な依頼の奥にある、本当に達成したい目的を整理します。主役AIへは、本当の目的、成功条件、優先順位、避けたい失敗、誰に向けた回答かを渡します。これにより、文章を整えるだけではなく、利用者が実際に達成したいことへ合う回答になりやすくなります。",
65
+ "Exceptions_and_Limits": "利用者の意図を勝手に確定せず、複数の目的が考えられる場合や結果が変わる場合は必要最小限の確認を行います。推測した目的は確認済み事実として扱いません。",
66
+ "Status": "公開"
67
+ },
68
+ {
69
+ "id": "3accdcf128e481a2a301f8545756c203",
70
+ "url": "https://app.notion.com/p/3accdcf128e481a2a301f8545756c203",
71
+ "Title": "「前提不足」では何を確認しますか?",
72
+ "Category": "仕様・機能",
73
+ "Target_Intents": "前提不足 情報不足 確認質問 対象 予算 期限 人員 技術条件 運用 読者 制約",
74
+ "Definitive_Answer": "回答を実際に使えるものへするため、対象、予算、期限、人員、技術条件、運用方法、読者、目的などの抜けを探します。主役AIへは、足りない条件、確認すべき質問、置くべき前提、制約、未決定事項を渡し、思い込みや条件抜けによる回答のズレを減らします。",
75
+ "Exceptions_and_Limits": "不足があっても一般条件を先に説明できる場合は回答を止めません。回答結果が大きく変わる情報だけを追加確認し、不要な質問を繰り返しません。",
76
+ "Status": "公開"
77
+ },
78
+ {
79
+ "id": "3accdcf128e481fc971ed84e834ec31b",
80
+ "url": "https://app.notion.com/p/3accdcf128e481fc971ed84e834ec31b",
81
+ "Title": "「事実確認」では何を確認しますか?",
82
+ "Category": "仕様・機能",
83
+ "Target_Intents": "事実確認 ファクトチェック 根拠 未確認情報 推測 意見 最新情報 断定を避ける",
84
+ "Definitive_Answer": "問い・資料・AI回答に含まれる内容を、確認済みの事実、推測・意見、未確認情報へ分けます。主役AIへは、確認済み事実、推測として扱う内容、調べるべき点、断定を避ける箇所を渡し、嘘や思い込みが事実のように混ざるのを防ぎます。",
85
+ "Exceptions_and_Limits": "Astera単体が外部世界の事実を自動保証するものではありません。法律、料金、最新仕様、現在情報等は、承認された一次Sourceと確認日時が必要です。",
86
+ "Status": "公開"
87
+ },
88
+ {
89
+ "id": "3accdcf128e481e0a758ea10c84bfa9d",
90
+ "url": "https://app.notion.com/p/3accdcf128e481e0a758ea10c84bfa9d",
91
+ "Title": "「危機察知」では何を確認しますか?",
92
+ "Category": "仕様・機能",
93
+ "Target_Intents": "危機察知 リスク 危険 失敗 信用低下 法務 セキュリティ コスト 運用破綻 炎上",
94
+ "Definitive_Answer": "実行後に問題となる条件を先に探します。炎上、誤解、法務、信用低下、運用破綻、Cost増、Security不備、利用者Trouble等を確認し、主役AIへ想定Risk、発生条件、避ける表現・手順、先に行う対策、代替案を渡します。",
95
+ "Exceptions_and_Limits": "Risk候補は発生確定を意味しません。重大度、発生可能性、影響範囲、回避可能性を区別し、過度に止めるだけの回答にしません。高Risk領域では専門家・責任者の確認を優先します。",
96
+ "Status": "公開"
97
+ },
98
+ {
99
+ "id": "3accdcf128e481489f64e8186add5742",
100
+ "url": "https://app.notion.com/p/3accdcf128e481489f64e8186add5742",
101
+ "Title": "「反対視点」では何を確認しますか?",
102
+ "Category": "仕様・機能",
103
+ "Target_Intents": "反対視点 反論 批判 逆の立場 弱点 別の見え方 補強",
104
+ "Definitive_Answer": "依頼者の案をそのまま肯定せず、あえて逆側から弱点、反論、批判されやすい表現、別の立場からの見え方を確認します。主役AIへ補強すべき論点を渡すことで、反論や批判に耐えやすい厚みのある回答へ作り直せます。",
105
+ "Exceptions_and_Limits": "反対すること自体を目的にせず、根拠のない否定や利用者への攻撃を生成しません。反対材料と、それを踏まえても採用する理由を分けます。",
106
+ "Status": "公開"
107
+ },
108
+ {
109
+ "id": "3accdcf128e4819da919e79e9d6ac6e9",
110
+ "url": "https://app.notion.com/p/3accdcf128e4819da919e79e9d6ac6e9",
111
+ "Title": "「比較案」では何を確認しますか?",
112
+ "Category": "仕様・機能",
113
+ "Target_Intents": "比較案 代替案 案A 案B 案C 選択肢 メリット デメリット 採用条件 段階案",
114
+ "Definitive_Answer": "最初の一案へ固定せず、別の方法、段階的な方法、安い方法、安全な方法、早い方法等を並べます。主役AIへ案A・B・C、それぞれの利点、欠点、採用条件、捨てるべき案、段階的な進め方を渡し、比較して選べる回答にします。",
115
+ "Exceptions_and_Limits": "数を増やすだけの案出しは行わず、目的・制約に合わない案は理由付きで除外します。比較軸や前提が異なる案を同じ条件として扱いません。",
116
+ "Status": "公開"
117
+ },
118
+ {
119
+ "id": "3accdcf128e481e489d4c34874cab832",
120
+ "url": "https://app.notion.com/p/3accdcf128e481e489d4c34874cab832",
121
+ "Title": "「推奨判断」は最終決定ですか?",
122
+ "Category": "仕様・機能",
123
+ "Target_Intents": "推奨判断 推奨する方向 理由 判断条件 注意点 次の一手 最終決定",
124
+ "Definitive_Answer": "最終決定ではありません。本当の目的、前提、事実、危険、反対視点、比較案をまとめ、現時点で最も筋の良い方向、その理由、採用条件、注意点、次の一手、採用しない案の理由を示す条件付き提案です。",
125
+ "Exceptions_and_Limits": "最終決定権と責任は利用者または権限を持つ組織に残ります。未確認事項が結論を変える場合は、確認後に推奨を更新します。法律・医療・投資等の専門判断を代行しません。",
126
+ "Status": "公開"
127
+ },
128
+ {
129
+ "id": "3accdcf128e481d68b8fd6e751205525",
130
+ "url": "https://app.notion.com/p/3accdcf128e481d68b8fd6e751205525",
131
+ "Title": "「主役AIへの再指示」はどう使いますか?",
132
+ "Category": "仕様・機能",
133
+ "Target_Intents": "主役AIへの再指示 再指示文 Prompt コピー ChatGPT Claude Gemini 自作AI 自社AI",
134
+ "Definitive_Answer": "第1〜7項目で整理した目的、追加前提、確認すべき事実、避ける危険、反対材料、比較案、推奨方向を、主役AIが回答を作り直せる一つの指示へ変換します。利用者はその再指示をChatGPT、Claude、Gemini、自作AI・自社AI等へ渡して使います。",
135
+ "Exceptions_and_Limits": "「もう一度考えて」だけではなく、重視する目的、禁止事項、出力形式、最終回答の条件まで含めます。未確認事実を確定情報へ変えたり、主役AIのProvider仕様・Safety制約を回避する指示は作りません。",
136
+ "Status": "公開"
137
+ },
138
+ {
139
+ "id": "3accdcf128e481509816db2ae89908c5",
140
+ "url": "https://app.notion.com/p/3accdcf128e481509816db2ae89908c5",
141
+ "Title": "Astera v8でいうV8は生成AI Modelですか?",
142
+ "Category": "Astera本体・技術",
143
+ "Target_Intents": "Google V8 V8 JavaScript Runtime 生成AI Model 多重並列思考 Worker 実行基盤",
144
+ "Definitive_Answer": "違います。V8はJavaScriptを実行するRuntimeで、Asteraでは問いの正規化、分類、独立処理、並列実行、状態管理、結果統合を動かす実行基盤として使います。生成AI Modelそのものではありません。",
145
+ "Exceptions_and_Limits": "一般向けの「Google V8で多重並列思考を走らせる」は役割を分かりやすくした公開表現です。技術的には全工程を同時に走らせず、Inquiryの事前判定、Fact・Risk等の並列処理、依存するMulti・Compare、8項目整形の順序を守ります。",
146
+ "Status": "公開"
147
+ },
148
+ {
149
+ "id": "3accdcf128e481948c95fdd3836bc0c7",
150
+ "url": "https://app.notion.com/p/3accdcf128e481948c95fdd3836bc0c7",
151
+ "Title": "Asteraの「多重並列思考」とは何ですか?",
152
+ "Category": "Astera本体・技術",
153
+ "Target_Intents": "多重並列思考 Google V8 並列処理 同時処理 5本柱 8項目 依存順序",
154
+ "Definitive_Answer": "問いを一つの一本道だけで処理せず、事実、危険、問いの前提等の独立して確認できる工程をV8上で並列化し、その結果を多角・比較工程へ渡して8項目へ統合す���処理です。複数の視点を同時期に検討しつつ、依存関係がある工程は順序を守ります。",
155
+ "Exceptions_and_Limits": "8項目全部や5本柱全部を完全同時に実行する意味ではありません。並列化によって正しさが自動保証されるものでもなく、Evidence、現在情報、Quality Gate、最終確認が別に必要です。",
156
+ "Status": "公開"
157
+ },
158
+ {
159
+ "id": "3accdcf128e481ad856ef975d57f8dc2",
160
+ "url": "https://app.notion.com/p/3accdcf128e481ad856ef975d57f8dc2",
161
+ "Title": "Asteraの判断材料を主役AIへどう渡しますか?",
162
+ "Category": "利用方法",
163
+ "Target_Intents": "AIへ渡す方法 コピー フォーム API Webhook 主役AI 再指示 手動 自動連携",
164
+ "Definitive_Answer": "公開構想では、1.判断材料または再指示をCopyして主役AIへ貼る、2.Web Formから受け取る、3.製品APIで自作AI・自社AI・SaaSへ組み込む、4.Webhookで業務FlowやBotへ配送する方法を使い分けます。最初は手動Copyで利用でき、後からAPI・Webhookで自動化する考え方です。",
165
+ "Exceptions_and_Limits": "現在の製品版App・Account・API・Webhook連結はすべて本番提供済みではありません。手動Copy、現行Frontend操作、Standalone Runtime、製品版API、汎用Webhook Gatewayを区別し、利用可能状態は各機能の最新実装に従います。",
166
+ "Status": "公開"
167
+ },
168
+ {
169
+ "id": "3accdcf128e481c0bb77d011268fb6b7",
170
+ "url": "https://app.notion.com/p/3accdcf128e481c0bb77d011268fb6b7",
171
+ "Title": "Asteraを使うと主役AIの回答が強くなるのはなぜですか?",
172
+ "Category": "製品・概要",
173
+ "Target_Intents": "強くなる理由 回答品質 目的 前提抜け 事実 推測 危険 反対意見 比較 検証 レビュー",
174
+ "Definitive_Answer": "主役AIへ質問だけを渡すのではなく、本当の目的、足りない前提、事実と推測の区別、危険、反対意見、比較案、推奨条件を先に渡すためです。これにより、目的に合いやすくなり、前提抜けや未確認断定が減り、比較・検証・Reviewを踏まえて回答を作り直しやすくなります。",
175
+ "Exceptions_and_Limits": "必ず正解になる、すべてのAIが同じ幅で改善する、専門家確認が不要になるという保証ではありません。入力品質、KB・Evidence、主役AIの能力、現在情報、利用者の最終判断に依存します。",
176
+ "Status": "公開"
177
+ },
178
+ {
179
+ "id": "3accdcf128e4816b8563efa698b07a0d",
180
+ "url": "https://app.notion.com/p/3accdcf128e4816b8563efa698b07a0d",
181
+ "Title": "HPの一般向け説明とAsteraの技術説明は矛盾しますか?",
182
+ "Category": "製品・概要",
183
+ "Target_Intents": "HP公開説明 技術説明 外付けAI強化外装 Multi-Perspective Cognition Runtime 5本柱 38 Lens 8項目 違い",
184
+ "Definitive_Answer": "矛盾しません。HPはAsteraの価値を「外付けAI強化外装」「Google V8による多重並列思考」「判断素材8項目」「主役AIへ渡す」と説明します。技術説明は、その8項目を作るための5本柱、38 Genre Lens、Overlay、Worker、依存順序、Quality Gate等を説明します。",
185
+ "Exceptions_and_Limits": "一般向け表現を理由に技術構造を省略・改変したり、技術Module名をそのまま一般利用者へ押しつけたりしません。料金・Provider・実装状態は最新正本を別途確認し、旧公開Packageの値を現在仕様として使いません。",
186
+ "Status": "公開"
187
+ },
188
+ {
189
+ "id": "3accdcf128e481e0bbb7c52e0c7a0b4b",
190
+ "url": "https://app.notion.com/p/3accdcf128e481e0bbb7c52e0c7a0b4b",
191
+ "Title": "BrowserからWebhook GatewayやPrivate HFへ直接接続しますか?",
192
+ "Category": "Customer AI",
193
+ "Target_Intents": "Browser Direct Gateway HF Prohibited Cloudflare",
194
+ "Definitive_Answer": "接続しません。BrowserはCloudflareのSame-Origin Public APIを使用し、Server側で検証・Context解決後に汎用GatewayとPrivate HFへ配送する設計です。",
195
+ "Exceptions_and_Limits": "Private Endpoint、Secret、AuthorizationをBrowserへ露出しません。実接続は未完了です。",
196
+ "Status": "公開"
197
+ },
198
+ {
199
+ "id": "3accdcf128e4812ca6aec9c8513cbc29",
200
+ "url": "https://app.notion.com/p/3accdcf128e4812ca6aec9c8513cbc29",
201
+ "Title": "Webhook GatewayはCustomer AI専用のSystemですか?",
202
+ "Category": "外部連携・Webhook",
203
+ "Target_Intents": "汎用Gateway Customer AI専用 共通基盤 独立System",
204
+ "Definitive_Answer": "いいえ。Webhook Gatewayは外部ProviderからのWebhookを共通に受け、署名検証、永続化、配送、再送、復旧、監査を行う独立した汎用基盤です。Customer AIは、その汎用配送先の一つとして接続します。",
205
+ "Exceptions_and_Limits": "Customer AIの都合だけでGateway本体の責務やProvider Contractを変更しません。製品固有の回答生成やKB検索は配送先Application側の責務です。",
206
+ "Status": "公開"
207
+ },
208
+ {
209
+ "id": "3accdcf128e4811da043cc981d821d83",
210
+ "url": "https://app.notion.com/p/3accdcf128e4811da043cc981d821d83",
211
+ "Title": "Customer AIはKBにない情報をModel知識で補いますか?",
212
+ "Category": "Customer AI",
213
+ "Target_Intents": "Hallucination Model Knowledge Fill Missing KB",
214
+ "Definitive_Answer": "補いません。製品事実は検索済みKBまたは承認Sourceだけを使い、該当情報が無い場合は「現在、該当する正確な案内情報が登録されていません」と返します。",
215
+ "Exceptions_and_Limits": "文章の整形にModelを使う場合も、新しい事実、数値、機能、保証を追加させません。",
216
+ "Status": "公開"
217
+ },
218
+ {
219
+ "id": "3accdcf128e4816998dad199b87e1da9",
220
+ "url": "https://app.notion.com/p/3accdcf128e4816998dad199b87e1da9",
221
+ "Title": "Customer AIはどの情報を正本として回答しますか?",
222
+ "Category": "Customer AI",
223
+ "Target_Intents": "Source of Truth 正本 Notion GitHub Current Public",
224
+ "Definitive_Answer": "確定した公開Master、認証済みのAccount・契約・決済・Job等の正本System、承認されたCurrent Data Sourceを回答根拠にします。技術の現在状態は現行Repositoryと実行結果へ照合します。",
225
+ "Exceptions_and_Limits": "会話履歴、Model学習知識、古いREADME、未承認Web情報を製品事実の正本にしません。",
226
+ "Status": "公開"
227
+ }
228
+ ]
229
+ }
runtime/__init__.py CHANGED
@@ -1,3 +1,7 @@
 
 
 
 
1
  from .service import CustomerAIService
2
 
3
  __all__ = ["CustomerAIService"]
 
1
+ from .bundled_snapshot import install_bundled_notion_fallback
2
+
3
+ install_bundled_notion_fallback()
4
+
5
  from .service import CustomerAIService
6
 
7
  __all__ = ["CustomerAIService"]
runtime/bundled_snapshot.py ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ import os
5
+ from pathlib import Path
6
+ from typing import Any
7
+
8
+ from .notion import NotionClient
9
+
10
+ BUNDLED_NOTION_TOKEN = "bundled:hp-public-v2"
11
+ EXPECTED_SCHEMA = "customerai_master_v2_hp_public_bundle_v2"
12
+ EXPECTED_SOURCE_HASH = "8c2de4259b00a4c64dc175bb76ed7187387db1c127e2f3de66fc21278490d8f5"
13
+ REQUIRED_FIELDS = (
14
+ "Title",
15
+ "Category",
16
+ "Target_Intents",
17
+ "Definitive_Answer",
18
+ "Exceptions_and_Limits",
19
+ "Status",
20
+ )
21
+ DEFAULT_BUNDLE_NAMES = (
22
+ "bundled-hp-public-v2.json",
23
+ "bundled-hp-public-boundary-v2.json",
24
+ )
25
+
26
+
27
+ def _bundle_paths() -> list[Path]:
28
+ configured = os.getenv("CUSTOMER_AI_BUNDLED_KB_PATH", "").strip()
29
+ if configured:
30
+ candidate = Path(configured)
31
+ if candidate.exists():
32
+ sibling = candidate.with_name("bundled-hp-public-boundary-v2.json")
33
+ return [candidate, sibling] if sibling.exists() else [candidate]
34
+ root = Path(__file__).resolve().parents[1] / "kb"
35
+ return [root / name for name in DEFAULT_BUNDLE_NAMES]
36
+
37
+
38
+ def _load_payload(path: Path) -> dict[str, Any]:
39
+ payload = json.loads(path.read_text(encoding="utf-8"))
40
+ if payload.get("schema_version") != EXPECTED_SCHEMA:
41
+ raise RuntimeError("bundled_kb_schema_invalid")
42
+ if payload.get("source_sha256") != EXPECTED_SOURCE_HASH:
43
+ raise RuntimeError("bundled_kb_source_hash_invalid")
44
+ raw_pages = payload.get("pages")
45
+ if not isinstance(raw_pages, list) or not raw_pages:
46
+ raise RuntimeError("bundled_kb_pages_missing")
47
+ return payload
48
+
49
+
50
+ def load_bundled_pages() -> tuple[list[dict[str, Any]], dict[str, Any]]:
51
+ paths = _bundle_paths()
52
+ pages: list[dict[str, Any]] = []
53
+ titles: set[str] = set()
54
+ effective_dates: list[str] = []
55
+
56
+ for path in paths:
57
+ payload = _load_payload(path)
58
+ effective_dates.append(str(payload.get("effective_date", "")))
59
+ for raw in payload["pages"]:
60
+ if not isinstance(raw, dict):
61
+ raise RuntimeError("bundled_kb_page_invalid")
62
+ missing = [field for field in REQUIRED_FIELDS if not str(raw.get(field, "")).strip()]
63
+ if missing:
64
+ raise RuntimeError("bundled_kb_required_field_missing:" + ",".join(missing))
65
+ if raw.get("Status") != "公開":
66
+ raise RuntimeError("bundled_kb_non_public_page")
67
+ title = str(raw["Title"]).strip()
68
+ if title in titles:
69
+ raise RuntimeError("bundled_kb_duplicate_title:" + title)
70
+ titles.add(title)
71
+ pages.append(dict(raw))
72
+
73
+ metadata = {
74
+ "mode": "bundled_hp_public",
75
+ "paths": [str(path) for path in paths],
76
+ "schema_version": EXPECTED_SCHEMA,
77
+ "source_sha256": EXPECTED_SOURCE_HASH,
78
+ "effective_date": max(effective_dates),
79
+ "page_count": len(pages),
80
+ }
81
+ return pages, metadata
82
+
83
+
84
+ async def _fetch_bundled_pages(self: NotionClient) -> list[dict[str, Any]]:
85
+ pages, _ = load_bundled_pages()
86
+ return pages
87
+
88
+
89
+ def install_bundled_notion_fallback() -> bool:
90
+ if os.getenv("NOTION_TOKEN", "").strip() != BUNDLED_NOTION_TOKEN:
91
+ return False
92
+ NotionClient.fetch_pages = _fetch_bundled_pages # type: ignore[method-assign]
93
+ return True