مشكلة تراجع محتملة في حدث post_edited؟

تقرير خطأ في Discourse: تراجع في حدث :post_edited في أحدث إصدار (latest-release)

يؤثر على: فرع latest-release في Discourse (الإصدار +122)
الحالة: تراجع مؤكد - يمكن تكراره
التاريخ: 15 يناير 2026


الملخص

توقف نشر حدث DiscourseEvent المسمى :post_edited في الإصدارات الأخيرة من latest-release. تكتمل تعديلات المشاركات بنجاح ويتم إنشاء المراجعات، لكن الحدث الذي تعتمد عليه الإضافات (plugins) لا يتم إطلاقه أبدًا. هذا يكسر جميع الإضافات التي تستخدم مشغل الأتمتة post_created_edited وأي إضافات أخرى تستمع إلى أحداث :post_edited.


التكرار (مؤكد)

أكدنا أن هذا تراجع من خلال الاختبار على بيئتي Azure AKS متطابقتين:

قبل التحديث (يعمل)

  • الإصدار: v2026.1.0-latest (بناء أقدم)
  • السلوك: :white_check_mark: يتم إطلاق أحداث :post_edited بشكل صحيح
  • الأتمتة: :white_check_mark: يعمل تلقائيًا

بعد التحديث (معطل)

  • الإصدار: latest-release +1221 hours ago, release +122
  • السلوك: :cross_mark: لا يتم إطلاق أحداث :post_edited أبدًا
  • الأتمتة: :cross_mark: معطلة تمامًا

اكتشاف حاسم: كانت كلتا البيئتين تعملان قبل التحديث. تعطلتا كلتاهما بعد التحديث إلى latest-release +122. هذا يثبت بشكل قاطع أنه تم إدخال تراجع.


تفاصيل البيئة

  • إصدار Discourse: latest-release (الإصدار +122)
  • إصدار Rails: 8.0.4
  • البنية التحتية: خدمة Azure Kubernetes (AKS)
  • صورة Docker: discourse/base:2.0.20260109-0020
  • النشر: تثبيت Docker قياسي لـ Discourse

إجراء الاختبار

الاختبار 1: مستمع الحدث (يثبت أن الحدث لا يتم إطلاقه أبدًا)

# في وحدة تحكم Rails
File.open('/tmp/post_edited_test.log', 'w') { |f| f.write("Test started at #{Time.now}\n") }

DiscourseEvent.on(:post_edited) do |post, topic_changed, revisor|
  File.open('/tmp/post_edited_test.log', 'a') do |f|
    f.write("[#{Time.now}] :post_edited fired! Post #{post.id}\n")
  end
end

ثم قم بتعديل أي مشاركة عبر واجهة الويب وتحقق من:

cat /tmp/post_edited_test.log

النتيجة على latest-release +122: يعرض فقط “Test started” - الحدث لا يتم إطلاقه أبدًا
النتيجة على البناء الأقدم: يعرض إدخالات الحدث مع الطوابع الزمنية ومعرفات المشاركات

الاختبار 2: التحقق من إنشاء المراجعات

post = Post.find(POST_ID)
puts "Post revisions: #{post.revisions.count}"
post.revisions.last(3).each { |rev| puts "  Revision #{rev.number}: #{rev.created_at}" }

النتيجة: يتم إنشاء المراجعات بشكل صحيح مع الطوابع الزمنية المناسبة
الاستنتاج: تتم معالجة التعديلات بنجاح، ولكن لم يتم استدعاء post_process_post أو لم يتم تشغيل الحدث

الاختبار 3: تشغيل الحدث يدويًا (يثبت أن نظام الحدث يعمل)

post = Post.find(POST_ID)
DiscourseEvent.trigger(:post_edited, post, false, PostRevisor.new(post))

النتيجة: يتم تنفيذ معالجات الأحداث بشكل صحيح
الاستنتاج: نظام الحدث يعمل، لكن التشغيل التلقائي أثناء التعديلات معطل


السلوك المتوقع

عند تعديل مشاركة عبر واجهة الويب:

  1. يتم حفظ التعديل بنجاح :white_check_mark:
  2. يتم إنشاء مراجعة للمشاركة :white_check_mark:
  3. يتم استدعاء PostRevisor#post_process_post :cross_mark:
  4. يتم تشغيل حدث :post_edited :cross_mark:
  5. يتم تنفيذ معالجات الحدث :cross_mark:

