Skip to content

fix(intelligence): reframe GBP lodging-gap insight as a verify, not a confirmed gap#723

Merged
arberx merged 3 commits into
mainfrom
fix/gbp-lodging-insight-honesty
Jun 21, 2026
Merged

fix(intelligence): reframe GBP lodging-gap insight as a verify, not a confirmed gap#723
arberx merged 3 commits into
mainfrom
fix/gbp-lodging-insight-honesty

Conversation

@arberx

@arberx arberx commented Jun 21, 2026

Copy link
Copy Markdown
Member

Problem

The gbp-lodging-gap and 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 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 === 0 means "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.high notification) 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:

Insight Severity New framing
gbp-lodging-gap high → low "Verify amenities in the GBP 'Hotel details' panel. If set there, no change needed."
gbp-listing-discrepancy high → medium Places can read amenities the Lodging API can't, so they are likely already set in "Hotel details" and just not API-readable; ask the operator to confirm. Still names the exact amenities.

Lowering severity also means these stop counting toward criticalOrHigh, so they no longer fire insight.high notifications, which is correct for a verify-nudge. The insights are still persisted and surface in canonry insights and Aero's wake-up count. The insight type values 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, and run-coordinator.test.ts updated 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

arberx and others added 2 commits June 21, 2026 21:25
… 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>
@arberx arberx force-pushed the fix/gbp-lodging-insight-honesty branch from dcc4af3 to 2684dfe Compare June 21, 2026 22:55
@arberx arberx merged commit 9214706 into main Jun 21, 2026
4 checks passed
@arberx arberx deleted the fix/gbp-lodging-insight-honesty branch June 21, 2026 23:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant