fix: make behaviour evaluation authoritative
Core fix: For cases with expectedBehaviours, reasoningQuality.status is now set exclusively from behaviour evaluation results (required behaviour pass/fail). Legacy concept checks remain visible as diagnostic-only metrics and do not influence the authoritative result. Key changes: - Behaviour-based scoring determines reasoning status (passed/failed) instead of legacy concept literal matching - Schema failure correctly forces not_evaluated (no vacuous truth) - Saved live results re-evaluator preserves provenance metadata - Classification tolerance map works bidirectionally for interchangeable types - normalise() treats underscores as word characters, hyphens as spaces Tests: 74 passing across both evaluator test suites - tests/evaluator-behaviour-authoritative.test.mjs (47 tests, new) - tests/evaluator-semantic.test.mjs (27 tests)
This commit is contained in:
@@ -2,91 +2,611 @@
|
||||
{
|
||||
"id": "diag-01",
|
||||
"input": "We've seen a spike in complaints from our warehouse team this month compared to last month.",
|
||||
"expectedPrimaryTypes": ["unexplained_change"],
|
||||
"expectedReasoningModes": ["establish_baseline", "identify_difference"],
|
||||
"shouldIdentify": ["complaints", "warehouse", "baseline comparison"],
|
||||
"shouldNotInfer": ["quality issue", "staff turnover", "training gap"],
|
||||
"description": "Baseline comparison — change without context. Should NOT jump to conclusions about quality or staff issues."
|
||||
"expectedPrimaryTypes": [
|
||||
"unexplained_change"
|
||||
],
|
||||
"expectedReasoningModes": [
|
||||
"establish_baseline",
|
||||
"identify_difference"
|
||||
],
|
||||
"shouldIdentify": [
|
||||
"complaints",
|
||||
"warehouse",
|
||||
"baseline comparison"
|
||||
],
|
||||
"shouldNotInfer": [
|
||||
"quality issue",
|
||||
"staff turnover",
|
||||
"training gap"
|
||||
],
|
||||
"description": "Baseline comparison — change without context. Should NOT jump to conclusions about quality or staff issues.",
|
||||
"expectedBehaviours": [
|
||||
{
|
||||
"id": "b-baseline",
|
||||
"description": "Identifies prior state or baseline period",
|
||||
"type": "baseline_recognition",
|
||||
"acceptedSignals": [
|
||||
"baseline",
|
||||
"previous period",
|
||||
"before comparison",
|
||||
"pre-change",
|
||||
"prior state"
|
||||
],
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"id": "b-nosub",
|
||||
"description": "Does NOT assert warehouse quality/staff issues as cause",
|
||||
"type": "unsupported_justification",
|
||||
"prohibitedSignals": [
|
||||
"quality issue",
|
||||
"staff turnover",
|
||||
"training gap"
|
||||
],
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"id": "b-nq1",
|
||||
"description": "Asks about baseline detail (absolute numbers, time frame)",
|
||||
"type": "next_question_target",
|
||||
"acceptedSignals": [
|
||||
"baseline",
|
||||
"number",
|
||||
"period",
|
||||
"volume",
|
||||
"count",
|
||||
"over what period"
|
||||
],
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "diag-02",
|
||||
"input": "Some customers reported that the new app crashes when uploading photos.",
|
||||
"expectedPrimaryTypes": ["observed_problem"],
|
||||
"expectedReasoningModes": ["identify_difference", "establish_baseline"],
|
||||
"shouldIdentify": ["app crashes", "photo upload", "some customers"],
|
||||
"shouldNotInfer": ["all users affected", "server-side bug", "Android only"],
|
||||
"description": "Subset modifier — 'some customers' means not universal. Should distinguish from blanket claims."
|
||||
"expectedPrimaryTypes": [
|
||||
"observed_problem"
|
||||
],
|
||||
"expectedReasoningModes": [
|
||||
"identify_difference",
|
||||
"establish_baseline"
|
||||
],
|
||||
"shouldIdentify": [
|
||||
"app crashes",
|
||||
"photo upload",
|
||||
"some customers"
|
||||
],
|
||||
"shouldNotInfer": [
|
||||
"all users affected",
|
||||
"server-side bug",
|
||||
"Android only"
|
||||
],
|
||||
"description": "Subset modifier — 'some customers' means not universal. Should distinguish from blanket claims.",
|
||||
"expectedBehaviours": [
|
||||
{
|
||||
"id": "b-subset",
|
||||
"description": "Recognises subset scope rather than universal claim",
|
||||
"type": "subset_recognition",
|
||||
"acceptedSignals": [
|
||||
"some",
|
||||
"subset",
|
||||
"partial",
|
||||
"not universal",
|
||||
"certain users",
|
||||
"limited to"
|
||||
],
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"id": "b-obv",
|
||||
"description": "Acknowledges photo-upload context from the scenario",
|
||||
"type": "observation_recognition",
|
||||
"acceptedSignals": [
|
||||
"photo",
|
||||
"upload",
|
||||
"crash",
|
||||
"app"
|
||||
],
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "b-nq2",
|
||||
"description": "Asks about which user groups are affected vs unaffected",
|
||||
"type": "next_question_target",
|
||||
"acceptedSignals": [
|
||||
"who",
|
||||
"which users",
|
||||
"affected group",
|
||||
"distinguish",
|
||||
"proportion"
|
||||
],
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "diag-03",
|
||||
"input": "Sales fell by 15% last month after we increased prices, but the CFO says revenue is still up 2%.",
|
||||
"expectedPrimaryTypes": ["contradiction"],
|
||||
"expectedReasoningModes": ["investigate_contradiction", "establish_baseline"],
|
||||
"shouldIdentify": ["sales decline", "price increase", "revenue increase", "CFO report"],
|
||||
"shouldNotInfer": ["price was set too high", "competitors gained market share", "revenue data is wrong"],
|
||||
"description": "Apparent contradiction — sales down but revenue up after price change. Distinguishes volume vs value."
|
||||
"expectedPrimaryTypes": [
|
||||
"contradiction"
|
||||
],
|
||||
"expectedReasoningModes": [
|
||||
"investigate_contradiction",
|
||||
"establish_baseline"
|
||||
],
|
||||
"shouldIdentify": [
|
||||
"sales decline",
|
||||
"price increase",
|
||||
"revenue increase",
|
||||
"CFO report"
|
||||
],
|
||||
"shouldNotInfer": [
|
||||
"price was set too high",
|
||||
"competitors gained market share",
|
||||
"revenue data is wrong"
|
||||
],
|
||||
"description": "Apparent contradiction — sales down but revenue up after price change. Distinguishes volume vs value.",
|
||||
"expectedBehaviours": [
|
||||
{
|
||||
"id": "b-metric",
|
||||
"description": "Recognises revenue/sales as different metric dimensions",
|
||||
"type": "metric_relationship",
|
||||
"acceptedSignals": [
|
||||
"rate",
|
||||
"denominator",
|
||||
"comparable scale",
|
||||
"volume vs value",
|
||||
"per unit",
|
||||
"absolute vs relative"
|
||||
],
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"id": "b-contra",
|
||||
"description": "Identifies the apparent contradiction between sales and revenue signals",
|
||||
"type": "contradiction_recognition",
|
||||
"acceptedSignals": [
|
||||
"contradiction",
|
||||
"divergent",
|
||||
"opposing",
|
||||
"conflicting",
|
||||
"conversely",
|
||||
"but"
|
||||
],
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"id": "b-trans",
|
||||
"description": "Acknowledges temporal caution in cause-effect timing",
|
||||
"type": "transition_recognition",
|
||||
"acceptedSignals": [
|
||||
"transition",
|
||||
"before to",
|
||||
"moved from",
|
||||
"after",
|
||||
"since"
|
||||
],
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "b-nq3",
|
||||
"description": "Asks about sales volume and revenue composition breakdown",
|
||||
"type": "next_question_target",
|
||||
"acceptedSignals": [
|
||||
"sales volume",
|
||||
"revenue composition",
|
||||
"unit price",
|
||||
"average",
|
||||
"breakdown"
|
||||
],
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "diag-04",
|
||||
"input": "We need to launch a marketplace app in Southeast Asia to capture the gap our competitors are exploiting.",
|
||||
"expectedPrimaryTypes": ["decision_request"],
|
||||
"expectedReasoningModes": ["decision_support", "identify_missing_information"],
|
||||
"shouldIdentify": ["marketplace app", "Southeast Asia", "competitor gap"],
|
||||
"shouldNotInfer": ["this will definitely succeed", "we have the resources", "competitors are struggling"],
|
||||
"description": "Decision request — forward-looking, needs missing info identification."
|
||||
"expectedPrimaryTypes": [
|
||||
"decision_request"
|
||||
],
|
||||
"expectedReasoningModes": [
|
||||
"decision_support",
|
||||
"identify_missing_information"
|
||||
],
|
||||
"shouldIdentify": [
|
||||
"marketplace app",
|
||||
"Southeast Asia",
|
||||
"competitor gap"
|
||||
],
|
||||
"shouldNotInfer": [
|
||||
"this will definitely succeed",
|
||||
"we have the resources",
|
||||
"competitors are struggling"
|
||||
],
|
||||
"description": "Decision request — forward-looking, needs missing info identification.",
|
||||
"expectedBehaviours": [
|
||||
{
|
||||
"id": "b-action",
|
||||
"description": "Recognises forward-looking proposed action",
|
||||
"type": "proposed_action_recognition",
|
||||
"acceptedSignals": [
|
||||
"decision_request",
|
||||
"desired_outcome",
|
||||
"action plan"
|
||||
],
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"id": "b-nosub2",
|
||||
"description": "Does NOT treat competitor gap as quantified fact",
|
||||
"type": "unsupported_justification",
|
||||
"prohibitedSignals": [
|
||||
"competitor gap",
|
||||
"gap confirmed",
|
||||
"we lack"
|
||||
],
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"id": "b-nq4",
|
||||
"description": "Asks about market gap size and scope",
|
||||
"type": "next_question_target",
|
||||
"acceptedSignals": [
|
||||
"gap size",
|
||||
"market size",
|
||||
"scope",
|
||||
"extent",
|
||||
"how big"
|
||||
],
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "diag-05",
|
||||
"input": "Our production line changed suppliers three months ago but still delivers the same defect rate as before.",
|
||||
"expectedPrimaryTypes": ["unexplained_change"],
|
||||
"expectedReasoningModes": ["establish_baseline", "identify_difference"],
|
||||
"shouldIdentify": ["supplier change", "three months ago", "same defect rate"],
|
||||
"shouldNotInfer": ["new supplier is worse", "old supplier was better", "quality process is broken"],
|
||||
"description": "Unexpected continuity — changed context but no outcome change."
|
||||
"expectedPrimaryTypes": [
|
||||
"unexplained_change"
|
||||
],
|
||||
"expectedReasoningModes": [
|
||||
"establish_baseline",
|
||||
"identify_difference"
|
||||
],
|
||||
"shouldIdentify": [
|
||||
"supplier change",
|
||||
"three months ago",
|
||||
"same defect rate"
|
||||
],
|
||||
"shouldNotInfer": [
|
||||
"new supplier is worse",
|
||||
"old supplier was better",
|
||||
"quality process is broken"
|
||||
],
|
||||
"description": "Unexpected continuity — changed context but no outcome change.",
|
||||
"expectedBehaviours": [
|
||||
{
|
||||
"id": "b-mnorm",
|
||||
"description": "Recognises unexpected continuity despite change input",
|
||||
"type": "measurement_normalisation",
|
||||
"acceptedSignals": [
|
||||
"normalise",
|
||||
"denominator",
|
||||
"rate",
|
||||
"comparable scale",
|
||||
"per unit"
|
||||
],
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"id": "b-timing",
|
||||
"description": "Acknowledges timing of the supplier change vs outcome measurement",
|
||||
"type": "timing_recognition",
|
||||
"acceptedSignals": [
|
||||
"after",
|
||||
"three months",
|
||||
"timeline",
|
||||
"time lag",
|
||||
"delayed effect"
|
||||
],
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "b-nq5",
|
||||
"description": "Asks why input change produced no outcome change",
|
||||
"type": "next_question_target",
|
||||
"acceptedSignals": [
|
||||
"why",
|
||||
"same rate",
|
||||
"defect rate comparison",
|
||||
"baseline",
|
||||
"period of measurement"
|
||||
],
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "diag-06",
|
||||
"input": "From 45% to 62%, the completion rate for our onboarding flow improved significantly.",
|
||||
"expectedPrimaryTypes": ["unexplained_change"],
|
||||
"expectedReasoningModes": ["establish_baseline", "validate_measurement"],
|
||||
"shouldIdentify": ["completion rate", "45%", "62%", "onboarding"],
|
||||
"shouldNotInfer": ["all improvements are due to the redesign", "the old flow was bad", "users prefer the new design"],
|
||||
"description": "Quantified improvement — needs context about measurement period and baseline conditions."
|
||||
"expectedPrimaryTypes": [
|
||||
"unexplained_change"
|
||||
],
|
||||
"expectedReasoningModes": [
|
||||
"establish_baseline",
|
||||
"validate_measurement"
|
||||
],
|
||||
"shouldIdentify": [
|
||||
"completion rate",
|
||||
"45%",
|
||||
"62%",
|
||||
"onboarding"
|
||||
],
|
||||
"shouldNotInfer": [
|
||||
"all improvements are due to the redesign",
|
||||
"the old flow was bad",
|
||||
"users prefer the new design"
|
||||
],
|
||||
"description": "Quantified improvement — needs context about measurement period and baseline conditions.",
|
||||
"expectedBehaviours": [
|
||||
{
|
||||
"id": "b-baseline2",
|
||||
"description": "Recognises quantified improvement needs context for significance",
|
||||
"type": "baseline_recognition",
|
||||
"acceptedSignals": [
|
||||
"baseline",
|
||||
"previous period",
|
||||
"comparison point",
|
||||
"reference",
|
||||
"benchmark",
|
||||
"pre-change"
|
||||
],
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"id": "b-nq6",
|
||||
"description": "Asks about timeframe, cohort, and baseline conditions",
|
||||
"type": "next_question_target",
|
||||
"acceptedSignals": [
|
||||
"timeframe",
|
||||
"cohort",
|
||||
"baseline condition",
|
||||
"measurement period",
|
||||
"sample size"
|
||||
],
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "diag-07",
|
||||
"input": "A user claimed that our pricing model is too complex for small businesses.",
|
||||
"expectedPrimaryTypes": ["reported_claim"],
|
||||
"expectedReasoningModes": ["validate_claim", "identify_difference"],
|
||||
"shouldIdentify": ["pricing complexity", "small business", "user claim"],
|
||||
"shouldNotInfer": ["the pricing is actually complex", "other small businesses agree", "we should simplify pricing"],
|
||||
"description": "Single reported claim — needs validation, not acceptance as fact."
|
||||
"expectedPrimaryTypes": [
|
||||
"reported_claim"
|
||||
],
|
||||
"expectedReasoningModes": [
|
||||
"validate_claim",
|
||||
"identify_difference"
|
||||
],
|
||||
"shouldIdentify": [
|
||||
"pricing complexity",
|
||||
"small business",
|
||||
"user claim"
|
||||
],
|
||||
"shouldNotInfer": [
|
||||
"the pricing is actually complex",
|
||||
"other small businesses agree",
|
||||
"we should simplify pricing"
|
||||
],
|
||||
"description": "Single reported claim — needs validation, not acceptance as fact.",
|
||||
"expectedBehaviours": [
|
||||
{
|
||||
"id": "b-cval",
|
||||
"description": "Treats single-user claim as needing corroboration, not acceptance",
|
||||
"type": "claim_validation",
|
||||
"acceptedSignals": [
|
||||
"validate",
|
||||
"corroborate",
|
||||
"verify",
|
||||
"confirm",
|
||||
"evidence needed",
|
||||
"single user",
|
||||
"unverified"
|
||||
],
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"id": "b-nq7",
|
||||
"description": "Asks for examples or corroboration from other users",
|
||||
"type": "next_question_target",
|
||||
"acceptedSignals": [
|
||||
"examples",
|
||||
"corroborate",
|
||||
"other users",
|
||||
"more examples",
|
||||
"survey",
|
||||
"feedback"
|
||||
],
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "diag-08",
|
||||
"input": "I used the phrase 'philosophical difference' in a meeting and my colleague said it meant nothing. Is that fair?",
|
||||
"expectedPrimaryTypes": ["ambiguous_statement"],
|
||||
"expectedReasoningModes": ["clarify_meaning"],
|
||||
"shouldIdentify": ["philosophical", "ambiguous", "meaning clarification"],
|
||||
"shouldNotInfer": ["the phrase was wrong", "the colleague is hostile", "we should avoid philosophical language"],
|
||||
"description": "Meta-test — self-referential ambiguous statement. Should trigger clarification mode."
|
||||
"expectedPrimaryTypes": [
|
||||
"ambiguous_statement"
|
||||
],
|
||||
"expectedReasoningModes": [
|
||||
"clarify_meaning"
|
||||
],
|
||||
"shouldIdentify": [
|
||||
"philosophical",
|
||||
"ambiguous",
|
||||
"meaning clarification"
|
||||
],
|
||||
"shouldNotInfer": [
|
||||
"the phrase was wrong",
|
||||
"the colleague is hostile",
|
||||
"we should avoid philosophical language"
|
||||
],
|
||||
"description": "Meta-test — self-referential ambiguous statement. Should trigger clarification mode.",
|
||||
"expectedBehaviours": [
|
||||
{
|
||||
"id": "b-ambig",
|
||||
"description": "Recognises the phrase as ambiguous and requiring clarification",
|
||||
"type": "ambiguity_recognition",
|
||||
"acceptedSignals": [
|
||||
"ambiguous",
|
||||
"unclear meaning",
|
||||
"clarify",
|
||||
"interpretation varies",
|
||||
"phrase intent"
|
||||
],
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"id": "b-nq8",
|
||||
"description": "Asks about the phrase intent in meeting context",
|
||||
"type": "next_question_target",
|
||||
"acceptedSignals": [
|
||||
"intent",
|
||||
"meaning",
|
||||
"context",
|
||||
"why said",
|
||||
"what meant",
|
||||
"phrase intent"
|
||||
],
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "diag-09",
|
||||
"input": "After the deployment last week, our complaint volume tripled to 47 cases per day.",
|
||||
"expectedPrimaryTypes": ["causal_claim"],
|
||||
"expectedReasoningModes": ["investigate_contradiction", "establish_baseline"],
|
||||
"shouldIdentify": ["deployment", "complaint volume increase", "tripled", "47 cases"],
|
||||
"shouldNotInfer": ["the deployment caused the complaints", "the bug report was insufficient", "rollback is needed"],
|
||||
"description": "Post-event spike — presents correlation as potential causation. Must resist jumping to causal conclusion."
|
||||
"expectedPrimaryTypes": [
|
||||
"causal_claim"
|
||||
],
|
||||
"expectedReasoningModes": [
|
||||
"investigate_contradiction",
|
||||
"establish_baseline"
|
||||
],
|
||||
"shouldIdentify": [
|
||||
"deployment",
|
||||
"complaint volume increase",
|
||||
"tripled",
|
||||
"47 cases"
|
||||
],
|
||||
"shouldNotInfer": [
|
||||
"the deployment caused the complaints",
|
||||
"the bug report was insufficient",
|
||||
"rollback is needed"
|
||||
],
|
||||
"description": "Post-event spike — presents correlation as potential causation. Must resist jumping to causal conclusion.",
|
||||
"expectedBehaviours": [
|
||||
{
|
||||
"id": "b-trans2",
|
||||
"description": "Distinguishes temporal sequence from causal proof",
|
||||
"type": "transition_recognition",
|
||||
"acceptedSignals": [
|
||||
"transition",
|
||||
"before to",
|
||||
"after",
|
||||
"temporal sequence",
|
||||
"coincidence vs cause"
|
||||
],
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"id": "b-baseline3",
|
||||
"description": "Recognises need for pre-deployment complaint baseline",
|
||||
"type": "baseline_recognition",
|
||||
"acceptedSignals": [
|
||||
"baseline",
|
||||
"previous level",
|
||||
"before deployment",
|
||||
"pre-change",
|
||||
"historical"
|
||||
],
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"id": "b-nq9",
|
||||
"description": "Asks about evidence distinguishing deployment effect from coincidence",
|
||||
"type": "next_question_target",
|
||||
"acceptedSignals": [
|
||||
"coincidence",
|
||||
"deployment timing",
|
||||
"baseline comparison",
|
||||
"other factors",
|
||||
"confounders"
|
||||
],
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "diag-10",
|
||||
"input": "Some complaints involve production issues, but others say the delivery team is slow.",
|
||||
"expectedPrimaryTypes": ["observed_problem"],
|
||||
"expectedReasoningModes": ["identify_difference", "decompose_aggregate"],
|
||||
"shouldIdentify": ["production issues", "delivery speed", "complaint types"],
|
||||
"shouldNotInfer": ["production is worse than delivery", "the delivery team needs training", "both teams are underperforming equally"],
|
||||
"description": "Paired with diag-01 — distinguishes subset complaints from aggregate claims."
|
||||
"expectedPrimaryTypes": [
|
||||
"observed_problem"
|
||||
],
|
||||
"expectedReasoningModes": [
|
||||
"identify_difference",
|
||||
"decompose_aggregate"
|
||||
],
|
||||
"shouldIdentify": [
|
||||
"production issues",
|
||||
"delivery speed",
|
||||
"complaint types"
|
||||
],
|
||||
"shouldNotInfer": [
|
||||
"production is worse than delivery",
|
||||
"the delivery team needs training",
|
||||
"both teams are underperforming equally"
|
||||
],
|
||||
"description": "Paired with diag-01 — distinguishes subset complaints from aggregate claims.",
|
||||
"expectedBehaviours": [
|
||||
{
|
||||
"id": "b-obs2",
|
||||
"description": "Decomposes complaints into distinct categories rather than merging",
|
||||
"type": "observation_recognition",
|
||||
"acceptedSignals": [
|
||||
"complaint",
|
||||
"production",
|
||||
"delivery",
|
||||
"categories",
|
||||
"types of complaint",
|
||||
"decompose"
|
||||
],
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"id": "b-metric2",
|
||||
"description": "Avoids merging complaint types without quantification",
|
||||
"type": "metric_relationship",
|
||||
"acceptedSignals": [
|
||||
"rate",
|
||||
"comparable scale",
|
||||
"proportion",
|
||||
"percentage",
|
||||
"volume vs value"
|
||||
],
|
||||
"required": false
|
||||
},
|
||||
{
|
||||
"id": "b-nq10",
|
||||
"description": "Asks about complaint category proportions (production vs delivery)",
|
||||
"type": "next_question_target",
|
||||
"acceptedSignals": [
|
||||
"proportion",
|
||||
"percentage",
|
||||
"ratio",
|
||||
"how many",
|
||||
"which is worse",
|
||||
"split"
|
||||
],
|
||||
"required": false
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
]
|
||||
Reference in New Issue
Block a user