Gate 2: Contract coverage. must_cover_questions: The contract lists 5 questions that must appear as H2 or H3 with verbatim wording. The H2s already match the first five questions in the question_driven_structure. So covered.
Gate 3: Claim = source. Every
… must have named source anchor”. That might be too strict. Possibly we need to add a source? But no source exists. Could attribute to “Facebook Help Center” but not directly. But we could add a note that it’s based on lack of public information. Possibly we can just leave it, as it’s not a claim that needs a source. However the gate says “Missing → pull from research notes, wrap as anchor.” The research notes don’t have a source for that claim. We could add a source like “theo Trung tâm trợ giúp Facebook (không có thống kê)” but that’s not a source. I’ll check if any source in research notes mentions “not publicly disclosed”? Not explicitly. Perhaps we can skip. But to be safe, we can add a generic source link to Facebook Help Center about account recovery? But that might be misleading. I’ll leave as is for now.
Gate 4: Fact lock vs verified_facts. The verified_facts are empty in input. So no changes.
Gate 5: FAQ dedup. Check if any FAQ item overlaps with H2/H3. The H2s are different. The FAQ questions: “Link 929 có phải là link chính thức của Facebook không?” etc. No direct overlap. Need to ensure at least 5 items. There are 7, so fine.
Gate 6: Link hygiene + diversity. Internal links: The article has two internal links: “Hentai Waguri: Thông Tin Xác Minh và Nguồn Chính Thức” and “Sẽ Gầy Ngoài Đời Thật…”. They should have target and rel stripped? For internal links, no target _blank or rel noopener. The article has target=”_blank” rel=”noopener nofollow” on those. We need to remove them for internal links. Also need to ensure each external URL at most once and max 3 per domain. There are many links to facebook.com and other domains. Count: facebook.com appears multiple times but with different paths. That’s fine, but max 3 per domain. Let’s check: facebook.com/help/contact/515009838910929 appears multiple times? Actually same URL appears multiple times. That’s multiple times the same URL. The gate says “Each external URL at most once”. So we need to deduplicate identical external URLs. The article has the same Facebook help URL in multiple places (e.g., in snapshot, in table, in steps). We need to replace duplicates with other relevant sources? But the same URL is the official one. The gate says each external URL at most once. That means we cannot use the same URL more than once in the entire article. That is strict. We must find alternative sources for the same information. For example, we could use a different official Facebook page? But there is only one. Possibly use a different language version? The article already uses vi-vn.facebook.com for one. We can vary between www.facebook.com and vi-vn.facebook.com. But the URL path is different. The main URL is https://www.facebook.com/help/contact/515009838910929. There is also https://www.facebook.com/help/159096464162185 and https://www.facebook.com/help/105487009541643. So we can spread across those. The duplicate occurrences: The main URL appears in snapshot card 1, in step 1 (Bước 1), in the table, in the FAQ. We need to ensure it appears only once. We’ll replace subsequent occurrences with one of the other two Facebook help pages that are relevant. For example, when mentioning the link in the steps, we can link to the help center page about identity verification (159096464162185). And in FAQ, use another. But we must ensure the anchor text remains appropriate. We’ll do that.
Gate 7: JSON-LD. There are two scripts inside
? They are at the end of the article, before closing
. They are fine. Need to check fields: NewsArticle has headline, datePublished (today’s ISO), dateModified (today’s ISO), publisher with logo, mainEntityOfPage. The existing JSON has datePublished “2025-03-26”. We need to update to today’s date? The gate says “today’s ISO”. Assuming today is 2025-03-26? Actually the current date is unknown, but we can keep as is or use a placeholder? The article was written for a specific date. We’ll keep as is unless instructed to update. The gate says “datePublished (today’s ISO)”, but that’s ambiguous. Likely we should set to the actual date of publication. Since we don’t have a specific date, we’ll keep the provided date. Also need to strip author if placeholder. The existing author is “Bulletin Vietnam” (Organization), which is fine. No author placeholder. Need to remove aggregateRating if present. It’s not present. Replace example.com with site domain: the mainEntityOfPage @id uses “https://bulletinvietnam.org/link-929-huong-dan-xac-minh-danh-tinh-facebook”. That’s fine. FAQPage mirrors visible FAQ items. There are 7 items, the JSON has all 7? It has 7. Good.
Gate 8: Tone hygiene. Scan for forbidden phrases. Check article: “truly exceptional”, “in essence”, etc. Not present. “this article will” is not present. “in this guide” not present. “in conclusion” is present in one of the n24-tldr? Actually there is a
with “Kết luận:” but that’s Vietnamese, not the English forbidden phrase. The forbidden phrases are English. So fine.
Gate 8b: Intro opener + lead length. The first sentence starts with “Bạn đã từng bị khóa tài khoản Facebook…” This is a question, which is fine. Not an AI-tell opener. But we already reduced intro to 2 sentences. We’ll do that.
Gate 9: Quote speaker variety. Already two different speakers. Good.
Gate 10: Research confidence calibration. research_confidence=low. Need to ensure rumor-list ≥ confirmed-list? The article has a “Clarity section” with “Sự thật đã xác nhận” and “Điều chưa rõ”. The confirmed list has 3 items; unclear list has 3 items. That’s equal. But gate says if low, verify rumor-list ≥ confirmed-list. So we need at least as many unclear as confirmed. Currently equal, so okay. If we need to make unclear > confirmed, we could add an extra unclear item from research? But not necessary.
Gate 11: Facts summary tier audit. facts_summary is empty, so no changes.
Gate 12: UX structural enforcement. Check contract fields: comparison_table_required=false, spec_table_required=false, pros_cons_required=false, steps_required=true. Steps are present as ordered steps in the “Làm thế nào để sử dụng link 929” section, but they are in
not
. The gate says steps_required=true:
with 3-8 numbered steps. The current steps are in
with bullet points, not numbered list. We need to change to
. Also need to ensure each step is a separate
- . They already are. Also need stats line present. Key facts table present. At least 2 callouts: we have
and
and
. That’s fine. No more than 2 consecutive
without a break. We need to check. There are sections with consecutive
maybe. We’ll need to insert breaks if needed. Also mini-summary n24-tldr after any H2 section with >300 words. We’ll check word count manually? The “Làm thế nào để sử dụng link 929” section has multiple paragraphs and steps, likely >300 words. There is already a tldr after that section. Good.
Gate 13: Research-residue scan. No residue found.
Gate 14: Editorial voice validation. We need to check each subgate.
14.1 Intro first sentence takes a stance. Forbidden leads: “X is a/an” etc. The lead is a question, which is fine.
14.2 Table lead-ins. Before every
there must be a
with editorial framing. The table after the snapshot block is preceded by a
“4 mục trong bảng trên, một điểm chung…” That works. But there is another table? There is only one table. So okay.
14.3 Section closers. Every H2 content section must end with analytical takeaway, not with table/list/callout. Check each H2 section:
– “Tổng quan nhanh” section ends with the snapshot block and then the table? Actually “Tổng quan nhanh” is not an H2; it’s an h2 inside a section. The H2 sections start with “Tài khoản Facebook bị khóa…”. That section ends with a
callout. That’s a callout. Need to append a closing
with interpretive sentence. According to the rule, if last element is a callout, we need to append a
. So we’ll add a sentence like: “The implication: Người dùng Việt Nam cần cân nhắc mức độ vi phạm trước khi hy vọng mở khóa.”
– Next H2 “Làm thế nào để sử dụng link 929…” ends with a blockquote? Actually after step 4 there is a blockquote, then a tldr. The tldr is a callout (n24-tldr). So again need to append a closing
after the tldr. But the tldr is considered a callout. So we need to add a sentence after it.
– “Làm thế nào để tải lên giấy tờ…” ends with a
callout. Need to append.
– “Làm cách nào để xác minh tài khoản Facebook miễn phí?” ends with a blockquote then tldr. tldr is callout. Append.
– “Mã mở khóa Facebook là gì…” ends with a
callout. Append.
We’ll add analytical takeaway sentences for each.
14.4 Callouts as judgment. Check each callout body: “Tóm lại” in tip is pure data recitation? It says “Người dùng Việt Nam có thể mở khóa tài khoản nếu vi phạm nhẹ, nhưng các trường hợp vi phạm nghiêm trọng (lừa đảo, spam) thường khó phục hồi hơn.” That’s judgment, okay. “Điểm cần lưu ý” note: “Facebook hỗ trợ nhiều ngôn ngữ và khu vực…” that’s data recitation. Need to rewrite to editorial judgment. We can say “Điểm cần lưu ý: Facebook hỗ trợ nhiều ngôn ngữ nên người dùng cần kiểm tra xem biểu mẫu có hỗ trợ tiếng Việt hay không” but that’s still data. Better: “The catch: Even if Facebook supports multiple languages, the form may not automatically detect your language, so you may need to manually switch.” But we need to keep in Vietnamese. We’ll rephrase to: “Điểm mấu chốt: Người dùng cần kiểm tra ngôn ngữ của biểu mẫu để đảm bảo xử lý chính xác.” That’s judgment.
14.5 Source anchor text. Check anchors with bare text: “source”, “Source”? Not present. All anchors have descriptive text. Good.
14.6 TL;DR editorial verdict. n24-tldr blocks must name an actor and state a consequence. The first tldr: “Kết luận: Quy trình xác minh qua link 929 thực chất là một biểu mẫu hỗ trợ đơn giản, không phải công cụ đặc biệt. Người dùng cần chuẩn bị giấy tờ thật và kiên nhẫn chờ đợi; các dịch vụ hứa hẹn thời gian nhanh chóng thường không đáng tin cậy.” That names “người dùng” as actor and consequence “cần chuẩn bị giấy tờ thật và kiên nhẫn; dịch vụ không đáng tin”. That’s fine. Second tldr: “Kết luận: Người dùng Việt Nam nên tránh các dịch vụ thu phí hứa hẹn mở khóa nhanh – chỉ có quy trình miễn phí qua link 929 mới là hợp pháp và an toàn.” That names actor and consequence. Good.
14.7 Summary ending. The article ends with a FAQ section and then two JSON-LD scripts. The last visible content is the FAQ details. There is a summary paragraph before FAQ? Actually there is a
after the clarity section: “Sự thật là link 929 không phải “công cụ bí mật” mà là biểu mẫu hỗ trợ tiêu chuẩn của Facebook. Đối với người dùng Việt Nam, điều quan trọng là hiểu rõ quy trình, chuẩn bị giấy tờ hợp lệ và tránh các dịch vụ thu phí không đáng tin cậy. Nếu không, bạn có thể mất thời gian, tiền bạc và thậm chí gặp nguy cơ lộ thông tin cá nhân.” That summary ends with naming actor “bạn” and consequence “mất thời gian, tiền bạc, lộ thông tin”. That’s fine.
Gate – Intro sanity: Ensure article starts with
without whitespace. The provided input has
as first characters. We’ll keep that.
Now we need to implement repairs:
1. Add
around content inside
. The article currently:
… then all content, then
. We’ll wrap everything from after the opening
to before the first
Ve tac gia
Hoang Ngo Long Son
Ban bien tap ket hop cap nhat nhanh voi giai thich ro rang, de hieu.