{"schemaVersion":"kam_public_semantic_interface.v1","generatedFrom":["server/shared/actions/kamTypedActionRegistry.js","server/shared/contracts/kamCapabilityExecutionPlan.js","server/shared/contracts/kamPublicResponseReceipt.js","server/shared/contracts/kamResponseContract.js","src/data/chat-request-cycle.ts"],"capabilities":[{"capabilityId":"kam.cap.sports.board.list.by_date.v1","legacyCapabilityId":"sports.board.by_date","publicName":"Show the daily odds board","plainLanguageDescription":"Load the current or pinned slate for a sport and show sportsbook market prices with source coverage.","requiredInputs":["sport","date"],"optionalInputs":["marketType","bookmaker"],"supportedSources":["sportsbooks"],"possibleStates":["ready_nonempty","ready_empty","not_materialized","stale","blocked"],"responseView":"odds_board","dataPlanes":["materialized_daily_odds_board_view"],"responseContractId":"kam.response.sports.board.daily_odds.v1","receiptType":"kam.receipt.sports.board.daily_odds.v1","typedActions":["kam.act.sports.board.show.v1","kam.act.sports.market.filter.by_bookmaker.v1"],"nextActions":[{"typedActionId":"kam.act.sports.market.switch_market.v1","label":"Open FanDuel moneyline timeline","arguments":{"marketText":"h2h","bookmakerText":"fanduel"}},{"typedActionId":"kam.act.sports.market.compare_polymarket.v1","label":"Compare with Polymarket","arguments":{"marketText":"moneyline","polymarketText":"Polymarket"}}],"expectedResponseFacts":["Sportsbook coverage is stated separately from Polymarket availability.","The active board source and date are visible.","Safety counters and freshness state are visible when available."],"permittedWording":["Polymarket comparison is available when requested.","Other sportsbooks are not loaded in this board packet."],"forbiddenWording":["Polymarket: 0/15 games loaded when matched Polymarket rows exist.","Consensus edge without a receipt proving consensus."],"blockedStateWording":"Daily odds board is not ready for this sport/date, so Kam cannot claim current odds.","publicPath":"/blog/kam-ai-react-native-workspace-architecture"},{"capabilityId":"kam.cap.sports.market.compare_books.v1","legacyCapabilityId":"sports.market.compare_books","publicName":"Compare prices across sportsbooks","plainLanguageDescription":"Compare the same market across available sportsbook prices for a bounded sport/date/market.","requiredInputs":["sport","date","marketType"],"optionalInputs":["bookmaker","game"],"supportedSources":["sportsbooks"],"possibleStates":["ready_nonempty","ready_empty","not_requested","not_materialized","stale","blocked"],"responseView":"compare_books","dataPlanes":["materialized_sportsbook_market_view"],"responseContractId":"kam.response.sports.market.compare_books.v1","receiptType":"kam.receipt.sports.market.compare_books.v1","typedActions":["kam.act.sports.market.compare_books.v1"],"nextActions":[{"typedActionId":"kam.act.sports.market.filter.by_bookmaker.v1","label":"Filter to FanDuel","arguments":{"bookmakerText":"FanDuel","marketText":"moneyline"}},{"typedActionId":"kam.act.sports.game.open.v1","label":"Open one game detail","arguments":{"gameText":"selected game"}}],"expectedResponseFacts":["Requested sportsbooks are listed.","Missing or stale books are named.","A comparison is not rendered when there is no shared market."],"permittedWording":["I can compare loaded sportsbook rows for this market.","This book is missing from the current board packet."],"forbiddenWording":["Best price across all books when only one book was loaded.","No edge without showing which sources were compared."],"blockedStateWording":"Cross-book comparison is blocked until at least two comparable sportsbook rows are ready.","publicPath":"/blog/how-kam-ai-backend-data-becomes-a-better-read"},{"capabilityId":"kam.cap.sports.market.compare_polymarket.v1","legacyCapabilityId":"sports.market.compare_polymarket","publicName":"Compare sportsbooks and Polymarket","plainLanguageDescription":"Compare sportsbook prices with prediction-market prices while keeping sportsbook coverage and Polymarket coverage separate.","requiredInputs":["sport","date","marketType"],"optionalInputs":["bookmaker","game","polymarketMarket"],"supportedSources":["sportsbooks","polymarket"],"possibleStates":["ready_nonempty","available_not_rendered","not_requested","not_materialized","stale","blocked"],"responseView":"market_alignment","dataPlanes":["materialized_cross_market_delta_view"],"responseContractId":"kam.response.sports.market.compare_polymarket.v1","receiptType":"kam.receipt.sports.market.compare_books.v1","typedActions":["kam.act.sports.market.compare_polymarket.v1"],"nextActions":[{"typedActionId":"kam.act.sports.market.compare_polymarket.v1","label":"Render Polymarket comparison","arguments":{"marketText":"moneyline","polymarketText":"Polymarket"}},{"typedActionId":"kam.act.sports.market.switch_market.v1","label":"Open sportsbook timeline","arguments":{"marketText":"h2h","bookmakerText":"fanduel"}}],"expectedResponseFacts":["Sportsbook rows and prediction-market rows are reported separately.","Joined comparison rows are required before deltas are rendered.","Generic sportsbook boards can report availability without rendering the comparison."],"permittedWording":["Polymarket: 15/15 matched games available.","Cross-market comparison is available when requested."],"forbiddenWording":["Polymarket is missing when matched rows are ready.","Cross-market comparison not allowed when the projection is ready."],"blockedStateWording":"Cross-market comparison is incomplete because sportsbook rows and Polymarket rows are not joined in the ready projection.","publicPath":"/blog/how-kam-ai-backend-data-becomes-a-better-read"},{"capabilityId":"kam.cap.sports.schedule.list.by_week.v1","legacyCapabilityId":"sports.schedule.by_week","publicName":"Answer a bounded schedule question","plainLanguageDescription":"Resolve a team, sport, and date window into a schedule count or schedule list.","requiredInputs":["sport","dateWindow"],"optionalInputs":["team","week","homeAway"],"supportedSources":["schedule"],"possibleStates":["ready_nonempty","ready_empty","not_read","stale","blocked"],"responseView":"all_games","dataPlanes":["materialized_schedule_view"],"responseContractId":"kam.response.sports.schedule.list.v1","receiptType":"kam.receipt.chat.turn.public.v1","typedActions":["kam.act.sports.schedule.navigate.by_week.v1"],"nextActions":[{"typedActionId":"kam.act.sports.schedule.navigate.by_week.v1","label":"Show full schedule window","arguments":{"scheduleText":"Yankees June games"}}],"expectedResponseFacts":["Date window is visible.","Team normalization is visible.","Missing schedule rows are named before any count is claimed."],"permittedWording":["I counted the games in the resolved June window.","Schedule data is incomplete for this window."],"forbiddenWording":["A count without a date window.","A count from model memory when schedule data is missing."],"blockedStateWording":"Schedule answer is blocked until the team and date window resolve to schedule rows.","publicPath":"/blog/how-kam-ai-backend-data-becomes-a-better-read"},{"capabilityId":"kam.cap.sports.game.get.detail.v1","legacyCapabilityId":"sports.game.detail","publicName":"Open or resolve game detail","plainLanguageDescription":"Use a selected or resolved game to answer status, score, matchup, and game-detail follow-up questions.","requiredInputs":["sport","game"],"optionalInputs":["date","team","bookmaker"],"supportedSources":["scores","sportsbooks","schedule"],"possibleStates":["ready_nonempty","ready_empty","not_read","stale","blocked"],"responseView":"quick_read","dataPlanes":["materialized_game_detail_view"],"responseContractId":"kam.response.sports.game.detail.v1","receiptType":"kam.receipt.chat.turn.public.v1","typedActions":["kam.act.sports.game.open.v1"],"nextActions":[{"typedActionId":"kam.act.sports.game.open.v1","label":"Open game detail","arguments":{"gameText":"selected game"}}],"expectedResponseFacts":["Game status is final, live, scheduled, postponed, or unavailable.","Teams and date used for lookup are visible.","Unconfirmed final status is called out directly."],"permittedWording":["The score source is not confirmed final.","This game detail is unavailable for the requested scope."],"forbiddenWording":["Final score when the source status is not final.","Game status inferred from priors."],"blockedStateWording":"Game detail is blocked until the game reference resolves to a supported source row.","publicPath":"/blog/how-kam-ai-backend-data-becomes-a-better-read"},{"capabilityId":"kam.cap.workspace.view.switch_view.v1","legacyCapabilityId":"workspace.switch_view","publicName":"Review a workspace or watchlist view","plainLanguageDescription":"Open a workspace view such as watchlist so saved reads can be reviewed with current source state.","requiredInputs":["workspaceId","view"],"optionalInputs":["watchlistName","savedRead"],"supportedSources":["workspace","saved_reads","current_market_data"],"possibleStates":["ready_nonempty","ready_empty","not_read","stale","blocked"],"responseView":"quick_read","dataPlanes":["workspace_saved_read_view"],"responseContractId":"kam.response.workspace.watchlist.review.v1","receiptType":"kam.receipt.chat.turn.public.v1","typedActions":["kam.act.workspace.view.open.v1"],"nextActions":[{"typedActionId":"kam.act.workspace.view.open.v1","label":"Open watchlist","arguments":{"viewText":"watchlist"}}],"expectedResponseFacts":["Saved read and current market state are separated.","Freshness or stale-source state is visible.","The next action is open, refresh, save, wait, or pass."],"permittedWording":["This saved read is stale compared with current market state.","No meaningful movement is available from the current sources."],"forbiddenWording":["Watchlist movement without naming saved-read freshness.","A recommendation without current source state."],"blockedStateWording":"Watchlist review is blocked until the saved workspace view is available.","publicPath":"/blog/how-kam-ai-backend-data-becomes-a-better-read"}]}