P0-R4 Manual Research Design default qualitative

#138
Files changed (3) hide show
  1. app.py +23 -33
  2. core/advanced_method_registry.py +26 -57
  3. i18n.py +12 -12
app.py CHANGED
@@ -505,10 +505,13 @@ def _uploaded_material_descriptors() -> list[dict[str, str]]:
505
 
506
 
507
  def _method_intent_signature() -> str:
508
- payload = {
509
- "topic": str(st.session_state.get("sp_topic") or DEFAULT_TOPIC),
510
- "keywords": str(st.session_state.get("sp_keywords") or DEFAULT_KEYWORDS),
511
- }
 
 
 
512
  return hashlib.sha256(
513
  json.dumps(payload, ensure_ascii=False, sort_keys=True, separators=(",", ":")).encode("utf-8")
514
  ).hexdigest()
@@ -777,9 +780,9 @@ def _process_pending_launch(lang_code: str) -> None:
777
  idempotency_key = str(pending.get("idempotency_key") or "").strip()
778
  pending_signature = str(pending.get("method_intent_signature") or "").strip()
779
 
780
- # U1-R2B repeats the capability preflight immediately before any task/quota
781
- # creation so a stale rerun or modified session state cannot bypass a
782
- # manually adjusted or auto/default research design.
783
  preflight, current_signature = _current_method_preflight(
784
  confirmed_method_family=pending_family or None
785
  )
@@ -1518,31 +1521,23 @@ def render_workspace_controls(user):
1518
  method_signature = ""
1519
  else:
1520
  # SmartPaper intentionally supports only two reader-visible research
1521
- # designs. No cue defaults to qualitative. Specialized-method cues remain
1522
- # advisory-only for automatic detection; an explicit user selection
1523
- # between the two supported designs is authoritative for this topic.
1524
- auto_preflight, method_signature = _current_method_preflight(confirmed_method_family="")
1525
- auto_family = str(auto_preflight.get("method_family") or "qualitative").strip().casefold()
1526
- if auto_family not in METHOD_FAMILIES:
1527
- auto_family = "qualitative"
1528
- specialized_redirect = bool((auto_preflight.get("resolution") or {}).get("specialized_method_detected"))
1529
-
1530
  stored = str(st.session_state.get("sp_method_confirmation") or "").strip().casefold()
1531
  stored_sig = str(st.session_state.get("sp_method_confirmation_signature") or "").strip()
1532
  selected_default = (
1533
- stored if stored_sig == method_signature and stored in METHOD_FAMILIES else auto_family
1534
  )
1535
 
1536
- # A changed Title/Keywords signature invalidates a previous manual
1537
- # override. For the same signature, the user's explicit selection remains
1538
- # authoritative even when automatic detection found a specialized cue.
1539
  selector_sig = str(st.session_state.get("sp_method_selector_signature") or "").strip()
1540
  if selector_sig != method_signature:
1541
  st.session_state["sp_method_confirmation"] = ""
1542
  st.session_state["sp_method_confirmation_signature"] = ""
1543
- st.session_state["sp_method_selector"] = auto_family
1544
  st.session_state["sp_method_selector_signature"] = method_signature
1545
- selected_default = auto_family
1546
  elif str(st.session_state.get("sp_method_selector") or "").strip().casefold() not in METHOD_FAMILIES:
1547
  st.session_state["sp_method_selector"] = selected_default
1548
 
@@ -1554,13 +1549,11 @@ def render_workspace_controls(user):
1554
  key="sp_method_selector",
1555
  disabled=active,
1556
  )
1557
- selected = str(selected or auto_family).strip().casefold()
1558
- if selected != auto_family:
1559
- st.session_state["sp_method_confirmation"] = selected
1560
- st.session_state["sp_method_confirmation_signature"] = method_signature
1561
- else:
1562
- st.session_state["sp_method_confirmation"] = ""
1563
- st.session_state["sp_method_confirmation_signature"] = ""
1564
  preflight, method_signature = _current_method_preflight(confirmed_method_family=selected)
1565
 
1566
  method_family = str(preflight.get("method_family") or "undetermined").strip().casefold()
@@ -1574,10 +1567,7 @@ def render_workspace_controls(user):
1574
  st.caption(tr(lang_code, "method_detection_explanation"))
