{"schemaVersion":"kam_public_semantic_interface.v1","states":[{"state":"ready_nonempty","meaning":"Read succeeded and returned rows.","userInterpretation":"Kam can make bounded claims from the returned rows and should show source state."},{"state":"ready_empty","meaning":"Read succeeded and certified zero rows.","userInterpretation":"Empty is a real result only when the read path certifies zero rows."},{"state":"not_read","meaning":"Kam did not complete the source read.","userInterpretation":"Do not interpret absence of a table as absence of data."},{"state":"not_requested","meaning":"The current request did not ask for this source.","userInterpretation":"The source may exist, but it was outside the active response scope."},{"state":"not_materialized","meaning":"Source data may exist, but the product projection is not ready.","userInterpretation":"Kam should block or explain the missing projection instead of guessing."},{"state":"available_not_rendered","meaning":"Data is ready but outside the current response scope.","userInterpretation":"Kam can say it is available and offer a next action to render it."},{"state":"stale","meaning":"Data exists but is outside its freshness policy.","userInterpretation":"Kam can explain stale state, but should not present it as current."},{"state":"blocked","meaning":"The current route cannot safely make the claim.","userInterpretation":"Kam should say what is blocked and what input or materialization would unblock it."}],"responseThreadSequence":[{"itemType":"userMessage","userVisible":"Yes","job":"The exact prompt the user sent or selected from a quick prompt tile."},{"itemType":"agentProgress","userVisible":"Yes","job":"Lifecycle labels such as Choosing route, Reading sources, Preparing structured response, and Writing answer."},{"itemType":"readModel","userVisible":"When relevant","job":"The durable read model or blocked state that backs the answer."},{"itemType":"toolCall","userVisible":"When relevant","job":"The tool or source read used to load board rows, schedules, scores, or saved reads."},{"itemType":"structuredResponse","userVisible":"Rendered as UI","job":"A typed result such as a sports games table, market board, chart packet, or action card."},{"itemType":"agentMessage","userVisible":"Yes","job":"The final explanation in plain language. Streaming deltas update the active assistant item."},{"itemType":"reasoning","userVisible":"When enabled","job":"A separate trace-style item for checked state, caveats, and verification notes."},{"itemType":"artifact","userVisible":"When created","job":"A saved table, board, report, chart, watch item, or action artifact."},{"itemType":"receipt","userVisible":"When available","job":"Source receipts, workflow receipts, freshness state, and next transitions."},{"itemType":"decision","userVisible":"When needed","job":"A route, blocked-state, approval, or next-action decision."}],"contracts":[{"responseContractId":"kam.response.sports.board.daily_odds.v1","capabilityId":"kam.cap.sports.board.list.by_date.v1","responseView":"odds_board","dataPlanes":["materialized_daily_odds_board_view"],"possibleStates":["ready_nonempty","ready_empty","not_materialized","stale","blocked"],"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."},{"responseContractId":"kam.response.sports.market.compare_books.v1","capabilityId":"kam.cap.sports.market.compare_books.v1","responseView":"compare_books","dataPlanes":["materialized_sportsbook_market_view"],"possibleStates":["ready_nonempty","ready_empty","not_requested","not_materialized","stale","blocked"],"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."},{"responseContractId":"kam.response.sports.market.compare_polymarket.v1","capabilityId":"kam.cap.sports.market.compare_polymarket.v1","responseView":"market_alignment","dataPlanes":["materialized_cross_market_delta_view"],"possibleStates":["ready_nonempty","available_not_rendered","not_requested","not_materialized","stale","blocked"],"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."},{"responseContractId":"kam.response.sports.schedule.list.v1","capabilityId":"kam.cap.sports.schedule.list.by_week.v1","responseView":"all_games","dataPlanes":["materialized_schedule_view"],"possibleStates":["ready_nonempty","ready_empty","not_read","stale","blocked"],"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."},{"responseContractId":"kam.response.sports.game.detail.v1","capabilityId":"kam.cap.sports.game.get.detail.v1","responseView":"quick_read","dataPlanes":["materialized_game_detail_view"],"possibleStates":["ready_nonempty","ready_empty","not_read","stale","blocked"],"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."},{"responseContractId":"kam.response.workspace.watchlist.review.v1","capabilityId":"kam.cap.workspace.view.switch_view.v1","responseView":"quick_read","dataPlanes":["workspace_saved_read_view"],"possibleStates":["ready_nonempty","ready_empty","not_read","stale","blocked"],"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."}]}