{ "pack_id": "rename-and-relink", "title": "Rename and relink", "version": "0.1.0", "summary": "A collection of nouns and verbs for renaming products, repositories and pages and rewriting every reference and link to the new names: an inventory of every spelling at exact commits, rewrites in local copies, link checks that rely on no redirect, the owner's host renames on the record, a sweep that decides clean, and a plain notice for each retired address.", "dependencies": [ "findings-to-fixes", "release-and-verify" ], "boundaries": [ "Workers read local copies, edit local copies and check links read-only. Renaming on hosts, landing rewrites and showing notices are the owner's acts.", "No redirect is relied on. Old names stay only in named allowed contexts such as provenance and history.", "Names that must never be written down are searched by hash, never spelled out in a noun.", "Workers create nouns and propose verbs; an authorized requester enqueues the proposals worth doing.", "Importing the pack writes nothing and enqueues nothing." ], "nouns": [ { "slug": "pack", "category": "noun.skill_pack", "role": "pack", "title": "A collection of nouns and verbs for renaming products, repositories and pages and rewriting every reference to the new names", "value": { "lets_workers": "Turn a rename decision into a map, inventory every spelling of every old name across exact commits, plan and make the rewrites in local copies, check every link without relying on redirects, have the owner record the renames only they can do on hosts, sweep until no old name remains outside an allowed context, and draft a plain notice for each retired address.", "flow": [ { "verb": { "$verb": "rename-and-relink.build-inventory" }, "when": "As soon as a rename map is decided." }, { "verb": { "$verb": "rename-and-relink.plan-rewrites" }, "when": "From the inventory; the owner's host acts are listed separately." }, { "verb": { "$verb": "rename-and-relink.rewrite-references" }, "when": "Per repository, in a local copy." }, { "verb": { "$verb": "rename-and-relink.record-host-renames" }, "when": "When the owner has renamed repositories, sites or addresses on their hosts." }, { "verb": { "$verb": "rename-and-relink.check-links" }, "when": "After rewrites and host renames, and again before calling the rename done." }, { "verb": { "$verb": "rename-and-relink.sweep-old-names" }, "when": "Last; it decides clean or not." }, { "verb": { "$verb": "rename-and-relink.write-archive-notice" }, "when": "For each retired address that will keep showing something." } ], "guardrails": [ "No redirect is relied on: every link points at the new address directly.", "Old names stay only in named allowed contexts such as provenance and history.", "Renaming on hosts is the owner's act; workers edit local copies and check." ], "worked_examples": [ { "$pin": "rename-checks" }, { "$pin": "example.rename-map" }, { "$pin": "example.archive-notice" } ] }, "relations": [ [ "requires_noun", "method" ], [ "requires_noun", "reference-types" ], [ "requires_noun", "variant-rules" ], [ "requires_noun", "allowed-contexts" ], [ "requires_noun", "link-rules" ] ] }, { "slug": "method", "category": "noun.skill_pack", "role": "method", "title": "How a rename reaches every reference", "category_reason": "A reusable procedure with guardrails, followed by every verb in this pack.", "value": { "lifecycle": [ "A person decides the rename map: old and new names, addresses and where old names may stay.", "build-inventory finds every variant of every old name at exact commits.", "plan-rewrites groups edits per file and lists what only a person can change.", "rewrite-references edits local copies and runs each repository's own checks.", "The owner renames repositories, sites and addresses on their hosts and records it with record-host-renames.", "check-links resolves every link and records redirects and failures.", "sweep-old-names decides clean or not; write-archive-notice drafts what old addresses say." ], "rules": [ "Status lines, commit messages for new work, captions and alt text count; history and receipts do not change.", "A redirect that happens to work is still a violation of a clean rename.", "Text inside images and videos goes to a person; workers list it, never guess it.", "A name that keeps coming back is a finding with a guard, not another sweep.", "Workers create nouns and propose verbs; they never enqueue." ], "follow_ups": { "finding": { "$verb": "findings-to-fixes.record-finding" }, "release": { "$verb": "release-and-verify.plan-release" } } } }, { "slug": "reference-types", "category": "noun.skill_pack", "role": "reference_types", "title": "Where names hide: the kinds of reference a rename must reach", "category_reason": "Shared definitions the inventory and plan use.", "value": { "reference_types": [ { "name": "prose", "examples": [ "READMEs", "docs", "page copy", "status and error messages" ] }, { "name": "link", "examples": [ "absolute addresses", "relative links", "badges", "image sources" ] }, { "name": "identifier", "examples": [ "code names", "import paths", "environment variable names" ] }, { "name": "config", "examples": [ "host and service names", "workflow names", "deploy settings files" ] }, { "name": "package", "examples": [ "package and module names", "registry entries" ] }, { "name": "ci", "examples": [ "check names", "required-check lists" ] }, { "name": "image_or_media", "examples": [ "text inside screenshots", "video captions", "slides" ] }, { "name": "provenance", "examples": [ "moved_from fields", "source notes" ] }, { "name": "history", "examples": [ "changelogs", "earlier commit messages", "receipts" ] } ], "outside_repositories": [ "host repository names and descriptions", "site names and addresses", "profile and directory listings", "bookmarked addresses shared with partners" ] } }, { "slug": "variant-rules", "category": "noun.reflex_procedure", "role": "variant_rules", "title": "Generating every spelling of an old name", "category_reason": "A deterministic expansion applied before every search.", "value": { "rules": [ "Lower, upper and title case.", "Hyphen, underscore, space and no separator between words.", "Plural and possessive forms.", "Address forms: host names, repository paths and package names.", "Match whole words and hyphenated words, so a longer word that merely contains the name does not count." ], "private_names": "For names that must never be written down, search with a list of SHA-256 hashes of each variant instead of the names themselves." } }, { "slug": "allowed-contexts", "category": "noun.reflex_procedure", "role": "allowed_contexts", "title": "Where an old name may stay", "category_reason": "A deterministic allowlist the sweep applies.", "value": { "allowed": [ "machine-readable provenance fields such as moved_from", "history written before the rename: changelogs, earlier commit messages and receipts", "the archive notice at the old address" ], "rule": "Everything else is a violation, including status messages, new commit messages and examples.", "record": "Each allowed hit names its context, so a reviewer can disagree with it." } }, { "slug": "link-rules", "category": "noun.reflex_procedure", "role": "link_rules", "title": "Checking links after a rename", "category_reason": "A deterministic link policy.", "value": { "rules": [ "Every link must reach its target without a redirect; a redirect is recorded with its final address.", "A link that fails is recorded with its status code.", "Relative links are resolved inside the repository at the swept commit.", "Links to places the team does not control are listed for a person, not edited." ], "requests": "Link checks read; they never submit forms or follow sign-in flows." } }, { "slug": "template.rename-map", "category": "noun.seed_hypothesis", "role": "template", "title": "Template: a rename decision: old and new names and addresses, and where old names may stay", "category_reason": "A rename map is a decision that later sweeps check against.", "value": { "describes": "a rename decision: old and new names and addresses, and where old names may stay", "schema": { "type": "object", "additionalProperties": false, "required": [ "map_id", "effective_at", "entries", "redirects", "decided_by" ], "properties": { "map_id": { "type": "string", "minLength": 1, "maxLength": 60 }, "effective_at": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}(:[0-9]{2})?Z$", "maxLength": 30 }, "entries": { "type": "array", "minItems": 1, "maxItems": 32, "items": { "type": "object", "additionalProperties": false, "required": [ "old_name", "new_name", "thing", "old_urls", "new_urls", "keep_old_in" ], "properties": { "old_name": { "type": "string", "minLength": 1, "maxLength": 120 }, "new_name": { "type": "string", "minLength": 1, "maxLength": 120 }, "thing": { "type": "string", "enum": [ "repository", "product", "site", "package", "page", "channel" ] }, "old_urls": { "type": "array", "minItems": 0, "maxItems": 8, "items": { "type": "string", "minLength": 1, "maxLength": 300 } }, "new_urls": { "type": "array", "minItems": 1, "maxItems": 8, "items": { "type": "string", "minLength": 1, "maxLength": 300 } }, "keep_old_in": { "type": "array", "minItems": 0, "maxItems": 8, "items": { "type": "string", "minLength": 1, "maxLength": 160 } } } } }, "redirects": { "type": "string", "enum": [ "none_relied_on", "kept_but_not_relied_on" ] }, "decided_by": { "type": "string", "minLength": 1, "maxLength": 120 } } }, "rules": [ "A person decides the map.", "redirects none_relied_on means every link must point at the new address." ] } }, { "slug": "template.reference-inventory", "category": "noun.eval_run", "role": "template", "title": "Template: every occurrence of every variant of the old names at exact commits", "category_reason": "An inventory is a recorded search run.", "value": { "describes": "every occurrence of every variant of the old names at exact commits", "schema": { "type": "object", "additionalProperties": false, "required": [ "map_ref", "taken_at", "repositories", "occurrences", "outside_repositories" ], "properties": { "map_ref": { "type": "string", "minLength": 1, "maxLength": 200 }, "taken_at": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}(:[0-9]{2})?Z$", "maxLength": 30 }, "repositories": { "type": "array", "minItems": 1, "maxItems": 32, "items": { "type": "object", "additionalProperties": false, "required": [ "repository", "commit" ], "properties": { "repository": { "type": "string", "minLength": 1, "maxLength": 200 }, "commit": { "type": "string", "pattern": "^[0-9a-f]{7,40}$", "maxLength": 40 } } } }, "occurrences": { "type": "array", "minItems": 0, "maxItems": 2000, "items": { "type": "object", "additionalProperties": false, "required": [ "repository", "file", "line", "variant", "reference_type" ], "properties": { "repository": { "type": "string", "minLength": 1, "maxLength": 200 }, "file": { "type": "string", "minLength": 1, "maxLength": 300 }, "line": { "type": "integer", "minimum": 1, "maximum": 10000000 }, "variant": { "type": "string", "minLength": 1, "maxLength": 160 }, "reference_type": { "type": "string", "enum": [ "prose", "link", "identifier", "config", "package", "ci", "image_or_media", "provenance", "history" ] } } } }, "outside_repositories": { "type": "array", "minItems": 0, "maxItems": 32, "items": { "type": "string", "minLength": 1, "maxLength": 300 } } } }, "rules": [ "Occurrences carry repository, file, line, variant and reference type.", "Places outside repositories are listed separately." ] } }, { "slug": "template.rewrite-plan", "category": "noun.seed_hypothesis", "role": "template", "title": "Template: the edits per file, what stays and why, what needs a person and the owner's host acts", "category_reason": "A plan is a proposal about how to make the rename.", "value": { "describes": "the edits per file, what stays and why, what needs a person and the owner's host acts", "schema": { "type": "object", "additionalProperties": false, "required": [ "map_ref", "inventory_ref", "edits", "keep", "for_person", "owner_acts" ], "properties": { "map_ref": { "type": "string", "minLength": 1, "maxLength": 200 }, "inventory_ref": { "type": "string", "minLength": 1, "maxLength": 200 }, "edits": { "type": "array", "minItems": 0, "maxItems": 500, "items": { "type": "object", "additionalProperties": false, "required": [ "repository", "file", "change", "occurrences" ], "properties": { "repository": { "type": "string", "minLength": 1, "maxLength": 200 }, "file": { "type": "string", "minLength": 1, "maxLength": 300 }, "change": { "type": "string", "minLength": 1, "maxLength": 300 }, "occurrences": { "type": "integer", "minimum": 1, "maximum": 10000 } } } }, "keep": { "type": "array", "minItems": 0, "maxItems": 200, "items": { "type": "object", "additionalProperties": false, "required": [ "repository", "file", "why" ], "properties": { "repository": { "type": "string", "minLength": 1, "maxLength": 200 }, "file": { "type": "string", "minLength": 1, "maxLength": 300 }, "why": { "type": "string", "minLength": 1, "maxLength": 200 } } } }, "for_person": { "type": "array", "minItems": 0, "maxItems": 32, "items": { "type": "string", "minLength": 1, "maxLength": 300 } }, "owner_acts": { "type": "array", "minItems": 1, "maxItems": 16, "items": { "type": "string", "minLength": 1, "maxLength": 300 } } } }, "rules": [ "Every inventory occurrence is either an edit or a keep.", "owner_acts lists host renames in order." ] } }, { "slug": "template.rewrite", "category": "noun.code_node", "role": "template", "title": "Template: rewrites made in a local copy, with the patch digest and the repository's own checks", "category_reason": "A rewrite is a code change held as a patch.", "value": { "describes": "rewrites made in a local copy, with the patch digest and the repository's own checks", "schema": { "type": "object", "additionalProperties": false, "required": [ "repository", "base_commit", "patch_sha256", "files_changed", "occurrences_replaced", "checks_run" ], "properties": { "repository": { "type": "string", "minLength": 1, "maxLength": 200 }, "base_commit": { "type": "string", "pattern": "^[0-9a-f]{7,40}$", "maxLength": 40 }, "patch_sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$", "maxLength": 64 }, "files_changed": { "type": "integer", "minimum": 0, "maximum": 100000 }, "occurrences_replaced": { "type": "integer", "minimum": 0, "maximum": 1000000 }, "checks_run": { "type": "array", "minItems": 1, "maxItems": 16, "items": { "type": "object", "additionalProperties": false, "required": [ "command", "exit_code", "summary" ], "properties": { "command": { "type": "string", "minLength": 1, "maxLength": 200 }, "exit_code": { "type": "integer", "minimum": 0, "maximum": 255 }, "summary": { "type": "string", "minLength": 1, "maxLength": 200 } } } } } }, "rules": [ "The patch applies to base_commit.", "checks_run uses the repository's own commands." ] } }, { "slug": "template.link-check", "category": "noun.eval_run", "role": "template", "title": "Template: every link resolved, with redirects and failures recorded", "category_reason": "A link check is a recorded verification run.", "value": { "describes": "every link resolved, with redirects and failures recorded", "schema": { "type": "object", "additionalProperties": false, "required": [ "checked_at", "checked", "ok", "redirected", "broken", "outside_control" ], "properties": { "checked_at": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}(:[0-9]{2})?Z$", "maxLength": 30 }, "checked": { "type": "integer", "minimum": 0, "maximum": 100000 }, "ok": { "type": "integer", "minimum": 0, "maximum": 100000 }, "redirected": { "type": "array", "minItems": 0, "maxItems": 500, "items": { "type": "object", "additionalProperties": false, "required": [ "url", "final_url" ], "properties": { "url": { "type": "string", "minLength": 1, "maxLength": 300 }, "final_url": { "type": "string", "minLength": 1, "maxLength": 300 } } } }, "broken": { "type": "array", "minItems": 0, "maxItems": 500, "items": { "type": "object", "additionalProperties": false, "required": [ "url", "status" ], "properties": { "url": { "type": "string", "minLength": 1, "maxLength": 300 }, "status": { "type": "integer", "minimum": 0, "maximum": 999 } } } }, "outside_control": { "type": "array", "minItems": 0, "maxItems": 100, "items": { "type": "string", "minLength": 1, "maxLength": 300 } } } }, "rules": [ "ok counts links reached without a redirect.", "Links outside the team's control are listed, not judged." ] } }, { "slug": "template.host-rename-record", "category": "noun.eval_run", "role": "template", "title": "Template: the renames the owner carried out on hosts, with old and new addresses", "category_reason": "A host rename record is the evidence of a person's act.", "value": { "describes": "the renames the owner carried out on hosts, with old and new addresses", "schema": { "type": "object", "additionalProperties": false, "required": [ "recorded_by_role", "recorded_at", "renames", "not_done" ], "properties": { "recorded_by_role": { "type": "string", "minLength": 1, "maxLength": 120 }, "recorded_at": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}(:[0-9]{2})?Z$", "maxLength": 30 }, "renames": { "type": "array", "minItems": 1, "maxItems": 32, "items": { "type": "object", "additionalProperties": false, "required": [ "old_url", "new_url", "done_at" ], "properties": { "old_url": { "type": "string", "minLength": 1, "maxLength": 300 }, "new_url": { "type": "string", "minLength": 1, "maxLength": 300 }, "done_at": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}(:[0-9]{2})?Z$", "maxLength": 30 } } } }, "not_done": { "type": "array", "minItems": 0, "maxItems": 16, "items": { "type": "string", "minLength": 1, "maxLength": 300 } } } }, "rules": [ "Only the owner writes this record.", "not_done lists host renames still pending." ] } }, { "slug": "template.old-name-sweep", "category": "noun.eval_run", "role": "template", "title": "Template: the final sweep: variants searched, violations, allowed hits, link results, host renames and a verdict", "category_reason": "A sweep is a recorded verification run.", "value": { "describes": "the final sweep: variants searched, violations, allowed hits, link results, host renames and a verdict", "schema": { "type": "object", "additionalProperties": false, "required": [ "sweep_id", "map_ref", "swept_at", "repositories", "variants_checked", "violations", "allowed_hits", "links", "host_renames", "verdict" ], "properties": { "sweep_id": { "type": "string", "minLength": 1, "maxLength": 60 }, "map_ref": { "type": "string", "minLength": 1, "maxLength": 200 }, "swept_at": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}(:[0-9]{2})?Z$", "maxLength": 30 }, "repositories": { "type": "array", "minItems": 0, "maxItems": 32, "items": { "type": "object", "additionalProperties": false, "required": [ "repository", "commit" ], "properties": { "repository": { "type": "string", "minLength": 1, "maxLength": 200 }, "commit": { "type": "string", "pattern": "^[0-9a-f]{7,40}$", "maxLength": 40 } } } }, "variants_checked": { "type": "array", "minItems": 0, "maxItems": 64, "items": { "type": "string", "minLength": 1, "maxLength": 160 } }, "violations": { "type": "array", "minItems": 0, "maxItems": 500, "items": { "type": "object", "additionalProperties": false, "required": [ "repository", "file", "line", "variant" ], "properties": { "repository": { "type": "string", "minLength": 1, "maxLength": 200 }, "file": { "type": "string", "minLength": 1, "maxLength": 300 }, "line": { "type": [ "integer", "null" ], "minimum": 1, "maximum": 10000000 }, "variant": { "type": "string", "minLength": 1, "maxLength": 160 } } } }, "allowed_hits": { "type": "array", "minItems": 0, "maxItems": 500, "items": { "type": "object", "additionalProperties": false, "required": [ "repository", "file", "line", "variant", "allowed_context" ], "properties": { "repository": { "type": "string", "minLength": 1, "maxLength": 200 }, "file": { "type": "string", "minLength": 1, "maxLength": 300 }, "line": { "type": "integer", "minimum": 1, "maximum": 10000000 }, "variant": { "type": "string", "minLength": 1, "maxLength": 160 }, "allowed_context": { "type": [ "string", "null" ], "maxLength": 160 } } } }, "links": { "type": "object", "additionalProperties": false, "required": [ "checked", "ok", "redirected", "broken" ], "properties": { "checked": { "type": [ "integer", "null" ], "minimum": 0, "maximum": 100000 }, "ok": { "type": "integer", "minimum": 0, "maximum": 100000 }, "redirected": { "type": "array", "minItems": 0, "maxItems": 500, "items": { "type": "object", "additionalProperties": false, "required": [ "url", "final_url" ], "properties": { "url": { "type": "string", "minLength": 1, "maxLength": 300 }, "final_url": { "type": "string", "minLength": 1, "maxLength": 300 } } } }, "broken": { "type": "array", "minItems": 0, "maxItems": 500, "items": { "type": "object", "additionalProperties": false, "required": [ "url", "status" ], "properties": { "url": { "type": "string", "minLength": 1, "maxLength": 300 }, "status": { "type": "integer", "minimum": 0, "maximum": 999 } } } } } }, "host_renames": { "type": "array", "minItems": 0, "maxItems": 32, "items": { "type": "object", "additionalProperties": false, "required": [ "old_url", "new_url", "recorded_by_role" ], "properties": { "old_url": { "type": "string", "minLength": 1, "maxLength": 300 }, "new_url": { "type": "string", "minLength": 1, "maxLength": 300 }, "recorded_by_role": { "type": [ "string", "null" ], "maxLength": 120 } } } }, "verdict": { "type": "string", "enum": [ "clean", "violations_found", "unknown" ] } } }, "rules": [ "clean needs no violations, no redirects and no broken links.", "Every allowed hit names its context." ] } }, { "slug": "template.archive-notice", "category": "noun.public_source", "role": "template", "title": "Template: a plain notice for a retired address: what moved where, and what did not", "category_reason": "A notice is public-facing text about where something now lives.", "value": { "describes": "a plain notice for a retired address: what moved where, and what did not", "schema": { "type": "object", "additionalProperties": false, "required": [ "retired_name", "new_name", "new_url", "since", "what_moved", "what_did_not_move", "text" ], "properties": { "retired_name": { "type": "string", "minLength": 1, "maxLength": 120 }, "new_name": { "type": "string", "minLength": 1, "maxLength": 120 }, "new_url": { "type": "string", "minLength": 1, "maxLength": 300 }, "since": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}(:[0-9]{2})?Z$", "maxLength": 30 }, "what_moved": { "type": "array", "minItems": 1, "maxItems": 12, "items": { "type": "string", "minLength": 1, "maxLength": 200 } }, "what_did_not_move": { "type": "array", "minItems": 0, "maxItems": 12, "items": { "type": "string", "minLength": 1, "maxLength": 200 } }, "text": { "type": "string", "minLength": 1, "maxLength": 1200 } } }, "rules": [ "The notice names the new address and says it will not forward automatically.", "The owner decides where and when it appears." ] } }, { "slug": "rename-checks", "category": "noun.benchmark_suite", "role": "record_checks", "title": "Record checks for old-name sweeps, with synthetic golden sweeps", "category_reason": "A deterministic check suite with known-good and known-bad examples; the validator recomputes every verdict.", "value": { "fixture_kind": "finding_checks", "purpose": "Checks every old-name sweep must pass before a rename is called clean. The two synthetic good sweeps pass all of them; each synthetic bad sweep fails exactly the one check named in fails.", "deterministic_checks": [ { "id": "repositories-pinned", "rule": { "rule": "each_has", "path": "repositories", "min": 1, "fields": [ "repository", "commit" ] }, "why": "A sweep is true only for exact commits." }, { "id": "variants-listed", "rule": { "rule": "min_items", "path": "variants_checked", "min": 1 }, "why": "The sweep says which spellings it looked for." }, { "id": "violations-located", "rule": { "rule": "each_has", "path": "violations", "fields": [ "file", "line", "variant" ] }, "why": "Every violation can be found again." }, { "id": "allowed-hits-justified", "rule": { "rule": "each_has", "path": "allowed_hits", "fields": [ "file", "variant", "allowed_context" ] }, "why": "An old name may stay only in a named allowed context." }, { "id": "links-counted", "rule": { "rule": "present", "path": "links.checked" }, "why": "The sweep says how many links were checked." }, { "id": "clean-means-no-violations", "rule": { "rule": "when", "if": { "path": "verdict", "equals": "clean" }, "then": { "rule": "pattern_absent", "path": "violations", "pattern": "." } }, "why": "Clean means no old name outside an allowed context." }, { "id": "clean-means-no-redirects", "rule": { "rule": "when", "if": { "path": "verdict", "equals": "clean" }, "then": { "rule": "pattern_absent", "path": "links.redirected", "pattern": "." } }, "why": "No link relies on a redirect." }, { "id": "clean-means-no-broken-links", "rule": { "rule": "when", "if": { "path": "verdict", "equals": "clean" }, "then": { "rule": "pattern_absent", "path": "links.broken", "pattern": "." } }, "why": "Every link resolves." }, { "id": "host-renames-recorded", "rule": { "rule": "each_has", "path": "host_renames", "min": 1, "fields": [ "old_url", "new_url", "recorded_by_role" ] }, "why": "Host-side renames are the owner's acts and are recorded by the owner." } ], "golden_fixtures": [ { "id": "good-clean", "label": "known_good", "provenance": "synthetic", "finding": { "sweep_id": "SW-3", "map_ref": "rename map RM-1", "swept_at": "2026-10-30T16:00Z", "repositories": [ { "repository": "volunteer-hours-tracker", "commit": "7e3f9a2c1d40" }, { "repository": "hours-site", "commit": "b81c0d5e9f27" } ], "variants_checked": [ "sunrise-tracker", "sunrise_tracker", "sunrisetracker", "Sunrise Tracker", "sunrise.example.org", "acme/sunrise-tracker" ], "violations": [], "allowed_hits": [ { "repository": "volunteer-hours-tracker", "file": "CHANGELOG.md", "line": 12, "variant": "sunrise-tracker", "allowed_context": "history before the rename" }, { "repository": "volunteer-hours-tracker", "file": "provenance.json", "line": 3, "variant": "acme/sunrise-tracker", "allowed_context": "provenance field moved_from" } ], "links": { "checked": 214, "ok": 214, "redirected": [], "broken": [] }, "host_renames": [ { "old_url": "https://code.example.org/acme/sunrise-tracker", "new_url": "https://code.example.org/acme/volunteer-hours-tracker", "recorded_by_role": "repository owner" }, { "old_url": "https://sunrise.example.org", "new_url": "https://hours.example.org", "recorded_by_role": "site owner" } ], "verdict": "clean" } }, { "id": "good-honest-dirty", "label": "known_good", "provenance": "synthetic", "finding": { "sweep_id": "SW-2", "map_ref": "rename map RM-1", "swept_at": "2026-10-30T13:00Z", "repositories": [ { "repository": "volunteer-hours-tracker", "commit": "7e3f9a2c1d40" }, { "repository": "hours-site", "commit": "b81c0d5e9f27" } ], "variants_checked": [ "sunrise-tracker", "sunrise_tracker", "sunrisetracker", "Sunrise Tracker", "sunrise.example.org", "acme/sunrise-tracker" ], "violations": [ { "repository": "hours-site", "file": "docs/setup.md", "line": 40, "variant": "Sunrise Tracker" } ], "allowed_hits": [ { "repository": "volunteer-hours-tracker", "file": "CHANGELOG.md", "line": 12, "variant": "sunrise-tracker", "allowed_context": "history before the rename" }, { "repository": "volunteer-hours-tracker", "file": "provenance.json", "line": 3, "variant": "acme/sunrise-tracker", "allowed_context": "provenance field moved_from" } ], "links": { "checked": 214, "ok": 213, "redirected": [ { "url": "https://code.example.org/acme/sunrise-tracker", "final_url": "https://code.example.org/acme/volunteer-hours-tracker" } ], "broken": [] }, "host_renames": [ { "old_url": "https://code.example.org/acme/sunrise-tracker", "new_url": "https://code.example.org/acme/volunteer-hours-tracker", "recorded_by_role": "repository owner" }, { "old_url": "https://sunrise.example.org", "new_url": "https://hours.example.org", "recorded_by_role": "site owner" } ], "verdict": "violations_found" } }, { "id": "bad-unpinned-repository", "label": "known_bad", "fails": "repositories-pinned", "why": "A repository without its commit.", "finding": { "sweep_id": "SW-3", "map_ref": "rename map RM-1", "swept_at": "2026-10-30T16:00Z", "repositories": [ { "repository": "hours-site", "commit": "" } ], "variants_checked": [ "sunrise-tracker", "sunrise_tracker", "sunrisetracker", "Sunrise Tracker", "sunrise.example.org", "acme/sunrise-tracker" ], "violations": [], "allowed_hits": [ { "repository": "volunteer-hours-tracker", "file": "CHANGELOG.md", "line": 12, "variant": "sunrise-tracker", "allowed_context": "history before the rename" }, { "repository": "volunteer-hours-tracker", "file": "provenance.json", "line": 3, "variant": "acme/sunrise-tracker", "allowed_context": "provenance field moved_from" } ], "links": { "checked": 214, "ok": 214, "redirected": [], "broken": [] }, "host_renames": [ { "old_url": "https://code.example.org/acme/sunrise-tracker", "new_url": "https://code.example.org/acme/volunteer-hours-tracker", "recorded_by_role": "repository owner" }, { "old_url": "https://sunrise.example.org", "new_url": "https://hours.example.org", "recorded_by_role": "site owner" } ], "verdict": "clean" } }, { "id": "bad-no-variants", "label": "known_bad", "fails": "variants-listed", "why": "No spellings listed.", "finding": { "sweep_id": "SW-3", "map_ref": "rename map RM-1", "swept_at": "2026-10-30T16:00Z", "repositories": [ { "repository": "volunteer-hours-tracker", "commit": "7e3f9a2c1d40" }, { "repository": "hours-site", "commit": "b81c0d5e9f27" } ], "variants_checked": [], "violations": [], "allowed_hits": [ { "repository": "volunteer-hours-tracker", "file": "CHANGELOG.md", "line": 12, "variant": "sunrise-tracker", "allowed_context": "history before the rename" }, { "repository": "volunteer-hours-tracker", "file": "provenance.json", "line": 3, "variant": "acme/sunrise-tracker", "allowed_context": "provenance field moved_from" } ], "links": { "checked": 214, "ok": 214, "redirected": [], "broken": [] }, "host_renames": [ { "old_url": "https://code.example.org/acme/sunrise-tracker", "new_url": "https://code.example.org/acme/volunteer-hours-tracker", "recorded_by_role": "repository owner" }, { "old_url": "https://sunrise.example.org", "new_url": "https://hours.example.org", "recorded_by_role": "site owner" } ], "verdict": "clean" } }, { "id": "bad-violation-unlocated", "label": "known_bad", "fails": "violations-located", "why": "A violation with no line.", "finding": { "sweep_id": "SW-2", "map_ref": "rename map RM-1", "swept_at": "2026-10-30T13:00Z", "repositories": [ { "repository": "volunteer-hours-tracker", "commit": "7e3f9a2c1d40" }, { "repository": "hours-site", "commit": "b81c0d5e9f27" } ], "variants_checked": [ "sunrise-tracker", "sunrise_tracker", "sunrisetracker", "Sunrise Tracker", "sunrise.example.org", "acme/sunrise-tracker" ], "violations": [ { "repository": "hours-site", "file": "docs/setup.md", "line": null, "variant": "Sunrise Tracker" } ], "allowed_hits": [ { "repository": "volunteer-hours-tracker", "file": "CHANGELOG.md", "line": 12, "variant": "sunrise-tracker", "allowed_context": "history before the rename" }, { "repository": "volunteer-hours-tracker", "file": "provenance.json", "line": 3, "variant": "acme/sunrise-tracker", "allowed_context": "provenance field moved_from" } ], "links": { "checked": 214, "ok": 213, "redirected": [ { "url": "https://code.example.org/acme/sunrise-tracker", "final_url": "https://code.example.org/acme/volunteer-hours-tracker" } ], "broken": [] }, "host_renames": [ { "old_url": "https://code.example.org/acme/sunrise-tracker", "new_url": "https://code.example.org/acme/volunteer-hours-tracker", "recorded_by_role": "repository owner" }, { "old_url": "https://sunrise.example.org", "new_url": "https://hours.example.org", "recorded_by_role": "site owner" } ], "verdict": "violations_found" } }, { "id": "bad-allowed-hit-unjustified", "label": "known_bad", "fails": "allowed-hits-justified", "why": "An old name kept with no allowed context.", "finding": { "sweep_id": "SW-3", "map_ref": "rename map RM-1", "swept_at": "2026-10-30T16:00Z", "repositories": [ { "repository": "volunteer-hours-tracker", "commit": "7e3f9a2c1d40" }, { "repository": "hours-site", "commit": "b81c0d5e9f27" } ], "variants_checked": [ "sunrise-tracker", "sunrise_tracker", "sunrisetracker", "Sunrise Tracker", "sunrise.example.org", "acme/sunrise-tracker" ], "violations": [], "allowed_hits": [ { "repository": "hours-site", "file": "README.md", "line": 2, "variant": "sunrise-tracker", "allowed_context": null } ], "links": { "checked": 214, "ok": 214, "redirected": [], "broken": [] }, "host_renames": [ { "old_url": "https://code.example.org/acme/sunrise-tracker", "new_url": "https://code.example.org/acme/volunteer-hours-tracker", "recorded_by_role": "repository owner" }, { "old_url": "https://sunrise.example.org", "new_url": "https://hours.example.org", "recorded_by_role": "site owner" } ], "verdict": "clean" } }, { "id": "bad-links-uncounted", "label": "known_bad", "fails": "links-counted", "why": "No count of checked links.", "finding": { "sweep_id": "SW-3", "map_ref": "rename map RM-1", "swept_at": "2026-10-30T16:00Z", "repositories": [ { "repository": "volunteer-hours-tracker", "commit": "7e3f9a2c1d40" }, { "repository": "hours-site", "commit": "b81c0d5e9f27" } ], "variants_checked": [ "sunrise-tracker", "sunrise_tracker", "sunrisetracker", "Sunrise Tracker", "sunrise.example.org", "acme/sunrise-tracker" ], "violations": [], "allowed_hits": [ { "repository": "volunteer-hours-tracker", "file": "CHANGELOG.md", "line": 12, "variant": "sunrise-tracker", "allowed_context": "history before the rename" }, { "repository": "volunteer-hours-tracker", "file": "provenance.json", "line": 3, "variant": "acme/sunrise-tracker", "allowed_context": "provenance field moved_from" } ], "links": { "checked": null, "ok": 214, "redirected": [], "broken": [] }, "host_renames": [ { "old_url": "https://code.example.org/acme/sunrise-tracker", "new_url": "https://code.example.org/acme/volunteer-hours-tracker", "recorded_by_role": "repository owner" }, { "old_url": "https://sunrise.example.org", "new_url": "https://hours.example.org", "recorded_by_role": "site owner" } ], "verdict": "clean" } }, { "id": "bad-clean-with-violation", "label": "known_bad", "fails": "clean-means-no-violations", "why": "Called clean with an old name in a page.", "finding": { "sweep_id": "SW-3", "map_ref": "rename map RM-1", "swept_at": "2026-10-30T16:00Z", "repositories": [ { "repository": "volunteer-hours-tracker", "commit": "7e3f9a2c1d40" }, { "repository": "hours-site", "commit": "b81c0d5e9f27" } ], "variants_checked": [ "sunrise-tracker", "sunrise_tracker", "sunrisetracker", "Sunrise Tracker", "sunrise.example.org", "acme/sunrise-tracker" ], "violations": [ { "repository": "hours-site", "file": "docs/setup.md", "line": 40, "variant": "Sunrise Tracker" } ], "allowed_hits": [ { "repository": "volunteer-hours-tracker", "file": "CHANGELOG.md", "line": 12, "variant": "sunrise-tracker", "allowed_context": "history before the rename" }, { "repository": "volunteer-hours-tracker", "file": "provenance.json", "line": 3, "variant": "acme/sunrise-tracker", "allowed_context": "provenance field moved_from" } ], "links": { "checked": 214, "ok": 214, "redirected": [], "broken": [] }, "host_renames": [ { "old_url": "https://code.example.org/acme/sunrise-tracker", "new_url": "https://code.example.org/acme/volunteer-hours-tracker", "recorded_by_role": "repository owner" }, { "old_url": "https://sunrise.example.org", "new_url": "https://hours.example.org", "recorded_by_role": "site owner" } ], "verdict": "clean" } }, { "id": "bad-clean-with-redirect", "label": "known_bad", "fails": "clean-means-no-redirects", "why": "Called clean while a link relies on a redirect.", "finding": { "sweep_id": "SW-3", "map_ref": "rename map RM-1", "swept_at": "2026-10-30T16:00Z", "repositories": [ { "repository": "volunteer-hours-tracker", "commit": "7e3f9a2c1d40" }, { "repository": "hours-site", "commit": "b81c0d5e9f27" } ], "variants_checked": [ "sunrise-tracker", "sunrise_tracker", "sunrisetracker", "Sunrise Tracker", "sunrise.example.org", "acme/sunrise-tracker" ], "violations": [], "allowed_hits": [ { "repository": "volunteer-hours-tracker", "file": "CHANGELOG.md", "line": 12, "variant": "sunrise-tracker", "allowed_context": "history before the rename" }, { "repository": "volunteer-hours-tracker", "file": "provenance.json", "line": 3, "variant": "acme/sunrise-tracker", "allowed_context": "provenance field moved_from" } ], "links": { "checked": 214, "ok": 214, "redirected": [ { "url": "https://code.example.org/acme/sunrise-tracker", "final_url": "https://code.example.org/acme/volunteer-hours-tracker" } ], "broken": [] }, "host_renames": [ { "old_url": "https://code.example.org/acme/sunrise-tracker", "new_url": "https://code.example.org/acme/volunteer-hours-tracker", "recorded_by_role": "repository owner" }, { "old_url": "https://sunrise.example.org", "new_url": "https://hours.example.org", "recorded_by_role": "site owner" } ], "verdict": "clean" } }, { "id": "bad-clean-with-broken-link", "label": "known_bad", "fails": "clean-means-no-broken-links", "why": "Called clean with a broken link.", "finding": { "sweep_id": "SW-3", "map_ref": "rename map RM-1", "swept_at": "2026-10-30T16:00Z", "repositories": [ { "repository": "volunteer-hours-tracker", "commit": "7e3f9a2c1d40" }, { "repository": "hours-site", "commit": "b81c0d5e9f27" } ], "variants_checked": [ "sunrise-tracker", "sunrise_tracker", "sunrisetracker", "Sunrise Tracker", "sunrise.example.org", "acme/sunrise-tracker" ], "violations": [], "allowed_hits": [ { "repository": "volunteer-hours-tracker", "file": "CHANGELOG.md", "line": 12, "variant": "sunrise-tracker", "allowed_context": "history before the rename" }, { "repository": "volunteer-hours-tracker", "file": "provenance.json", "line": 3, "variant": "acme/sunrise-tracker", "allowed_context": "provenance field moved_from" } ], "links": { "checked": 214, "ok": 214, "redirected": [], "broken": [ { "url": "https://hours.example.org/old-faq", "status": 404 } ] }, "host_renames": [ { "old_url": "https://code.example.org/acme/sunrise-tracker", "new_url": "https://code.example.org/acme/volunteer-hours-tracker", "recorded_by_role": "repository owner" }, { "old_url": "https://sunrise.example.org", "new_url": "https://hours.example.org", "recorded_by_role": "site owner" } ], "verdict": "clean" } }, { "id": "bad-host-rename-unrecorded", "label": "known_bad", "fails": "host-renames-recorded", "why": "A host rename nobody recorded.", "finding": { "sweep_id": "SW-3", "map_ref": "rename map RM-1", "swept_at": "2026-10-30T16:00Z", "repositories": [ { "repository": "volunteer-hours-tracker", "commit": "7e3f9a2c1d40" }, { "repository": "hours-site", "commit": "b81c0d5e9f27" } ], "variants_checked": [ "sunrise-tracker", "sunrise_tracker", "sunrisetracker", "Sunrise Tracker", "sunrise.example.org", "acme/sunrise-tracker" ], "violations": [], "allowed_hits": [ { "repository": "volunteer-hours-tracker", "file": "CHANGELOG.md", "line": 12, "variant": "sunrise-tracker", "allowed_context": "history before the rename" }, { "repository": "volunteer-hours-tracker", "file": "provenance.json", "line": 3, "variant": "acme/sunrise-tracker", "allowed_context": "provenance field moved_from" } ], "links": { "checked": 214, "ok": 214, "redirected": [], "broken": [] }, "host_renames": [ { "old_url": "https://code.example.org/acme/sunrise-tracker", "new_url": "https://code.example.org/acme/volunteer-hours-tracker", "recorded_by_role": null } ], "verdict": "clean" } } ], "finding_schema": { "type": "object", "additionalProperties": false, "required": [ "sweep_id", "map_ref", "swept_at", "repositories", "variants_checked", "violations", "allowed_hits", "links", "host_renames", "verdict" ], "properties": { "sweep_id": { "type": "string", "minLength": 1, "maxLength": 60 }, "map_ref": { "type": "string", "minLength": 1, "maxLength": 200 }, "swept_at": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}(:[0-9]{2})?Z$", "maxLength": 30 }, "repositories": { "type": "array", "minItems": 0, "maxItems": 32, "items": { "type": "object", "additionalProperties": false, "required": [ "repository", "commit" ], "properties": { "repository": { "type": "string", "minLength": 1, "maxLength": 200 }, "commit": { "type": "string", "pattern": "^[0-9a-f]{7,40}$", "maxLength": 40 } } } }, "variants_checked": { "type": "array", "minItems": 0, "maxItems": 64, "items": { "type": "string", "minLength": 1, "maxLength": 160 } }, "violations": { "type": "array", "minItems": 0, "maxItems": 500, "items": { "type": "object", "additionalProperties": false, "required": [ "repository", "file", "line", "variant" ], "properties": { "repository": { "type": "string", "minLength": 1, "maxLength": 200 }, "file": { "type": "string", "minLength": 1, "maxLength": 300 }, "line": { "type": [ "integer", "null" ], "minimum": 1, "maximum": 10000000 }, "variant": { "type": "string", "minLength": 1, "maxLength": 160 } } } }, "allowed_hits": { "type": "array", "minItems": 0, "maxItems": 500, "items": { "type": "object", "additionalProperties": false, "required": [ "repository", "file", "line", "variant", "allowed_context" ], "properties": { "repository": { "type": "string", "minLength": 1, "maxLength": 200 }, "file": { "type": "string", "minLength": 1, "maxLength": 300 }, "line": { "type": "integer", "minimum": 1, "maximum": 10000000 }, "variant": { "type": "string", "minLength": 1, "maxLength": 160 }, "allowed_context": { "type": [ "string", "null" ], "maxLength": 160 } } } }, "links": { "type": "object", "additionalProperties": false, "required": [ "checked", "ok", "redirected", "broken" ], "properties": { "checked": { "type": [ "integer", "null" ], "minimum": 0, "maximum": 100000 }, "ok": { "type": "integer", "minimum": 0, "maximum": 100000 }, "redirected": { "type": "array", "minItems": 0, "maxItems": 500, "items": { "type": "object", "additionalProperties": false, "required": [ "url", "final_url" ], "properties": { "url": { "type": "string", "minLength": 1, "maxLength": 300 }, "final_url": { "type": "string", "minLength": 1, "maxLength": 300 } } } }, "broken": { "type": "array", "minItems": 0, "maxItems": 500, "items": { "type": "object", "additionalProperties": false, "required": [ "url", "status" ], "properties": { "url": { "type": "string", "minLength": 1, "maxLength": 300 }, "status": { "type": "integer", "minimum": 0, "maximum": 999 } } } } } }, "host_renames": { "type": "array", "minItems": 0, "maxItems": 32, "items": { "type": "object", "additionalProperties": false, "required": [ "old_url", "new_url", "recorded_by_role" ], "properties": { "old_url": { "type": "string", "minLength": 1, "maxLength": 300 }, "new_url": { "type": "string", "minLength": 1, "maxLength": 300 }, "recorded_by_role": { "type": [ "string", "null" ], "maxLength": 120 } } } }, "verdict": { "type": "string", "enum": [ "clean", "violations_found", "unknown" ] } } }, "expected": { "good-clean": { "verdict": "pass", "failed_checks": [] }, "good-honest-dirty": { "verdict": "pass", "failed_checks": [] }, "bad-unpinned-repository": { "verdict": "fail", "failed_checks": [ "repositories-pinned" ] }, "bad-no-variants": { "verdict": "fail", "failed_checks": [ "variants-listed" ] }, "bad-violation-unlocated": { "verdict": "fail", "failed_checks": [ "violations-located" ] }, "bad-allowed-hit-unjustified": { "verdict": "fail", "failed_checks": [ "allowed-hits-justified" ] }, "bad-links-uncounted": { "verdict": "fail", "failed_checks": [ "links-counted" ] }, "bad-clean-with-violation": { "verdict": "fail", "failed_checks": [ "clean-means-no-violations" ] }, "bad-clean-with-redirect": { "verdict": "fail", "failed_checks": [ "clean-means-no-redirects" ] }, "bad-clean-with-broken-link": { "verdict": "fail", "failed_checks": [ "clean-means-no-broken-links" ] }, "bad-host-rename-unrecorded": { "verdict": "fail", "failed_checks": [ "host-renames-recorded" ] } } } }, { "slug": "example.rename-map", "category": "noun.seed_hypothesis", "role": "example", "title": "Worked example: a rename map for one repository and one site", "synthetic": true, "category_reason": "A synthetic rename map in the template's shape.", "value": { "conforms_to": { "$pin": "template.rename-map" }, "instance": { "map_id": "RM-1", "effective_at": "2026-10-30T12:00Z", "entries": [ { "old_name": "sunrise-tracker", "new_name": "volunteer-hours-tracker", "thing": "repository", "old_urls": [ "https://code.example.org/acme/sunrise-tracker" ], "new_urls": [ "https://code.example.org/acme/volunteer-hours-tracker" ], "keep_old_in": [ "provenance fields", "changelog entries written before the rename" ] }, { "old_name": "Sunrise", "new_name": "Volunteer hours", "thing": "site", "old_urls": [ "https://sunrise.example.org" ], "new_urls": [ "https://hours.example.org" ], "keep_old_in": [ "the archive notice on the old address" ] } ], "redirects": "none_relied_on", "decided_by": "program director" }, "shows": "A small program renames its tracker repository and site, relies on no redirects and keeps the old names only in provenance, history and the archive notice.", "source": "Synthetic. Written for this pack; every name, number and identifier is made up." } }, { "slug": "example.archive-notice", "category": "noun.public_source", "role": "example", "title": "Worked example: the notice at a retired address", "synthetic": true, "category_reason": "A synthetic notice in the template's shape.", "value": { "conforms_to": { "$pin": "template.archive-notice" }, "instance": { "retired_name": "Sunrise", "new_name": "Volunteer hours", "new_url": "https://hours.example.org", "since": "2026-10-30T12:00Z", "what_moved": [ "the volunteer hours log", "the sign-up form", "the tracker's code and history" ], "what_did_not_move": [ "the old monthly bulletin archive, which stays read-only here" ], "text": "Sunrise is now Volunteer hours. Everything you used here lives at https://hours.example.org, including the hours log and the sign-up form. This address will not forward you automatically; please update your bookmarks. The old bulletin archive stays here, read-only." }, "shows": "The notice says where everything moved, that the old address will not forward and what stays behind.", "source": "Synthetic. Written for this pack; every name, number and identifier is made up." } } ], "verbs": [ { "slug": "build-inventory", "kind": "verb.probe_source", "title": "Inventory every reference to the old names", "claimant": "agent", "model_use": "none", "summary": "Expand every old name into its variants and find each occurrence in local copies at exact commits, by reference type.", "outcome": "A reference inventory, with places outside the repositories listed separately.", "ready_outcome": "inventory_built", "pinned": [ "variant-rules", "reference-types" ], "slots": [ { "name": "rename_map", "category": "noun.seed_hypothesis", "description": "Pin of the decided rename map." }, { "name": "repositories", "category": "noun.code_node", "description": "Pins of the local repository copies at exact commits.", "many": true, "max": 32 } ], "produces": [ { "name": "inventory", "template": "template.reference-inventory" } ], "steps": [ "Expand each old name with the variant rules before searching.", "Search every file in each copy, including docs, configuration, workflows and tests, and record repository, file, line, variant and reference type.", "List text inside images and videos, and places outside the repositories, for a person instead of guessing them." ], "acceptance": [ { "id": "inventory-matches-template", "check": "The inventory validates against template.reference-inventory's schema.", "method": "deterministic" }, { "id": "exact-commits", "check": "Every repository is recorded with the commit that was searched.", "method": "deterministic" }, { "id": "reproducible", "check": "Rerunning the search at the same commits yields the same occurrences.", "method": "deterministic" } ], "network": [ "local_only", "Reads local copies only; no request leaves the machine." ] }, { "slug": "plan-rewrites", "kind": "verb.decompose_dag", "title": "Plan the rewrites", "claimant": "agent", "summary": "Group the inventory into edits per file, mark what stays under an allowed context, and list what only a person or the owner can change.", "outcome": "A rewrite plan covering every occurrence.", "ready_outcome": "rewrites_planned", "pinned": [ "allowed-contexts", "link-rules" ], "slots": [ { "name": "rename_map", "category": "noun.seed_hypothesis", "description": "Pin of the rename map." }, { "name": "inventory", "category": "noun.eval_run", "description": "Pin of the reference inventory." } ], "produces": [ { "name": "rewrite_plan", "template": "template.rewrite-plan" } ], "steps": [ "Make every occurrence either an edit or a keep with its allowed context.", "Point every link at the new address directly; never plan a redirect as the fix.", "List host renames as owner acts, in order, and text in media as items for a person." ], "acceptance": [ { "id": "plan-matches-template", "check": "The plan validates against template.rewrite-plan's schema.", "method": "deterministic" }, { "id": "occurrences-covered", "check": "The edit and keep counts add up to the inventory's occurrences.", "method": "deterministic" }, { "id": "no-redirect-fixes", "check": "No planned change relies on a redirect.", "method": "deterministic" } ] }, { "slug": "rewrite-references", "kind": "verb.solve_draft", "title": "Rewrite references in a local copy", "claimant": "agent", "summary": "Make the planned edits for one repository in a local copy and run that repository's own checks.", "outcome": "A rewrite held as a patch with its check results; nothing leaves the local copy.", "ready_outcome": "references_rewritten", "slots": [ { "name": "rewrite_plan", "category": "noun.seed_hypothesis", "description": "Pin of the rewrite plan." }, { "name": "repository", "category": "noun.code_node", "description": "Pin of the local repository copy." } ], "produces": [ { "name": "rewrite", "template": "template.rewrite" } ], "steps": [ "Apply only the planned edits for this repository; leave history and allowed contexts untouched.", "Run the repository's own checks and record each command, exit code and summary.", "Hold the result as a patch with its digest. Never push it; landing it is the owner's release." ], "acceptance": [ { "id": "rewrite-matches-template", "check": "The rewrite validates against template.rewrite's schema.", "method": "deterministic" }, { "id": "patch-applies", "check": "The patch applies cleanly to base_commit.", "method": "deterministic" }, { "id": "checks-recorded", "check": "Every check command has a recorded exit code.", "method": "deterministic" } ], "network": [ "sandbox_packages", "Package installs inside the sandbox to run the repository's own checks; no requests to any live system." ] }, { "slug": "record-host-renames", "kind": "verb.verify_gate", "title": "Record the renames carried out on hosts", "claimant": "human", "model_use": "none", "summary": "The owner records each rename they carried out on a host, with the old address, the new address and when. This template performs nothing itself.", "outcome": "A host rename record, with any renames still pending.", "ready_outcome": "host_renames_recorded", "slots": [ { "name": "rewrite_plan", "category": "noun.seed_hypothesis", "description": "Pin of the rewrite plan listing the owner acts." } ], "produces": [ { "name": "host_rename_record", "template": "template.host-rename-record" } ], "steps": [ "Write each old and new address exactly as the host shows it.", "List any planned host rename not yet carried out under not_done." ], "acceptance": [ { "id": "record-matches-template", "check": "The record validates against template.host-rename-record's schema.", "method": "deterministic" }, { "id": "owner-acts-covered", "check": "Every owner act in the plan appears in renames or not_done.", "method": "deterministic" } ], "bounds": { "max_elapsed_seconds": 604800 } }, { "slug": "check-links", "kind": "verb.verify_gate", "title": "Check every link", "claimant": "agent", "model_use": "none", "summary": "Resolve every link in the rewritten files and record which ones reach their target directly, which redirect and which fail.", "outcome": "A link check with redirects and failures listed.", "ready_outcome": "links_checked", "pinned": [ "link-rules" ], "slots": [ { "name": "rewrites", "category": "noun.code_node", "description": "Pins of the rewrites or repository copies to check.", "many": true, "max": 32 } ], "produces": [ { "name": "link_check", "template": "template.link-check" } ], "steps": [ "Collect every absolute and relative link from the rewritten files.", "Resolve relative links inside the repository; request absolute links read-only and record any redirect with its final address.", "List links to places the team does not control under outside_control." ], "acceptance": [ { "id": "links-match-template", "check": "The link check validates against template.link-check's schema.", "method": "deterministic" }, { "id": "counts-add-up", "check": "ok plus redirected plus broken equals checked.", "method": "deterministic" } ], "network": [ "read_only", "Read-only requests to each absolute link in the rewritten files; no forms are submitted and nothing is changed." ], "bounds": { "max_elapsed_seconds": 1800 } }, { "slug": "sweep-old-names", "kind": "verb.verify_gate", "title": "Sweep for old names and decide clean", "claimant": "agent", "model_use": "none", "summary": "Search the final local copies for every variant of every old name, combine the link check and host rename record, and decide whether the rename is clean.", "outcome": "An old-name sweep that passes the rename checks, with verdict clean, violations_found or unknown.", "ready_outcome": "sweep_recorded", "pinned": [ "variant-rules", "allowed-contexts", "rename-checks" ], "slots": [ { "name": "rename_map", "category": "noun.seed_hypothesis", "description": "Pin of the rename map." }, { "name": "repositories", "category": "noun.code_node", "description": "Pins of the final local copies at exact commits.", "many": true, "max": 32 }, { "name": "link_check", "category": "noun.eval_run", "description": "Pin of the latest link check." }, { "name": "host_rename_record", "category": "noun.eval_run", "description": "Pin of the owner's host rename record." } ], "produces": [ { "name": "sweep", "template": "template.old-name-sweep" } ], "steps": [ "Search with every variant; record each hit as a violation or an allowed hit with its context.", "Copy redirects and broken links from the link check, and host renames from the owner's record.", "Write clean only when there are no violations, no redirects and no broken links; propose record-finding for each violation." ], "acceptance": [ { "id": "sweep-matches-template", "check": "The sweep validates against template.old-name-sweep's schema.", "method": "deterministic" }, { "id": "rename-checks-pass", "check": "The sweep passes the pinned rename checks.", "method": "deterministic" }, { "id": "reproducible", "check": "Rerunning the search at the same commits yields the same hits.", "method": "deterministic" } ], "network": [ "local_only", "Reads local copies and pinned nouns only; no request leaves the machine." ] }, { "slug": "write-archive-notice", "kind": "verb.solve_draft", "title": "Draft the notice for a retired address", "claimant": "agent", "summary": "Draft a short, plain notice for a retired address: the new name and address, what moved, what did not and that it will not forward.", "outcome": "An archive notice draft; the owner decides where and when it appears.", "ready_outcome": "notice_drafted", "slots": [ { "name": "rename_map", "category": "noun.seed_hypothesis", "description": "Pin of the rename map." } ], "params": { "retired_name": { "schema": { "type": "string", "minLength": 1, "maxLength": 120 }, "description": "The retired name whose old address shows the notice.", "required": true } }, "produces": [ { "name": "archive_notice", "template": "template.archive-notice" } ], "steps": [ "Lead with the new name and the new address.", "Say plainly that the old address will not forward, and list what stayed behind.", "Keep it under 1,200 characters, in plain words." ], "acceptance": [ { "id": "notice-matches-template", "check": "The notice validates against template.archive-notice's schema.", "method": "deterministic" }, { "id": "new-address-present", "check": "text contains new_url exactly.", "method": "deterministic" }, { "id": "plain", "check": "A reader new to the project understands where to go.", "method": "judgment" } ] } ] }