1575
 
1576
  block_reason = str(preflight.get("block_reason") or "")
1577
- specialized_redirect = bool((preflight.get("resolution") or {}).get("specialized_method_detected"))
1578
- if specialized_redirect and not active and method_family == "qualitative":
1579
- st.warning(tr(lang_code, "specialized_method_redirect"))
1580
- elif block_reason:
1581
  st.warning(tr(lang_code, "method_resolution_invalid"))
1582
  elif not active:
1583
  st.info(tr(lang_code, "method_supported", method=method_label))
 
505
 
506
 
507
  def _method_intent_signature() -> str:
508
+ """Stable identity for the manual Research Design control.
509
+
510
+ Title and Keywords must never reset or auto-change the user's selected
511
+ research design. The signature therefore identifies the control policy, not
512
+ the topic text.
513
+ """
514
+ payload = {"research_design_control": "manual-default-qualitative-v1"}
515
  return hashlib.sha256(
516
  json.dumps(payload, ensure_ascii=False, sort_keys=True, separators=(",", ":")).encode("utf-8")
517
  ).hexdigest()
 
780
  idempotency_key = str(pending.get("idempotency_key") or "").strip()
781
  pending_signature = str(pending.get("method_intent_signature") or "").strip()
782
 
783
+ # Repeat the capability preflight immediately before any task/quota
784
+ # creation so a stale rerun or modified session state cannot bypass the
785
+ # manually selected/default research design.
786
  preflight, current_signature = _current_method_preflight(
787
  confirmed_method_family=pending_family or None
788
  )
 
1521
  method_signature = ""
1522
  else:
1523
  # SmartPaper intentionally supports only two reader-visible research
1524
+ # designs. New tasks default to qualitative research. The user may
1525
+ # adjust the design manually; Title, Keywords, and uploaded materials
1526
+ # never auto-select or reset the Research Design.
1527
+ method_signature = _method_intent_signature()
 
 
 
 
 
1528
  stored = str(st.session_state.get("sp_method_confirmation") or "").strip().casefold()
1529
  stored_sig = str(st.session_state.get("sp_method_confirmation_signature") or "").strip()
1530
  selected_default = (
1531
+ stored if stored_sig == method_signature and stored in METHOD_FAMILIES else "qualitative"
1532
  )
1533
 
 
 
 
1534
  selector_sig = str(st.session_state.get("sp_method_selector_signature") or "").strip()
1535
  if selector_sig != method_signature:
1536
  st.session_state["sp_method_confirmation"] = ""
1537
  st.session_state["sp_method_confirmation_signature"] = ""
1538
+ st.session_state["sp_method_selector"] = "qualitative"
1539
  st.session_state["sp_method_selector_signature"] = method_signature
1540
+ selected_default = "qualitative"
1541
  elif str(st.session_state.get("sp_method_selector") or "").strip().casefold() not in METHOD_FAMILIES:
1542
  st.session_state["sp_method_selector"] = selected_default
1543
 
 
1549
  key="sp_method_selector",
1550
  disabled=active,
1551
  )
1552
+ selected = str(selected or "qualitative").strip().casefold()
1553
+ if selected not in METHOD_FAMILIES:
1554
+ selected = "qualitative"
1555
+ st.session_state["sp_method_confirmation"] = selected
1556
+ st.session_state["sp_method_confirmation_signature"] = method_signature
 
 
1557
  preflight, method_signature = _current_method_preflight(confirmed_method_family=selected)
1558
 
1559
  method_family = str(preflight.get("method_family") or "undetermined").strip().casefold()
 
1567
  st.caption(tr(lang_code, "method_detection_explanation"))
1568
 
1569
  block_reason = str(preflight.get("block_reason") or "")
1570
+ if block_reason:
 
 
 
1571
  st.warning(tr(lang_code, "method_resolution_invalid"))
1572
  elif not active:
1573
  st.info(tr(lang_code, "method_supported", method=method_label))
core/advanced_method_registry.py CHANGED
@@ -1,13 +1,11 @@
1
  # -*- coding: utf-8 -*-
2
- """Deterministic two-design resolver and capability preflight for SmartPaper.
3
 
4
- U1-R2C intentionally limits production research design to two supported paths:
5
- qualitative research and survey-based quantitative research. Specialized cues
6
- such as fsQCA, panel data/econometrics, meta-analysis, and bibliometric/review
7
- methods are detected only to provide a reader-facing scope notice; they are not
8
- exposed as selectable method families. Automatic detection falls back to the
9
- qualitative framework, while an explicit user selection between the two supported
10
- designs remains authoritative for the current Title + Keywords signature.
11
 
12
  This module never selects providers/models and never rewrites Title/Keywords.
13
  """
@@ -17,7 +15,7 @@ import os
17
  import re
18
  from typing import Any, Iterable
19
 
20
- METHOD_RESOLVER_VERSION = "smartpaper-auto-method-resolver-v5"
21
  METHOD_CAPABILITY_REGISTRY_VERSION = "smartpaper-method-capability-registry-v3"
22
 
23
  # Reader-visible / task-owning method families. Order is intentional:
@@ -176,51 +174,23 @@ def resolve_method_family(
176
  *,
177
  materials: Iterable[Any] | None = None,
178
  ) -> dict[str, Any]:
179
- """Resolve one of SmartPaper's two supported production research designs.
180
 
181
- Title + Keywords remain the design authority. Uploaded Research Materials
182
- do not alter automatic design selection. Specialized-method cues are kept
183
- only as an advisory classification and redirect to qualitative research.
 
184
  """
185
- source_title = _normalized_text(title)
186
- source_keywords = _keyword_items(keywords)
187
- text = " ; ".join([source_title] + source_keywords)
188
  descriptors = _material_descriptors(materials)
189
-
190
- specialized_hits = _pattern_hits(text, _SPECIALIZED_METHOD_PATTERNS)
191
- if specialized_hits:
192
- capability = method_capability("qualitative")
193
- return {
194
- "resolver_version": METHOD_RESOLVER_VERSION,
195
- "shadow_only": False,
196
- "method_family": "qualitative",
197
- "confidence": "SPECIALIZED_METHOD_REDIRECT",
198
- "reason_codes": ["specialized_method_cue_detected", "redirect_to_qualitative"],
199
- "title_keyword_hits": [],
200
- "specialized_method_detected": True,
201
- "specialized_method_families": [row["method_family"] for row in specialized_hits],
202
- "specialized_method_hits": specialized_hits,
203
- "material_hint_families": [],
204
- "material_count": len(descriptors),
205
- "derived_policy_lane": capability.get("legacy_policy_lane"),
206
- "capability": capability,
207
- }
208
-
209
- supported_hits = _pattern_hits(text, _SUPPORTED_METHOD_PATTERNS)
210
- chosen = str((supported_hits[0] if supported_hits else {}).get("method_family") or "qualitative")
211
- confidence = "AUTO_DETECTED" if supported_hits else "DEFAULT_QUALITATIVE"
212
- reason_codes = ["explicit_title_keyword_method_cue"] if supported_hits else ["no_explicit_method_cue", "default_qualitative"]
213
- if len(supported_hits) > 1:
214
- reason_codes.append("lower_priority_method_cues_present")
215
-
216
- capability = method_capability(chosen)
217
  return {
218
  "resolver_version": METHOD_RESOLVER_VERSION,
219
  "shadow_only": False,
220
- "method_family": chosen,
221
- "confidence": confidence,
222
- "reason_codes": reason_codes,
223
- "title_keyword_hits": supported_hits,
224
  "specialized_method_detected": False,
225
  "specialized_method_families": [],
226
  "specialized_method_hits": [],
@@ -230,7 +200,6 @@ def resolve_method_family(
230
  "capability": capability,
231
  }
232
 
233
-
234
  def compare_shadow_to_legacy_lane(resolution: dict[str, Any], selected_lane: Any) -> dict[str, Any]:
235
  """Compare inferred design with a legacy AMJ/ASQ lane."""
236
  selected = str(selected_lane or "").strip().casefold()
@@ -252,25 +221,24 @@ def resolve_generation_preflight(
252
  ) -> dict[str, Any]:
253
  """Resolve the two supported designs before any task/quota creation.
254
 
255
- Manual adjustment is available only between qualitative and survey-based
256
- quantitative research. Automatic detection may map specialized-method cues
257
- to the qualitative fallback, but an explicit user selection between the two
258
- supported production designs is authoritative for the current topic.
259
  """
260
  resolution = resolve_method_family(title, keywords, materials=materials)
261
- family = str(resolution.get("method_family") or "qualitative").strip().casefold()
262
 
263
  confirmed = str(confirmed_method_family or "").strip().casefold()
264
- if confirmed in METHOD_FAMILIES and confirmed != family:
265
  family = confirmed
266
  capability = method_capability(family)
267
  resolution = dict(resolution)
268
  resolution.update({
269
  "method_family": family,
270
- "confidence": "USER_OVERRIDE",
271
  "derived_policy_lane": capability.get("legacy_policy_lane"),
272
  "capability": capability,
273
- "reason_codes": list(resolution.get("reason_codes") or []) + ["user_override_method_family"],
274
  })
275
 
276
  capability = method_capability(family)
@@ -293,3 +261,4 @@ def resolve_generation_preflight(
293
  "legacy_policy_lane": lane,
294
  "capability": capability,
295
  }
 
 
1
  # -*- coding: utf-8 -*-
2
+ """Deterministic two-design manual selector and capability preflight for SmartPaper.
3
 
4
+ Production research design is intentionally limited to two supported paths:
5
+ qualitative research and survey-based quantitative research. New tasks default to
6
+ qualitative research, and the user may explicitly adjust the design before task
7
+ creation. Title, Keywords, and uploaded Research Materials never auto-select or
8
+ change the research design.
 
 
9
 
10
  This module never selects providers/models and never rewrites Title/Keywords.
11
  """
 
15
  import re
16
  from typing import Any, Iterable
17
 
18
+ METHOD_RESOLVER_VERSION = "smartpaper-manual-method-selector-v1"
19
  METHOD_CAPABILITY_REGISTRY_VERSION = "smartpaper-method-capability-registry-v3"
20
 
21
  # Reader-visible / task-owning method families. Order is intentional:
 
174
  *,
175
  materials: Iterable[Any] | None = None,
176
  ) -> dict[str, Any]:
177
+ """Return the fixed default design for a new task.
178
 
179
+ Automatic research-design detection is intentionally disabled. Title,
180
+ Keywords, and Research Materials are accepted for API compatibility only and
181
+ never change the default. New tasks start from qualitative research unless the
182
+ user explicitly selects survey-based quantitative research in preflight.
183
  """
184
+ _ = title, keywords
 
 
185
  descriptors = _material_descriptors(materials)
186
+ capability = method_capability("qualitative")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
187
  return {
188
  "resolver_version": METHOD_RESOLVER_VERSION,
189
  "shadow_only": False,
190
+ "method_family": "qualitative",
191
+ "confidence": "DEFAULT_QUALITATIVE",
192
+ "reason_codes": ["manual_design_control", "default_qualitative"],
193
+ "title_keyword_hits": [],
194
  "specialized_method_detected": False,
195
  "specialized_method_families": [],
196
  "specialized_method_hits": [],
 
200
  "capability": capability,
201
  }
202
 
 
203
  def compare_shadow_to_legacy_lane(resolution: dict[str, Any], selected_lane: Any) -> dict[str, Any]:
204
  """Compare inferred design with a legacy AMJ/ASQ lane."""
205
  selected = str(selected_lane or "").strip().casefold()
 
221
  ) -> dict[str, Any]:
222
  """Resolve the two supported designs before any task/quota creation.
223
 
224
+ The default is qualitative research. If the user explicitly selects one of
225
+ the two supported production designs, that selection is authoritative.
226
+ Title, Keywords, and Research Materials never alter the chosen design.
 
227
  """
228
  resolution = resolve_method_family(title, keywords, materials=materials)
229
+ family = "qualitative"
230
 
231
  confirmed = str(confirmed_method_family or "").strip().casefold()
232
+ if confirmed in METHOD_FAMILIES:
233
  family = confirmed
234
  capability = method_capability(family)
235
  resolution = dict(resolution)
236
  resolution.update({
237
  "method_family": family,
238
+ "confidence": "USER_SELECTION",
239
  "derived_policy_lane": capability.get("legacy_policy_lane"),
240
  "capability": capability,
241
+ "reason_codes": ["manual_design_control", "user_selected_method_family"],
242
  })
243
 
244
  capability = method_capability(family)
 
261
  "legacy_policy_lane": lane,
262
  "capability": capability,
263
  }
264
+
i18n.py CHANGED
@@ -278,14 +278,14 @@ TEXTS: dict[str, dict[str, str]] = {
278
  "download_asq_template": "📥 一键下载 TXT 访谈模板",
279
  "start_asq": "🚀 启动 ASQ 模式生成",
280
  "research_materials_label": "研究资料(可选)",
281
- "research_materials_help": "支持 PDF、TXT、DOC、DOCX、CSV、XLS、XLSX。上传资料用于辅助论文生成;研究设计仅在质性研究与问卷量化研究之间根据论文题目和关键词识别。",
282
  "drop_research_materials": "将研究资料拖到这里",
283
  "limit_research_materials": "每个文件最大 1 GB · PDF, TXT, DOC, DOCX, CSV, XLS, XLSX",
284
  "material_document_use_label": "如何使用上传的 PDF/DOC/DOCX 文件?",
285
  "material_use_reference": "作为参考文献资料",
286
  "material_use_research": "作为研究资料",
287
- "detected_method_label": "研究设计(自动识别,可调整)",
288
- "method_detection_explanation": "系统根据论文题目和关键词在质性研究与问卷量化研究之间自动识别;未识别时默认质性研究,可手动调整。",
289
  "method_confirm_label": "调整研究设计",
290
  "method_confirm_placeholder": "请选择研究设计",
291
  "method_confirmation_required": "研究设计状态异常,请重新选择研究设计。",
@@ -519,14 +519,14 @@ TEXTS: dict[str, dict[str, str]] = {
519
  "download_asq_template": "📥 Download TXT Interview Template",
520
  "start_asq": "🚀 Start ASQ Generation",
521
  "research_materials_label": "Research Materials (Optional)",
522
- "research_materials_help": "Supports PDF, TXT, DOC, DOCX, CSV, XLS, and XLSX. Uploaded files support paper generation; Research Design is identified from the Title and Keywords between Qualitative Research and Survey-Based Quantitative Research only.",
523
  "drop_research_materials": "Drag research materials here",
524
  "limit_research_materials": "Up to 1 GB per file · PDF, TXT, DOC, DOCX, CSV, XLS, XLSX",
525
  "material_document_use_label": "How should SmartPaper use the uploaded PDF/DOC/DOCX files?",
526
  "material_use_reference": "Use as reference literature",
527
  "material_use_research": "Use as research materials",
528
- "detected_method_label": "Research Design (Auto-detected, Adjustable)",
529
- "method_detection_explanation": "SmartPaper identifies the Research Design from the Title and Keywords using two supported options: Qualitative Research and Survey-Based Quantitative Research. If neither is clearly indicated, Qualitative Research is used by default. You can adjust the selection manually.",
530
  "method_confirm_label": "Adjust Research Design",
531
  "method_confirm_placeholder": "Select a Research Design",
532
  "method_confirmation_required": "The Research Design state is invalid. Please select a Research Design again.",
@@ -760,14 +760,14 @@ TEXTS: dict[str, dict[str, str]] = {
760
  "download_asq_template": "📥 Скачать TXT-шаблон интервью",
761
  "start_asq": "🚀 Запустить формирование в режиме ASQ",
762
  "research_materials_label": "Материалы исследования (необязательно)",
763
- "research_materials_help": "Поддерживаются PDF, TXT, DOC, DOCX, CSV, XLS и XLSX. Загруженные файлы используются как дополнительные исследовательские или справочные материалы; дизайн исследования определяется по названию статьи и ключевым словам только между качественным исследованием и количественным исследованием на основе опроса.",
764
  "drop_research_materials": "Перетащите исследовательские материалы сюда",
765
  "limit_research_materials": "До 1 ГБ на файл · PDF, TXT, DOC, DOCX, CSV, XLS, XLSX",
766
  "material_document_use_label": "Как использовать загруженные файлы PDF/DOC/DOCX?",
767
  "material_use_reference": "Как научные источники",
768
  "material_use_research": "Как исследовательские материалы",
769
- "detected_method_label": "Дизайн исследования (определяется автоматически, можно изменить)",
770
- "method_detection_explanation": "SmartPaper определяет дизайн исследования по названию статьи и ключевым словам, выбирая между двумя поддерживаемыми вариантами: качественным исследованием и количественным исследованием на основе опроса. Если явных признаков нет, по умолчанию выбирается качественное исследование. Выбор можно изменить вручную.",
771
  "method_confirm_label": "Изменить дизайн исследования",
772
  "method_confirm_placeholder": "Выберите дизайн исследования",
773
  "method_confirmation_required": "Некорректное состояние дизайна исследования. Выберите дизайн исследования повторно.",
@@ -1001,14 +1001,14 @@ TEXTS: dict[str, dict[str, str]] = {
1001
  "download_asq_template": "📥 TXT сұхбат үлгісін жүктеу",
1002
  "start_asq": "🚀 ASQ режимінде дайындауды бастау",
1003
  "research_materials_label": "Зерттеу материалдары (міндетті емес)",
1004
- "research_materials_help": "PDF, TXT, DOC, DOCX, CSV, XLS және XLSX форматтары қолдау табады. Жүктелген файлдар қосымша зерттеу немесе анықтамалық материал ретінде пайдаланылады; зерттеу дизайны мақала тақырыбы мен кілт сөздер негізінде тек сапалық зерттеу мен сауалнамаға негізделген сандық зерттеу арасынан анықталады.",
1005
  "drop_research_materials": "Зерттеу материалдарын осы жерге сүйреп әкеліңіз",
1006
  "limit_research_materials": "Әр файлға 1 ГБ дейін · PDF, TXT, DOC, DOCX, CSV, XLS, XLSX",
1007
  "material_document_use_label": "Жүктелген PDF/DOC/DOCX файлдарын қалай пайдалану керек?",
1008
  "material_use_reference": "Ғылыми дереккөз ретінде",
1009
  "material_use_research": "Зерттеу материалы ретінде",
1010
- "detected_method_label": "Зерттеу дизайны (автоматты түрде анықталады, өзгертуге болады)",
1011
- "method_detection_explanation": "SmartPaper мақала тақырыбы мен кілт сөздер негізінде екі қолдау көрсетілетін нұсқаның бірін анықтайды: сапалық зерттеу немесе сауалнамаға негізделген сандық зерттеу. Нақты белгі болмаса, әдепкі бойынша сапалық зерттеу таңдалады. Таңдауды қолмен өзгертуге болады.",
1012
  "method_confirm_label": "Зерттеу дизайнын өзгерту",
1013
  "method_confirm_placeholder": "Зерттеу дизайнын таңдаңыз",
1014
  "method_confirmation_required": "Зерттеу дизайнының күйі жарамсыз. Зерттеу дизайнын қайта таңдаңыз.",
 
278
  "download_asq_template": "📥 一键下载 TXT 访谈模板",
279
  "start_asq": "🚀 启动 ASQ 模式生成",
280
  "research_materials_label": "研究资料(可选)",
281
+ "research_materials_help": "支持 PDF、TXT、DOC、DOCX、CSV、XLS、XLSX。上传资料用于辅助论文生成。研究设计默认为质性研究,可根据需要调整为问卷量化研究。",
282
  "drop_research_materials": "将研究资料拖到这里",
283
  "limit_research_materials": "每个文件最大 1 GB · PDF, TXT, DOC, DOCX, CSV, XLS, XLSX",
284
  "material_document_use_label": "如何使用上传的 PDF/DOC/DOCX 文件?",
285
  "material_use_reference": "作为参考文献资料",
286
  "material_use_research": "作为研究资料",
287
+ "detected_method_label": "研究设计(可调整)",
288
+ "method_detection_explanation": "默认为质性研究;生成前可根据需要调整为问卷量化研究。",
289
  "method_confirm_label": "调整研究设计",
290
  "method_confirm_placeholder": "请选择研究设计",
291
  "method_confirmation_required": "研究设计状态异常,请重新选择研究设计。",
 
519
  "download_asq_template": "📥 Download TXT Interview Template",
520
  "start_asq": "🚀 Start ASQ Generation",
521
  "research_materials_label": "Research Materials (Optional)",
522
+ "research_materials_help": "Supports PDF, TXT, DOC, DOCX, CSV, XLS, and XLSX. Uploaded files support paper generation. Research Design defaults to Qualitative Research and can be adjusted to Survey-Based Quantitative Research.",
523
  "drop_research_materials": "Drag research materials here",
524
  "limit_research_materials": "Up to 1 GB per file · PDF, TXT, DOC, DOCX, CSV, XLS, XLSX",
525
  "material_document_use_label": "How should SmartPaper use the uploaded PDF/DOC/DOCX files?",
526
  "material_use_reference": "Use as reference literature",
527
  "material_use_research": "Use as research materials",
528
+ "detected_method_label": "Research Design (Adjustable)",
529
+ "method_detection_explanation": "Qualitative Research is selected by default. Before generation, you can adjust the Research Design to Survey-Based Quantitative Research.",
530
  "method_confirm_label": "Adjust Research Design",
531
  "method_confirm_placeholder": "Select a Research Design",
532
  "method_confirmation_required": "The Research Design state is invalid. Please select a Research Design again.",
 
760
  "download_asq_template": "📥 Скачать TXT-шаблон интервью",
761
  "start_asq": "🚀 Запустить формирование в режиме ASQ",
762
  "research_materials_label": "Материалы исследования (необязательно)",
763
+ "research_materials_help": "Поддерживаются PDF, TXT, DOC, DOCX, CSV, XLS и XLSX. Загруженные файлы используются как дополнительные исследовательские или справочные материалы. По умолчанию выбрано качественное исследование; при необхо��имости дизайн можно изменить на количественное исследование на основе опроса.",
764
  "drop_research_materials": "Перетащите исследовательские материалы сюда",
765
  "limit_research_materials": "До 1 ГБ на файл · PDF, TXT, DOC, DOCX, CSV, XLS, XLSX",
766
  "material_document_use_label": "Как использовать загруженные файлы PDF/DOC/DOCX?",
767
  "material_use_reference": "Как научные источники",
768
  "material_use_research": "Как исследовательские материалы",
769
+ "detected_method_label": "Дизайн исследования (можно изменить)",
770
+ "method_detection_explanation": "По умолчанию выбрано качественное исследование. До начала генерации дизайн можно изменить на количественное исследование на основе опроса.",
771
  "method_confirm_label": "Изменить дизайн исследования",
772
  "method_confirm_placeholder": "Выберите дизайн исследования",
773
  "method_confirmation_required": "Некорректное состояние дизайна исследования. Выберите дизайн исследования повторно.",
 
1001
  "download_asq_template": "📥 TXT сұхбат үлгісін жүктеу",
1002
  "start_asq": "🚀 ASQ режимінде дайындауды бастау",
1003
  "research_materials_label": "Зерттеу материалдары (міндетті емес)",
1004
+ "research_materials_help": "PDF, TXT, DOC, DOCX, CSV, XLS және XLSX форматтары қолдау табады. Жүктелген файлдар қосымша зерттеу немесе анықтамалық материал ретінде пайдаланылады. Әдепкі бойынша сапалық зерттеу таңдалады; қажет болса, дизайнды сауалнамаға негізделген сандық зерттеуге өзгертуге болады.",
1005
  "drop_research_materials": "Зерттеу материалдарын осы жерге сүйреп әкеліңіз",
1006
  "limit_research_materials": "Әр файлға 1 ГБ дейін · PDF, TXT, DOC, DOCX, CSV, XLS, XLSX",
1007
  "material_document_use_label": "Жүктелген PDF/DOC/DOCX файлдарын қалай пайдалану керек?",
1008
  "material_use_reference": "Ғылыми дереккөз ретінде",
1009
  "material_use_research": "Зерттеу материалы ретінде",
1010
+ "detected_method_label": "Зерттеу дизайны (өзгертуге болады)",
1011
+ "method_detection_explanation": "Әдепкі бойынша сапалық зерттеу таңдалады. Гене��ацияны бастамас бұрын зерттеу дизайнын сауалнамаға негізделген сандық зерттеуге өзгертуге болады.",
1012
  "method_confirm_label": "Зерттеу дизайнын өзгерту",
1013
  "method_confirm_placeholder": "Зерттеу дизайнын таңдаңыз",
1014
  "method_confirmation_required": "Зерттеу дизайнының күйі жарамсыз. Зерттеу дизайнын қайта таңдаңыз.",