Files
progcode/web/scripts/audit-agent-rewrites.mjs
T
huncode 2d914b543f
Build and deploy / deploy (push) Failing after 15s
Publish rewritten technical article archive
2026-08-02 22:19:34 +03:00

59 lines
2.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import articles from '../data/articles.json' with { type: 'json' };
import { agentRewriteRevisions } from '../data/agent-rewrite-revisions.mjs';
const archiveBySlug = new Map(articles.map((article) => [article.slug, article]));
const forbidden = [
/synthetic-plan-hand-off/i,
/productionEffect/i,
/future-only/i,
/plan\/scenario/i,
/source cutoff/i,
/editorial date/i,
/planDate/i,
/not-collected/i,
/not-attempted/i,
/future owner/i,
/author trajectory/i,
/развитие автора/i,
/План на \d{4}/i,
];
function bodyWithoutSources(content) {
return content
.replace(/<h2>Проверяемые источники<\/h2>[\s\S]*$/, '')
.replace(/<[^>]+>/g, ' ')
.replace(/&(?:quot|amp|lt|gt|#039);/g, ' ')
.replace(/\s+/g, ' ')
.trim();
}
const failures = [];
const seen = new Set();
for (const revision of agentRewriteRevisions) {
const body = bodyWithoutSources(revision.contentHtml || '');
const issues = [];
if (!archiveBySlug.has(revision.slug)) issues.push('slug отсутствует в архиве');
if (seen.has(revision.slug)) issues.push('дубликат slug');
seen.add(revision.slug);
if (!revision.title || !revision.excerpt) issues.push('нет title/excerpt');
if (body.length < 5000 || body.length > 15000) issues.push('основной текст вне 5 000–15 000 знаков');
if (!/<figure>[\s\S]*?<img\b[^>]+alt=(?:"[^"<>]+"|'[^'<>]+')[\s\S]*?<\/figure>/.test(revision.contentHtml)) issues.push('нет figure с alt');
if (!/<table>[\s\S]*?<\/table>/.test(revision.contentHtml)) issues.push('нет table');
if (!/<pre><code>[\s\S]*?<\/code><\/pre>/.test(revision.contentHtml)) issues.push('нет pre/code');
if (!/<ol>[\s\S]*?<\/ol>/.test(revision.contentHtml)) issues.push('нет ol');
if (!/<h2>Проверяемые источники<\/h2>[\s\S]*?https?:\/\//.test(revision.contentHtml)) issues.push('нет проверяемого источника');
const meta = forbidden.find((pattern) => pattern.test(body));
if (meta) issues.push('мета-лексика: ' + meta);
if (issues.length) failures.push({ index: revision.index, slug: revision.slug, issues });
}
const report = {
drafts: agentRewriteRevisions.length,
uniqueSlugs: seen.size,
failures,
nextExpectedIndex: articles.findIndex((article) => !seen.has(article.slug)) + 1 || null,
};
console.log(JSON.stringify(report, null, 2));
if (failures.length) process.exitCode = 1;