fix(intelligence): reframe GBP lodging-gap insight as a verify, not a confirmed gap#723
Merged
Conversation
… confirmed gap The gbp-lodging-gap / gbp-listing-discrepancy insights fired at high severity and told operators their hotel "has no structured attributes, populate them" whenever the GBP Lodging API returned an empty resource (populatedGroupCount === 0). That resource is empty by default even for complete hotels: the owner-set "Hotel details" amenity panel (breakfast, wifi, parking, pets, accessibility) writes to a separate attribute surface the Lodging API does not return. So an empty result means "canonry can't read the structured attributes via the API", not "the owner set no amenities". The old copy produced a false negative, telling owners to populate amenities they had already set, and Aero relayed the same wrong advice. Reframe both insights as verify-nudges: - gbp-lodging-gap: high -> low. "Verify the Hotel details panel; if set there, no change needed." - gbp-listing-discrepancy: high -> medium. Places can read amenities the Lodging API can't, so the amenities are likely already set in Hotel details and just not API-readable; ask the operator to confirm. Lowering severity also stops these firing insight.high notifications (they no longer count toward criticalOrHigh), which is correct for a verify. Insights are still persisted and surface in Aero's count. Insight type values are unchanged (no contract break). Updates the two skill references so Aero stops recommending the wrong fix. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…+ MCP #723 reframed the lodging-gap insight, but the old false-positive wording still shipped through two primary operator/agent surfaces: `cnry gbp lodging` printed "EMPTY (AEO gap: no structured amenities...)" and the canonry_gbp_lodging MCP tool description said populatedGroupCount=0 "means an empty profile, an AEO gap". Both reach operators and agents directly. Reframe both (plus the countPopulatedGroups doc comment and a test fixture comment) to match the insight: an empty Lodging API result is common even for complete hotels because the owner-set "Hotel details" amenity panel is a separate surface the API does not expose, so it is a "verify there", not a confirmed gap. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
arberx
added a commit
that referenced
this pull request
Jun 21, 2026
…dled docs #723 reframed the insight + CLI + MCP, but the stale "empty lodging profile is an AEO gap" claim still shipped in the bundled operator docs/skills (canonry-cli.md, data-model.md, SKILL.md, google-business-profile.md), which undercut the exact false-positive framing the PR removes. Reframe all of them to the verify-not-a-gap wording (the Lodging API does not expose the owner-set "Hotel details" amenity panel, so an empty result is common even for complete hotels). Also corrects a lingering "Q&A API HTTP 501" to "retired (2025-11-03)". Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…dled docs #723 reframed the insight + CLI + MCP, but the stale "empty lodging profile is an AEO gap" claim still shipped in the bundled operator docs/skills (canonry-cli.md, data-model.md, SKILL.md, google-business-profile.md), which undercut the exact false-positive framing the PR removes. Reframe all of them to the verify-not-a-gap wording (the Lodging API does not expose the owner-set "Hotel details" amenity panel, so an empty result is common even for complete hotels). Also corrects a lingering "Q&A API HTTP 501" to "retired (2025-11-03)". Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
dcc4af3 to
2684dfe
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
The
gbp-lodging-gapandgbp-listing-discrepancyinsights fired at high severity and told operators their hotel "has no structured attributes, populate them" whenever the GBP Lodging API returned an empty resource (populatedGroupCount === 0).That resource is empty by default even for fully-managed hotels: the owner-facing "Hotel details" amenity panel (breakfast, wifi, parking, pets, accessibility, etc.) writes to a separate attribute surface the GBP Lodging API does not return. The Places API does not expose those owner-set amenities either. So
populatedGroupCount === 0means "canonry can't read the structured attributes via the API", not "the owner set no amenities".The result was a false negative: a hotel with a fully-populated "Hotel details" panel got a high-severity insight (and an
insight.highnotification) telling the owner to populate amenities they had already set, and Aero relayed the same wrong advice.Fix
Reframe both insights as verify-nudges, not confirmed gaps:
gbp-lodging-gapgbp-listing-discrepancyLowering severity also means these stop counting toward
criticalOrHigh, so they no longer fireinsight.highnotifications, which is correct for a verify-nudge. The insights are still persisted and surface incanonry insightsand Aero's wake-up count. The insighttypevalues are unchanged (no contract break).Also updated
Both skill references that describe these insights (
skills/canonry/references/google-business-profile.md,skills/aero/references/regression-playbook.md) so Aero and operators stop reading an empty Lodging API result as proof the hotel set no amenities.Tests
gbp-analyzer.test.ts,intelligence-service-gbp.test.ts, andrun-coordinator.test.tsupdated for the new severities and the verify framing (the lodging-gap no longer counts as critical/high, so the insight-notification callback no longer fires for a low-only result). Full intelligence suite + run-coordinator + skills-install: 552 passing. Typecheck + lint clean. No version bump (85 non-doc lines, under the 100-line threshold).🤖 Generated with Claude Code