You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Provide the first independently deliverable part of the remaining legacy-main adapter: a deterministic, network-free, non-rendering parser for the exact two tool and two conference records at the accepted immutable legacy-main pin. It returns typed source records, source-owned asset descriptors, opaque Person keys, and bounded diagnostics. It changes no public or database authority.
_docs/specs/02-url-link-seo-compatibility.md: later preservation of established /tools/<slug>.html and /conferences/<slug>.html canonicals, but no route delivery in this issue;
The adapter accepts only a caller-supplied checkout already proven to have that normalized origin, exact HEAD/tree, and an empty tracked/untracked status. It performs no clone, fetch, HTTP request, DNS lookup, provider call, or moving-branch lookup.
Every _tools/*.md and _conferences/*.md blob at the pin is selected—there is no collection-record exception. The only selected assets are the eleven exact files listed below. Every other repository path is excluded by rule and must neither be walked nor emitted. A missing/extra collection record, selected path of a type/mode other than regular 100644, symlink, submodule, traversal, case/Unicode-normalization collision, or file outside the exact allowlist rejects the entire parse.
The 15 sorted manifest lines use exact UTF-8 path<TAB>git_blob_sha<TAB>byte_size<TAB>sha256<LF> bytes. Their SHA-256 is 8a7ebde5ea63116efc4fe3651439ac7dceeb724609e0055332cddf3f22c84b6c; total selected bytes are 314,358. The MLOps.community image is referenced twice but emitted once by source path.
Exact parser and output boundary
Implement a pure content_sync legacy-main adapter/contract. Its input is an exact verified checkout path plus the explicit commit/tree values. Its immutable output contains only:
corpus provenance: repository, commit, tree, parser/schema version, selected-manifest digest, and counts;
ordered ToolSourceRecord values: key (filename stem), source_path, source blob/SHA-256, title, name, description, one HTTPS github_url, ordered categories, one HTTPS demo_url, and ordered opaque maintainer_keys from who;
ordered ConferenceSourceRecord values: key, provenance, title, description, normalized root-relative cover_asset_path, exact source layout="page", ordered tracks, ordered talks, ordered partners, and the checksum-bound legacy-body evidence described below;
tracks preserve their source order and explicit schedule variant. 2021-feb uses track_date_talk_time (name, naive date lexeme, positive Eventbrite ID normalized to a decimal string, HTTPS YouTube URL, talks). 2021-summer-marathon uses track_window_talk_datetime (name, naive start/end lexemes, positive Eventbrite ID string, talks);
talks normalize to name, exact source abstract_fragment, opaque speaker_key, optional source speaker_company, and only the fields present for their schedule variant: quoted HH:MMtime plus optional HTTPS YouTube for February, or naive date, positive Eventbrite ID string, and optional HTTPS YouTube for summer;
partners normalize to ordered name, HTTPS link, and root-relative image_asset_path; and
AssetSourceRecord values sorted by source path with path, blob, byte size, SHA-256, detected MIME family (image/jpeg or image/png), and referencing record/pointer census. Asset bytes are not duplicated into normalized JSON.
YAML timestamps are parsed from their exact scalar lexemes and remain timezone-free strings; this issue does not infer UTC, Europe/Berlin, event state, or an Event row. Entity-looking title text such as – and the apparent source typo in Obsei's GitHub URL are preserved; the parser does not editorially repair or dereference them. Eventbrite IDs are opaque positive decimal strings, not database identifiers.
Stable output ordering is record kind then source path, source order within lists, and asset path byte order. A canonical evidence serialization uses UTF-8 JSON, sorted mapping keys, compact separators, ensure_ascii=false, and one trailing LF. Two parses of independently copied exact checkouts must be byte-identical. No current public-projection digest is an acceptance input and no output is written into content/public_projection.
Exact source census
The accepted result is exactly 2 tools, 2 conferences, 6 tracks, 26 talks, 10 partner entries, 12 asset references resolving to 11 unique assets, and 28 opaque Person references resolving to 27 unique source strings. The only repeated Person key is elenasamuylova, once in each conference. The ordered opaque keys are:
The adapter validates opaque keys only against the current Person-key grammar ^[A-Za-z0-9_][A-Za-z0-9._()-]{0,199}$ with .. forbidden. It does not read _people, resolve existence, infer by name/company/email/case, create relations, or decide required/optional Person behavior; #40 owns all of that.
Legacy body and fragment quarantine
The tool bodies are empty. Conference frontmatter is semantic source; the bodies are legacy Jekyll presentation programs and are not renderable input. They contain Liquid, inline HTML/style/event handlers, javascript: links, inline JavaScript, and a remote Eventbrite script. This issue neither evaluates, sanitizes, rewrites, copies, nor emits those bodies as HTML.
The sole reviewed exception is checksum-bound opaque evidence for the two exact bodies (bytes after the second delimiter line through EOF):
Any body drift or any non-empty tool body fails closed and returns to PM; there is no generic executable-body allowlist. Frontmatter abstract strings may contain only text plus the observed inert fragment tags <ul>, <li>, <br>, and <br/>, with no attributes. Scripts, styles, event attributes, loading elements, javascript:/data/protocol-relative URLs, Liquid/Jinja delimiters, malformed tags, or any other element in a semantic string fail. Fragments remain source strings in this issue and are never marked safe or rendered; later presentation must sanitize/render from normalized data under its own issue.
Fail-closed limits and diagnostics
Read no more than the exact 15 selected files. Limits are 32 KiB per Markdown record, 128 KiB per asset, 512 KiB total, 24 KiB frontmatter, 8 KiB legacy body, YAML depth 16, YAML nodes 2,048, 64 tracks per conference, 64 talks per track, 32 partners, 20 diagnostics, 2,048 characters per URL, 200 per opaque key, 256 per title/name/company/category, 4,096 per description, and 16,384 per abstract. UTF-8 is required. YAML safe parsing forbids aliases, custom tags/object construction, merge keys, duplicate mapping keys, non-string mapping keys, non-finite numbers, unknown fields, and scalar coercion outside the exact schemas. Booleans are never integers.
Structured external URLs are absolute HTTPS without userinfo, control characters, backslashes, protocol-relative forms, fragments where not present in the source contract, or synchronous fetch. Asset references normalize one optional leading slash, must remain under exact images/other/ or images/partners/, and must resolve to the selected regular blob with exact size/digest and JPEG/PNG signature.
A rejected corpus produces no partial records/assets. Diagnostics are deterministic, path/pointer/code sorted, shaped only as {code, source_path, pointer}, bounded to 20 with a fixed overflow marker, and never contain source text, titles, abstracts, raw URLs, exception text, checkout absolute paths, credentials, account/Person data, or production data. Required fixed codes include:
quarantine/internal: legacy_body_digest_mismatch and fixed content-free legacy_main_parser_failed for an unexpected internal failure.
KeyboardInterrupt and SystemExit propagate. Parser state is invocation-local; a failure/retry cannot reuse partial output or a cross-run cache.
Acceptance criteria
The exact origin/commit/tree, four regular record blobs, eleven regular asset blobs, 15-line manifest digest, sizes, SHA-256 values, and exclusion rule above are encoded in a versioned legacy-main contract and verified before parsing.
One pure network-free adapter emits the exact typed schema and census: 2 tools, 2 conferences, 6 ordered tracks, 26 ordered talks, 10 ordered partners, 12/11 asset references/assets, and 28/27 opaque Person references/keys.
Both legacy schedule variants normalize without timezone/Event inference; optional summer YouTube remains absent where absent; identifiers remain opaque; source order and exact source text are preserved.
All eleven assets validate by path, regular-file boundary, byte size, digest, and JPEG/PNG signature. No other legacy-main asset is scanned or emitted.
Conference bodies are accepted only by the two exact opaque body digests and are absent from renderable output. Tool bodies are empty. Semantic abstract fragments accept only the observed inert tag subset and are never marked safe/rendered.
Person values are validated and emitted only as the 28 ordered opaque keys. There is zero _people read, Person resolution/relation, account/member lookup, fuzzy inference, or authority side effect.
Two independent exact-checkout parses produce byte-identical canonical evidence and identical bundle digests. Source/tree/file/body/asset/schema/order drift and every adversarial case fail atomically with the exact bounded diagnostics.
Tests prove the parser performs zero network/subprocess/provider calls and zero model/query/migration/file-write/runtime side effects; importing the module does not register a route, job, command, signal, source row, or setting.
A current change-selective CI plan records exact base/head, graph/plan digests, and every disposition. uv-backed format/lint/type checks, focused real-corpus and synthetic security tests, graph-selected Django/Playwright/container gates, independent tester PASS, and PM acceptance precede commit.
Required test envelope
Parse two independently copied exact legacy checkouts and compare complete typed values plus canonical bytes/digest; assert every pinned path/blob/size/SHA, all exact counts, both schedule variants, optional fields, ordering, 28 opaque keys, and shared asset deduplication.
Mutate each source file, body, asset, source origin/SHA/tree/status, selected path set/type/case, ordering, scalar kind, required/unknown field, date/time/Eventbrite grammar, URL/path, opaque key, and collection/byte limit. Assert whole-corpus rejection, stable diagnostic code/pointer/order, no partial output, and no leaked value/exception/absolute path.
Install hard-fail seams around network clients, subprocess, DNS/socket, Django ORM/model writes, filesystem writes, and runtime registration; exact parse must remain green and negative cases must not cross a seam.
Prove public URLConf, migrations, models, checked projection, sitemap/search/SEO output, templates/static assets, Studio/admin API/OpenAPI, jobs, and settings are byte-identical to the base.
This source-only issue has no render impact. Screenshots are not_applicable if the independently recomputed change graph confirms the strict boundary above; the applicable Playwright tier is backend-only smoke. Any public artifact/template/route/runtime impact is scope drift and returns to engineering/PM rather than being covered with unrelated screenshots.
There is no product dependency on #38, #40, or #253 for this four-record source-only parser. It neither uses the disputed #253 projection nor resolves Person keys. However, engineering starts only from a clean current base with required baseline CI green under _docs/PROCESS.md; a red or dirty shared main is an operational hold, not permission to weaken this contract.
Downstream order:
implement/test/accept this issue as the isolated source parser;
Any source revision, selected corpus, schema, asset, body, or architecture drift returns this issue to PM before engineering continues.
Explicit non-goals
No public tool/conference hub or detail route, alias, canonical, sitemap/search/SEO entry, template, navigation, asset serving, checked projection change, Person lookup/relation, Event/Course import, model, migration, database read/write, source registration, direct-sync orchestration, webhook/reconciliation, Studio/admin API/OpenAPI, job, provider/network call, source/GitHub write, production access, browser UI, content editorial repair, legacy Liquid/JavaScript execution, commit, push, merge, deployment, or #253 hash blessing.
Lifecycle
This body is the PM-groomed product/architecture contract. Engineering may be dispatched only after the orchestrator supplies the clean green current-base gate. The engineer works uncommitted in an isolated worktree, posts the complete verification handoff, and freezes it for a separate tester. Tester PASS and PM acceptance remain mandatory before any focused commit or local merge.
Parent: #39
Product outcome
Provide the first independently deliverable part of the remaining legacy-main adapter: a deterministic, network-free, non-rendering parser for the exact two tool and two conference records at the accepted immutable legacy-main pin. It returns typed source records, source-owned asset descriptors, opaque Person keys, and bounded diagnostics. It changes no public or database authority.
Normative authority
_docs/specs/03-github-content-and-people.md: legacy-main source ownership, the remaining-main-site adapter, opaque Person identity, sync safety, and no executable content;_docs/specs/01-platform-architecture.md: GitHub-owned tools/conferences and no repository/network/parse work on public requests;_docs/specs/02-url-link-seo-compatibility.md: later preservation of established/tools/<slug>.htmland/conferences/<slug>.htmlcanonicals, but no route delivery in this issue;_docs/specs/open-decisions.md#1-github-backed-editing-resolved-by-12-and-226: GitHub stays read-only and direct sync later consumes accepted adapters;_docs/architecture/app-boundaries.md: source parsing belongs tocontent_syncand may not move intocontentmodels/views;_docs/specs/09-migration-rollout-roadmap.md,_docs/specs/10-verification-strategy.md, and_docs/PROCESS.md; andImmutable source and complete selection
Repository:
https://github.com/DataTalksClub/datatalksclub.github.ioCommit:
ee43d3fa0929faf691178d79f19528e6f15a83e5Tree:
1666d11893a9f001e916409f3bac65a9ef0ff072The adapter accepts only a caller-supplied checkout already proven to have that normalized origin, exact HEAD/tree, and an empty tracked/untracked status. It performs no clone, fetch, HTTP request, DNS lookup, provider call, or moving-branch lookup.
Every
_tools/*.mdand_conferences/*.mdblob at the pin is selected—there is no collection-record exception. The only selected assets are the eleven exact files listed below. Every other repository path is excluded by rule and must neither be walked nor emitted. A missing/extra collection record, selected path of a type/mode other than regular100644, symlink, submodule, traversal, case/Unicode-normalization collision, or file outside the exact allowlist rejects the entire parse._conferences/2021-feb.md75d7c2f9c0e3acdfd18c0cfe66b41bdcbdd39d97df494d6bcfbd02b7b0745e75f149eb6029f6c249b5b6c6df29a349bc4e19b77b_conferences/2021-summer-marathon.md3a541ddec2d81d4e1fb8495cbca3c6f6333b03d4db239c7ff07b6bebceae144fbf588eb92d53e26a57ff4db457d17f03b564f71d_tools/modelstore.mdde13d7d514af7e8187d54ec0ce73b5d0b33453ac9a66d4fba23b1616d1126ee1b892e97f25e5124389db6025ae2838dc41d18131_tools/obsei.mdbcfb109854ea6b92f41a11568eac8b5fbe098e4513fe3b6e0b873add7fb9da83a2e2c0e175be54dfaebe1f5cd2f3255d5a9ed027images/other/conference-2021-feb-cover.jpg538b8f819e0fec88b5b7e8f87cd0201b69324b848354a6e53e06d227f3b1d291f1d2abb96e7112fd2ec42e146cea3d142eb5b333images/other/conference-2021-summer-marathon-cover.jpgb245b80a9d31a35df7c68012ee39f1c00b1e24c3ad6bfe867d477d3f5415ce69620127060036900eb92cfdc625c1c27ab6f0dd83images/partners/aicamp.png921c9be8fb88e440fc81f05c2cd3e9e2269ebadd690d35cd88677dd2cbb292ad23dc4bf17929125c565437d52e8632f76177acf4images/partners/confetti.png04854a28b8070eaf37854b664212cf634d50c193720f4dca0dff44fdb1919f0ffe2ac52b7abf7a3c6e7c0be068a7c84bf6f66635images/partners/dphi.png891bd1efe77a5cd0e76fb3dc7413848422fc65c37cbfc95fc1c43f3c2a44dcb730de9dc5c61bcadd73508f8655a9f827e35f8373images/partners/mlops-community.jpg1551e92e19ccebf7476fa3ffbca03eb9319c3af832a3fa7eabe88f25bde91382d691b25f500b4befe440b152ce55a5cf9d4fc678images/partners/odsc.pngc881cdfd70a5c69c5adfb37b9e9ae21ce3ad8005e1641a1bbaf28ead0dc1edaa824d02ad6da8aa719b5299cdd19e216cdce8dbe9images/partners/oreilly.jpg13e7959e3bc8063c43c545af5817319631ba3e5f21841b32991025990810707e5e97b84daf0ad57bcc386c2d5dd0474b9bcd0ee7images/partners/pydata-london.png76f636d791516c4f10ee57d824fcfcddd17af882ae2fff85ac104b2d4058105bfd93368aee407e2d365d902937b8275eacd0d7f6images/partners/thenewstack.png7c85efa0a784ee39cad0a28f99d1772c3d32574cb850bc6e59da36eb350fa0a2198de022d402ef720be68537715244a6ad90c478images/partners/thesequence.png0378326d4778663076df4991eaf41a7eaf2b097aa58cf7c9ff06dfe6b0e7a5d4c4d619441074cb80446ce55418314ec1f7334d85The 15 sorted manifest lines use exact UTF-8
path<TAB>git_blob_sha<TAB>byte_size<TAB>sha256<LF>bytes. Their SHA-256 is8a7ebde5ea63116efc4fe3651439ac7dceeb724609e0055332cddf3f22c84b6c; total selected bytes are 314,358. The MLOps.community image is referenced twice but emitted once by source path.Exact parser and output boundary
Implement a pure
content_synclegacy-main adapter/contract. Its input is an exact verified checkout path plus the explicit commit/tree values. Its immutable output contains only:ToolSourceRecordvalues:key(filename stem),source_path, source blob/SHA-256,title,name,description, one HTTPSgithub_url, orderedcategories, one HTTPSdemo_url, and ordered opaquemaintainer_keysfromwho;ConferenceSourceRecordvalues:key, provenance,title,description, normalized root-relativecover_asset_path, exact sourcelayout="page", ordered tracks, ordered talks, ordered partners, and the checksum-bound legacy-body evidence described below;2021-febusestrack_date_talk_time(name, naivedatelexeme, positive Eventbrite ID normalized to a decimal string, HTTPS YouTube URL, talks).2021-summer-marathonusestrack_window_talk_datetime(name, naivestart/endlexemes, positive Eventbrite ID string, talks);name, exact sourceabstract_fragment, opaquespeaker_key, optional sourcespeaker_company, and only the fields present for their schedule variant: quotedHH:MMtimeplus optional HTTPS YouTube for February, or naivedate, positive Eventbrite ID string, and optional HTTPS YouTube for summer;name, HTTPSlink, and root-relativeimage_asset_path; andAssetSourceRecordvalues sorted by source path with path, blob, byte size, SHA-256, detected MIME family (image/jpegorimage/png), and referencing record/pointer census. Asset bytes are not duplicated into normalized JSON.YAML timestamps are parsed from their exact scalar lexemes and remain timezone-free strings; this issue does not infer UTC, Europe/Berlin, event state, or an Event row. Entity-looking title text such as
–and the apparent source typo in Obsei's GitHub URL are preserved; the parser does not editorially repair or dereference them. Eventbrite IDs are opaque positive decimal strings, not database identifiers.Stable output ordering is record kind then source path, source order within lists, and asset path byte order. A canonical evidence serialization uses UTF-8 JSON, sorted mapping keys, compact separators,
ensure_ascii=false, and one trailing LF. Two parses of independently copied exact checkouts must be byte-identical. No current public-projection digest is an acceptance input and no output is written intocontent/public_projection.Exact source census
The accepted result is exactly 2 tools, 2 conferences, 6 tracks, 26 talks, 10 partner entries, 12 asset references resolving to 11 unique assets, and 28 opaque Person references resolving to 27 unique source strings. The only repeated Person key is
elenasamuylova, once in each conference. The ordered opaque keys are:neallathia,lalitpagaria;philwinder,himanshuupreti,mahmoudaziz,eugeneyan,eliasnema,susanwalsh,elenasamuylova,danbecker,dannyma,admondleekinlim,parulpandey,vinvashishta,larysavisengeriyeva,mikiobraun,sararobinson,elleobrien;svpino,dalianaliu,andreaskretz,roksolanadiachuk,elenasamuylova,janzawadzki,benwilson,linaweichbrodt,dougturnbull,fabianaclemente.The adapter validates opaque keys only against the current Person-key grammar
^[A-Za-z0-9_][A-Za-z0-9._()-]{0,199}$with..forbidden. It does not read_people, resolve existence, infer by name/company/email/case, create relations, or decide required/optional Person behavior; #40 owns all of that.Legacy body and fragment quarantine
The tool bodies are empty. Conference frontmatter is semantic source; the bodies are legacy Jekyll presentation programs and are not renderable input. They contain Liquid, inline HTML/style/event handlers,
javascript:links, inline JavaScript, and a remote Eventbrite script. This issue neither evaluates, sanitizes, rewrites, copies, nor emits those bodies as HTML.The sole reviewed exception is checksum-bound opaque evidence for the two exact bodies (bytes after the second delimiter line through EOF):
2021-feb: 3,111 bytes, SHA-256336a008c02a4bdbb13a76ecf11358ef555270ff822ed797944cc3efbffe366c8;2021-summer-marathon: 3,866 bytes, SHA-256bcdcb8359fe49e66342566fd01a91735709ef876208d1f5c11a8bfc5ed717ac2.Any body drift or any non-empty tool body fails closed and returns to PM; there is no generic executable-body allowlist. Frontmatter abstract strings may contain only text plus the observed inert fragment tags
<ul>,<li>,<br>, and<br/>, with no attributes. Scripts, styles, event attributes, loading elements,javascript:/data/protocol-relative URLs, Liquid/Jinja delimiters, malformed tags, or any other element in a semantic string fail. Fragments remain source strings in this issue and are never marked safe or rendered; later presentation must sanitize/render from normalized data under its own issue.Fail-closed limits and diagnostics
Read no more than the exact 15 selected files. Limits are 32 KiB per Markdown record, 128 KiB per asset, 512 KiB total, 24 KiB frontmatter, 8 KiB legacy body, YAML depth 16, YAML nodes 2,048, 64 tracks per conference, 64 talks per track, 32 partners, 20 diagnostics, 2,048 characters per URL, 200 per opaque key, 256 per title/name/company/category, 4,096 per description, and 16,384 per abstract. UTF-8 is required. YAML safe parsing forbids aliases, custom tags/object construction, merge keys, duplicate mapping keys, non-string mapping keys, non-finite numbers, unknown fields, and scalar coercion outside the exact schemas. Booleans are never integers.
Structured external URLs are absolute HTTPS without userinfo, control characters, backslashes, protocol-relative forms, fragments where not present in the source contract, or synchronous fetch. Asset references normalize one optional leading slash, must remain under exact
images/other/orimages/partners/, and must resolve to the selected regular blob with exact size/digest and JPEG/PNG signature.A rejected corpus produces no partial records/assets. Diagnostics are deterministic, path/pointer/code sorted, shaped only as
{code, source_path, pointer}, bounded to 20 with a fixed overflow marker, and never contain source text, titles, abstracts, raw URLs, exception text, checkout absolute paths, credentials, account/Person data, or production data. Required fixed codes include:source_origin_mismatch,source_revision_mismatch,source_tree_mismatch,source_checkout_dirty,source_path_missing,source_path_unexpected,source_path_type_invalid,source_path_escape,source_file_size_invalid,source_corpus_size_invalid;source_utf8_invalid,frontmatter_invalid,yaml_alias_forbidden,yaml_duplicate_key,yaml_depth_exceeded,yaml_node_limit_exceeded,schema_field_unknown,schema_required_value_missing,schema_value_type_invalid,schema_limit_exceeded;stable_key_invalid,person_key_invalid,schedule_value_invalid,eventbrite_id_invalid,url_invalid,url_scheme_forbidden,abstract_fragment_unsafe,asset_path_invalid,asset_missing,asset_digest_mismatch,asset_type_invalid;legacy_body_digest_mismatchand fixed content-freelegacy_main_parser_failedfor an unexpected internal failure.KeyboardInterruptandSystemExitpropagate. Parser state is invocation-local; a failure/retry cannot reuse partial output or a cross-run cache.Acceptance criteria
_peopleread, Person resolution/relation, account/member lookup, fuzzy inference, or authority side effect.uv-backed format/lint/type checks, focused real-corpus and synthetic security tests, graph-selected Django/Playwright/container gates, independent tester PASS, and PM acceptance precede commit.Required test envelope
This source-only issue has no render impact. Screenshots are
not_applicableif the independently recomputed change graph confirms the strict boundary above; the applicable Playwright tier is backend-only smoke. Any public artifact/template/route/runtime impact is scope drift and returns to engineering/PM rather than being covered with unrelated screenshots.Dependencies and delivery order
Satisfied inputs: #12, #34, #35, #37, and #226. Parent: #39.
There is no product dependency on #38, #40, or #253 for this four-record source-only parser. It neither uses the disputed #253 projection nor resolves Person keys. However, engineering starts only from a clean current base with required baseline CI green under
_docs/PROCESS.md; a red or dirty shared main is an operational hold, not permission to weaken this contract.Downstream order:
Any source revision, selected corpus, schema, asset, body, or architecture drift returns this issue to PM before engineering continues.
Explicit non-goals
No public tool/conference hub or detail route, alias, canonical, sitemap/search/SEO entry, template, navigation, asset serving, checked projection change, Person lookup/relation, Event/Course import, model, migration, database read/write, source registration, direct-sync orchestration, webhook/reconciliation, Studio/admin API/OpenAPI, job, provider/network call, source/GitHub write, production access, browser UI, content editorial repair, legacy Liquid/JavaScript execution, commit, push, merge, deployment, or #253 hash blessing.
Lifecycle
This body is the PM-groomed product/architecture contract. Engineering may be dispatched only after the orchestrator supplies the clean green current-base gate. The engineer works uncommitted in an isolated worktree, posts the complete verification handoff, and freezes it for a separate tester. Tester PASS and PM acceptance remain mandatory before any focused commit or local merge.