{
  "schema": "MAKNOW_AWR003_VISIBLE_CHECK_RULES_v1.0",
  "lesson_id": "AWR-003",
  "lab_id": "AWR-003-LAB1",
  "checker_has_hidden_answer_key": false,
  "state_vocabulary": [
    "USE",
    "PILOT",
    "NOT_NOW",
    "UNKNOWN",
    "EVIDENCE_INCOMPLETE",
    "OWNER_MISSING",
    "REVIEW_REQUIRED",
    "HOLD",
    "PARTIAL",
    "DISPUTED"
  ],
  "positive_states": [
    "USE",
    "PILOT"
  ],
  "positive_evidence_vocabulary": {
    "SEARCH_ENGINE": {
      "technology": [
        "ELASTICSEARCH_OR_OPENSEARCH"
      ],
      "layer": [
        "SEARCH_ANALYTICS"
      ],
      "problem_class": [
        "INDEXED_RETRIEVAL"
      ],
      "query_pattern": [
        "TYPO_TOLERANT_FULL_TEXT_WITH_FACETS"
      ],
      "full_text_requirement": [
        "PRESENT"
      ],
      "filter_aggregation_requirement": [
        "PRESENT"
      ],
      "relevance_requirement": [
        "TYPO_TOLERANT_RANKING_REQUIRED"
      ],
      "vector_requirement": [
        "ABSENT"
      ],
      "indexing_pipeline": [
        "BOUNDED_INDEX_PIPELINE_DEFINED",
        "CDC_OR_EVENT_PIPELINE_DEFINED",
        "PILOT_INDEX_PIPELINE_DEFINED"
      ],
      "source_of_truth": [
        "POSTGRESQL_AUTHORITATIVE",
        "PRIMARY_DATABASE_AUTHORITATIVE",
        "UPSTREAM_SERVICE_AUTHORITATIVE"
      ],
      "freshness_lag_tolerance": [
        "UP_TO_60_SECONDS",
        "UP_TO_5_SECONDS",
        "BOUNDED_EVENTUAL_WITHIN_TOLERANCE"
      ],
      "consistency_requirement": [
        "EVENTUAL_INDEX_OK_SOURCE_DB_AUTHORITATIVE",
        "EVENTUAL_INDEX_BOUNDED",
        "SEARCH_INDEX_NON_AUTHORITATIVE"
      ],
      "authorization_boundary": [
        "SEARCH_FILTERS_MIRROR_SOURCE_POLICY",
        "EXPLICIT_SEARCH_AUTH_FILTER_POLICY"
      ],
      "simpler_alternative": [
        "POSTGRESQL_FULL_TEXT_AND_EXTENSIONS"
      ]
    },
    "GRAPHQL": {
      "technology": [
        "GRAPHQL"
      ],
      "layer": [
        "API_QUERY_SHAPING"
      ],
      "problem_class": [
        "API_QUERY_SHAPING"
      ],
      "client_query_variability": [
        "HIGH_MANY_CLIENT_TYPES",
        "HIGH_NESTED_SHAPE_VARIABILITY"
      ],
      "query_pattern": [
        "MANY_NESTED_REPRESENTATIONS",
        "FREQUENT_OVER_UNDER_FETCH"
      ],
      "schema_owner": [
        "API_PLATFORM_OWNER",
        "PRODUCT_API_SCHEMA_OWNER"
      ],
      "resolver_boundary": [
        "EXPLICIT_RESOLVER_DATA_BOUNDARY",
        "SERVICE_OWNED_RESOLVER_BOUNDARY"
      ],
      "authorization_boundary": [
        "FIELD_AND_OBJECT_POLICY_DEFINED",
        "EXPLICIT_GRAPHQL_AUTHORIZATION_POLICY"
      ],
      "n_plus_one_risk": [
        "BOUNDED_WITH_BATCHING_AND_QUERY_COST_LIMITS",
        "EXPLICIT_COST_AND_BATCHING_POLICY"
      ],
      "source_of_truth": [
        "UNDERLYING_SERVICES_AND_POSTGRESQL"
      ],
      "consistency_requirement": [
        "RESOLVER_READS_FOLLOW_SOURCE_CONTRACTS"
      ],
      "simpler_alternative": [
        "EXTEND_EXISTING_REST_ENDPOINTS"
      ]
    }
  },
  "rules": [
    {
      "id": "R1",
      "text": "Submission contains exactly SEARCH_ENGINE and GRAPHQL records."
    },
    {
      "id": "R2",
      "text": "Each decision_state belongs to the visible state vocabulary."
    },
    {
      "id": "R3",
      "text": "Evidence must exactly match the selected shipped fixture for each axis."
    },
    {
      "id": "R4",
      "text": "Positive Search Engine requires a measured indexed-retrieval trigger plus an admissible indexing/source-of-truth/freshness/consistency/authorization boundary, owner, cost/failure evidence and authority trace."
    },
    {
      "id": "R5",
      "text": "Positive GraphQL requires high client query-shape variability plus admissible schema owner, resolver boundary, authorization and N+1/query-cost evidence, owner, cost/failure evidence and authority trace."
    },
    {
      "id": "R6",
      "text": "Missing operational/schema owner blocks USE/PILOT."
    },
    {
      "id": "R7",
      "text": "Missing decisive trigger/boundary evidence cannot produce USE/PILOT or NOT_NOW; preserve typed uncertainty."
    },
    {
      "id": "R8",
      "text": "NOT_NOW is valid only when the layer trigger is measured absent and a simpler current capability serves the need."
    },
    {
      "id": "R9",
      "text": "Positive states require visible cost_risk, failure_surface and evidence_ref."
    },
    {
      "id": "R10",
      "text": "Every decision requires non-empty learner rationale, review_due and stop_or_pivot_trigger."
    },
    {
      "id": "R11",
      "text": "Every axis requires authority_refs that trace FACT/DESIGN evidence to declared lesson/source references."
    },
    {
      "id": "R12",
      "text": "Typed non-success labels must not contradict visible evidence; the checker contains no hidden expected-verdict oracle."
    }
  ],
  "typed_non_success_state_semantics": {
    "UNKNOWN": "decisive trigger/boundary evidence remains unresolved",
    "EVIDENCE_INCOMPLETE": "decisive trigger/boundary evidence is incomplete or unresolved",
    "OWNER_MISSING": "accountable operational/schema ownership is visibly absent",
    "REVIEW_REQUIRED": "visible stale, out-of-tolerance, conflicting, or contradictory decisive evidence requires review",
    "HOLD": "decisive evidence explicitly carries a hold/blocked/waiting/paused marker",
    "PARTIAL": "decisive evidence is a visible mixture of resolved and unresolved fields",
    "DISPUTED": "decisive evidence explicitly carries conflict/contradictory/disputed semantics"
  }
}
