Skip to content

Extend process docs with stable IDs #33

Closed

Description

@alexeygrigorev

Extend process docs with stable IDs

Status: pending
Tags: enhancement, docs, process-docs, backend, work-engine, testing, data, P0
Depends on: None
Blocks: #34, #36, #37, #38, #39

Scope

Add a stable document identity policy and the first implementation slice for process documents that are used by DataOps workflows.

The current docs conventions already describe frontmatter IDs, and the docs registry can generate fallback IDs from paths. That fallback is not enough for V1 workflow execution because task templates and runtime tasks need process-document references that survive file renames, repo moves, and the future dataops-knowledge split described in docs/decisions/dataops-knowledge-repository.md.

This issue should make stable IDs an explicit contract for workflow-critical process docs and migrate the first priority set. The implementer should inspect and update the relevant documentation and code paths, especially:

  • .goal-v1.md
  • _docs/PROCESS.md
  • _docs/MERGE_PLAN.md
  • PROJECT_PLAN.md
  • PORTAL_ANALYSIS.md
  • docs/STRUCTURE.md
  • docs/sop-format.md
  • docs/local-development.md
  • docs/decisions/dataops-knowledge-repository.md
  • docs/v1-workflow-data-model.md
  • content/tasks/templates/*.md
  • Podcast workflow process docs referenced by content/tasks/templates/podcast.md and work-engine/scripts/seed-templates.ts
  • lambda-functions/src/lambda_functions/doc_registry.py
  • lambda-functions/src/lambda_functions/docs_index.py
  • docs metadata/search tests under tests/docs_app/
  • work-engine template/task metadata code and tests when sourceDocIds or instructionDocId mappings are changed

The first migration target is:

  1. Every Markdown task template in content/tasks/templates/*.md has explicit stable frontmatter id, aliases, doc_type: task-template, schema_version: 1, source, systems, tags, and related_docs where applicable.
  2. Every Podcast process doc referenced by the Podcast task template or Podcast seed-template instructionDocId has an explicit stable frontmatter id, or the reference is corrected to the stable ID already present on the target document.
  3. Workflow template records that already expose sourceDocIds and task definitions that expose instructionDocId use these stable document IDs rather than path-derived or Google Docs-only references.
  4. The policy docs explain how IDs, aliases, source metadata, task/workflow references, and repository boundaries work together.

Metadata Format

Use the existing frontmatter style and make it normative for workflow-critical process docs:

---
id: sop.media.podcast.create-podcast-document
aliases:
  - sop.media.podcast.create-a-podcast-document
title: "Create a podcast document"
summary: "Short operator-facing summary."
doc_type: sop
schema_version: 1
source: "Processes/Podcast/Create a podcast document.docx"
systems:
  - github
tags:
  - podcast
related_docs:
  - task-template.tasks.podcast
---

Rules to preserve or document:

  • id is the canonical stable identity. It must use lowercase letters, numbers, dots, dashes, and underscores only.
  • Prefer namespaces by type and domain: sop.<domain>.<area>.<slug>, template.<domain>.<area>.<slug>, reference.<domain>.<area>.<slug>, playbook.<domain>.<area>.<slug>, prompt.<domain>.<area>.<slug>, and task-template.tasks.<workflow>.
  • aliases contains old IDs, old generated IDs, or old repo-relative paths that should still resolve after a rename or migration.
  • related_docs, task-template sourceDocIds, and task/task-definition instructionDocId should prefer stable IDs over paths and external Google Docs URLs.
  • source remains provenance for imported docs. It is not the runtime identity.
  • instructionsUrl may remain for external Google Docs links during migration, but it must not be the only process-doc identity when an in-repo process doc exists.

Migration Strategy

Do this as a narrow first batch, not a repo-wide blind rewrite.

  1. Update the documentation contract first so future agents know when a stable ID is required and how to choose it.
  2. Audit the current workflow-critical docs and list any generated fallback IDs that are being relied on today.
  3. Add explicit IDs to all content/tasks/templates/*.md, preserving existing generated IDs as aliases when the explicit ID differs from the current generated ID.
  4. Add explicit IDs to the Podcast docs referenced by content/tasks/templates/podcast.md and work-engine/scripts/seed-templates.ts where missing.
  5. Update related_docs, sourceDocIds, and instructionDocId values only when needed to point at the canonical stable ID.
  6. Keep source repositories read-only. Do not edit ../dtc-operations, ../datatasks, or ../podcast-assistant.
  7. Do not split content/ into DataTalksClub/dataops-knowledge in this issue. The ADR remains a future boundary decision.

Validation And Search Impact

The implementation must keep the docs registry and search behavior deterministic:

  • Registry validation must fail loudly for duplicate id values, duplicate aliases, aliases that conflict with another document ID/path, invalid ID syntax, and broken related_docs references.
  • Workflow-critical docs migrated in this issue must report stable_id: true and id_source: frontmatter from the docs API/registry.
  • Search index generation must still succeed after the migration and must index the stable id field for migrated docs.
  • Existing path and alias resolution must keep working for migrated docs.
  • Generated fallback IDs may remain for legacy docs outside this issue's migration batch, but tests should make clear that workflow-critical docs are not allowed to rely on fallback IDs.

Acceptance Criteria

  • docs/STRUCTURE.md, docs/sop-format.md, and relevant process/development docs explain the stable-ID requirement for workflow-critical process docs, aliases, source provenance, related_docs, sourceDocIds, instructionDocId, and the future knowledge-repo boundary.
  • All content/tasks/templates/*.md files have explicit stable frontmatter IDs using the task-template.tasks.<workflow> namespace and are covered by tests.
  • Podcast workflow docs referenced by content/tasks/templates/podcast.md and Podcast seed-template instructionDocId values have explicit stable IDs or references are corrected to existing explicit IDs.
  • related_docs, sourceDocIds, and instructionDocId values for the migrated batch resolve through the document registry by stable ID.
  • Registry/search behavior preserves aliases and path resolution for migrated docs, and duplicate/conflicting IDs fail with actionable validation errors.
  • Search index build succeeds and includes stable IDs for the migrated task templates and Podcast process docs.
  • Work-engine template/task tests still prove that sourceDocIds and instructionDocId persist, export, and instantiate correctly.
  • No source repositories outside DataTalksClub/dataops are modified.

Test Scenarios

Scenario: Task template has stable identity

Given: each Markdown file under content/tasks/templates/
When: the docs registry indexes the content tree
Then: each template record has id_source: frontmatter, stable_id: true, doc_type: task-template, and a unique task-template.tasks.<workflow> ID.

Scenario: Podcast task opens process doc by ID

Given: a Podcast task definition with instructionDocId: sop.media.podcast.create-podcast-document
When: the frontend or docs API resolves the instruction document
Then: the stable ID resolves to the expected Markdown document even if the file path has an alias or generated fallback ID.

Scenario: Duplicate ID fails loudly

Given: two Markdown docs define the same id
When: registry validation or search-index build runs
Then: validation fails with a message naming both conflicting paths.

Scenario: Alias preserves old references

Given: a migrated doc has an alias for its previous generated/path reference
When: /docs/resolve?ref=<alias> or registry resolution is used
Then: it resolves to the canonical document record and reports the canonical id.

Scenario: Search indexes migrated IDs

Given: migrated task-template and Podcast process docs
When: the search index is built
Then: the index build succeeds, migrated docs include their stable id keyword field, and existing search tests still pass.

Scenario: Work-engine keeps process-doc identity

Given: a template with sourceDocIds and task definitions with instructionDocId
When: templates are created, updated, instantiated into tasks, and exported
Then: the stable process-doc IDs are preserved and no code falls back to Google Docs URLs as the only identity for migrated in-repo docs.

Out of Scope

Dependencies

  • This issue is foundational for Add internal link and related-doc validation #34 and the workflow mapping issues because they should rely on stable document identities rather than generated path IDs.
  • No external credentials or human-only checks are expected.
  • If a referenced Podcast process doc does not exist in content/**, document the missing mapping in the implementation notes and keep the current external instructionsUrl; do not invent a document or edit a source repository.

Labels

Use labels: enhancement, docs, process-docs, backend, work-engine, testing, data, P0.

Remove needs grooming after this body is applied.

Verification Commands

Run the relevant focused checks during implementation, and the full relevant workflow before handoff:

uv run --project lambda-functions --extra search --with pytest python -m pytest tests/docs_app/test_backend_docs_metadata.py tests/docs_app/test_frontend_routes_and_links.py
uv run --project lambda-functions --extra search --with pytest python -m pytest tests/docs_app
cd lambda-functions
uv run --extra search python -m lambda_functions.build_search_index \
  --docs-dir ../content \
  --output ../.tmp/dataops-content-search.index
npm --prefix work-engine test
npm --prefix work-engine run typecheck
npm --prefix work-engine run build

Activity

  1. added
    needs groomingRaw intake that needs PM grooming
    process-docsSOPs, templates, references, playbooks
    dataData model, migration, storage
    P0Must have
    on Jun 27, 2026
  2. alexeygrigorev commented on Jun 27, 2026

    @alexeygrigorev
    MemberAuthor

    Implementation note from #10 workflow-card slice:

    The portal now starts workflows from process template cards using a conservative bridge: future explicit template ID fields (templateId, sourceTemplateId, canonicalTemplateId) match live template IDs; otherwise doc slug/type must match exactly one live template slug/type. Ambiguous matches leave the workflow selector unselected.

    This is still a bridge, not the final boundary. When grooming #33, include acceptance criteria for a persisted canonical process-doc/template identity, such as sourceDocId or canonicalTemplateId, in Git frontmatter and runtime templates, with validation that duplicate mappings fail loudly.

  3. added
    enhancementNew or improved functionality
    docsDocumentation or process docs work
    work-engineDataTasks task execution engine
    and removed
    needs groomingRaw intake that needs PM grooming
    on Jun 27, 2026
  4. alexeygrigorev commented on Jun 27, 2026

    @alexeygrigorev
    MemberAuthor

    PM grooming complete. I rewrote the issue as a scoped P0 implementation spec for stable process-document IDs, including the metadata contract, first migration batch, validation/search impact, workflow/task references, source boundaries, acceptance criteria, out-of-scope items, dependencies, labels, and verification commands. The issue is agent-ready and needs grooming has been removed.

  5. alexeygrigorev commented on Jun 28, 2026

    @alexeygrigorev
    MemberAuthor

    Process Curator pre-implementation review

    I reviewed #33 against .goal-v1.md, the V1 operator JTBD, SOP format, workflow data model, current content/, doc_registry.py, docs_index.py, task-template content, and the Podcast seed mappings. This issue should stay a narrow identity hardening slice, not a broad content rewrite.

    Stable ID conventions

    Use the existing registry syntax as the hard rule: lowercase letters, numbers, dots, dashes, and underscores only, matching ^[a-z0-9][a-z0-9._-]*$. The ID is the runtime/document identity. source is provenance only. File paths and Google Docs URLs are not stable identities.

    Recommended canonical namespaces:

    • SOPs: sop.<domain>.<area>.<operator-action>.
      Examples: sop.media.podcast.create-podcast-document, sop.events.luma.creating-events-webinar-workshop-and-podcast-on-luma, sop.finance.tax-reporting.monthly-tax-report, sop.community.book-of-the-week.select-book-of-the-week-winners.
    • Communication/content templates: template.<domain>.<area>.<slug>.
      Examples: template.media.podcast.podcast-remind-the-guest-about-the-event-a-day-before-template, template.newsletter.sponsorship.send-sponsorship-document-2-weeks-before, template.community.book-of-the-week.book-of-the-week-announcement-template.
    • References: reference.<domain>[.<area>].<slug>.
      Examples: reference.overview.schedule, reference.newsletter.newsletter-sponsorship, reference.finance.invoices-receipts-and-statements, reference.social-media.post-podcast-overview-after-the-event.
    • Workflow-linked task templates: keep task-template.tasks.<workflow-type> for the current Markdown task-template docs and work-engine sourceDocIds.
      Examples: task-template.tasks.podcast, task-template.tasks.newsletter, task-template.tasks.book-of-the-week, task-template.tasks.tax-report, task-template.tasks.oss, task-template.tasks.social-media.

    Do not introduce a second competing workflow ID namespace in this issue. If future YAML workflow definitions move to workflow-templates/, either preserve the current task-template.tasks.<workflow> identity as the canonical template ID or make that change in a separate schema issue with migration rules.

    Aliases should be conservative:

    • If the new explicit ID equals the current generated ID, aliases: [] is fine.
    • If the canonical ID differs from the current generated path ID, add the generated ID as an alias. content/media/podcast/sops/create-a-podcast-document.md is the right example: canonical sop.media.podcast.create-podcast-document, alias sop.media.podcast.create-a-podcast-document.
    • Add old repo-relative paths as aliases only when a path has already moved or is intentionally being renamed. Do not bulk-add every current path as an alias unless there is a migration reason.
    • Do not use aliases for unrelated Google Docs URLs. Keep external URLs in references or instructionsUrl fallback fields.

    Current state to account for

    The registry currently sees 357 Markdown docs. Only 2 have explicit frontmatter IDs: content/tasks/templates/podcast.md and content/media/podcast/sops/create-a-podcast-document.md. The other task-template docs currently resolve through generated IDs such as task-template.tasks.newsletter, task-template.tasks.tax-report, and task-template.tasks.oss.

    Podcast seed data already uses stable-looking sourceDocIds and instructionDocId values, but most resolve only because generated path IDs happen to match. That is the main risk #33 needs to remove.

    Two Podcast source references do not currently resolve through content/:

    • assistant.podcast.process.podcast
    • template.media.podcast.podcast-guest-intake

    Do not invent replacement content for those in #33. Either keep them as explicitly external/assistant references with clear implementation notes, or point them to real in-repo docs only if the implementation confirms a supported registry type and canonical file exists. The repo does have assistants/podcast/process/podcast.md and assistants/podcast/templates/podcast_guest_intake.md, but the current document registry only indexes content/**/*.md.

    Also note that work-engine/src/public/app.js currently has a hard-coded PROCESS_DOC_REGISTRY. That can be a display cache, but it must not become the source of truth. Runtime links should ultimately resolve through the document registry or generated registry data, not hand-maintained IDs in the frontend.

    V1 content priority

    For #33 itself, the highest priority is identity coverage for docs already used by V1 task/workflow execution:

    1. All content/tasks/templates/*.md, with explicit IDs in task-template.tasks.<workflow>.
    2. Podcast process docs and templates referenced by content/tasks/templates/podcast.md and work-engine/scripts/seed-templates.ts.
    3. Shared event setup docs used by Podcast task definitions: calendar, Luma, Meetup, Airtable/person/event form, Slack announcement, YouTube playlist, and social post reference docs.

    For follow-up workflow mapping issues, prioritize operator-critical content in this order:

    • Podcast: already has the richest V1 task semantics, phases, proof requirements, assistant artifacts, and contextual doc IDs. Harden all referenced SOP/template/reference IDs first.
    • Newsletter: weekly recurring work with sponsor document, Mailchimp campaign, publication scheduling, invoice proof, LinkedIn/X post links, newsletter performance, and sponsor report handoff. This is high-frequency and proof-heavy.
    • Tax Report: monthly recurring finance workflow. Prioritize docs for TODO review, currency conversion, Finom/Revolut statements, cross-checking, zip/upload, accountant notification, and invoice folder cleanup. Required files and upload links must be proof gates.
    • Book of the Week: author outreach, date agreement, confirmed schedule status, Airtable author/book records, website page, reminders, Slack announcements, winner selection, email collection, and publisher handoff.
    • Open-Source Spotlight: author/tool outreach, recording scheduling, YouTube upload/edit/timecodes, scheduled publication, playlist, guest share request, and newsletter/social follow-up.
    • Recurring operations: weekly social media, weekly newsletter generation, monthly tax report, Slack invite handling, daily task/card review, Mailchimp audience backup, monthly Slack dump, sponsor performance follow-up, invoices/receipts/bookkeeping checks.

    The principle is: prioritize docs that unblock dashboard actions, waiting/follow-up states, missing-evidence reminders, and completion proof. Low-risk references can keep generated IDs until later.

    Bulk migration risks to avoid

    • Do not do a repo-wide blind rewrite. Extend process docs with stable IDs #33 should migrate task templates plus Podcast-critical references first.
    • Do not change visible titles, headings, screenshots, or SOP body structure unless a metadata change requires it.
    • Do not rename a canonical ID just because the title wording can be improved. Stable IDs are not display labels.
    • Do not remove Google Docs instructionsUrl values until the in-repo instructionDocId is proven resolvable. During migration, instructionDocId should be primary and instructionsUrl can remain legacy fallback.
    • Do not confuse communication templates (template.media.podcast...) with workflow task templates (task-template.tasks.podcast).
    • Do not add schema_version: 1 to legacy SOPs unless their body actually follows the structured SOP marker contract, or the parser/linter behavior is known to accept the shape. Metadata-only changes should not imply structured-body compliance accidentally.
    • Do not add aliases that conflict with another document ID or path. The registry already validates duplicate IDs, duplicate aliases, alias-to-ID conflicts, and alias-to-path conflicts.
    • Do not put private operational data, generated assistant output, invoices, guest-specific drafts, or credentials into metadata while adding source, related_docs, or references.
    • Do not treat current search behavior as proof for legacy docs: docs_index.iter_docs() currently emits the frontmatter id field, so migrated docs will index IDs only if explicit IDs are actually present.

    How workflow/task references should work

    Workflow/template level:

    • Template.sourceDocIds should include the task-template document ID and the small set of process docs needed to understand the whole workflow.
    • For Podcast, keep task-template.tasks.podcast and make every resolvable Podcast sourceDocIds entry a frontmatter-backed stable ID. External assistant refs should be marked or documented as external until the registry supports them.
    • Task-template Markdown related_docs should point to stable IDs, not paths, for the key SOP/reference docs.

    Task level:

    • Use instructionDocId for the canonical in-repo process doc.
    • Use instructionStepId when the SOP has structured steps and the task maps to a specific step.
    • Keep phase, systems, validation, requiredLinkName, requiresFile, and proofRequirement aligned so the operator sees the SOP in the same context as due date, waiting/follow-up, and proof requirements.
    • Keep instructionsUrl only as a legacy fallback for external Google Docs or missing in-repo docs.

    Operator UI expectation:

    • The workflow/task row should show one contextual instruction action: SOP/template/reference by title when instructionDocId resolves, with phase/step/system metadata nearby.
    • If the ID is unresolved, show an explicit unresolved state and a resolver/debug link; do not silently fall back to an unrelated URL.
    • Completion must still be governed by proof fields, not by whether the doc link opens.

    Required validation and evidence for the later implementation

    The future SWE/Process Curator implementation should provide evidence for all of these:

    • Registry build validates with validate=True and no duplicate ID, duplicate alias, alias/path conflict, invalid ID, or broken related_docs errors.
    • Every migrated content/tasks/templates/*.md document reports stable_id: true and id_source: frontmatter from /docs/registry or direct registry inspection.
    • Every migrated Podcast SOP/template/reference used by sourceDocIds or instructionDocId resolves by stable ID through doc_registry.resolve_reference() and /docs/resolve?ref=....
    • Old generated IDs and path aliases that were intentionally preserved resolve to the canonical document.
    • The two currently unresolved Podcast refs, assistant.podcast.process.podcast and template.media.podcast.podcast-guest-intake, are either resolved through a deliberate registry extension or explicitly reported as external/non-content references. They should not be left as accidental missing content refs.
    • Search index build succeeds and migrated docs include non-empty stable id keyword fields.
    • Focused negative tests cover duplicate IDs, duplicate aliases, alias conflicts with another ID/path, invalid ID syntax, and broken related_docs.
    • Work-engine tests prove sourceDocIds, instructionDocId, instructionStepId, and instructionsUrl fallback persist through template create/update, template instantiation into tasks, and portable export.
    • Frontend/docs tests prove instruction links prefer instructionDocId, resolve canonical docs, and display unresolved IDs visibly.

    Recommended verification commands from #33 remain appropriate:

    uv run --project lambda-functions --extra search --with pytest python -m pytest tests/docs_app/test_backend_docs_metadata.py tests/docs_app/test_frontend_routes_and_links.py
    uv run --project lambda-functions --extra search --with pytest python -m pytest tests/docs_app
    cd lambda-functions && uv run --extra search python -m lambda_functions.build_search_index --docs-dir ../content --output ../.tmp/dataops-content-search.index
    npm --prefix work-engine test
    npm --prefix work-engine run typecheck
    npm --prefix work-engine run build

    A useful additional focused check is a registry audit that compares every migrated sourceDocIds and instructionDocId against doc_registry.resolve_reference() and fails unless the reference is deliberately marked external.

    Read-only review only: I did not modify repo files, commit, push, close the issue, or open a PR.

  6. alexeygrigorev commented on Jun 28, 2026

    @alexeygrigorev
    MemberAuthor

    READY FOR TEST

    SWE handoff for issue #33 from worktree /home/alexey/git/dataops/.tmp/worktrees/issue-33 on branch worktree-issue-33.

    Summary:

    • Added explicit stable frontmatter IDs to all content/tasks/templates/*.md using task-template.tasks.<workflow>.
    • Added explicit stable IDs/empty aliases to the Podcast workflow-critical content docs referenced by Podcast sourceDocIds or instructionDocId values.
    • Kept the two assistant-local Podcast references as explicit non-content references in work-engine/scripts/seed-templates.ts:
      • template.media.podcast.podcast-guest-intake -> assistants/podcast/templates/podcast_guest_intake.md
      • assistant.podcast.process.podcast -> assistants/podcast/process/podcast.md
    • Updated stable-ID policy/docs for workflow-critical docs, aliases, source provenance, related_docs, sourceDocIds, instructionDocId, instructionsUrl fallback, and future knowledge-repo boundary.
    • Added docs metadata/search tests for migrated stable IDs and work-engine seed tests for registry-backed vs assistant-local Podcast source docs.

    Changed files:

    • PROJECT_PLAN.md
    • _docs/MERGE_PLAN.md
    • _docs/PROCESS.md
    • docs/STRUCTURE.md
    • docs/decisions/dataops-knowledge-repository.md
    • docs/local-development.md
    • docs/sop-format.md
    • docs/v1-workflow-data-model.md
    • tests/docs_app/test_backend_docs_metadata.py
    • work-engine/scripts/seed-templates.ts
    • work-engine/tests/seed.test.ts
    • content/tasks/templates/book-of-the-week.md
    • content/tasks/templates/course.md
    • content/tasks/templates/maven-ll.md
    • content/tasks/templates/newsletter.md
    • content/tasks/templates/office-hours.md
    • content/tasks/templates/oss.md
    • content/tasks/templates/podcast.md was already explicitly ID-backed and was reviewed; no diff needed there.
    • content/tasks/templates/social-media.md
    • content/tasks/templates/tax-report.md
    • content/tasks/templates/webinar.md
    • content/tasks/templates/workshop.md
    • content/events/calendar/sops/create-a-calender-invite-for-the-guests-speaker-for-an-event.md
    • content/events/calendar/sops/creating-tentative-event-on-google-calendar.md
    • content/events/luma/sops/creating-events-on-google-calendar.md
    • content/events/luma/sops/creating-events-webinar-workshop-and-podcast-on-luma.md
    • content/events/luma/sops/downloading-the-csv-file-on-luma.md
    • content/events/meetup/sops/create-events-in-meetup-com.md
    • content/events/outreach/sops/how-to-find-emails-of-previous-guests.md
    • content/events/planning/sops/create-speaker-profiles-via-airtable-form.md
    • content/events/planning/sops/fill-in-the-event-form-in-airtable-for-adding-events-to-our-website.md
    • content/events/sops/announce-event-in-slack-in-announcements.md
    • content/media/podcast/sops/add-a-guest-bio-to-the-podcast-document.md
    • content/media/podcast/sops/add-a-podcast-episode-via-airtable-form.md
    • content/media/podcast/sops/add-links-to-youtube-after-the-stream-is-over.md
    • content/media/podcast/sops/creating-podcast-transcription-document.md
    • content/media/podcast/sops/generate-timecodes-from-docx-transcriptions.md
    • content/media/podcast/sops/making-event-announcements-when-topic-bio-or-outline-is-missing.md
    • content/media/podcast/sops/managing-podcast-workflow.md
    • content/media/podcast/sops/move-podcast-documents-to-archive-in-google-drive.md
    • content/media/podcast/sops/moving-podcast-audio-in-dropbox.md
    • content/media/podcast/sops/reach-out-to-guests-and-propose-a-date-on-linkedin.md
    • content/media/podcast/sops/removing-the-beginning-from-the-youtube-stream.md
    • content/media/podcast/sops/schedule-podcast-episodes-with-spotify-for-podcaster.md
    • content/media/podcast/sops/select-and-propose-a-date-for-events.md
    • content/media/podcast/sops/sending-a-podcast-scheduled-email-to-pavel-after-the-event.md
    • content/media/podcast/sops/update-the-website-with-the-information-from-forms.md
    • content/media/podcast/sops/updating-the-cover-of-the-youtube-video.md
    • content/media/podcast/templates/podcast-adding-johanna-and-sending-the-podcast-link-to-the-speaker.md
    • content/media/podcast/templates/podcast-links-after-the-event-is-over.md
    • content/media/podcast/templates/podcast-remind-about-the-event-in-a-week-share-registration-link-template.md
    • content/media/podcast/templates/podcast-remind-the-guest-about-the-event-a-day-before-template.md
    • content/media/podcast/templates/podcast-share-the-podcast-page-template.md
    • content/media/podcast/templates/sending-podcast-document-on-slack-the-dtc-podcast-help-channel.md
    • content/media/video-youtube/sops/adding-videos-from-other-channels-to-our-playlist.md
    • content/social-media/reference/post-podcast-overview-after-the-event.md
    • content/social-media/sops/post-podcast-guest-recommendations.md
    • content/social-media/templates/template-new-event-announcements-podcasts-webinars-workshops.md

    Verification:

    • pwd: /home/alexey/git/dataops/.tmp/worktrees/issue-33
    • git status --short in /home/alexey/git/dataops: clean.
    • git diff --check: passed, no output.
    • Registry audit command: PYTHONPATH=lambda-functions/src python - <<'PY' ... checked Podcast/workflow source refs from work-engine/scripts/seed-templates.ts: checked=38 external=2 missing=0 generated=0.
    • uv run --project lambda-functions --extra search --with pytest python -m pytest tests/docs_app/test_backend_docs_metadata.py tests/docs_app/test_frontend_routes_and_links.py: 37 passed in 1.82s.
    • uv run --project lambda-functions --extra search --with pytest python -m pytest tests/docs_app: 86 passed, 1 skipped in 5.27s. The skip is the pre-existing local Playwright docs flow skip from that suite, not a skipped Extend process docs with stable IDs #33 verification command.
    • cd lambda-functions && uv run --extra search python -m lambda_functions.build_search_index --docs-dir ../content --output ../.tmp/dataops-content-search.index: Indexed 357 documents into ../.tmp/dataops-content-search.index.
    • npm --prefix work-engine test: 647 passed, 0 failed in 6291ms after installing local work-engine dependencies.
    • npm --prefix work-engine run typecheck: passed.
    • npm --prefix work-engine run build: passed.

    Notes:

    • npm --prefix work-engine ci could not run because work-engine/ has no package lock. I used npm --prefix work-engine install to install local verification dependencies, then removed the generated untracked work-engine/package-lock.json. No tracked package metadata remains changed.
    • No commits, pushes, merges, PRs, deploys, cache refreshes, or source-repo edits were performed.
  7. alexeygrigorev commented on Jun 28, 2026

    @alexeygrigorev
    MemberAuthor

    TEST PASS

    Tester verification for issue #33 from worktree /home/alexey/git/dataops/.tmp/worktrees/issue-33 on branch worktree-issue-33.

    Required command results:

    • git diff --check: passed with no output.
    • uv run --project lambda-functions --extra search --with pytest python -m pytest tests/docs_app/test_backend_docs_metadata.py tests/docs_app/test_frontend_routes_and_links.py: passed, 37 passed in 1.75s.
    • uv run --project lambda-functions --extra search --with pytest python -m pytest tests/docs_app: passed, 86 passed, 1 skipped in 2.12s. The skipped test is tests/docs_app/test_playwright_local_docs_flow.py from the existing suite.
    • cd lambda-functions && uv run --extra search python -m lambda_functions.build_search_index --docs-dir ../content --output ../.tmp/dataops-content-search.index: passed, indexed 357 documents into ../.tmp/dataops-content-search.index.
    • npm --prefix work-engine test: passed, 647 tests, 0 failed, 0 skipped. The output includes an intentional Simulated DB failure log from a passing error-handling test.
    • npm --prefix work-engine run typecheck: passed (tsc --noEmit, test tsconfig, and script tsconfig all completed).
    • npm --prefix work-engine run build: passed (tsc plus public/pages copy completed).

    Focused registry/reference audit:

    • Ran a read-only audit through the Lambda uv environment against content/, work-engine/scripts/seed-templates.ts, and lambda_functions.doc_registry/docs_index.iter_docs.
    • Result: AUDIT PASS.
    • Evidence: task_templates=11, registry_documents=357, podcast_registry_refs_checked=51, assistant_local_external_refs=2, search_indexed_ids_checked=49.
    • The audit checked every content/tasks/templates/*.md file has required stable frontmatter metadata, task-template.tasks.<workflow> ID, doc_type: task-template, id_source: frontmatter, and stable_id: true registry behavior.
    • It checked Podcast sourceDocIds and instructionDocId refs from the seed script resolve through doc_registry by frontmatter-backed stable ID.
    • It checked template.media.podcast.podcast-guest-intake and assistant.podcast.process.podcast remain explicitly documented assistant-local references under assistants/podcast/ and do not accidentally resolve through the content registry.
    • It checked search iteration includes the migrated stable IDs and excludes the assistant-local external IDs.

    Acceptance-criteria evidence:

    • Stable-ID policy docs were inspected in docs/STRUCTURE.md, docs/sop-format.md, docs/local-development.md, docs/v1-workflow-data-model.md, docs/decisions/dataops-knowledge-repository.md, _docs/PROCESS.md, _docs/MERGE_PLAN.md, and PROJECT_PLAN.md. They document stable IDs, aliases, source as provenance, related_docs, sourceDocIds, instructionDocId, instructionsUrl fallback, and the future knowledge-repo boundary.
    • tests/docs_app/test_backend_docs_metadata.py now covers task-template stable IDs, Podcast workflow content IDs, alias resolution, search id fields, and duplicate/invalid/conflicting registry failures.
    • work-engine/tests/seed.test.ts covers Podcast seed sourceDocIds, documented assistant-local exceptions, instructionDocId, and instantiation semantics.
    • Existing work-engine tests also cover persistence/update/instantiation/export for sourceDocIds and instructionDocId (api-templates, templates, api-bundles, tasks, api-tasks, and export-portable were included in the 647-test run).
    • The implementation does not use Google Docs/source provenance as runtime identity for the migrated batch: seed sourceDocIds and Podcast instructionDocId values are stable IDs; instructionsUrl remains a fallback field.
    • No weakening of the V1 goal/JTBD found; the changes reinforce registry-backed process-doc identity and preserve proof/task workflow semantics.

    Worktree/source-boundary checks:

    • /home/alexey/git/dataops main checkout: clean (## main...origin/main). This resolves the wrong-worktree concern for main.
    • Issue worktree: only the intended Extend process docs with stable IDs #33 files are modified on worktree-issue-33; no untracked files shown by git status --short --branch --untracked-files=all.
    • /home/alexey/git/dtc-operations: clean.
    • /home/alexey/git/podcast-assistant: the root is not a git checkout, so there is no source-repo status to report there.
    • /home/alexey/git/datatasks: has a pre-existing modified e2e/.auth-state.json dated 2026-06-24 23:21:12 +0200, changing localhost auth state from port 3000 to 3001. This predates Extend process docs with stable IDs #33 testing/handoff and was not touched by the Extend process docs with stable IDs #33 commands; I found no evidence Extend process docs with stable IDs #33 modified source repos outside dataops.

    No files were edited, committed, pushed, merged, deployed, or cache-refreshed by this tester run beyond the required local .tmp search-index artifact command.

  8. alexeygrigorev commented on Jun 28, 2026

    @alexeygrigorev
    MemberAuthor

    Tester clarification: the required npm --prefix work-engine run build command writes ignored work-engine/dist/ output, and the required search-index command writes the ignored .tmp/dataops-content-search.index artifact. git status --short --branch --untracked-files=all remains limited to the intended tracked #33 implementation files; no tracked source files were modified by the tester run.

  9. alexeygrigorev commented on Jun 28, 2026

    @alexeygrigorev
    MemberAuthor

    PM ACCEPTED

    Acceptance evidence:

    • Reviewed AGENTS.md, _docs/PROCESS.md, issue Extend process docs with stable IDs #33, SWE handoff, tester pass, tester clarification, worktree status, and the changed-file diff.
    • From the operator perspective, this is the right stable-ID foundation: task/workflow rows can rely on registry-backed process-doc IDs for Podcast daily duties, reminders, follow-ups, proof, and completion context, while Google Docs URLs remain fallback/provenance only.
    • Implementation is narrow metadata/contract work, not a broad SOP rewrite: migrated content files mostly add explicit id/aliases frontmatter; task templates add explicit task-template.tasks. IDs and related_docs metadata without changing operator-facing SOP bodies.
    • All 11 content/tasks/templates/.md files have explicit task-template.tasks. IDs and required frontmatter metadata; a read-only registry audit reported task_templates=11, registry_documents=357, podcast_registry_source_refs=15, assistant_local_external_refs=2, errors=0.
    • Podcast-critical content refs in seed sourceDocIds/instructionDocId resolve through doc_registry by frontmatter-backed stable IDs. The two unresolved Podcast refs are deliberately marked assistant-local: template.media.podcast.podcast-guest-intake and assistant.podcast.process.podcast.
    • Docs contract updates strengthen, rather than weaken, the AI Shipping Labs/DataOps process and V1 JTBD: stable IDs are runtime identity, source is provenance, instructionsUrl is legacy/external fallback, and the future knowledge-repo boundary preserves IDs/aliases.
    • Tester evidence is adequate: docs metadata/routes tests passed, full tests/docs_app passed, search index build indexed 357 docs, npm work-engine test/typecheck/build passed, and focused registry/search/work-engine audits passed.
    • Source boundary checks are acceptable: dataops main checkout is clean; issue worktree contains only intended tracked Extend process docs with stable IDs #33 files; dtc-operations is clean; datatasks has only a pre-existing e2e/.auth-state.json change predating Extend process docs with stable IDs #33; podcast-assistant is not a git checkout.

    No PM acceptance blocker found.

  10. alexeygrigorev commented on Jun 28, 2026

    @alexeygrigorev
    MemberAuthor

    COMMITTED

    Commit: 24f23105969cca0d1009c9395f574149fb55b7df
    Branch: worktree-issue-33

    Changed files summary:

    • 57 files changed: 296 insertions, 13 deletions.
    • Added explicit stable IDs/frontmatter to all V1 task-template docs and Podcast-critical SOP/template/reference docs.
    • Updated process, planning, structure, SOP-format, local-development, V1 workflow data-model, and knowledge-repository docs for stable process-document identity, aliases, provenance, related docs, sourceDocIds, instructionDocId, and fallback URL behavior.
    • Updated work-engine/scripts/seed-templates.ts for documented assistant-local Podcast references.
    • Added/updated docs metadata tests and work-engine seed tests covering registry-backed IDs and assistant-local exceptions.

    Commit-readiness checks:

    • Ran git status --short --untracked-files=all before commit; only intended tracked Extend process docs with stable IDs #33 changes were present, with no untracked files.
    • Removed ignored scratch/cache artifacts only: .tmp/, .pytest_cache/, and Python __pycache__/ directories.
    • Post-commit git status --short --untracked-files=all is clean.

    No push, merge, PR, deploy, cache refresh, or source-repo modification was performed.

  11. alexeygrigorev commented on Jun 28, 2026

    @alexeygrigorev
    MemberAuthor

    ON-CALL PASS after merge commit 6dda9a9 and follow-up on-call workflow fix 493565c for #33.

    Evidence:

    • Validate Planning Docs: success. https://github.com/DataTalksClub/dataops/actions/runs/28310455692
      • Passed planning docs validation, docs metadata/registry tests, and content search index build.
    • Validate DataOps Content: success for the original push. https://github.com/DataTalksClub/dataops/actions/runs/28310455678
      • Passed content search index build and built-index smoke test.
      • On-call found plumbing issue in the cache-refresh gate: shallow checkout made git diff 081fb410aeb2fd7634010b495ede7dc2c4e616b7 6dda9a94d7d7be2cebae57776db8ddd30b60c9fa report fatal: bad object, so the workflow skipped refresh. Fixed on main in 493565c by using full-history checkout for this workflow.
    • Deploy DataOps V1 Lambda: success. https://github.com/DataTalksClub/dataops/actions/runs/28310455679
      • Passed docs app tests, work-engine tests, work-engine typecheck, search index build, full app handler smoke, SAM validation/build, CloudFormation stack update, and private work-engine Lambda smoke test. Deploy log shows DocsFullAppFunction modified and stack UPDATE_COMPLETE.
    • Follow-up Validate DataOps Content for fix 493565c: success. https://github.com/DataTalksClub/dataops/actions/runs/28310537318
      • Passed search index build and smoke test; content-change gate compared 6dda9a9 to 493565c without the previous shallow-clone error and correctly skipped refresh because the fix commit changed only the workflow file.

    No source repos were modified. No manual deploy/cache refresh was run.

  12. added 3 commits that reference this issue on Aug 14, 2026
    be8b97b
    7f56395
    2ac64ba
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    P0Must havebackendBackend/APIdataData model, migration, storagedocsDocumentation or process docs workenhancementNew or improved functionalityprocess-docsSOPs, templates, references, playbookstestingTests and QAwork-engineDataTasks task execution engine

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions