S1-R1 research intent moderation authority closure

#122
core/generation_runner.py CHANGED
@@ -1216,6 +1216,25 @@ class GenerationRunner:
1216
  blocking.append(row)
1217
  return blocking, advisory
1218
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1219
  @classmethod
1220
  def _partition_section_violations_by_lineage(
1221
  cls, rows, lineage_attempts, *, section_name: str = "", mode: str = "",
@@ -5194,6 +5213,10 @@ The previous attempt for this same manuscript unit was rejected by validation. R
5194
  full_draft_en, hypothesis_ledger, section_name="Full Manuscript", require_all=True
5195
  )
5196
  if hypothesis_rows:
 
 
 
 
5197
  self._record_adaptive_completion_residual(
5198
  quality_notes, hypothesis_rows, section_name="Full Manuscript", stage="final_hypothesis_review"
5199
  )
@@ -5407,6 +5430,10 @@ The previous attempt for this same manuscript unit was rejected by validation. R
5407
  full_draft_en, hypothesis_ledger, section_name="Full Manuscript", require_all=True
5408
  )
5409
  if post_front_hypothesis_rows:
 
 
 
 
5410
  self._record_adaptive_completion_residual(
5411
  quality_notes, post_front_hypothesis_rows, section_name="Final Abstract",
5412
  stage="post_front_matter_hypothesis_review"
 
1216
  blocking.append(row)
1217
  return blocking, advisory
1218
 
1219
+ @classmethod
1220
+ def _raise_if_fatal_completion_residual(
1221
+ cls, rows, *, section_name: str = "", mode: str = "", error_code: str = "final_validation_unresolved"
1222
+ ) -> None:
1223
+ """Fail closed only for residuals already classified as FATAL.
1224
+
1225
+ Adaptive completion may retain advisory diagnostics, but it must never
1226
+ downgrade hypothesis identity or other fatal correctness contracts into
1227
+ a shippable manuscript.
1228
+ """
1229
+ fatal = [
1230
+ row for row in list(rows or [])
1231
+ if cls._section_violation_severity(
1232
+ row, section_name=section_name, mode=mode, exhausted=True
1233
+ ) == "FATAL"
1234
+ ]
1235
+ if fatal:
1236
+ raise RuntimeError(f"{error_code}:{fatal[:4]}")
1237
+
1238
  @classmethod
1239
  def _partition_section_violations_by_lineage(
1240
  cls, rows, lineage_attempts, *, section_name: str = "", mode: str = "",
 
5213
  full_draft_en, hypothesis_ledger, section_name="Full Manuscript", require_all=True
5214
  )
5215
  if hypothesis_rows:
5216
+ self._raise_if_fatal_completion_residual(
5217
+ hypothesis_rows, section_name="Full Manuscript", mode=mode,
5218
+ error_code="final_hypothesis_contract_unresolved"
5219
+ )
5220
  self._record_adaptive_completion_residual(
5221
  quality_notes, hypothesis_rows, section_name="Full Manuscript", stage="final_hypothesis_review"
5222
  )
 
5430
  full_draft_en, hypothesis_ledger, section_name="Full Manuscript", require_all=True
5431
  )
5432
  if post_front_hypothesis_rows:
