Facet nav audit
Skill popiliadam/platinum-seo-engine/skills/discovery/facet-nav-audit
Use when: kullanıcı "faceted navigation", "facet audit", "parametre temizliği", "crawl budget", "index bloat", "filtre URL'leri indexleniyor", "sort/sayfalama parametreleri", "?sirala= / ?renk= URL'leri", "sonsuz parametre alanı" der ya da /pseo-facet-audit çağırır. Free (paid MCP yok) — SF export + master.xlsx okur. Also use when: aktif projenin SF crawl export'u alındı (projects/{slug}/sf-exports/{date}/raw/internal_all.csv); e-ticaret platformu (WooCommerce/Ticimax/Ideasoft/imagaza) parametre URL'leri üretiyor; bulgular master.xlsx#robots_txt sheet'ine FN- prefix'li yazılacak + önerilen robots.txt bloğu raporda üretilecek (recommendation-only, operator deploy eder). Do not use when: SF export henüz yok (sf-import önce, DURUR #1); robots.txt lifecycle/noindex denetimi (robots-policy-audit, ayrı); tech-audit / schema-audit / hreflang-audit gerekiyor; master.xlsx yokken (init-project önce).From its SKILL.md
npx -y skills add popiliadam/platinum-seo-engine --skill facet-nav-auditAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
SKILL.md
9.9 KB, as published. Nobody here has run it
facet-nav-audit — discovery skill (GAP-T2, FREE)
Faceted-navigation / parameter & crawl-budget governance per
rules/tech-seo-governance.md R-128 (Parameter Taxonomy), R-129
(Index-Bloat Budget), R-130 (Blocking-Mechanism Decision Tree). SF's
Issues-Overview can say "you have pagination issues"; this skill says "38% of
the crawl is ?sirala= sorts and 4,200 of them are indexable" — URL-corpus-level
quantification SF cannot give.
Recommendation-only (R-130). The engine NEVER writes to client
infrastructure (robots.txt, CMS, server). It emits findings (master.xlsx#robots_txt,
FN- prefix) + a proposed robots.txt block (report text) + per-class actions; the
operator deploys. The Excel write is behind the standard request_approval
gate. No paid MCP, no DataForSEO calls (demand evidence is read from the existing
master.xlsx#cluster_keywords / #gsc_performance sheets).
Inputs (frontmatter contract)
| Name | Type | Default | Notes |
|---|---|---|---|
project_slug | string | — | Required. Resolves master.xlsx + sf-exports/. |
sf_export_date | string | latest | sf-exports/{date}/ dir to read. |
policy_overrides_path | string | config/facet-policy.json | Per-project taxonomy override (R-128). |
unknown_param_threshold | integer | 10 | Unknown-URL count → operator-triage finding. |
workspace_root is resolved via PSEO_WORKSPACE_ROOT (mirrors tech-audit
§Inputs).
Outputs
master.xlsx#robots_txt—FN-NNNfindings (5-col: id/level/issue/detail/ resolution;levelis severityEnum). Written viascripts/util/sheet_merge.merge_prefixed_rows(..., id_prefix="FN-")— idempotent re-runs, preserves sf_projectionR-NNNand hreflang-auditHF-/ robots- policy-auditRP-rows. sf-import'stransaction.replacewipes the sheet → re-run this audit after every sf-import (it is free and reads the same export).outputs/reports/{date}-facet-nav-audit.md— param-class table + bloat metrics- the proposed robots.txt block + demand-evidence table.
events.jsonl—append_provenance(source.kind="sf_csv", operation="project_excel", target_excel_sheet="robots_txt").
Body protocol
Mirrors tech-audit's shape minus the budget pre-flight (this skill is free).
- create_run —
workflow_runner.create_run(skill="facet-nav-audit", ...). - read inputs — resolve latest
sf-exports/{date}/raw/; readinternal_all.csv(Address + Indexability + Crawl Depth + Canonical columns),response_codes_all.csv,directives_all.csv,canonicals_all.csv; readmaster.xlsx#cluster_keywords#gsc_performance(openpyxl, read-only) →demand_keywords(terms with volume/impressions > 0); loadpolicy_overrides_pathif present (validate againstschemas/facet-policy.schema.json).
- transform (pure) —
Classifies every URL's params into the R-128 closed setfrom scripts.discovery import facet_nav_audit_transform as fnt out = fnt.transform( internal_rows, response_rows, directives_rows, canonical_rows, pagination_rows, demand_keywords, platform, url_patterns, policy_overrides=overrides, unknown_param_threshold=threshold, ){facet_filter, sort, pagination, internal_search, session_or_tracking, functional, unknown}, quantifies per-class index-bloat (R-129), emitsFN-findings + a deterministicproposed_robots_block(R-130). Platform seeds are HEURISTIC and conservative: generic web + WooCommerce param names only; Ticimax/Ideasoft/imagaza and non-English vocabularies route to theunknown-triage finding by design — the operator classifies them infacet-policy.json(this is the designed path, not a gap). v1 limitation: zero-result/soft-404 facet detection and path-segment facets are DEFERRED (the SF export does not carry the content signal needed) — noted here so no fake finding is emitted. - request_approval —
request_approval(...)("N facet finding'i master.xlsx#robots_txt'ye yazalım mı?"); skill EXIT awaiting_approval. - write_excel — on approve,
sheet_merge.merge_prefixed_rows(master_xlsx, "robots_txt", out["robots_txt_rows"], id_prefix="FN-", run_id=..., project_slug=..., writer="facet-nav-audit")(single idempotent committer.commit path). - render_report —
render_template.py templates/reports/facet-nav-audit.template.md→outputs/reports/{date}-facet-nav-audit.md(includes the proposed robots.txt block as recommendation text). - provenance event —
append_provenance(source.kind="sf_csv", operation="project_excel", target_excel_sheet="robots_txt", rows_written=len(rows)). - complete —
workflow_runner.complete(...)with string-typed outputs.
Optional live SF mode
Mirror tech-audit's use_sf_mcp_live branch (mcp__sf__sf_list_crawls →
sf_load_crawl → sf_export_seo_element_urls for the Internal element) to source
internal_all live; AMBER fallback to file-based on any SF MCP error (never hard
fail). Default: file-based.
DURUR conditions
Stop and flag the manager — do not patch, do not fabricate.
internal_all.csvmissing (FacetInternalMissingError) — run sf-import first.- Address column absent in
internal_all.csv(FacetSchemaDriftError) — re-export with default data_fields or use live SF mode. - URL corpus > 250k rows (
FacetUrlCapExceededError) — surface to manager, suggest chunking the crawl. - Zero usable URLs parsed (
FacetSchemaDriftError). master.xlsx#robots_txtrow schema mismatch on write (RowSchemaError).PSEO_WORKSPACE_ROOTunset and noworkspace_rootarg.
Cross-references
- Rules:
rules/tech-seo-governance.md(R-128 / R-129 / R-130). - Transform:
scripts/discovery/facet_nav_audit_transform.py(pure;transform,FacetNavAuditErrorhierarchy,PARAM_CLASSES). - Write path:
scripts/util/sheet_merge.py(merge_prefixed_rows, prefixFN-). - Schemas:
schemas/master-excel.schema.json#robots_txt(5-col + severityEnum),schemas/facet-policy.schema.json(optional override),schemas/events.schema.json. - Template:
templates/reports/facet-nav-audit.template.md. - Command:
commands/pseo-facet-audit.md.
Discipline checklist
- Recommendation-only — engine never deploys to client infra (R-130).
- Free —
budget.uses_paid_mcp=false; demand evidence from master.xlsx, no DFS. - Schema-first — frontmatter validates against
skills/skill-frontmatter.schema.json;FN-rows validate againstmaster-excel.schema.json#robots_txt. - Plugin-agnostik — no slug literals; pure transform; platform seeds heuristic, unknowns → operator-triage (no invented platform params).
- Idempotent write —
sheet_merge.merge_prefixed_rowsre-lands theFN-namespace in place; foreignR-/HF-/RP-rows preserved. - Append-only — provenance via
events_writer.