الخطوات 1-2 فقط تعمل. الخطوات 3-5 معطلة.


السلوك الفعلي

تُظهر سجلات الإنتاج إكمال التعديل بنجاح:

Started PUT "/posts/3631" for 88.97.179.124 at 2026-01-15 13:06:19 +0000
Processing by PostsController#update as JSON
Completed 200 OK in 676ms

لا توجد أخطاء، ولا استثناءات، ولكن لم يتم نشر أي حدث :post_edited.

يجب تشغيل الحدث في /var/www/discourse/lib/post_revisor.rb السطر 759:

def post_process_post
  @post.invalidate_oneboxes = true
  @post.trigger_post_process
  DiscourseEvent.trigger(:post_edited, @post, self.topic_changed?, self)
end

يتم استدعاء هذه الطريقة من السطر 341 ولكن الحدث لا يتم إطلاقه.


التأثير

الميزات الرسمية المتأثرة

  • أتمتة Discourse (Discourse Automation): مشغل post_created_edited معطل تمامًا
  • تفشل جميع مسارات سير عمل الأتمتة التي تعتمد على تعديلات المشاركات بصمت

الإضافات المتأثرة

جميع الإضافات التي تستمع إلى أحداث :post_edited معطلة:

  • discourse-automation - مشغلات الأتمتة الرسمية
  • discourse-ai - الإشراف بالذكاء الاصطناعي على المشاركات المعدلة
  • discourse-doc-categories - تحديثات فهرس الوثائق
  • discourse-topic-voting - مسارات سير عمل استرداد الأصوات
  • أي إضافات مخصصة تستخدم أحداث تعديل المشاركات

جدول زمني للتراجع

  1. البناء الأقدم: v2026.1.0-latest - أحداث :post_edited كانت تعمل :white_check_mark:
  2. تم التحديث إلى: latest-release (الإصدار +122) - أحداث :post_edited معطلة :cross_mark:
  3. تم التأكيد على: بيئتي إنتاج مستقلتين (تعطلتا كلتاهما بعد التحديث)

هذا يثبت بشكل قاطع أنه تم إدخال تراجع في إصدارات latest-release الأخيرة.


الحل البديل (Workaround)

التشغيل اليدوي عبر وحدة تحكم Rails يعمل:

automation = DiscourseAutomation::Automation.find(AUTOMATION_ID)
post = Post.find(POST_ID)
automation.trigger!({"post" => post})

هذا يؤكد أن نظام الأتمتة نفسه يعمل - التشغيل التلقائي للحدث هو المعطل فقط.


ملاحظات التكوين

  • الإعدادات التي تم التحقق منها: جميع الإعدادات المتعلقة بالتحرير قياسية/افتراضية
  • فترة السماح: تم الاختبار مع تعديلات خارج فترة السماح (لا تأثير)
  • الإضافات: 50 إضافة مثبتة (الإضافات الرسمية القياسية)
  • لا توجد تعديلات أساسية: تثبيت Discourse نظيف
  • البيئة: كلتا بيئتي الاختبار عبارة عن عمليات نشر متطابقة لـ Azure AKS

الدليل الرئيسي

أهم اكتشاف:

كان لدينا بيئة تطوير تعمل على بناء أقدم. بعد التحديث إلى latest-release +122، توقفت الأتمتة عن العمل. هذا يثبت بيقين أن تراجعًا قد تم إدخاله في الإصدارات الأخيرة.

كلتا البيئتين تُظهران الآن سلوكًا معطلاً متطابقًا بعد أن كانتا على نفس الإصدار.


قابلية التكرار

يمكن تكراره بنسبة 100٪ - تم اختباره على بيئتين مستقلتين:

  1. تثبيت Discourse latest-release (الإصدار +122)
  2. إنشاء أتمتة باستخدام مشغل post_created_edited
  3. تعديل مشاركة
  4. لاحظ أن الأتمتة لا يتم تشغيلها أبدًا
  5. تأكد من أن حدث :post_edited لا يتم إطلاقه أبدًا باستخدام مستمع الاختبار

الملخص

هذا تراجع مؤكد في latest-release (الإصدار +122). كان حدث :post_edited يعمل في الإصدارات السابقة وتوقف عن العمل بعد التحديث. أكدت بيئتان مستقلتان نفس السلوك. هذا يكسر وظيفة الأتمتة الأساسية لـ Discourse وجميع الإضافات التي تعتمد على أحداث تعديل المشاركات.

إعجاب واحد (1)