diff --git a/docs/content-sources.json b/docs/content-sources.json index 31378e4..2afbf25 100644 --- a/docs/content-sources.json +++ b/docs/content-sources.json @@ -39,12 +39,12 @@ "id": "aisecure", "repo": "https://github.com/FORIFOR/AISecure", "source": "https://github.com/FORIFOR/AISecure/blob/main/README.md", - "sourceBlobSha": "357abc6d30d32a317be62c738d36550febb08167", - "evidence": "https://github.com/FORIFOR/AISecure/blob/main/docs/TUNING.md", + "sourceBlobSha": "b8cebc9afbdbd8b6bd0da01bfc397f94e3803292", + "evidence": "https://github.com/FORIFOR/AISecure/blob/main/docs/security/DETECTION_MEASUREMENT.md", "preview": "/assets/products/aisecure.jpg", - "previewSource": "AISecure/docs/screenshots/audit.png", - "status": "検証用プロトタイプ", - "scope": "スナップショット分析です。常時監視、実際の遮断、漏えいの確定は行いません。公開検証は合成データで、本番の性能保証ではありません。" + "previewSource": "AISecure/docs/media/demo-desktop.mp4", + "status": "アルファ", + "scope": "常時監視や実際の遮断、OCR、端末全体の情報漏えい対策は行いません。自社測定の再現率は0.30で、「検出なし」は安全の証明ではありません。" }, { "id": "agent-team", diff --git a/public/assets/animated-demos.mjs b/public/assets/animated-demos.mjs index 3a1987a..664e7be 100644 --- a/public/assets/animated-demos.mjs +++ b/public/assets/animated-demos.mjs @@ -18,7 +18,7 @@ export function demoCopy(id, lang = 'ja') { genie: ja ? ['メモから、使える下書きへ。','このメモから、LPの下書きを作って。',['メモを渡す','依頼する','構成を作る','下書きを見る','成果物を残す'],'実際の利用にはMac・ローカルサービス・モデルの設定が必要です。'] : ['A note becomes a useful draft.','Turn these notes into a landing-page draft.',['Add notes','Send request','Structure','Review draft','Keep artifact'],'Actual use requires a Mac, local services and a configured model.'], 'ai-meeting': ja ? ['話したことを、次の行動に。','料金案を3つ比較するタスクを追加して。',['話す','文字にする','整理する','変更を確認','タスクを残す'],'音声を録音・送信せず、タスクも実際には保存しません。'] : ['Think out loud. Keep the next step.','Add a task to compare three pricing options.',['Speak','Transcribe','Organize','Confirm change','Keep task'],'No microphone recording, audio transmission or real task storage.'], oathra: ja ? ['結果から、相手の発言まで。','金曜日の14時に予約をお願いします。',['依頼を見る','会話を見る','発言を拾う','根拠を照合','未確認を分ける'],'サンプル会話の説明です。実電話を発信せず、店舗システムへの登録も行いません。'] : ['A result with a traceable source.','Please book Friday at 14:00.',['Read request','Read exchange','Extract words','Match evidence','Separate unknowns'],'A fictional conversation. No live call or external booking is made.'], - aisecure: ja ? ['ログを、調べられる一件に。','この3件のログを、一つのケースとして調査。',['ログを選ぶ','観測する','関連づける','仮説を分ける','不明点を残す'],'合成ログによる説明です。実環境の監視・遮断や安全性の保証ではありません。'] : ['Scattered logs. One reviewable case.','Investigate these three log entries together.',['Select logs','Observe','Correlate','Form hypothesis','Keep unknowns'],'Synthetic logs only. Not live monitoring, enforcement or a safety guarantee.'], + aisecure: ja ? ['AIに渡す前に、手元で確かめる。','社外秘のサンプル資料を、送らずに検査。',['資料を入れる','指示を添える','送らずに検査','範囲を見る','限界を知る'],'合成サンプルによる説明です。実環境の監視・遮断や安全性の保証ではありません。'] : ['Check before you send to AI.','Check a confidential sample without sending it.',['Add a file','Add the prompt','Check, not send','See the coverage','Know the limits'],'Synthetic sample only. Not live monitoring, enforcement or a safety guarantee.'], 'agent-team': ja ? ['一人で作らない。途中も残す。','新機能の発表文を作り、レビューして。',['依頼する','下書きを作る','レビューする','修正する','未完了も残す'],'説明用の再現UIと架空の作業記録です。実モデルの実行記録は実録画・製品ページで確認できます。'] : ['Shared work. A visible trail.','Draft and review a new-feature announcement.',['Request','Draft','Review','Revise','Keep open items'],'Illustrative UI and fictional work trail. See the recording and product page for real-model evidence.'], launchloom: ja ? ['ひとつの録画から、届ける素材へ。','この録画から、公開前の素材セットを作る。',['録画を入れる','構成を選ぶ','用途別に作る','素材を確認','公開前に止める'],'動画を生成・アップロードせず、SNSにも実投稿しません。'] : ['One recording. A launch kit.','Make a pre-publish launch kit from this recording.',['Add recording','Choose story','Adapt formats','Review assets','Stop before publishing'],'No video generation, upload or real social publishing.'], noa: ja ? ['コメントを、声と表情に。','コメント「ノア、かわいい」が届く',['コメントを受ける','重複・古いものを除く','返事を決める','声にする','表情を動かす'],'説明用の再現UIです。実際の配信の録画ではありません。'] : ['Comments, answered in voice and expression.','A comment arrives: "Noa, you are cute"',['Take the comment','Drop repeats and stale ones','Decide the reply','Voice it','Move the face'],'An illustrative UI, not a recording of a live stream.'] @@ -49,7 +49,7 @@ export function renderStory(id, lang = 'ja') { if (id === 'genie') body = `

${t('新しいタスク','NEW TASK')}

${input}${reveal(1,`

${t('メモを読み込み、構成を整理します。','Reading the notes and organizing the page.')}

`)}${reveal(2,`
${icon('check')} ${t('見出し・機能・次のアクション','Headline · features · next action')} ${badge('3 / 3')}
`)}${reveal(3,`
landing-page.md${badge(t('下書き','DRAFT'))}

${t('考えを、かたちに。','Make room for your ideas.')}

${t('あなたのメモから、次の仕事を始める。','Start your next piece of work from a simple note.')}

`)}${reveal(4,`
${icon('check')} ${t('成果物を開く','Open artifact')}Markdown ↗
`)}
`; if (id === 'ai-meeting') body = `
AI MEETING
${icon('mic')}

${t('話す、考える、整理する。','Speak. Think. Organize.')}

${t('音声の動きを再現したデモ','SIMULATED VOICE ACTIVITY')}
${reveal(0,`${t('あなた','YOU')}
${esc(c.prompt)}
`)}${reveal(2,`AI MEETING
${t('「料金案を3つ比較」をタスクとして残しますか?','Save “Compare three pricing options” as a task?')}
`)}${reveal(3,`
${t('変更を確認(デモ)','Confirm change (demo)')}${icon('check')}
`)}${reveal(4,`
${icon('check')}
${t('料金案を3つ比較','Compare three pricing options')}${t('確認済みタスクの表示例','Example of a confirmed task')}
`)}
`; if (id === 'oathra') body = `
${icon('call')}
${t('予約窓口','Reservation desk')}${t('サンプル会話','SAMPLE TRANSCRIPT')}
00:24
${reveal(0,`OATHRA
${esc(c.prompt)}
`)}${reveal(1,`${t('相手の発言 · 00:18','OTHER PARTY · 00:18')}
${t('はい、金曜日の14時ですね。お待ちしています。','Yes, Friday at 14:00. We will see you then.')}
`)}${reveal(2,note(t('ハイライト箇所が判定の根拠です。','Highlighted words support the claim.')))}

EVIDENCE CHECK

${t('発言と、結果を照合。','Match the words to the result.')}

${reveal(2,`
${t('日時','WHEN')}
${t('金曜 14:00','Friday 14:00')}
${t('根拠','SOURCE')}
${t('相手の発言 00:18','Other party 00:18')}
`)}${reveal(3,`
${icon('check')}${t('発言の一致を確認','Spoken agreement matched')}
`)}${reveal(4,`
${t('外部システムへの登録:未確認','External booking: unverified')}

${t('会話の合意 ≠ 店舗への登録','Spoken agreement ≠ a system record')}

`)}
`; - if (id === 'aisecure') body = `

SYNTHETIC LOGS / CASE 018

${t('3件の兆候。ひとつの調査。','Three signals. One investigation.')}

${[['09:41','EXPOSURE',t('公開状態の変更','Exposure changed')],['09:42','IDENTITY',t('特権ログイン','Privileged sign-in')],['09:43','ACCESS',t('ファイルアクセス','File accessed')]].map((a,i)=>reveal(i,`
${a[1]}${a[2]}
0${i+1}
`)).join('')}

${t('調査の整理','CASE NOTES')}

${reveal(2,`
${t('観測した事実','OBSERVED')}${t('同じ主体の操作が連続','Related activity by one actor')}

${t('3件のログを関連づけ','Three related log entries')}

`)}${reveal(3,`
${t('仮説 · 未確定','HYPOTHESIS · UNCONFIRMED')}${t('権限の不適切な利用の可能性','Possible misuse of privilege')}
`)}${reveal(4,`
${t('まだ分からないこと','UNKNOWN')}${t('正当な業務かを確認する','Was this authorized work?')}

${t('追加の確認が必要','Further review required')}

`)}
`; + if (id === 'aisecure') body = `

SYNTHETIC SAMPLE / PRE-SEND

${t('送る前に、この端末で。','Checked here, before sending.')}

${[['00:00','INPUT',t('社外秘のサンプル資料','Confidential sample file')],['00:05','PROMPT',t('「要点を確認して」','“Check the key points”')],['00:07','CHECK',t('送信せずに検査','Checked without sending')]].map((a,i)=>reveal(i,`
${a[1]}${a[2]}
0${i+1}
`)).join('')}

${t('判定','DECISION')}

${reveal(2,`
${t('判定','DECISION')}${t('保留','Hold')}

${t('根拠ルール PG-004 · DOC-CLASS','Rules PG-004 · DOC-CLASS')}

`)}${reveal(3,`
${t('検査範囲','COVERAGE')}${t('文字を検査済み · 画像は対象外','Text checked · images not covered')}
`)}${reveal(4,`
${t('限界','LIMIT')}${t('「検出なし」は安全の証明ではない','“No findings” is not proof of safety')}

${t('自社測定の再現率 0.30','Own measured recall 0.30')}

`)}
`; if (id === 'agent-team') body = `
${[['editor',t('まとめる','Master'),'PLAN'],['writer',t('つくる','Builder'),'DRAFT · V1 → V2'],['reviewer',t('たしかめる','Reviewer'),'REVIEW']].map(([look,label,step],i)=>`
${avatar(look,label)}${label}${step}
`).join('')}
${reveal(0,`
${esc(c.prompt)}
`)}${reveal(1,`
${avatar('writer','Builder')}
BUILDER · V1

${t('見出しと紹介文の下書きを作成。','Headline and announcement drafted.')}

`)}${reveal(2,`
${avatar('reviewer','Reviewer')}
REVIEWER · 1 NOTE

${t('公開日が未確認です。断定を避けましょう。','The release date is unverified. Avoid stating it as fact.')}

`)}${reveal(3,`
${avatar('writer','Builder')}
BUILDER · V2

${t('指摘を受けて表現を修正。確認が必要な箇所も残しました。','Revised after the finding. Open verification is retained.')}

`)}${reveal(4,`
${icon('check')} announcement.md ${t('確認待ち 1件','1 open check')}
`)}
`; if (id === 'noa') body = `
${[['writer',t('ノア','Noa'),t('配信','LIVE')],['reviewer','Jev',t('判定','JUDGES')]].map(([look,label,step],i)=>`
${avatar(look,label)}${label}${step}
`).join('')}
${reveal(0,`
${esc(c.prompt)}
`)}${reveal(1,`
${avatar('reviewer','Jev')}
${t('Jev · 判定','JEV · JUDGES')}

${t('重複なし・期限内。返事の対象にする。','Not a repeat, still fresh. Reply to it.')}

`)}${reveal(2,`
${avatar('writer','Noa')}
${t('ノア · 返事','NOA · REPLY')}

${t('えへへ、ありがと。','Hehe, thank you.')}

`)}${reveal(3,`
${avatar('writer','Noa')}
${t('声 · コハク','VOICE · KOHAKU')}

${t('読み上げに合わせて、口と目が動く。','The mouth and eyes move with the voice.')}

`)}${reveal(4,`
${icon('check')} ${t('声と表情で返す','Answered in voice and expression')} ${t('再現UI','ILLUSTRATIVE')}
`)}
`; if (id === 'launchloom') body = `
product-demo.mp4${badge(t('入力素材の例','SAMPLE SOURCE'))}
YOUR NEXT LAUNCH

${t('つくった。その次へ。','Made it. Now show it.')}

00:0000:18
010203

LAUNCH KIT

${reveal(1,`
16:9
${t('横動画','Landscape film')}product-film.mp4
${icon('check')}
`)}${reveal(2,`
9:16
${t('縦動画','Vertical film')}product-short.mp4
${icon('check')}
`)}${reveal(3,`
WEB
${t('LP・SNS投稿案','LP · social drafts')}launch-kit/
${icon('check')}
`)}${reveal(4,`
${t('公開前の確認待ち','Ready for pre-publish review')}

${t('SNSには投稿されません','Nothing is published to social accounts')}

`)}
`; diff --git a/public/assets/lab-core.mjs b/public/assets/lab-core.mjs index 41a368d..b965f7e 100644 --- a/public/assets/lab-core.mjs +++ b/public/assets/lab-core.mjs @@ -6,7 +6,7 @@ export const LAB = Object.freeze({ genie: {ja:['考えを形に','メモから、\n仕事が始まる。','考えを渡す。下書きを開く。次の作業へ持ち出す。自分のモデルと進めるMacのワークスペース。','手元に残る下書き','メモ → 構成 → 成果物'],en:['Make something','From a note\nto a next step.','Give an idea a place to become work. A Mac workspace for drafting and revisiting artifacts with your own model.','A draft you can keep','Notes → structure → artifact']}, 'ai-meeting':{ja:['話して整理','話したことを、\n次の行動に。','考えを声にして、やることを整理。聞き違いがあり得る変更は、確認してから残します。','確認して残すタスク','会話 → 確認 → タスク'],en:['Think out loud','A conversation.\nA clear next step.','Talk through an idea and keep the work that matters. Review uncertain changes before saving them.','A confirmed next step','Conversation → review → task']}, oathra:{ja:['電話を確かめる','「できました」に、\n確かめる手がかりを。','相手は何と言ったのか。実際に登録されたのか。電話の発言と結果を、分けて確かめる。','発言まで辿れる結果','会話 → 発言の根拠 → 確認'],en:['Check a call','Not just “done.”\nSomething to check.','What did the other party say? What was actually registered? Keep the words and the external result distinct.','A traceable call result','Conversation → evidence → review']}, - aisecure:{ja:['根拠を調べる','散らばった兆候を、\nひとつの調査に。','ログを関連づけ、観測した事実・仮説・不明点を整理。次に何を確認するかが見える。','読み返せる調査ケース','ログ → 関連づけ → 調査'],en:['Follow the evidence','Scattered signals.\nOne reviewable case.','Connect log entries without confusing observations with hypotheses. Keep the unanswered questions visible.','A reviewable investigation','Logs → correlation → review']}, + aisecure:{ja:['送る前に確かめる','AIに渡す前に、\n手元で確かめる。','資料と指示を、この端末だけで検査。判定と理由をJSONで残す。','理由つきの判定','資料 → 手元で検査 → 判定と理由'],en:['Check before sending','Check it here,\nbefore it goes to AI.','The document and prompt are checked on this machine. The decision and its reasons are saved as JSON.','A decision with reasons','Document → local check → decision and reasons']}, 'agent-team':{ja:['チームで作る','つくる。確かめる。\nもう一度、よくする。','下書き・レビュー・修正に、それぞれの担当を。成果物だけでなく、そこまでの仕事も残す。','経緯のわかる成果物','下書き → レビュー → 修正'],en:['Work as a team','Draft. Review.\nMake it better.','Give drafting, review and revision their own roles. Keep the work trail alongside the deliverable.','An artifact with a work trail','Draft → review → revision']}, launchloom:{ja:['作ったものを届ける','つくった。\nその次へ。','ひとつの操作録画から、動画・LP・投稿案へ。公開前に、伝える素材を揃える。','公開前の素材セット','録画 → 制作 → 素材の確認'],en:['Show your work','You built it.\nNow show it.','Turn one product recording into film, page and social drafts. Review the material before you publish.','A pre-publish launch kit','Recording → creation → review']}, noa:{ja:['声と表情で返す','コメントを、\n声と表情に。','返事・声・見た目は別々の仕組み。その間をつなぎ、配信のコメントに声と表情で返します。','声と表情のついた返事','コメント → 判定 → 声・表情'],en:['Voice and expression','Comments, answered\nin voice and expression.','The reply, the voice and the look are separate systems. Noa joins them and answers stream comments with voice and expression.','A reply with voice and expression','Comment → judgement → voice and expression']} @@ -40,7 +40,7 @@ export function sampleResult(id,lang){ genie:[t('見出し:考えを、かたちに。','Headline: Make room for your ideas.'),t('説明:メモから次の仕事を始める。','Description: Start the next piece of work from a note.'),'landing-page.md'], 'ai-meeting':[t('タスク:料金案を3つ比較','Task: Compare three pricing options'),t('状態:このサンプル内で確認済み','State: confirmed within this sample'),t('実アプリへの保存:なし','Stored in the actual app: no')], oathra:[t('日時:金曜日 14:00','When: Friday 14:00'),t('根拠:相手の発言 00:18','Source: other party at 00:18'),t('外部システムへの登録:未確認','External booking: unverified')], - aisecure:[t('観測:3件の関連したログ','Observed: three related log entries'),t('仮説:権限の不適切な利用の可能性','Hypothesis: possible misuse of privilege'),t('不明点:正当な業務か、追加確認が必要','Unknown: was this authorized work?')], + aisecure:[t('判定:保留(PG-004 · DOC-CLASS)','Decision: hold (PG-004 · DOC-CLASS)'),t('外部送信:なし','Sent out: nothing'),t('「検出なし」でも安全の証明ではない','“No findings” would not prove it safe')], 'agent-team':['announcement.md · v2',t('表現を修正。公開日の確認待ちを保持。','Copy revised. Release-date verification remains open.'),t('未完了の確認:1件','Open verification items: 1')], launchloom:['16:9 / 9:16 / Web / Social',t('上記は制作対象の例。実ファイルは未生成。','These are example outputs, not generated media files.'),t('実際のSNS投稿:なし','Real social publishing: none')], noa:[t('返事:えへへ、ありがと。','Reply: Hehe, thank you.'),t('声と表情:コハクの声、口と目が動く','Voice and face: Kohaku voice, mouth and eyes move'),t('実際の配信:なし(説明用のサンプル)','Real stream: none (sample for illustration)')] diff --git a/public/assets/products/aisecure.jpg b/public/assets/products/aisecure.jpg index b19cecd..2e3d208 100644 Binary files a/public/assets/products/aisecure.jpg and b/public/assets/products/aisecure.jpg differ diff --git a/public/media/originals/agent-team/real-run-2026-10-19.mp4 b/public/media/originals/agent-team/real-run-2026-10-19.mp4 new file mode 100644 index 0000000..bca4210 Binary files /dev/null and b/public/media/originals/agent-team/real-run-2026-10-19.mp4 differ diff --git a/public/media/originals/manifest.json b/public/media/originals/manifest.json index 221759c..626a024 100644 --- a/public/media/originals/manifest.json +++ b/public/media/originals/manifest.json @@ -274,6 +274,20 @@ "height": 1080 } ] + }, + { + "path": "/media/originals/agent-team/real-run-2026-10-19.mp4", + "bytes": 3553864, + "sha256": "a58ae1a32203aa7442d46553b594247ef42760e0f648dfea0cc674636ee1394c", + "duration": 33.067, + "streams": [ + { + "codec_name": "h264", + "codec_type": "video", + "width": 1440, + "height": 900 + } + ] } ] } diff --git a/src/films.mjs b/src/films.mjs index ea9a279..5c32338 100644 --- a/src/films.mjs +++ b/src/films.mjs @@ -5,8 +5,11 @@ export const recordings = Object.freeze({ genie: 'https://reachmade.com/media/originals/genie/assets/genie-orbit-web.mp4', 'ai-meeting': 'https://reachmade.com/media/originals/ai-meeting/demo.mp4', oathra: 'https://forifor.github.io/oathra/media/oathra-battle-ja.mp4', - aisecure: 'https://forifor.github.io/AISecure/media/intro.mp4', - 'agent-team': 'https://forifor.github.io/Multibot/media/real-walkthrough-ja-silent.mp4', + // Real app, no time compression (AISecure docs/media/demo-build.json). The older intro.mp4 is an animated explainer. + aisecure: 'https://forifor.github.io/AISecure/media/demo-desktop.mp4', + // Current UI (Multibot origin/main be45e96, sidebar and character teammates), replaying a finished real run from the + // repository's evidence (docs/evidence/real-readiness-v18-qwen35-fixed-2026-09-15/01) with no model calls; 1×, silent. + 'agent-team': 'https://reachmade.com/media/originals/agent-team/real-run-2026-10-19.mp4', launchloom: 'https://forifor.github.io/Launchloom/film.mp4', // Introduction film supplied by the owner as 「Jev Studio LP Video.mp4」 (35.5 s, 16:9, silent, sha256 b2d462e9…a0e9), // transcoded for the web. Its studio screens recreate the rc.6 layout and its comments are examples (stated in the film). diff --git a/src/home-flagship.mjs b/src/home-flagship.mjs index 99d614b..e6d27e4 100644 --- a/src/home-flagship.mjs +++ b/src/home-flagship.mjs @@ -92,7 +92,7 @@ export function renderAccess(products, lang) { const QUESTIONS = { ja: [ - ['いますぐ試せますか?', 'プロダクトごとに違います。AI Meetingは登録なしでタスク画面を、Oathraは公開サンプルの照合を、AI Secureは合成データの調査を、Agent TeamとLaunchloomは既存の実行記録と生成済み素材を、そのまま開けます。Genieはローカル設定が必要な開発者プレビューです。星藍ノアはソース非公開のため、YouTubeの配信と解説動画で動きを確かめられます。'], + ['いますぐ試せますか?', 'プロダクトごとに違います。AI Meetingは登録なしでタスク画面を、Oathraは公開サンプルの照合を、Agent TeamとLaunchloomは既存の実行記録と生成済み素材を、そのまま開けます。Genie(開発者プレビュー)とAI Secure(アルファ)は手元での起動が必要です。星藍ノアはソース非公開のため、YouTubeの配信と解説動画で動きを確かめられます。'], ['料金はかかりますか?', 'このサイトの閲覧と、ここから開けるサンプルに費用はかかりません。ライセンスは製品ごとに異なり、Apache-2.0のものと、まだ全体ライセンスを設定していないもの、ソースを公開していないものがあります。外部のAIモデルを使う構成では、その利用料はご自身の契約によります。'], ['導入実績や利用者数は?', '掲載していません。確かめられた事実だけを載せる方針のため、顧客事例・利用者数・性能比較は、検証が済むまで書きません。代わりに、コード、実演の録画、検証資料を公開しています。'], ['入力した内容はどう扱われますか?', '広告・アクセス解析タグと外部フォントは読み込みません。相談フォームの送信内容は同じドメインの受付経路から運営者の受付システムへ保存し、対応にのみ使います。AI・広告・解析サービスへは送りません。'], @@ -100,7 +100,7 @@ const QUESTIONS = { ['動きや音を止められますか?', '自動再生はしません。録画は押したときだけ再生し、音声もその操作で初めて鳴ります。OSの「視差効果を減らす」設定では登場演出を止めます。JavaScriptを無効にしても、全ページの内容とリンクは使えます。'] ], en: [ - ['Can I try it right now?', 'It depends on the product. AI Meeting opens account-free text tasks, Oathra opens a public transcript check, AI Secure opens a synthetic investigation, and Agent Team and Launchloom open existing run records and generated material. Genie is a developer preview that needs local setup. Noa is closed source, so the YouTube stream and explainer video are where you can see it working.'], + ['Can I try it right now?', 'It depends on the product. AI Meeting opens account-free text tasks, Oathra opens a public transcript check, and Agent Team and Launchloom open existing run records and generated material. Genie (developer preview) and AI Secure (alpha) need to be run locally. Noa is closed source, so the YouTube stream and explainer video are where you can see it working.'], ['Does it cost anything?', 'Browsing this site and opening the samples linked here is free. Licenses differ per product: some are Apache-2.0, some have no project-wide license yet, and some are not open source. If a setup uses an external AI model, that usage is billed under your own account.'], ['Do you have customers or user numbers?', 'None are published. Only verified facts are stated here, so customer stories, user counts and performance comparisons stay out until they are verified. What is published instead is the source code, the recordings and the evidence documents.'], ['What happens to what I type?', 'No advertising or analytics tags and no external fonts are loaded. An inquiry is sent through a same-origin route to the operator’s existing intake, stored there, and used only to answer you. It is not sent to an AI, advertising or analytics service.'], diff --git a/src/home-v4-copy.mjs b/src/home-v4-copy.mjs index 9cf2214..2cdd858 100644 --- a/src/home-v4-copy.mjs +++ b/src/home-v4-copy.mjs @@ -14,7 +14,7 @@ export const homeV4Copy = { reelError: '映像を読み込めませんでした。再生ボタンで再試行できます。', recordingNotes: '映像の収録・編集について', recordingNote: n => `公開映像から各約13秒を選び、無音・速度変更なしで編集しています。Launchloomは自身で作った紹介映像です。Genieは開発中の次の版のTaskDockの動きを再現した映像、Oathraはイメージ映像、Agent Teamは未実装の画面を含む設計動画、星藍ノアは画面を再現した紹介映像です。これらは実アプリや配信の実録画ではありません。入力や検証の条件は各製品の「映像と利用条件」で確認できます。${n}つは独立した製品で、自動連携しません。`, - clips: {genie:'呼び出しから結果へ','ai-meeting':'会話からタスクへ',oathra:'会話から証拠へ',aisecure:'兆候から調査へ','agent-team':'依頼から、確かめた版へ',launchloom:'録画から公開素材へ',noa:'管理画面と仕組み'}, + clips: {genie:'呼び出しから結果へ','ai-meeting':'会話からタスクへ',oathra:'会話から証拠へ',aisecure:'入力から判定へ','agent-team':'依頼から、確かめた版へ',launchloom:'録画から公開素材へ',noa:'管理画面と仕組み'}, kinds: {genie:'再現映像(開発中の次の版)',oathra:'イメージ映像(演出を含む)','agent-team':'設計動画(画面は再現・未実装を含む)',launchloom:'Launchloomが作った紹介映像',noa:'紹介映像(画面は再現・演出を含む)'}, clipNotes: { genie:'次の版のTaskDock(開発中)の動きを再現した約13秒の映像です。背景は実アプリの紹介映像から切り出した画面で、データは架空です。実アプリの録画ではありません。確認できる記録は「映像と利用条件」と製品ページにあります。', @@ -22,7 +22,7 @@ export const homeV4Copy = { 'agent-team':'設計ファイルから書き出した設計動画から約13秒を切り出したもので、実アプリの録画ではありません。確認できる記録は「映像と利用条件」と製品ページにあります。' }, setup: '利用条件・セットアップ', setupNote: 'Macとローカル設定が必要', tasks: 'タスク画面を試す', tasksNote: '文字入力のタスク機能は登録不要', - entryNotes: {oathra:'公開サンプルの照合',aisecure:'合成データの調査','agent-team':'既存の実行記録を閲覧',launchloom:'生成済み素材を閲覧',noa:'YouTubeの公開配信・解説を閲覧'}, + entryNotes: {oathra:'公開サンプルの照合',aisecure:'合成サンプルを手元で検査','agent-team':'既存の実行記録を閲覧',launchloom:'生成済み素材を閲覧',noa:'YouTubeの公開配信・解説を閲覧'}, productPage: name => `${name}の製品ページ`, viewProduct: '製品を見る', productDetails: '製品詳細', scope: '映像と利用条件', publishedEvidence: '公開している記録', license: 'ライセンス:', film15: '15秒の紹介映像(演出を含む)', filmLabels: {genie: '30秒の紹介映像(再現・設計プレビューを含む)'}, noaExplainer: '5:48の解説(演出を含む)を見る', nextUi: '次のTaskDockの設計プレビューを見る', nextUiNote: '設計プレビューは未リリースで、実アプリの録画ではありません。', @@ -59,7 +59,7 @@ export const homeV4Copy = { reelError: 'The film could not load. Press play to try again.', recordingNotes: 'About the footage and editing', recordingNote: n => `Each excerpt uses about 13 seconds of a published film, with no sound or playback-speed change. Launchloom made its own introduction film. Genie is a reconstruction of how the next TaskDock, still in development, moves. Oathra is a staged concept film, Agent Team is a design film with some unimplemented screens, and Noa is an introduction film with recreated screens. Those are not recordings of the live apps or stream. Input and evaluation conditions are in each product’s “Footage and conditions”. The ${n} products are independent and do not connect automatically.`, - clips: {genie:'Invocation to result','ai-meeting':'Conversation to tasks',oathra:'Conversation to evidence',aisecure:'Signals to investigation','agent-team':'Request to a checked version',launchloom:'Recording to launch material',noa:'The control room and how it works'}, + clips: {genie:'Invocation to result','ai-meeting':'Conversation to tasks',oathra:'Conversation to evidence',aisecure:'Input to decision','agent-team':'Request to a checked version',launchloom:'Recording to launch material',noa:'The control room and how it works'}, kinds: {genie:'Illustrative reconstruction (next version, in development)',oathra:'Concept film (includes staging)','agent-team':'Design film (recreated screens, partly not implemented)',launchloom:'Introduction film made by Launchloom',noa:'Introduction film (recreated screens and staging)'}, clipNotes: { genie:'About 13 seconds reconstructing how the next TaskDock (in development) moves. The background is a frame cut from the real app’s introduction film and the data is fictional. It is not a recording of the real app. Published evidence is in “Footage and conditions” and on the product page.', @@ -67,7 +67,7 @@ export const homeV4Copy = { 'agent-team':'About 13 seconds from a design film rendered from design files, not a recording of the real app. Published evidence is in “Footage and conditions” and on the product page.' }, setup: 'Setup and requirements', setupNote: 'Requires a Mac and local setup', tasks: 'Try the task screen', tasksNote: 'Text tasks need no sign-up', - entryNotes: {oathra:'Inspect a public sample',aisecure:'Investigate synthetic data','agent-team':'Read an existing run record',launchloom:'View generated material',noa:'Watch the public YouTube stream and explainers'}, + entryNotes: {oathra:'Inspect a public sample',aisecure:'Check a synthetic sample locally','agent-team':'Read an existing run record',launchloom:'View generated material',noa:'Watch the public YouTube stream and explainers'}, productPage: name => `${name} product page`, viewProduct: 'View product', productDetails: 'Product details', scope: 'Footage and conditions', publishedEvidence: 'Published evidence', license: 'License: ', film15: '15-second introduction film (includes motion graphics)', filmLabels: {genie: '30-second introduction film (recreation and design preview)'}, noaExplainer: 'Where to watch the 5:48 explainer (includes staging)', nextUi: 'See the next TaskDock design preview', nextUiNote: 'This design is not released. It is not a recording of the real app.', diff --git a/src/lab-experience.mjs b/src/lab-experience.mjs index dd58c92..aa3a0f3 100644 --- a/src/lab-experience.mjs +++ b/src/lab-experience.mjs @@ -12,7 +12,7 @@ export function art(id,lang){ genie:`
landing-page.md${t('考えを、かたちに。','Make room for ideas.')}${t('下書きを開く','Open draft')} ↗
${t('メモから、次の仕事へ。','A note. A place to start.')}
`, 'ai-meeting':`
✓
${t('料金案を3つ比較','Compare three pricing options')}${t('変更を確認してから残す','Review the change, then keep it')}
`, oathra:`
“${t('はい、金曜日の','Yes, Friday at')}14:00”
00:18${t('発言の根拠','Spoken evidence')}
${t('外部登録は、別に確認。','A system record is a separate check.')}`, - aisecure:`
${t('公開状態の変更','Exposure changed')}01
${t('特権ログイン','Privileged sign-in')}02
${t('ファイルアクセス','File access')}03
${t('観測','OBSERVED')}${t('仮説','HYPOTHESIS')}${t('不明点','UNKNOWN')}
`, + aisecure:`
${t('資料と指示を入力','Document and prompt in')}01
${t('送信せずに検査','Checked without sending')}02
${t('判定をJSONで保存','Decision saved as JSON')}03
${t('保留','HOLD')}${t('根拠ルール','RULE IDS')}${t('検査範囲','COVERAGE')}
`, 'agent-team':`
announcement.mdv2

${t('公開日は確定済みです。','The release date is confirmed.')}

${t('公開日は確認中です。決まり次第ここを更新します。','The release date is still being confirmed; this line updates when it is.')}

${t('レビュー','Review')}${t('未確認の断定を修正。確認待ちを1件残す。','Unverified claim revised. One open check kept.')}
v1${t('レビュー','Review')}v2
`, launchloom:`
16:9Made it.
Show it.
9:16↗
010203
`, noa:`
“${t('ノア、かわいい','Noa, you are cute')}”
${t('コメント','COMMENT')}${t('声と表情','Voice and face')}
${t('ソース非公開。配信で確かめる。','Closed source. Check it on the stream.')}` diff --git a/src/outcome-first.mjs b/src/outcome-first.mjs index 7800c0b..fa5168b 100644 --- a/src/outcome-first.mjs +++ b/src/outcome-first.mjs @@ -27,7 +27,7 @@ const subtitles={ genie:['作業中に呼び出せる、MacのAIアシスタント','An AI assistant for the Mac you’re working on'], 'ai-meeting':['AIキャラクターと話す、ひとり会議','Think out loud with an AI character'], oathra:['AI電話の結果を、相手の発言と照合','Check AI call results against the other party’s words'], - aisecure:['ログをつないで調べる、AIセキュリティ調査','Trace security signals through the logs'], + aisecure:['AIに渡す前に、手元で確かめる','Check before you send to AI'], 'agent-team':['作成・レビュー・修正を分担するAIチーム','AI agents that draft, review and revise'], launchloom:['製品紹介の動画・LP・SNS投稿案をつくる','Videos, pages and posts for your product launch'], noa:['星藍ノア / ゲームも会話も楽しむAIキャラクター','Meet Noa, an AI gamer and streaming character'] @@ -36,7 +36,7 @@ export const DIRECT_STARTS=Object.freeze({ genie:{url:'/media/originals/genie/orbit.html',enUrl:'/media/originals/genie/orbit.html',ja:['実演のHTMLを動かす','保存済みのHTMLを開きます。'],en:['Open the demo HTML','Opens the saved Japanese HTML example.']}, 'ai-meeting':{url:'https://ai-meeting.web.app/#tasks',ja:['登録なしでタスクを試す','文字入力のタスク画面。音声体験は別条件です。'],en:['Try a task without signing up','Japanese text task UI. Voice has separate access conditions.']}, oathra:{url:'https://forifor.github.io/oathra/check.html',ja:['サンプルの根拠を照合する','公開サンプルの検証。電話は発信しません。'],en:['Inspect a sample transcript','Public sample verification. No phone call is placed.']}, - aisecure:{url:'https://forifor.github.io/AISecure/try.html',ja:['合成ログの調査を試す','合成データのデモ。実環境の監視・遮断は行いません。'],en:['Investigate a synthetic case','Synthetic-data demo. No monitoring or enforcement.']}, + aisecure:{url:'https://aisecure.reachmade.com/index.ja.html#start',enUrl:'https://aisecure.reachmade.com/#start',ja:['デモの起動手順を見る','合成サンプルを手元で検査。AIには何も送りません。'],en:['See how to run the demo','A synthetic sample, checked locally. Nothing is sent to AI.']}, 'agent-team':{url:'https://forifor.github.io/Multibot/ja/',enUrl:'https://forifor.github.io/Multibot/',ja:['実モデルの作業記録を見る','過去の実行記録を開きます。新しいAI実行は始まりません。'],en:['Read a real-model work record','An existing run record, not a new AI execution.']}, launchloom:{url:'https://forifor.github.io/Launchloom/ja/',enUrl:'https://forifor.github.io/Launchloom/',ja:['生成済みの素材を開く','既存の作例を閲覧。SNSへの投稿は行いません。'],en:['Open generated launch material','Existing examples. Nothing is published to a social account.']}, noa:{url:'https://youtube.com/channel/UCjX52bV1kfUgSuqf3vv_rTQ',enUrl:'https://youtube.com/channel/UCjX52bV1kfUgSuqf3vv_rTQ',ja:['配信を見る(YouTube)','ソース非公開。配信と動画で動きを確かめられます。'],en:['Open the YouTube channel','Closed source. This link opens Noa’s YouTube channel.']} diff --git a/src/owned-media.mjs b/src/owned-media.mjs index 561d09a..42ae579 100644 --- a/src/owned-media.mjs +++ b/src/owned-media.mjs @@ -8,6 +8,7 @@ const sources = new Set([ '/media/originals/genie/assets/genie-orbit-web.mp4', '/media/originals/ai-meeting/demo.mp4', '/media/originals/noa/lp-film.mp4', + '/media/originals/agent-team/real-run-2026-10-19.mp4', ]); export async function readOwnedRecording(value, { repositoryRoot = root } = {}) { const url = new URL(value); diff --git a/src/premium-film-cuts.mjs b/src/premium-film-cuts.mjs index 14c262f..34c4e3f 100644 --- a/src/premium-film-cuts.mjs +++ b/src/premium-film-cuts.mjs @@ -18,15 +18,18 @@ export const premiumFilmCuts = Object.freeze({ clips: [[6, 11], [13, 20]], label: { ja: '会話から証拠へ', en: 'Conversation to evidence' }, }, + // Real-app recording: typing the sample (from 3 s), the check and the 保留 result (7.5 s), then saving the JSON (17 s). + // The reading pause between the result and the save is cut. aisecure: { - sourceWindow: [0, 14], - clips: [[0, 5], [7, 14]], - label: { ja: '兆候から調査へ', en: 'Signal to investigation' }, + sourceWindow: [3, 20], + clips: [[3, 9], [14, 20]], + label: { ja: '入力から判定へ', en: 'Input to decision' }, }, + // The teammates (3.5 s), then the run's result and its check record (20.5 s). 'agent-team': { - sourceWindow: [5, 19], - clips: [[5, 10], [12, 19]], - label: { ja: '依頼から成果物へ', en: 'Brief to artifact' }, + sourceWindow: [3.5, 27.5], + clips: [[3.5, 8.5], [20.5, 27.5]], + label: { ja: 'チームから確認済みの版へ', en: 'Team to a checked version' }, }, launchloom: { sourceWindow: [3, 17], diff --git a/src/product-art-direction.mjs b/src/product-art-direction.mjs index 8685072..be59675 100644 --- a/src/product-art-direction.mjs +++ b/src/product-art-direction.mjs @@ -15,7 +15,7 @@ export const directions = Object.freeze({ }); const copy = { ja: { - category: {genie:'自分のモデルで使う、MacのAIワークスペース','ai-meeting':'話して動かすタスク管理',oathra:'発言を根拠にする、AI電話の実行基盤',aisecure:'AI利用前の確認と、根拠を辿る調査','agent-team':'Agent Team / Multibot — コードや資料をつくるAI作業アプリ',launchloom:'実録画から、公開前の素材をつくる制作基盤',noa:'コメントに、声と表情で返す配信キャラクター'}, + category: {genie:'自分のモデルで使う、MacのAIワークスペース','ai-meeting':'話して動かすタスク管理',oathra:'発言を根拠にする、AI電話の実行基盤',aisecure:'AIに渡す前に、資料を手元で検査','agent-team':'Agent Team / Multibot — コードや資料をつくるAI作業アプリ',launchloom:'実録画から、公開前の素材をつくる制作基盤',noa:'コメントに、声と表情で返す配信キャラクター'}, scope:'試す前に知っておくこと', cue:'録画の見どころ', sample:'使い方の例 · 実際の発言ログではありません', request:'メモから始める。', requestBody:'何を作りたいかを伝えて、結果を開く。依頼と成果物を、同じ作業場所に。', output:['メモ・依頼','計画・下書き・HTML'], @@ -23,9 +23,9 @@ const copy = { voiceSteps:['話す','変更を確かめる','タスクを残す'], call:'相手は、何と言った?', callBody:'結果から発言まで、同じ画面で辿る。', evidence:[['01','発言','AIの返答ではなく、相手側の言葉。'],['02','条件','日時・金額・確定表現を見比べる。'],['03','判定','会話上の合意と、外部への登録を分ける。']], - pre:'AIへ送る前', preBody:'内容・送信先・操作を確認する。', preLink:'送信前チェックの説明へ', - post:'兆候を調べる', postBody:'観測・仮説・不明点を分ける。', postLink:'調査の録画を見る', - investigation:'ここで見るのは、調査側の実演。', investigationBody:'この録画は合成ログの調査デモです。送信前チェックや実環境の遮断を示すものではありません。', + pre:'送る前に検査', preBody:'資料と指示を、この端末だけで。', preLink:'ワークベンチの説明へ', + post:'理由を残す', postBody:'判定・根拠ルール・検査範囲をJSONで。', postLink:'実アプリの録画を見る', + investigation:'ここで見るのは、実アプリの録画。', investigationBody:'編集できる合成サンプルを、送信せずに検査して保存するまで。', handoff:'書く。読み直す。直す。', roleLabel:'役割の案内 · 実行中の状態ではありません', stageLabel:'ひとつのコメントが通る道', stage:'コメント → 判定 → 声・表情', stageSteps:[['01','返事','Jevが判定して、返事を決める'],['02','声','コハクの声で読み上げる'],['03','見た目','画像を重ねて、表情を動かす']], @@ -36,16 +36,16 @@ const copy = { formats:[['01','横動画','製品を紹介する'],['02','縦動画','モバイルへ届ける'],['03','LP','価値を一ページに'],['04','投稿案','公開前に見直す']] }, en: { - category: {genie:'A Mac AI workspace for your own model','ai-meeting':'Voice-driven task management',oathra:'AI phone calls with evidence-led results',aisecure:'Preflight checks and evidence-led investigation','agent-team':'Agent Team / Multibot — an AI work app for code and documents',launchloom:'A local production workflow, from recording to launch material',noa:'A streaming character who answers comments with voice and expression'}, + category: {genie:'A Mac AI workspace for your own model','ai-meeting':'Voice-driven task management',oathra:'AI phone calls with evidence-led results',aisecure:'Local checks before anything goes to AI','agent-team':'Agent Team / Multibot — an AI work app for code and documents',launchloom:'A local production workflow, from recording to launch material',noa:'A streaming character who answers comments with voice and expression'}, scope:'Before you try it', cue:'WHAT TO LOOK FOR', sample:'Usage example · not an actual conversation log', request:'Watch a note become a draft.', requestBody:'Open the result, copy what you need, and get back to what you were doing.', output:['Notes & requests','Plans, drafts & HTML'], voice:'“Actually, move the email reply to tomorrow.”', voiceBody:'Review the change before it becomes your plan.', voiceSteps:['Speak','Review the change','Keep the task'], call:'What did the other party say?', callBody:'Follow the result back to the words that support it.', evidence:[['01','Words','The other party’s words, not the agent’s claim.'],['02','Terms','Compare dates, amounts and confirmation.'],['03','Result','Separate spoken agreement from external registration.']], - pre:'Before sending to AI',preBody:'Review content, destination and action.',preLink:'Explore preflight checks', - post:'Investigate a signal',postBody:'Separate observations, hypotheses and unknowns.',postLink:'Watch the investigation', - investigation:'This recording shows investigation.',investigationBody:'A synthetic-log investigation demo. It does not demonstrate preflight checks or enforcement in a live environment.', + pre:'Check before sending',preBody:'The document and prompt, on this machine only.',preLink:'About the workbench', + post:'Keep the reasons',postBody:'Decision, rule IDs and coverage as JSON.',postLink:'Watch the real-app recording', + investigation:'This is a real-app recording.',investigationBody:'An editable synthetic sample, checked without sending and saved.', handoff:'Draft. Review. Refine.',roleLabel:'Role guide · not a live execution status', stageLabel:'WHEN A COMMENT COMES IN', stage:'Noa replies. You hear it. Her expression changes.', stageSteps:[['01','A comment','A viewer leaves a message in the stream.'],['02','A reply','Noa responds in a voice you can hear.'],['03','An expression','Her face changes as she speaks.']], @@ -102,8 +102,8 @@ export function artDirectProductHero(html, product, lang) { scene=`
${intro}
${paragraph(t.cue,'ad-label')}

${escapeHTML(t.call)}

${paragraph(t.callBody)}
${film}
`; break; case 'aisecure': { - const preflight=lang==='ja'?'https://forifor.github.io/AISecure/index.ja.html#workbench':'https://forifor.github.io/AISecure/#workbench'; - scene=`
${intro}
${film}
`; + const preflight=lang==='ja'?'https://aisecure.reachmade.com/index.ja.html#workbench':'https://aisecure.reachmade.com/#workbench'; + scene=`
${intro}
${film}
`; break; } case 'agent-team': diff --git a/src/product-landings.mjs b/src/product-landings.mjs index 829287e..3155971 100644 --- a/src/product-landings.mjs +++ b/src/product-landings.mjs @@ -120,32 +120,32 @@ export const landingExperience = Object.freeze({ }, aisecure: { ja: { - title:'このログの前に、何があった?', - lead:'公開状態の変化。特権ログイン。ファイルへのアクセス。別々に見える兆候を、ひとつの調査でたどります。分かったことと、まだ推測のことを分けながら。', - featuresTitle:'出来事のつながりを、ログからたどる。', - flowTitle:'ひとつの警告で、結論を出さない。', - consultTitle:'あなたの現場で、何を調べるべきか。', - primary:['サンプルケースを調べる','https://forifor.github.io/AISecure/try.html'], - secondary:['AI Secureの説明を見る','https://forifor.github.io/AISecure/'], - tryNow:'合成ログから、観測・仮説・不明点が分かれる調査ケースを見る。', - actionNote:'最初のボタンで合成データのブラウザーデモが開きます。実環境の常時監視や遮断には接続しません。', - startTitle:'調査の入口は、3つの兆候。', - startBody:'公開デモは合成データを使うスナップショット分析です。常時監視や遮断ではなく、観測・仮説・不明点を分けて調査する流れを確認できます。', - beats:[['兆候を見る','公開状態、特権ログイン、ファイルアクセスなどの観測を集めます。'],['関連づける','単独の警告ではなく、同じ調査ケースとして根拠をつなぎます。'],['判断を分ける','観測した事実、仮説、まだ分からないことを別の状態で扱います。']] + title:'AIに貼る前に、確かめる。', + lead:'資料と指示を、この端末だけで検査。判定と理由が手元に残ります。', + featuresTitle:'送る前の確認を、手元で。', + flowTitle:'結果は、理由と一緒に。', + consultTitle:'あなたの現場で、何を確かめるべきか。', + primary:['デモの起動手順を見る','https://aisecure.reachmade.com/index.ja.html#start'], + secondary:['AI Secureの説明を見る','https://aisecure.reachmade.com/index.ja.html'], + tryNow:'編集できる合成サンプルを検査し、判定をJSONで保存する。', + actionNote:'デモはPythonで手元に起動します。AIには何も送りません。', + startTitle:'入口は、送る前のひと手間。', + startBody:'デモは合成サンプルで動きます。検出できる範囲は、測定結果として公開しています。', + beats:[['入れる','送る予定の資料と指示を入れます。'],['手元で検査','外部に送らずに、ルールで検査します。'],['理由を残す','判定・根拠ルール・検査範囲をJSONで保存します。']] }, en: { - title:'What happened before this alert?', - lead:'A change in exposure. A privileged login. Access to a file. Follow separate signals through one investigation, keeping what you know distinct from what you suspect.', - featuresTitle:'Follow the connections in the logs.', - flowTitle:'One alert is a starting point.', - consultTitle:'Work out what your team needs to investigate.', - primary:['Investigate a sample case','https://forifor.github.io/AISecure/try.html'], - secondary:['Read about AI Secure','https://forifor.github.io/AISecure/'], - tryNow:'Use synthetic logs to see observations, hypotheses and unknowns separated in one case.', - actionNote:'The first button opens a browser demo on synthetic data. It does not connect to live monitoring or enforcement.', - startTitle:'Three signals. Somewhere to start.', - startBody:'The public demo is snapshot analysis on synthetic data. It demonstrates how observations, hypotheses and unknowns stay distinct; it is not continuous monitoring or enforcement.', - beats:[['Observe','Collect exposure, privileged access and file-activity signals.'],['Correlate','Connect related evidence into one case instead of reading alerts in isolation.'],['Separate judgment','Keep observed facts, hypotheses and unknowns explicitly distinct.']] + title:'Check it before you paste it into AI.', + lead:'The document and prompt are checked on this machine. The decision and its reasons stay with you.', + featuresTitle:'The pre-send check, done locally.', + flowTitle:'Every result comes with its reasons.', + consultTitle:'Work out what your team needs to check.', + primary:['See how to run the demo','https://aisecure.reachmade.com/#start'], + secondary:['Read about AI Secure','https://aisecure.reachmade.com/'], + tryNow:'Check an editable synthetic sample and save the decision as JSON.', + actionNote:'The demo runs locally with Python. Nothing is sent to AI.', + startTitle:'One step before sending.', + startBody:'The demo runs on a synthetic sample. What it can detect is published as a measurement.', + beats:[['Enter','Add the document and the prompt you plan to send.'],['Check locally','Rules check it without sending anything out.'],['Keep the reasons','Save the decision, rule IDs and coverage as JSON.']] } }, 'agent-team': { diff --git a/src/products.mjs b/src/products.mjs index 195adb4..270f2d2 100644 --- a/src/products.mjs +++ b/src/products.mjs @@ -146,42 +146,42 @@ export const products = [ } }, { - id: 'aisecure', name: 'AI Secure', index: '04', category: 'trust', discipline: 'SECURITY & INVESTIGATION', + id: 'aisecure', name: 'AI Secure', index: '04', category: 'trust', discipline: 'SECURITY & PREFLIGHT', repo: 'https://github.com/FORIFOR/AISecure', labSite: 'https://aisecure.reachmade.com/', site: 'https://forifor.github.io/AISecure/', - preview: '/assets/products/aisecure.jpg', previewSource: 'AISecure/docs/screenshots/audit.png', + preview: '/assets/products/aisecure.jpg', previewSource: 'AISecure/docs/media/demo-desktop.mp4', source: 'https://github.com/FORIFOR/AISecure/blob/main/README.md', - evidence: 'https://github.com/FORIFOR/AISecure/blob/main/docs/TUNING.md', - demo: 'https://forifor.github.io/AISecure/try.html', sourceSha: '357abc6d30d32a317be62c738d36550febb08167', + evidence: 'https://github.com/FORIFOR/AISecure/blob/main/docs/security/DETECTION_MEASUREMENT.md', + demo: 'https://aisecure.reachmade.com/index.ja.html#start', sourceSha: 'b8cebc9afbdbd8b6bd0da01bfc397f94e3803292', ja: { - headline: '点のアラートを、調べられる一件に。', demoLabel: '合成ケースを調べる', previewLabel: '調査ケースの画面', - short: '判断の根拠を辿る、ローカル分析プロトタイプ。', - description: '公開状態、特権ログイン、ファイルアクセスを関連づけ、根拠と一緒に調べる。観測したこと、仮説、不明なことを分けて扱います。', - status: '検証用プロトタイプ', license: 'MIT', - outcome: 'ログ → 関連付け → 調査', - scope: 'スナップショット分析です。常時監視、実際の遮断、漏えいの確定は行いません。公開検証は合成データで、本番の性能保証ではありません。', - proof: '合成データを使う操作デモと、単独ルール・相関ルールの比較手順。', - consult: 'ログ取り込みや判断の根拠を扱う設計の試作・評価。独立した本番セキュリティ対策の代替とはしません。', - highlights: [{value:'相関ルール',label:'公開状態・特権ログイン・ファイルアクセスを1件に統合'},{value:'観測 / 仮説 / 不明',label:'根拠のイベントIDを添えて、分けて扱う'},{value:'分析は手元で',label:'デモと分析は外部送信なし。対応実行やOkta連携は設定先へ通信'}], + headline: 'AIに渡す前に、手元で確かめる。', demoLabel: 'デモの起動手順を見る', previewLabel: '送信前の検査画面', + short: 'AIに送る資料を、この端末だけで検査するアルファ版。', + description: 'Excelなどの資料と、一緒に送る予定の指示を、外部に送らずに検査します。判定・理由・検査範囲をJSONで手元に残します。', + status: 'アルファ', license: 'MIT', + outcome: '資料 → 手元で検査 → 判定と理由', + scope: '常時監視や実際の遮断、OCR、端末全体の情報漏えい対策は行いません。自社測定の再現率は0.30で、「検出なし」は安全の証明ではありません。', + proof: '編集できる合成サンプルを検査し、判定をJSONで保存するまでの実アプリ録画と、60件の検出測定。', + consult: 'AIに渡す前の確認や、判定の根拠を残す仕組みの試作・評価。本番のセキュリティ対策の代わりにはしません。', + highlights: [{value:'外部送信なし',label:'検査はこの端末で。デモはAIに何も送りません'},{value:'判定と理由',label:'保留などの判定に、根拠ルールと検査範囲を添える'},{value:'再現率 0.30',label:'60件の自社測定。検出できない種類も公開'}], features: [ - {code:'F-01 / CORRELATION',title:'散らばった警告を1つの調査ケースに',body:'公開状態・特権ログイン・大量の機密ファイルアクセスを1つのルールで結びつけます。公開している比較は合成ログ上のもので、本番の性能保証ではありません。',tags:['相関ルール','単独ルールとの比較','合成データ']}, - {code:'F-02 / REASONING',title:'観測・仮説・不明点を分ける',body:'各所見には元になったイベントIDを付け、観測した事実、推論上の仮説、まだ分からないことを別の状態として保持します。',tags:['根拠のID','仮説を分離','不明点を明示']}, - {code:'F-03 / LOCAL',title:'分析は外部に送らない',body:'デモと分析の経路はローカルかつオフラインで動き、アカウントもテレメトリも要りません。任意の対応実行やOkta監視を設定した場合だけ、その送信先へ通信します。',tags:['ローカル実行','テレメトリなし','任意の連携は別']} + {code:'F-01 / PREFLIGHT',title:'送る前に、この端末で検査',body:'資料の内容と、一緒に送る予定の指示を、外部に送らずに検査します。AIのアカウントやAPIキーは要りません。',tags:['ローカル実行','APIキー不要','合成サンプル']}, + {code:'F-02 / REASONS',title:'判定に、理由と範囲を添える',body:'保留などの判定に、根拠になったルールと、どこまで検査したかを添えます。結果はJSONで保存できます。',tags:['根拠ルール','検査範囲','JSONで保存']}, + {code:'F-03 / MEASURED',title:'見逃しも、測って公開',body:'60件のラベル付きデータで、検出パターンの再現率は0.30でした。マイナンバーやクレジットカード番号など、検出できない種類も公開しています。',tags:['再現率 0.30','60件','限界を公開']} ] }, en: { - headline: 'From scattered alerts to one reviewable case.', demoLabel: 'Inspect a synthetic case', previewLabel: 'Investigation case', - short: 'A local prototype for following the evidence.', - description: 'Connect exposure, privileged access, and file activity. Keep observations, hypotheses, and unknowns distinct as you investigate.', - status: 'Research prototype', license: 'MIT', - outcome: 'Logs → correlation → review', - scope: 'Snapshot analysis, not continuous monitoring or enforcement. It does not confirm exfiltration. Published evaluations use synthetic data, not production performance guarantees.', - proof: 'An interactive synthetic case and reproducible single-rule versus correlation evaluation.', - consult: 'Prototype log ingestion and evidence-aware investigation. Not a replacement for production security controls.', - highlights: [{value:'Correlation rule',label:'Exposure, privileged login and file access become one case'},{value:'Observed / hypothesis / unknown',label:'Each finding keeps its source event IDs and its status'},{value:'Analysis stays local',label:'Demo and analysis send nothing; optional execute or Okta paths talk to what you configure'}], + headline: 'Check before you send to AI.', demoLabel: 'See how to run the demo', previewLabel: 'Pre-send check screen', + short: 'An alpha that checks what you are about to send to AI, on this machine only.', + description: 'Check a spreadsheet or other document, and the prompt you plan to send with it, without sending anything out. The decision, reasons and coverage stay with you as JSON.', + status: 'Alpha', license: 'MIT', + outcome: 'Document → local check → decision and reasons', + scope: 'Not continuous monitoring or actual enforcement, and no OCR or whole-device DLP. Our own measured recall is 0.30, so “no findings” is not proof of safety.', + proof: 'A real-app recording from checking an editable synthetic sample to saving the decision as JSON, and a 60-case detection measurement.', + consult: 'Prototype and evaluate pre-send checks and decision records. Not a replacement for production security controls.', + highlights: [{value:'Nothing sent out',label:'Checks run on this machine; the demo sends nothing to AI'},{value:'Decision and reasons',label:'A hold or other decision comes with its rules and coverage'},{value:'Recall 0.30',label:'Measured on 60 cases, with the misses published'}], features: [ - {code:'F-01 / CORRELATION',title:'Scattered alerts into one case',body:'One rule links exposure, privileged login and large sensitive-file access. The published comparison runs on synthetic logs and is not a production performance guarantee.',tags:['Correlation rule','Single-rule comparison','Synthetic data']}, - {code:'F-02 / REASONING',title:'Observed, hypothesis, unknown',body:'Every finding carries the event IDs it was built from and keeps observed facts, inferred hypotheses and unknowns as separate states.',tags:['Source IDs','Separated hypotheses','Unknowns stay visible']}, - {code:'F-03 / LOCAL',title:'Analysis without egress',body:'The demo and analysis paths run locally and offline with no account and no telemetry. Only the optional execute and Okta-watch paths send data, and only to the endpoints you configure.',tags:['Local run','No telemetry','Optional connectors']} + {code:'F-01 / PREFLIGHT',title:'Checked here, before sending',body:'The document and the prompt you plan to send with it are checked without leaving the machine. No AI account or API key is needed.',tags:['Local run','No API key','Synthetic sample']}, + {code:'F-02 / REASONS',title:'Decisions with reasons and coverage',body:'A hold or other decision lists the rules behind it and how much was checked. Save the result as JSON.',tags:['Rule IDs','Coverage','JSON report']}, + {code:'F-03 / MEASURED',title:'Misses, measured and published',body:'On 60 labelled cases the detection patterns reach recall 0.30. Categories they cannot detect yet, such as Japanese My Number and credit card numbers, are published too.',tags:['Recall 0.30','60 cases','Limits published']} ] } }, diff --git a/src/redesign-copy.mjs b/src/redesign-copy.mjs index 2742388..32e2244 100644 --- a/src/redesign-copy.mjs +++ b/src/redesign-copy.mjs @@ -88,6 +88,7 @@ export const redesignCopy = { }, filmNotes: { 'agent-team': 'Rendered from design files; not a recording of the real app. The request, conversation and checks are fictional examples.', + aisecure: 'Japanese UI and captions. The sample file is synthetic.', }, agentTeamRecording: 'Watch a recording of a real run', stillKind: 'Still image (the recording and film are further down)', filmBelow: 'Still image. Play the recording and the film further down this page', play: name => `Play the ${name} film`, videoFallback: 'This browser cannot play this video.' diff --git a/src/redesign.mjs b/src/redesign.mjs index 595682a..7fff3d1 100644 --- a/src/redesign.mjs +++ b/src/redesign.mjs @@ -330,7 +330,7 @@ function productMain(p, list, lang, {kept, figure, source, filmAnchor}) {

${esc(r.whatItDoes)}

    ${outcome}
${publicViewing(p, lang)} ${oathraExperienceFilm(p, lang)} -
${figure ? `
${figure}
` : filmAnchor ? `${esc(r.filmBelow)} ` : `
${video({...film, label: `${name} — ${kind}`}, lang)}
`}
${esc(r.film(name))}${figure && film.kind === 'recording' ? '' : `${esc(filmAnchor ? r.stillKind : kind)}${figure || filmAnchor ? '' : ` ${esc(note)}`}${extra}`}
+
${figure ? `
${figure}
` : filmAnchor ? `${esc(r.filmBelow)} ` : `
${video({...film, label: `${name} — ${kind}`}, lang)}
`}
${esc(r.film(name))}${figure && film.kind === 'recording' ? (note ? `${esc(note)}` : '') : `${esc(filmAnchor ? r.stillKind : kind)}${figure || filmAnchor ? '' : ` ${esc(note)}`}${extra}`}
${showHighlights ? `

${esc(r.highlights)}

${highlights}
` : ''} ${kept.length ? `

${esc(r.detailKicker)}

${openKept}
` : ''}${foldKept ? `
${esc(r.detailMore)}${foldKept}
` : ''}

${esc(r.features)}

${esc(t.short)}

${source ? source : `

${esc(r.featuresNote(capabilitiesCheckedAt))}

`}
${features}
diff --git a/src/site-content.mjs b/src/site-content.mjs index b6e200f..7262836 100644 --- a/src/site-content.mjs +++ b/src/site-content.mjs @@ -5,7 +5,7 @@ const entries = { genie: { ja: ['https://genie.reachmade.com/ja.html', 'https://reachmade.com/products/genie/demos/#prototype', '操作動画を見る'], en: ['https://genie.reachmade.com/?lang=en', 'https://reachmade.com/en/products/genie/demos/#prototype', 'Watch the workflow'] }, 'ai-meeting': { ja: ['https://reachmade.com/products/ai-meeting/guide/', 'https://ai-meeting.web.app/#tasks', '文字入力でタスクを試す'], en: ['https://reachmade.com/products/ai-meeting/guide/', 'https://ai-meeting.web.app/#tasks', 'Try text tasks (Japanese UI)'] }, oathra: { ja: ['https://oathra.reachmade.com/', 'https://reachmade.com/demos/oathra/', '用途別の構想デモを試す'], en: ['https://oathra.reachmade.com/en/', 'https://oathra.reachmade.com/en/#sim', 'Try the evidence engine'] }, - aisecure: { ja: ['https://aisecure.reachmade.com/index.ja.html', 'https://aisecure.reachmade.com/index.ja.html#case', 'サンプル事例を調べる'], en: ['https://aisecure.reachmade.com/', 'https://aisecure.reachmade.com/#case', 'Inspect a sample case'] }, + aisecure: { ja: ['https://aisecure.reachmade.com/index.ja.html', 'https://aisecure.reachmade.com/index.ja.html#start', 'デモの起動手順を見る'], en: ['https://aisecure.reachmade.com/', 'https://aisecure.reachmade.com/#start', 'See how to run the demo'] }, 'agent-team': { ja: ['https://multibot.reachmade.com/ja/', 'https://multibot.reachmade.com/ja/#guide', '3ステップの使い方を見る'], en: ['https://multibot.reachmade.com/', 'https://multibot.reachmade.com/#workflow', 'See the three-step workflow'] }, launchloom: { ja: ['https://launchloom.reachmade.com/ja/', 'https://launchloom.reachmade.com/ja/#kit', '完成した公開素材を見る'], en: ['https://launchloom.reachmade.com/', 'https://launchloom.reachmade.com/#kit', 'Explore the launch kit'] }, }; @@ -62,7 +62,7 @@ export function productIndex(products, language) { const stories = [ { id: 'oathra', ja: ['AIの「予約できた」だけでは、結果を確定しない。', '相手が保留していても、AIが成功と要約する可能性がある。', '日時・人数・確定の根拠を相手側の発言に結び付ける。', 'ブラウザーの証拠ラボで、返答と判定を一緒に確かめられる。', '会話上の確認は、店舗の予約台帳への登録証明ではない。'], en: ['Do not accept the agent’s “booked” as proof.', 'An agent can summarize success while the other party has only offered to check.', 'Attach dates, party size and confirmation to the other party’s words.', 'Inspect the reply and its verdict together in the browser evidence lab.', 'Spoken confirmation does not prove a booking-system entry.'] }, { id: 'ai-meeting', ja: ['聞き取った変更と、保存したタスクを分ける。', '聞き違えた期限や完了状態を、そのまま保存したくない。', '不確かな変更を提案として確認し、保存済みの状態と区別する。', '公開の操作録画で、会話からタスク変更までを確認できる。', '録画には合成した入力と、一部スクリプトによる操作が含まれる。'], en: ['Separate a proposed change from a saved task.', 'A misheard deadline should not silently become the saved state.', 'Review uncertain changes before they are applied to the task ledger.', 'The published recording shows conversation and task changes together.', 'The recording includes synthetic input and some scripted operations.'] }, - { id: 'aisecure', ja: ['警告を並べるだけでなく、一件として調べる。', '単独の警告だけでは、調べるべき経路を追いにくい。', '公開機器・特権ログイン・ファイル参照を関連付ける。', '観測された事実、仮説、不明な点を分けてサンプルを表示する。', '合成データの結果であり、実環境の検知性能を保証しない。'], en: ['Investigate a case, not a disconnected alert list.', 'An isolated alert does not show the path worth investigating.', 'Connect exposed assets, privileged logins and file access.', 'The sample separates observations, hypotheses and unknowns.', 'Synthetic examples do not establish real-world detection performance.'] }, + { id: 'aisecure', ja: ['AIに渡す前に、手元で確かめる。', '貼り付けた後では、取り消せない。', '資料と指示を、この端末だけで検査する。', '判定・根拠ルール・検査範囲をJSONで残す。', '自社測定の再現率は0.30。「検出なし」は安全の証明ではない。'], en: ['Check before you send to AI.', 'Once pasted, it cannot be taken back.', 'Check the document and prompt on this machine only.', 'Keep the decision, rule IDs and coverage as JSON.', 'Our own measured recall is 0.30; “no findings” is not proof of safety.'] }, ]; export function caseStudies(products, language) { const labels = language === 'ja' ? ['課題', '設計', '確認できるもの', '残る限界'] : ['Problem', 'Design', 'Inspect', 'Limit']; diff --git a/tests/animated-demos.test.mjs b/tests/animated-demos.test.mjs index f20f451..19f5d2f 100644 --- a/tests/animated-demos.test.mjs +++ b/tests/animated-demos.test.mjs @@ -27,7 +27,7 @@ test('unknown product and locale cannot become injected markup',()=>{ }); test('stories retain human approval and unverified boundaries',()=>{ assert.match(renderStory('oathra','en'),/External booking: unverified/); - assert.match(renderStory('aisecure','en'),/HYPOTHESIS · UNCONFIRMED/); + assert.match(renderStory('aisecure','en'),/“No findings” is not proof of safety/); assert.match(renderStory('agent-team','en'),/1 open check/); assert.match(renderStory('launchloom','en'),/Nothing is published/); assert.match(renderStory('ai-meeting','en'),/Confirm change \(demo\)/); diff --git a/tests/lab-experience.test.mjs b/tests/lab-experience.test.mjs index 6faa3b8..e9e5fe4 100644 --- a/tests/lab-experience.test.mjs +++ b/tests/lab-experience.test.mjs @@ -40,7 +40,7 @@ test('sample outputs never assert external success or actual generated media',() assert.match(sampleResult('oathra','en').text,/unverified/); assert.match(sampleResult('ai-meeting','en').text,/actual app: no/); assert.match(sampleResult('launchloom','en').text,/not generated media/); - assert.match(sampleResult('aisecure','en').text,/Hypothesis:/); + assert.match(sampleResult('aisecure','en').text,/would not prove it safe/); assert.match(sampleResult('agent-team','en').text,/Open verification items: 1/); }); test('build extension preserves entrypoints, product pages and is idempotent',async()=>{ diff --git a/tests/product-art-direction.test.mjs b/tests/product-art-direction.test.mjs index a687895..19a0645 100644 --- a/tests/product-art-direction.test.mjs +++ b/tests/product-art-direction.test.mjs @@ -49,13 +49,13 @@ test('replacement tokens in preserved source do not become substitution instruct const html=fixture('genie').replace('Description',()=> 'Price $& $$ $1'); assert.ok(artDirectProductHero(html,{id:'genie'},'ja').includes('Price $& $$ $1')); }); -test('security preflight and archived investigation are labelled separately in both languages',()=>{ +test('AI Secure links its workbench and labels the recording as the real app on a synthetic sample',()=>{ const ja=artDirectProductHero(fixture('aisecure'),{id:'aisecure'},'ja'); const en=artDirectProductHero(fixture('aisecure'),{id:'aisecure'},'en'); - assert.match(ja,/index\.ja\.html#workbench/); - assert.match(ja,/合成ログの調査デモ/); - assert.match(en,/synthetic-log investigation demo/); - assert.match(en,/href="https:\/\/forifor.github.io\/AISecure\/#workbench"/); + assert.match(ja,/href="https:\/\/aisecure\.reachmade\.com\/index\.ja\.html#workbench"/); + assert.match(ja,/実アプリ \/ 合成サンプル/); + assert.match(en,/REAL APP \/ SYNTHETIC SAMPLE/); + assert.match(en,/href="https:\/\/aisecure\.reachmade\.com\/#workbench"/); }); test('usage examples, role guides and output indexes cannot be confused with real execution',()=>{ assert.match(artDirectProductHero(fixture('ai-meeting'),{id:'ai-meeting'},'ja'),/実際の発言ログではありません/);