[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M69BSRJ7KQX7RGXMK131QS76":3,"skill-same:01M69BSRJ7KQX7RGXMK131QS76":63},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":29,"linkOnly":30,"markdownContent":31,"markdownBody":32,"frontMatter":33,"refName":35,"commitSha":36,"skillDirectory":37,"forksCount":14,"repositoryHtmlUrl":38,"repositoryHomepageUrl":6,"ownerHtmlUrl":39,"ownerBlogUrl":40,"ownerDescription":41,"updatedAt":42,"install":43,"resources":56},"01M69BSRJ7KQX7RGXMK131QS76","caldova-demo6",null,"Preflight, build\u002Fdeploy, run, or reset this repository's Caldova Logistics Demo 6 (Knowledge Hub vector search kept fresh by a HorizonDB AI pipeline, with a live failover step). Use when asked to run, preflight, pre-flight, deploy, build, open, reset, or check Caldova demo 6, the Knowledge Hub, the AI pipeline vector app, or the Caldova failover demo. Includes the Demo 3 preflight (Foundry embedding model and AI extensions) as a prerequisite, but does not run the Demo 3 demo itself.","microsoft\u002Fbobpgdemos","microsoft","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6154722?v=4","01M698VYDXZ6JW5WH3CRV650R8","Microsoft","01M69BSNXCFXGXZ9FADQT531RS",0,"MIT","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fbobpgdemos\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fcaldova-demo6\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",[24,25,26,27,28],"caldova demo6","foundry","deploy","run","caldova demo","2026-11-10 10:12:30",false,"---\nname: caldova-demo6\ndescription: 'Preflight, build\u002Fdeploy, run, or reset this repository''s Caldova Logistics Demo 6 (Knowledge Hub vector search kept fresh by a HorizonDB AI pipeline, with a live failover step). Use when asked to run, preflight, pre-flight, deploy, build, open, reset, or check Caldova demo 6, the Knowledge Hub, the AI pipeline vector app, or the Caldova failover demo. Includes the Demo 3 preflight (Foundry embedding model and AI extensions) as a prerequisite, but does not run the Demo 3 demo itself.'\nargument-hint: 'check | preflight | deploy | run | reset | local'\n---\n\n# Caldova Demo 6: Knowledge Hub\n\nRun this specific demo rather than asking the user to repeat its configuration.\nDo not delegate routine execution. Work in PowerShell from\n`caldovalogistics\\` unless noted. Read the\n[Demo 6 runbook](..\u002F..\u002F..\u002Fcaldovalogistics\u002Fdemo6-vector-app\u002FREADME.md) before\nexecuting anything beyond `check` or `run`.\n\n## Known configuration\n\n| Setting | Value |\n|---|---|\n| Subscription | `AzureSQL_bobward` |\n| Resource group \u002F region | `caldova-logistics-rg` \u002F `westus3` |\n| HorizonDB cluster | `caldova-logistics`, replicas `caldova-logistics-replica-1` and `caldova-logistics-replica-ha` (roles swap on each failover) |\n| Foundry account \u002F embedding alias | `caldova-logistics-ai` \u002F `caldova-embedding` |\n| App Service web app | `caldova-knowledge-hub-d1229495` (plan `caldova-knowledge-hub-d1229495-plan`, P0v3) |\n| App URL | `https:\u002F\u002Fcaldova-knowledge-hub-d1229495.azurewebsites.net\u002F` |\n| Local files (ignored) | `.caldova-connection.json`, `pwd.env`, `.venv\\` in `caldovalogistics\\` |\n| App database role | `knowledge_hub_app` (password `KNOWLEDGE_HUB_APP_PASSWORD` in `pwd.env`) |\n\nThese are defaults, not permission to target something else if they fail.\n\n## Ground rules\n\n- **Present from Azure App Service, not locally.** The App Service app is the\n  demo; only it can run step 5 (failover). Do not start a local copy unless the\n  user explicitly asks for `local`.\n- **Open pages in the user's default browser** with `Start-Process \u003Curl>`.\n  Never use the integrated\u002FVS Code browser tools for this demo.\n- Ask explicit approval before anything billable, public, or destructive:\n  creating\u002Fredeploying the App Service app, `-EnableFailover`, firewall changes,\n  `-ApproveProvisioning`, `-ApproveClusterRestart`, `-ApproveQueryStatsRestart`,\n  `-ResetDatabase`, `-ResetArticles`, forcing a failover, or teardown.\n- Never print passwords, keys, or `pwd.env` values. Scripts read them from\n  `pwd.env` themselves.\n\n## Mode selection\n\n- \"Is demo 6 ready?\" \u002F `check`: section 1 only (read-only).\n- \"Run the demo 6 preflight\" \u002F `preflight`: sections 1–2.\n- \"Deploy \u002F build demo 6\" \u002F `deploy`: sections 1–3.\n- \"Run \u002F open demo 6\" \u002F `run`: section 1, then section 4. Run preflight or\n  deploy only if `check` finds a problem, and ask first.\n- \"Reset demo 6\" \u002F `reset`: section 5.\n- \"Run demo 6 locally\" \u002F `local`: section 6.\n\n## 1. Check (read-only)\n\nRun these and report pass\u002Ffail for each; change nothing.\n\n```powershell\nforeach ($p in '.caldova-connection.json', '.venv\\Scripts\\python.exe', 'pwd.env') { '{0}: {1}' -f $p, (Test-Path $p) }\nSelect-String -Path pwd.env -Pattern '^\\s*KNOWLEDGE_HUB_APP_PASSWORD=' -Quiet\naz account show --query \"{name:name,user:user.name}\" -o table\naz horizondb firewall-rule list -g caldova-logistics-rg --cluster-name caldova-logistics --subscription AzureSQL_bobward `\n  --query \"[].{name:name,start:properties.startIpAddress}\" -o table\n(Invoke-RestMethod 'https:\u002F\u002Fapi.ipify.org?format=json').ip\n$a = 'caldova-knowledge-hub-d1229495'; $g = 'caldova-logistics-rg'\naz webapp show -n $a -g $g --query \"{state:state,host:defaultHostName}\" -o table\naz webapp config appsettings list -n $a -g $g --query \"[?name=='KNOWLEDGE_HUB_CLUSTER_ID'] | length(@)\" -o tsv\n$u = \"https:\u002F\u002F$a.azurewebsites.net\"\nInvoke-RestMethod \"$u\u002Fhealth\" -TimeoutSec 180\nInvoke-RestMethod \"$u\u002Fapi\u002Fcluster\"\n```\n\nReady means: local files exist; the `allow-azure-services` (`0.0.0.0`) rule\nexists; the app is `Running`; `\u002Fhealth` is `ok`; `\u002Fapi\u002Fcluster` reports\n`failover_enabled: true`. The first request after a deploy or restart can take\n2–3 minutes. A missing client-IP rule only matters for scripts run from this\nmachine (preflight, reset, local); the App Service app reaches HorizonDB\nthrough the Azure-services rule.\n\nAlso confirm the walkthrough article is not left over from a rehearsal:\n\n```powershell\n$s = Invoke-RestMethod \"$u\u002Fapi\u002Fsearch?q=frozen%20CO2%20on%20passenger%20flights&mode=hybrid\"\n$s.results | Where-Object title -eq 'Dry ice in air shipments'\n```\n\nIf it is present, offer `reset` (section 5) before the user presents, because\nstep 2 of the walkthrough adds that article as new.\n\n## 2. Preflight\n\nRun the prerequisites in order, stopping at the first failure. Each is\nidempotent but **not** read-only.\n\n1. **Parent Caldova preflight** — only when `.caldova-connection.json`,\n   `.venv`, or `pwd.env` is missing, or the user asks. It always runs\n   `02-add-firewall-rule.ps1` (adds a `client-\u003Cip>` rule and ensures\n   `allow-azure-services`), and also requires pgbench 17+ for Demo 5. Ask\n   approval for the firewall change first:\n\n   ```powershell\n   .\\scripts\\00-preflight.ps1 -Subscription AzureSQL_bobward\n   ```\n\n   If the only problem is that this machine's IP is not allowed, prefer\n   (with approval) `.\\scripts\\02-add-firewall-rule.ps1 -Subscription AzureSQL_bobward`.\n\n2. **Demo 3 preflight (prerequisite only)** — ensures the Foundry\n   `caldova-embedding` deployment, the `vector`, `pg_diskann`, `pg_textsearch`,\n   `azure_ai`, and `pg_durable` extensions, and the AI pipeline parameter group.\n   It (re)runs the Demo 3 sample pipeline, which makes billed embedding calls.\n\n   ```powershell\n   .\\demo3-ai-pipeline\\scripts\\00-preflight.ps1 -Subscription AzureSQL_bobward\n   ```\n\n   If it asks for `-ApproveProvisioning` (missing Foundry resources) or\n   `-ApproveClusterRestart` (parameter group not attached), stop and ask; the\n   restart interrupts every Caldova demo. Do not run the Demo 3 walkthrough.\n\n3. **Demo 6 preflight** — builds the `knowledge_hub` schema, the `on_change`\n   pipeline, seed articles, the 16-part failover handbook, and the\n   `knowledge_hub_app` role, checks `azure_ai` is 2.3.2+, and waits until every\n   article is searchable:\n\n   ```powershell\n   .\\demo6-vector-app\\scripts\\00-preflight.ps1\n   ```\n\n   Expect `Ready: True`, `Articles: 28\u002F28 searchable` (12 seed + 16 handbook\n   parts), and all chunks embedded. If `azure_ai` is older than 2.3.2, report\n   it; the fix (`ALTER EXTENSION azure_ai UPDATE TO '2.3.2';`) has no downgrade\n   path, so ask first.\n\n## 3. Build \u002F deploy to App Service\n\nIf section 1 shows the app exists, is running, and has failover enabled, do\n**not** redeploy unless the user asks or `src\u002F` changed since the last deploy.\n\nOtherwise, with explicit approval (billable P0v3 plan; public app with no\nsign-in; the app's identity gets Contributor on the cluster):\n\n```powershell\n.\\demo6-vector-app\\scripts\\02-deploy-appservice.ps1 -AppName caldova-knowledge-hub-d1229495 -EnableFailover\n```\n\nReuse this app name; do not create a second app. `-AllowedIpAddress` restricts\naccess but the presenter network may reach Azure from a different address, so\nonly add it if the user asks and then confirm they can still open the site.\nAfter deploying, rerun the section 1 checks.\n\nFailover needs the HA standby replica. Check it read-only before promising\nstep 5:\n\n```powershell\n$sub = az account show --subscription AzureSQL_bobward --query id -o tsv\naz rest --method GET --uri \"https:\u002F\u002Fmanagement.azure.com\u002Fsubscriptions\u002F$sub\u002FresourceGroups\u002Fcaldova-logistics-rg\u002Fproviders\u002FMicrosoft.HorizonDB\u002Fclusters\u002Fcaldova-logistics\u002Fpools\u002FDefaultPool\u002Freplicas?api-version=2026-01-20-preview\" `\n  --query \"value[].{name:name,role:properties.role,zone:properties.availabilityZone}\" -o table\n```\n\nExpect one `ReadWrite` and at least one `Read` replica; which one is primary\nchanges after every failover. `\u002Fapi\u002Fcluster` `failover_ready_in` is the number\nof seconds until the next failover is allowed.\n\n## 4. Run\n\nMake sure section 1 passes, then open the app in the default browser:\n\n```powershell\nStart-Process 'https:\u002F\u002Fcaldova-knowledge-hub-d1229495.azurewebsites.net\u002F'\n```\n\n`\u002F` is the step-by-step walkthrough (search → add *Dry ice in air shipments* →\nauto-search → search again → **⚡ Update the handbook and fail over**). `\u002Fapp`\nis the full app for the 5-minute demo script in the runbook. Remind the user:\none failover every 5 minutes, and the app is public with no sign-in.\n\nTo force a failover from a terminal instead of the button (asks to confirm):\n\n```powershell\n.\\demo6-vector-app\\scripts\\03-force-failover.ps1\n```\n\n## 5. Reset articles\n\nWith approval (re-embeds changed rows; small billed embedding cost):\n\n```powershell\n.\\demo6-vector-app\\scripts\\00-preflight.ps1 -ResetArticles\n```\n\nThen confirm `Dry ice in air shipments` no longer appears in search (section 1).\nThe in-app **Reset demo** button on `\u002Fapp` does the same for articles.\n\nIf preflight fails with `extension \"vector\" is not allow-listed`, the primary\nis `caldova-logistics-replica-ha`, which does not apply the cluster's parameter\ngroup (empty `azure.extensions`, no `pgaadauth`; the parameter group itself is\ncorrect, and a restart or re-applying it with `az horizondb update` does not\nhelp). The extensions are already installed, so the app, pipeline, and\nfailover still work. Either fail back to `replica-1` with approval\n(`03-force-failover.ps1`, about 15 s), or reset through the app instead, which\nonly calls `knowledge_hub.reset_demo()` (restores the 12 seed articles and the\n16 handbook parts) and creates no extensions:\n\n```powershell\n$u = 'https:\u002F\u002Fcaldova-knowledge-hub-d1229495.azurewebsites.net'\nInvoke-WebRequest \"$u\u002Freset\" -Method Post -UseBasicParsing -MaximumRedirection 0 -SkipHttpErrorCheck\n```\n\nA `303` to `\u002Fapp` means success; a redirect to `\u002F?error=...` means it failed.\nReport the allow-list mismatch to the user; do not restart the cluster, fail\nover, or recreate the replica to fix it without approval.\n\n## 6. Local (only when explicitly asked)\n\nLocal runs cannot fail over. Start it detached so an interrupted tool call does\nnot kill it, verify, then open it in the default browser:\n\n```powershell\n.\\demo6-vector-app\\scripts\\01-run-local.ps1 -Port 8020   # run with detach\nInvoke-RestMethod http:\u002F\u002F127.0.0.1:8020\u002Fhealth\nStart-Process 'http:\u002F\u002F127.0.0.1:8020\u002F'\n```\n\nTell the user the process ID and stop it when they are done.\n\n## After the event\n\nNot part of the default modes; mention it and ask before running anything:\nremove the web app's Contributor role assignment on the cluster, remove the\nextra HA replica (doubles compute cost; Azure portal → High availability →\nDisabled), and optionally run\n`.\\demo6-vector-app\\scripts\\99-teardown.ps1 -AppName caldova-knowledge-hub-d1229495`\n(drops the Knowledge Hub schema, pipeline, and role, and deletes the app and plan).\n","# Caldova Demo 6: Knowledge Hub\n\nRun this specific demo rather than asking the user to repeat its configuration.\nDo not delegate routine execution. Work in PowerShell from\n`caldovalogistics\\` unless noted. Read the\n[Demo 6 runbook](..\u002F..\u002F..\u002Fcaldovalogistics\u002Fdemo6-vector-app\u002FREADME.md) before\nexecuting anything beyond `check` or `run`.\n\n## Known configuration\n\n| Setting | Value |\n|---|---|\n| Subscription | `AzureSQL_bobward` |\n| Resource group \u002F region | `caldova-logistics-rg` \u002F `westus3` |\n| HorizonDB cluster | `caldova-logistics`, replicas `caldova-logistics-replica-1` and `caldova-logistics-replica-ha` (roles swap on each failover) |\n| Foundry account \u002F embedding alias | `caldova-logistics-ai` \u002F `caldova-embedding` |\n| App Service web app | `caldova-knowledge-hub-d1229495` (plan `caldova-knowledge-hub-d1229495-plan`, P0v3) |\n| App URL | `https:\u002F\u002Fcaldova-knowledge-hub-d1229495.azurewebsites.net\u002F` |\n| Local files (ignored) | `.caldova-connection.json`, `pwd.env`, `.venv\\` in `caldovalogistics\\` |\n| App database role | `knowledge_hub_app` (password `KNOWLEDGE_HUB_APP_PASSWORD` in `pwd.env`) |\n\nThese are defaults, not permission to target something else if they fail.\n\n## Ground rules\n\n- **Present from Azure App Service, not locally.** The App Service app is the\n  demo; only it can run step 5 (failover). Do not start a local copy unless the\n  user explicitly asks for `local`.\n- **Open pages in the user's default browser** with `Start-Process \u003Curl>`.\n  Never use the integrated\u002FVS Code browser tools for this demo.\n- Ask explicit approval before anything billable, public, or destructive:\n  creating\u002Fredeploying the App Service app, `-EnableFailover`, firewall changes,\n  `-ApproveProvisioning`, `-ApproveClusterRestart`, `-ApproveQueryStatsRestart`,\n  `-ResetDatabase`, `-ResetArticles`, forcing a failover, or teardown.\n- Never print passwords, keys, or `pwd.env` values. Scripts read them from\n  `pwd.env` themselves.\n\n## Mode selection\n\n- \"Is demo 6 ready?\" \u002F `check`: section 1 only (read-only).\n- \"Run the demo 6 preflight\" \u002F `preflight`: sections 1–2.\n- \"Deploy \u002F build demo 6\" \u002F `deploy`: sections 1–3.\n- \"Run \u002F open demo 6\" \u002F `run`: section 1, then section 4. Run preflight or\n  deploy only if `check` finds a problem, and ask first.\n- \"Reset demo 6\" \u002F `reset`: section 5.\n- \"Run demo 6 locally\" \u002F `local`: section 6.\n\n## 1. Check (read-only)\n\nRun these and report pass\u002Ffail for each; change nothing.\n\n```powershell\nforeach ($p in '.caldova-connection.json', '.venv\\Scripts\\python.exe', 'pwd.env') { '{0}: {1}' -f $p, (Test-Path $p) }\nSelect-String -Path pwd.env -Pattern '^\\s*KNOWLEDGE_HUB_APP_PASSWORD=' -Quiet\naz account show --query \"{name:name,user:user.name}\" -o table\naz horizondb firewall-rule list -g caldova-logistics-rg --cluster-name caldova-logistics --subscription AzureSQL_bobward `\n  --query \"[].{name:name,start:properties.startIpAddress}\" -o table\n(Invoke-RestMethod 'https:\u002F\u002Fapi.ipify.org?format=json').ip\n$a = 'caldova-knowledge-hub-d1229495'; $g = 'caldova-logistics-rg'\naz webapp show -n $a -g $g --query \"{state:state,host:defaultHostName}\" -o table\naz webapp config appsettings list -n $a -g $g --query \"[?name=='KNOWLEDGE_HUB_CLUSTER_ID'] | length(@)\" -o tsv\n$u = \"https:\u002F\u002F$a.azurewebsites.net\"\nInvoke-RestMethod \"$u\u002Fhealth\" -TimeoutSec 180\nInvoke-RestMethod \"$u\u002Fapi\u002Fcluster\"\n```\n\nReady means: local files exist; the `allow-azure-services` (`0.0.0.0`) rule\nexists; the app is `Running`; `\u002Fhealth` is `ok`; `\u002Fapi\u002Fcluster` reports\n`failover_enabled: true`. The first request after a deploy or restart can take\n2–3 minutes. A missing client-IP rule only matters for scripts run from this\nmachine (preflight, reset, local); the App Service app reaches HorizonDB\nthrough the Azure-services rule.\n\nAlso confirm the walkthrough article is not left over from a rehearsal:\n\n```powershell\n$s = Invoke-RestMethod \"$u\u002Fapi\u002Fsearch?q=frozen%20CO2%20on%20passenger%20flights&mode=hybrid\"\n$s.results | Where-Object title -eq 'Dry ice in air shipments'\n```\n\nIf it is present, offer `reset` (section 5) before the user presents, because\nstep 2 of the walkthrough adds that article as new.\n\n## 2. Preflight\n\nRun the prerequisites in order, stopping at the first failure. Each is\nidempotent but **not** read-only.\n\n1. **Parent Caldova preflight** — only when `.caldova-connection.json`,\n   `.venv`, or `pwd.env` is missing, or the user asks. It always runs\n   `02-add-firewall-rule.ps1` (adds a `client-\u003Cip>` rule and ensures\n   `allow-azure-services`), and also requires pgbench 17+ for Demo 5. Ask\n   approval for the firewall change first:\n\n   ```powershell\n   .\\scripts\\00-preflight.ps1 -Subscription AzureSQL_bobward\n   ```\n\n   If the only problem is that this machine's IP is not allowed, prefer\n   (with approval) `.\\scripts\\02-add-firewall-rule.ps1 -Subscription AzureSQL_bobward`.\n\n2. **Demo 3 preflight (prerequisite only)** — ensures the Foundry\n   `caldova-embedding` deployment, the `vector`, `pg_diskann`, `pg_textsearch`,\n   `azure_ai`, and `pg_durable` extensions, and the AI pipeline parameter group.\n   It (re)runs the Demo 3 sample pipeline, which makes billed embedding calls.\n\n   ```powershell\n   .\\demo3-ai-pipeline\\scripts\\00-preflight.ps1 -Subscription AzureSQL_bobward\n   ```\n\n   If it asks for `-ApproveProvisioning` (missing Foundry resources) or\n   `-ApproveClusterRestart` (parameter group not attached), stop and ask; the\n   restart interrupts every Caldova demo. Do not run the Demo 3 walkthrough.\n\n3. **Demo 6 preflight** — builds the `knowledge_hub` schema, the `on_change`\n   pipeline, seed articles, the 16-part failover handbook, and the\n   `knowledge_hub_app` role, checks `azure_ai` is 2.3.2+, and waits until every\n   article is searchable:\n\n   ```powershell\n   .\\demo6-vector-app\\scripts\\00-preflight.ps1\n   ```\n\n   Expect `Ready: True`, `Articles: 28\u002F28 searchable` (12 seed + 16 handbook\n   parts), and all chunks embedded. If `azure_ai` is older than 2.3.2, report\n   it; the fix (`ALTER EXTENSION azure_ai UPDATE TO '2.3.2';`) has no downgrade\n   path, so ask first.\n\n## 3. Build \u002F deploy to App Service\n\nIf section 1 shows the app exists, is running, and has failover enabled, do\n**not** redeploy unless the user asks or `src\u002F` changed since the last deploy.\n\nOtherwise, with explicit approval (billable P0v3 plan; public app with no\nsign-in; the app's identity gets Contributor on the cluster):\n\n```powershell\n.\\demo6-vector-app\\scripts\\02-deploy-appservice.ps1 -AppName caldova-knowledge-hub-d1229495 -EnableFailover\n```\n\nReuse this app name; do not create a second app. `-AllowedIpAddress` restricts\naccess but the presenter network may reach Azure from a different address, so\nonly add it if the user asks and then confirm they can still open the site.\nAfter deploying, rerun the section 1 checks.\n\nFailover needs the HA standby replica. Check it read-only before promising\nstep 5:\n\n```powershell\n$sub = az account show --subscription AzureSQL_bobward --query id -o tsv\naz rest --method GET --uri \"https:\u002F\u002Fmanagement.azure.com\u002Fsubscriptions\u002F$sub\u002FresourceGroups\u002Fcaldova-logistics-rg\u002Fproviders\u002FMicrosoft.HorizonDB\u002Fclusters\u002Fcaldova-logistics\u002Fpools\u002FDefaultPool\u002Freplicas?api-version=2026-01-20-preview\" `\n  --query \"value[].{name:name,role:properties.role,zone:properties.availabilityZone}\" -o table\n```\n\nExpect one `ReadWrite` and at least one `Read` replica; which one is primary\nchanges after every failover. `\u002Fapi\u002Fcluster` `failover_ready_in` is the number\nof seconds until the next failover is allowed.\n\n## 4. Run\n\nMake sure section 1 passes, then open the app in the default browser:\n\n```powershell\nStart-Process 'https:\u002F\u002Fcaldova-knowledge-hub-d1229495.azurewebsites.net\u002F'\n```\n\n`\u002F` is the step-by-step walkthrough (search → add *Dry ice in air shipments* →\nauto-search → search again → **⚡ Update the handbook and fail over**). `\u002Fapp`\nis the full app for the 5-minute demo script in the runbook. Remind the user:\none failover every 5 minutes, and the app is public with no sign-in.\n\nTo force a failover from a terminal instead of the button (asks to confirm):\n\n```powershell\n.\\demo6-vector-app\\scripts\\03-force-failover.ps1\n```\n\n## 5. Reset articles\n\nWith approval (re-embeds changed rows; small billed embedding cost):\n\n```powershell\n.\\demo6-vector-app\\scripts\\00-preflight.ps1 -ResetArticles\n```\n\nThen confirm `Dry ice in air shipments` no longer appears in search (section 1).\nThe in-app **Reset demo** button on `\u002Fapp` does the same for articles.\n\nIf preflight fails with `extension \"vector\" is not allow-listed`, the primary\nis `caldova-logistics-replica-ha`, which does not apply the cluster's parameter\ngroup (empty `azure.extensions`, no `pgaadauth`; the parameter group itself is\ncorrect, and a restart or re-applying it with `az horizondb update` does not\nhelp). The extensions are already installed, so the app, pipeline, and\nfailover still work. Either fail back to `replica-1` with approval\n(`03-force-failover.ps1`, about 15 s), or reset through the app instead, which\nonly calls `knowledge_hub.reset_demo()` (restores the 12 seed articles and the\n16 handbook parts) and creates no extensions:\n\n```powershell\n$u = 'https:\u002F\u002Fcaldova-knowledge-hub-d1229495.azurewebsites.net'\nInvoke-WebRequest \"$u\u002Freset\" -Method Post -UseBasicParsing -MaximumRedirection 0 -SkipHttpErrorCheck\n```\n\nA `303` to `\u002Fapp` means success; a redirect to `\u002F?error=...` means it failed.\nReport the allow-list mismatch to the user; do not restart the cluster, fail\nover, or recreate the replica to fix it without approval.\n\n## 6. Local (only when explicitly asked)\n\nLocal runs cannot fail over. Start it detached so an interrupted tool call does\nnot kill it, verify, then open it in the default browser:\n\n```powershell\n.\\demo6-vector-app\\scripts\\01-run-local.ps1 -Port 8020   # run with detach\nInvoke-RestMethod http:\u002F\u002F127.0.0.1:8020\u002Fhealth\nStart-Process 'http:\u002F\u002F127.0.0.1:8020\u002F'\n```\n\nTell the user the process ID and stop it when they are done.\n\n## After the event\n\nNot part of the default modes; mention it and ask before running anything:\nremove the web app's Contributor role assignment on the cluster, remove the\nextra HA replica (doubles compute cost; Azure portal → High availability →\nDisabled), and optionally run\n`.\\demo6-vector-app\\scripts\\99-teardown.ps1 -AppName caldova-knowledge-hub-d1229495`\n(drops the Knowledge Hub schema, pipeline, and role, and deletes the app and plan).\n",{"name":5,"description":7,"argument-hint":34},"check | preflight | deploy | run | reset | local","main","890174684faeec2700194a538e3ad7d1bd67aad3",".github\u002Fskills\u002Fcaldova-demo6","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fbobpgdemos","https:\u002F\u002Fgithub.com\u002Fmicrosoft","https:\u002F\u002Fopensource.microsoft.com","Open source projects and samples from Microsoft","2026-11-01 06:13:38",{"source":8,"skillName":5,"commands":44,"prompt":54,"zipAvailable":55},[45,48,51],{"tool":46,"command":47},"npx","npx skills add microsoft\u002Fbobpgdemos --skill caldova-demo6",{"tool":49,"command":50},"bunx","bunx skills add microsoft\u002Fbobpgdemos --skill caldova-demo6",{"tool":52,"command":53},"pnpm","pnpm dlx skills add microsoft\u002Fbobpgdemos --skill caldova-demo6","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fbobpgdemos\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fcaldova-demo6\u002FSKILL.md",true,[57],{"path":58,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":61,"sourceHtmlUrl":62},"agents\u002Fopenai.yaml","REFERENCE","参考文档",146,"https:\u002F\u002Fgithub.com\u002Fagross\u002Fdotfiles\u002Fblob\u002Fmaster\u002Fagents\u002Fagents\u002Fskills\u002Fto-tickets\u002Fagents\u002Fopenai.yaml",[64,77],{"skillNo":65,"name":66,"nameZh":6,"description":67,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":73,"publishedAt":29},"01M69BSVMF814QA7227HKB2EFS","local-postgres-to-azure","Provision Azure Database for PostgreSQL Flexible Server and migrate a local PostgreSQL database using Azure CLI, pg_dump, and pg_restore. Use when asked to migrate the local campsite database to Azure, move local PostgreSQL to the cloud, or verify a PostgreSQL migration. Requires explicit approval before Azure changes; does not deploy an application.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fbobpgdemos\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Flocal-postgres-to-azure\u002FSKILL.md",[70],{"categoryNo":71,"categoryName":72,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口",[74,75,76,26],"azure","local postgres to azure","cli",{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":29},"01M69BST2HRKZ8ZT2FV4CXQMT8","campsite-demo","Run or explain this repository's specific campsite PostgreSQL portability demo. Use when asked to run the campsite demo, run the local campsite or campsites demo, explain the local demo, find your next escape, run campsite preflight or pre-flight, refresh the campsite demo client IP, prepare the campsite migration demo, or demonstrate local PostgreSQL to Azure Flexible Server. Local mode demonstrates PostGIS, full-text search, JSONB, typo tolerance, and availability without Azure access. Cloud mode checks exact versions, uses Entra and verified TLS, and gates firewall changes and migrations separately.","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fbobpgdemos\u002Fblob\u002Fmain\u002F.github\u002Fskills\u002Fcampsite-demo\u002FSKILL.md",[],[84,85,74,27],"campsite demo","prepare"]