5433
+ self._raise_if_fatal_completion_residual(
5434
+ post_front_hypothesis_rows, section_name="Full Manuscript", mode=mode,
5435
+ error_code="post_front_matter_hypothesis_contract_unresolved"
5436
+ )
5437
  self._record_adaptive_completion_residual(
5438
  quality_notes, post_front_hypothesis_rows, section_name="Final Abstract",
5439
  stage="post_front_matter_hypothesis_review"
core/study_design_contract.py CHANGED
@@ -408,7 +408,14 @@ def _append_relation(relations: list[dict[str, Any]], *, rtype: str, source: str
408
  def _reconcile_explicit_quantitative_intent(
409
  *, topic: str, keywords: Any, constructs: list[dict[str, Any]], relations: list[dict[str, Any]], decisions: list[dict[str, Any]]
410
  ) -> dict[str, Any]:
411
- """Deterministically close omissions that would silently erase explicit user design intent."""
 
 
 
 
 
 
 
412
  intent = build_user_research_intent(topic, keywords, mode="quantitative")
413
  explicit = set(intent.get("explicit_relation_types") or [])
414
  if not explicit:
@@ -423,9 +430,11 @@ def _reconcile_explicit_quantitative_intent(
423
 
424
  if "moderation" in explicit:
425
  moderator_ids = ids_for("moderator")
426
- # Prefer the construct named nearest the user's explicit moderation cue.
427
- # A model-assigned role is advisory; the user's title/keywords are authority.
 
428
  moderator_label = _phrase_bound_intent_label(intent_text, labels, "moderation")
 
429
  if not moderator_label:
430
  noncore_labels = [
431
  str(row.get("label") or "") for row in constructs
@@ -441,7 +450,33 @@ def _reconcile_explicit_quantitative_intent(
441
  moderator_id = moderator_ids[0]
442
  else:
443
  moderator_id = ""
 
444
  if moderator_id:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
445
  direct = [r for r in relations if r.get("type") == "direct_association"]
446
  predictor_ids, outcome_ids = ids_for("predictor"), ids_for("outcome")
447
  preferred = next((r for r in direct if r.get("source") in predictor_ids and r.get("target") in outcome_ids), None)
@@ -453,6 +488,21 @@ def _reconcile_explicit_quantitative_intent(
453
  if len(relations) > before:
454
  decisions.append({"reason":"explicit_user_moderation_reconciled","moderator":moderator_id,"source":source,"target":target})
455
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
456
  if "mediation" in explicit or "serial_mediation" in explicit or "parallel_mediation" in explicit:
457
  mediator_ids = ids_for("mediator")
458
  mediator_label = _phrase_bound_intent_label(intent_text, labels, "mediation") or _closest_intent_label(intent_text, labels, _MEDIATION_CUES)
@@ -824,6 +874,10 @@ def build_quantitative_front_matter_contract(contract: dict[str, Any], *, versio
824
  "policy": "adaptive_study_design_frozen_semantic_authority",
825
  "source_topic": str((contract or {}).get("source_topic") or ""),
826
  "source_keywords": list((contract or {}).get("source_keywords") or []),
 
 
 
 
827
  "construct_roles": construct_roles,
828
  "constructs": role_map,
829
  "construct_items": items,
 
408
  def _reconcile_explicit_quantitative_intent(
409
  *, topic: str, keywords: Any, constructs: list[dict[str, Any]], relations: list[dict[str, Any]], decisions: list[dict[str, Any]]
410
  ) -> dict[str, Any]:
411
+ """Make explicit user design intent canonical rather than merely additive.
412
+
413
+ R7-R2C-R5 restored omitted mediation/moderation relations, but an upstream
414
+ model could still leave contradictory relations in place. S1-R1 closes
415
+ that authority gap: when the user explicitly names a moderator, model-
416
+ assigned alternative moderators are advisory proposals and are removed
417
+ before the canonical user relation is compiled.
418
+ """
419
  intent = build_user_research_intent(topic, keywords, mode="quantitative")
420
  explicit = set(intent.get("explicit_relation_types") or [])
421
  if not explicit:
 
430
 
431
  if "moderation" in explicit:
432
  moderator_ids = ids_for("moderator")
433
+ # A phrase-bound moderator named by the user is canonical authority.
434
+ # Model-assigned moderator roles/relations may not coexist when they
435
+ # contradict that explicit identity.
436
  moderator_label = _phrase_bound_intent_label(intent_text, labels, "moderation")
437
+ authoritative_named_moderator = bool(moderator_label)
438
  if not moderator_label:
439
  noncore_labels = [
440
  str(row.get("label") or "") for row in constructs
 
450
  moderator_id = moderator_ids[0]
451
  else:
452
  moderator_id = ""
453
+
454
  if moderator_id:
455
+ if authoritative_named_moderator:
456
+ # Remove only the conflicting moderator role. Other legitimate
457
+ # roles (e.g. predictor/main-effect participation) are preserved.
458
+ for row in constructs:
459
+ if str(row.get("construct_id") or "") == moderator_id:
460
+ continue
461
+ roles = list(row.get("roles") or [])
462
+ if "moderator" in roles:
463
+ row["roles"] = [role for role in roles if role != "moderator"]
464
+
465
+ removed = []
466
+ retained = []
467
+ for relation in relations:
468
+ if relation.get("type") == "moderation" and str(relation.get("moderator") or "") != moderator_id:
469
+ removed.append(dict(relation))
470
+ continue
471
+ retained.append(relation)
472
+ if removed:
473
+ relations[:] = retained
474
+ decisions.append({
475
+ "reason": "conflicting_model_moderation_removed_by_explicit_user_authority",
476
+ "moderator": moderator_id,
477
+ "removed_relation_ids": [str(row.get("relation_id") or "") for row in removed],
478
+ })
479
+
480
  direct = [r for r in relations if r.get("type") == "direct_association"]
481
  predictor_ids, outcome_ids = ids_for("predictor"), ids_for("outcome")
482
  preferred = next((r for r in direct if r.get("source") in predictor_ids and r.get("target") in outcome_ids), None)
 
488
  if len(relations) > before:
489
  decisions.append({"reason":"explicit_user_moderation_reconciled","moderator":moderator_id,"source":source,"target":target})
490
 
491
+ if authoritative_named_moderator:
492
+ # After removing contradictory model hypotheses, close any H-number
493
+ # gap deterministically. This is identity normalization only; it
494
+ # does not change relation semantics or create extra hypotheses.
495
+ numbered = [
496
+ (idx, row) for idx, row in enumerate(relations)
497
+ if row.get("numbered_hypothesis", True) and row.get("type") != "control_effect"
498
+ ]
499
+ numbered.sort(key=lambda item: (
500
+ int(item[1].get("hypothesis_order")) if str(item[1].get("hypothesis_order") or "").isdigit() else 10**6,
501
+ item[0],
502
+ ))
503
+ for order, (_idx, row) in enumerate(numbered, start=1):
504
+ row["hypothesis_order"] = order
505
+
506
  if "mediation" in explicit or "serial_mediation" in explicit or "parallel_mediation" in explicit:
507
  mediator_ids = ids_for("mediator")
508
  mediator_label = _phrase_bound_intent_label(intent_text, labels, "mediation") or _closest_intent_label(intent_text, labels, _MEDIATION_CUES)
 
874
  "policy": "adaptive_study_design_frozen_semantic_authority",
875
  "source_topic": str((contract or {}).get("source_topic") or ""),
876
  "source_keywords": list((contract or {}).get("source_keywords") or []),
877
+ # S1-R1: compatibility front-matter metadata must carry the complete
878
+ # R5/R6 user Research Intent Authority. Without it a degraded final
879
+ # reconciliation can silently synthesize a different title/keyword set.
880
+ "user_research_intent": dict((contract or {}).get("user_research_intent") or {}),
881
  "construct_roles": construct_roles,
882
  "constructs": role_map,
883
  "construct_items": items,
i18n.py CHANGED
@@ -325,7 +325,7 @@ TEXTS: dict[str, dict[str, str]] = {
325
  "literature_insufficient": "当前没有检索到可用于形成有效参考文献列表的直接相关文献。系统未使用无关文献凑数。请检查研究题目、关键词或补充核心文献后重试。",
326
  "upstream_translation_stopped": "英文母稿未形成可交付的有效参考文献列表,因此后续翻译已停止;当前页面中已显示的译文不是完整论文。",
327
  "evidence_limited_running": "文献证据覆盖提示:当前主题可能较前沿、较小众或具有较强跨学科特征,因此数据库中能够直接核验的高相关文献可能较少。这不会中断论文生成,也不代表研究价值不足。系统将继续完成论文,并坚持不使用无关或无法核验的文献凑数。建议后续结合领域核心文献进一步完善;对尚未被充分研究的问题保持探索,可能形成有价值的学术贡献。",
328
- "evidence_limited_completed": "论文已完整生成。当前主题的直接可核验文献证据覆盖有限,可能与研究较前沿、较小众或跨学科有关;这不代表研究价值不足。系统未使用无关或无法核验的文献凑数。正式投稿前建议结合 EVIDENCE_COVERAGE_REPORT.txt 补充或复核领域核心文献,并继续审慎推进有价值的新问题探索。",
329
  "node_error_detail": "错误代码:{code}|{error}|系统已保存断点,可继续恢复。",
330
  "task_cancelled": "任务已取消,断点和临时文件已删除。",
331
  "task_start_failed": "无法启动论文任务:{error}",
@@ -535,7 +535,7 @@ TEXTS: dict[str, dict[str, str]] = {
535
  "literature_insufficient": "No directly relevant literature was retrieved that can support a valid final reference list. Unrelated sources were not used to fill a quota. Check the topic or keywords, or provide relevant core literature, and try again.",
536
  "upstream_translation_stopped": "The English source manuscript could not form a deliverable validated reference list, so downstream translation stopped. Any translated text currently shown is incomplete and is not a final paper.",
537
  "evidence_limited_running": "Literature-evidence coverage notice: this topic may be frontier, niche, or strongly interdisciplinary, so databases may contain relatively few high-relevance sources that can be directly validated. This will not interrupt manuscript generation and does not imply low research value. The system will continue the paper without padding it with irrelevant or unverifiable references. Consider adding core field literature later; careful exploration of under-studied questions may yield a valuable academic contribution.",
538
- "evidence_limited_completed": "The paper was generated in full despite limited directly validated literature coverage. The topic may be frontier, niche, or interdisciplinary; this does not imply low research value. No irrelevant or unverifiable references were added merely to reach a count. Before formal submission, review EVIDENCE_COVERAGE_REPORT.txt and supplement or recheck core field literature while continuing careful exploration of the research question.",
539
  "node_error_detail": "Error code: {code} | {error} | A checkpoint has been saved and can be resumed.",
540
  "task_cancelled": "The task was cancelled. Its checkpoint and temporary files were deleted.",
541
  "task_start_failed": "The paper task could not be started: {error}",
@@ -745,7 +745,7 @@ TEXTS: dict[str, dict[str, str]] = {
745
  "literature_insufficient": "Не удалось найти прямо релевантную литературу, достаточную для формирования валидного итогового списка источников. Система не использовала не��елевантные публикации ради количества. Проверьте тему и ключевые слова либо добавьте релевантные основные источники и повторите попытку.",
746
  "upstream_translation_stopped": "Для английской исходной рукописи не удалось сформировать пригодный к выдаче валидный список источников, поэтому дальнейший перевод остановлен. Уже показанный перевод неполный и не является окончательной статьёй.",
747
  "evidence_limited_running": "Уведомление о литературных доказательствах: тема может быть передовой, узкоспециализированной или междисциплинарной, поэтому в базах данных может быть немного высокорелевантных источников, которые удаётся напрямую подтвердить. Это не остановит создание статьи и не означает низкую научную ценность исследования. Система продолжит работу и не будет добавлять нерелевантные или непроверяемые источники ради количества. Позднее рекомендуется дополнить основную литературу по области; тщательное изучение недостаточно исследованных вопросов может дать ценный научный вклад.",
748
- "evidence_limited_completed": "Статья полностью сформирована при ограниченном покрытии напрямую подтверждённой литературой. Тема может быть передовой, узкой или междисциплинарной; это не означает низкую научную ценность. Нерелевантные или непроверяемые источники не добавлялись ради количества. Перед подачей рекомендуется изучить EVIDENCE_COVERAGE_REPORT.txt, дополнить или перепроверить основную литературу и продолжить осторожное исследование нового вопроса.",
749
  "node_error_detail": "Код ошибки: {code} | {error} | Контрольная точка сохранена; работу можно продолжить.",
750
  "task_cancelled": "Задача отменена. Контрольная точка и временные файлы удалены.",
751
  "task_start_failed": "Не удалось запустить подготовку статьи: {error}",
@@ -955,7 +955,7 @@ TEXTS: dict[str, dict[str, str]] = {
955
  "literature_insufficient": "Жарамды соңғы әдебиеттер тізімін құруға жеткілікті тікелей релевантты әдебиет табылмады. Жүйе санды толтыру үшін қатысы жоқ дереккөздерді пайдаланбады. Тақырып пен кілт сөздерді тексеріңіз немесе релевантты негізгі әдебиетті қосып, қайта көріңіз.",
956
  "upstream_translation_stopped": "Ағылшын бастапқы қолжазбасы үшін жеткізуге жарамды тексерілген әдебиеттер тізімі қалыптаспады, сондықтан кейінгі аударма тоқтатылды. Қазір көрсетілген аударма толық емес және соңғы мақала болып саналмайды.",
957
  "evidence_limited_running": "Әдеби дәлелдер туралы ескерту: тақырып өте жаңа, тар ауқымды немесе пәнаралық болуы мүмкін, сондықтан дерекқорларда тікелей тексеруге болатын жоғары релевантты еңбектер аз кездесуі ықтимал. Бұл мақала жасауды тоқтатпайды және зерттеудің ғылыми құндылығы төмен дегенді білдірмейді. Жүйе жұмысты жалғастырады және санды толтыру үшін қатысы жоқ немесе тексерілмейтін дереккөздерді қоспайды. Кейін саланың негізгі әдебиетін толықтырған жөн; аз зерттелген мәселелерді мұқият зерделеу құнды ғылыми үлеске әкелуі мүмкін.",
958
- "evidence_limited_completed": "Мақала тікелей тексерілген әдебиет қамтуы шектеулі болғанына қарамастан толық жасалды. Тақырып жаңа, тар ауқымды немесе пәнаралық болуы мүмкін; бұл зерттеу құндылығы төмен дегенді білдірмейді. Сан үшін қатысы жоқ немесе тексерілмейтін дереккөздер қосылған жоқ. Ресми тапсыру алдында EVIDENCE_COVERAGE_REPORT.txt файлын қарап, негізгі әдебиетті толықтыру немесе қайта тексеру және жаңа зерттеу мәселесін мұқият дамытуды жалғастыру ұсынылады.",
959
  "node_error_detail": "Қате коды: {code} | {error} | Бақылау нүктесі сақталды; жұмысты жалғастыруға болады.",
960
  "task_cancelled": "Тапсырма тоқтатылды. Бақылау нүктесі мен уақытша файлдар жойылды.",
961
  "task_start_failed": "Мақала тапсырмасын бастау мүмкін болмады: {error}",
 
325
  "literature_insufficient": "当前没有检索到可用于形成有效参考文献列表的直接相关文献。系统未使用无关文献凑数。请检查研究题目、关键词或补充核心文献后重试。",
326
  "upstream_translation_stopped": "英文母稿未形成可交付的有效参考文献列表,因此后续翻译已停止;当前页面中已显示的译文不是完整论文。",
327
  "evidence_limited_running": "文献证据覆盖提示:当前主题可能较前沿、较小众或具有较强跨学科特征,因此数据库中能够直接核验的高相关文献可能较少。这不会中断论文生成,也不代表研究价值不足。系统将继续完成论文,并坚持不使用无关或无法核验的文献凑数。建议后续结合领域核心文献进一步完善;对尚未被充分研究的问题保持探索,可能形成有价值的学术贡献。",
328
+ "evidence_limited_completed": "论文已完整生成,并保持了严格的文献相关性与可核验性要求。当前主题可能较前沿、较小众或具有较强跨学科特征,因此可直接核验的高相关文献数量相对有限;系统优先保证文献质量与研究聚焦,没有为了增加数量而加入无关或无法核验的来源。这也可能意味着该研究问题仍具有进一步拓展学术贡献的空间。正式投稿前,建议结合 EVIDENCE_COVERAGE_REPORT.txt 复核并适当补充领域核心文献,以进一步增强论文的理论基础。",
329
  "node_error_detail": "错误代码:{code}|{error}|系统已保存断点,可继续恢复。",
330
  "task_cancelled": "任务已取消,断点和临时文件已删除。",
331
  "task_start_failed": "无法启动论文任务:{error}",
 
535
  "literature_insufficient": "No directly relevant literature was retrieved that can support a valid final reference list. Unrelated sources were not used to fill a quota. Check the topic or keywords, or provide relevant core literature, and try again.",
536
  "upstream_translation_stopped": "The English source manuscript could not form a deliverable validated reference list, so downstream translation stopped. Any translated text currently shown is incomplete and is not a final paper.",
537
  "evidence_limited_running": "Literature-evidence coverage notice: this topic may be frontier, niche, or strongly interdisciplinary, so databases may contain relatively few high-relevance sources that can be directly validated. This will not interrupt manuscript generation and does not imply low research value. The system will continue the paper without padding it with irrelevant or unverifiable references. Consider adding core field literature later; careful exploration of under-studied questions may yield a valuable academic contribution.",
538
+ "evidence_limited_completed": "The paper has been generated in full with evidence-quality safeguards preserved. Because this topic may be frontier, niche, or interdisciplinary, directly validated high-relevance literature coverage may be relatively limited. SmartPaper therefore prioritized relevance and verifiability rather than adding unrelated or unverifiable references merely to increase the count. This may also indicate room for further scholarly contribution. Before formal submission, review EVIDENCE_COVERAGE_REPORT.txt and, where appropriate, strengthen the manuscript with additional core field literature.",
539
  "node_error_detail": "Error code: {code} | {error} | A checkpoint has been saved and can be resumed.",
540
  "task_cancelled": "The task was cancelled. Its checkpoint and temporary files were deleted.",
541
  "task_start_failed": "The paper task could not be started: {error}",
 
745
  "literature_insufficient": "Не удалось найти прямо релевантную литературу, достаточную для формирования валидного итогового списка источников. Система не использовала не��елевантные публикации ради количества. Проверьте тему и ключевые слова либо добавьте релевантные основные источники и повторите попытку.",
746
  "upstream_translation_stopped": "Для английской исходной рукописи не удалось сформировать пригодный к выдаче валидный список источников, поэтому дальнейший перевод остановлен. Уже показанный перевод неполный и не является окончательной статьёй.",
747
  "evidence_limited_running": "Уведомление о литературных доказательствах: тема может быть передовой, узкоспециализированной или междисциплинарной, поэтому в базах данных может быть немного высокорелевантных источников, которые удаётся напрямую подтвердить. Это не остановит создание статьи и не означает низкую научную ценность исследования. Система продолжит работу и не будет добавлять нерелевантные или непроверяемые источники ради количества. Позднее рекомендуется дополнить основную литературу по области; тщательное изучение недостаточно исследованных вопросов может дать ценный научный вклад.",
748
+ "evidence_limited_completed": "Статья полностью сформирована с сохранением строгих требований к релевантности и проверяемости источников. Тема может быть передовой, узкоспециализированной или междисциплинарной, поэтому число напрямую проверяемых источников с высокой релевантностью может быть относительно небольшим. SmartPaper отдаёт приоритет качеству и тематической точности, не добавляя нерелевантные или непроверяемые источники ради количества. Это также может указывать на пространство для дальнейшего научного вклада. Перед формальной подачей рекомендуется просмотреть EVIDENCE_COVERAGE_REPORT.txt и при необходимости усилить теоретическую основу дополнительной ключевой литературой по теме.",
749
  "node_error_detail": "Код ошибки: {code} | {error} | Контрольная точка сохранена; работу можно продолжить.",
750
  "task_cancelled": "Задача отменена. Контрольная точка и временные файлы удалены.",
751
  "task_start_failed": "Не удалось запустить подготовку статьи: {error}",
 
955
  "literature_insufficient": "Жарамды соңғы әдебиеттер тізімін құруға жеткілікті тікелей релевантты әдебиет табылмады. Жүйе санды толтыру үшін қатысы жоқ дереккөздерді пайдаланбады. Тақырып пен кілт сөздерді тексеріңіз немесе релевантты негізгі әдебиетті қосып, қайта көріңіз.",
956
  "upstream_translation_stopped": "Ағылшын бастапқы қолжазбасы үшін жеткізуге жарамды тексерілген әдебиеттер тізімі қалыптаспады, сондықтан кейінгі аударма тоқтатылды. Қазір көрсетілген аударма толық емес және соңғы мақала болып саналмайды.",
957
  "evidence_limited_running": "Әдеби дәлелдер туралы ескерту: тақырып өте жаңа, тар ауқымды немесе пәнаралық болуы мүмкін, сондықтан дерекқорларда тікелей тексеруге болатын жоғары релевантты еңбектер аз кездесуі ықтимал. Бұл мақала жасауды тоқтатпайды және зерттеудің ғылыми құндылығы төмен дегенді білдірмейді. Жүйе жұмысты жалғастырады және санды толтыру үшін қатысы жоқ немесе тексерілмейтін дереккөздерді қоспайды. Кейін саланың негізгі әдебиетін толықтырған жөн; аз зерттелген мәселелерді мұқият зерделеу құнды ғылыми үлеске әкелуі мүмкін.",
958
+ "evidence_limited_completed": "Мақала әдебиеттердің өзектілігі мен тексерілуіне қойылатын қатаң талаптар сақтала отырып толық жасалды. Тақырып жаңа, тар маманданған немесе пәнаралық болуы мүмкін, сондықтан тікелей тексерілетін әрі жоғары өзекті әдебиеттер саны салыстырмалы түрде аз болуы ықтимал. SmartPaper санды көбейту үшін қатысы жоқ немесе тексерілмейтін дереккөздерді қоспай, әдебиет сапасы мен зерттеу фокусына басымдық береді. Бұл зерттеу мәселесінде одан әрі ғылыми үлес қосуға мүмкіндік бар екенін де көрсетуі мүмкін. Ресми тапсыру алдында EVIDENCE_COVERAGE_REPORT.txt файлын қарап, қажет болса саланың негізгі әдебиеттерімен теориялық негізді күшейту ұсынылады.",
959
  "node_error_detail": "Қате коды: {code} | {error} | Бақылау нүктесі сақталды; жұмысты жалғастыруға болады.",
960
  "task_cancelled": "Тапсырма тоқтатылды. Бақылау нүктесі мен уақытша файлдар жойылды.",
961
  "task_start_failed": "Мақала тапсырмасын бастау мүмкін болмады: {error}",