Description of Technical Debt
agentic-toolkit authors the issue bodies, feature-file headers and PageObject headers that the living-doc collectors mine, but its own skills, agent definitions, schemas and docs disagree with the canon living-doc now enforces (verified at merge commit bfcc402ff998085cbf7bb91a7fd55ea8ac12c911):
skills/living-doc-update/SKILL.md:139-160 still writes status: descoped, descoped_at, descoped_reason, future_release, and an AC line like (v1.2.0 – descoped) using en-dash bullets; :163-166 puts the AC description on the header line after an em dash instead of on a - Rationale: bullet.
skills/gherkin-living-doc-sync/SKILL.md (lines 7, 11, 171, 212), evals/evals.json:154-155 and docs/guides/gherkin-living-doc-sync.md (lines 15, 32) describe "descoped" scenarios with a target-release reference instead of (planned) / (v<target> - planned).
skills/living-doc-update/evals/evals.json:108-112 and evals/fixture-map.md:13 still expect the descoped state.
.github/agents/living-doc-bdd-copilot.agent.md:278 uses an en-dash in the AC reference format; roughly 81 lines across skills/, .github/, docs/ combine AC: with an en/em dash, plus 8 dash-bulleted lines.
skills/shared/references/schemas/project-profile.schema.json:40-44 allows an arbitrary ac_states value (mentions In Review) instead of a subset of the four canonical states, and still carries pageobject_statuses: [planned, candidate, active, deprecated], also present in living-doc-bdd-schemas.md (lines 46, 252, 264, 309, 349, 352).
skills/living-doc-create-feature/SKILL.md (lines 79, 174) assigns a Feature a status (including candidate); skills/data-cy-instrument/SKILL.md:207 "promotes" status: candidate to active instead of removing stub-reason:; the create-feature, scenario-creator, pageobject-scan and gap-finder evals all expect a Feature or PageObject status.
skills/shared/references/living-doc-glossary.md is an older, unsynced copy of the canon glossary and has drifted.
The canon it should follow now lives in living-doc's docs/guides/living-doc-glossary.md, docs/guides/living-doc-header-types.md and docs/guides/living-doc-document-types.md (a later living-doc move relocates these under docs/reference/; the sync script should be written against the current path and updated when that move lands).
Impact of Technical Debt
- Content authored by these skills (issue bodies, feature-file headers, PageObject headers) will fail collection or normalization once the collectors move onto the new canon — dashes, AC states, and status placement all disagree.
- The stale
pageobject_statuses / Feature status fields actively mislead authors and tooling into producing a field the canon no longer recognizes, and drop the derived-Feature-state / orphan-Feature reporting the canon expects instead.
- Evals encode the wrong expected output, so they'll pass against behavior that is itself wrong, hiding regressions instead of catching them.
skills/shared/references/living-doc-glossary.md being an unsynced copy means authors following it are working from out-of-date rules with no automated way to detect drift.
Category
Documentation
(Cuts across Code Quality/Refactoring and Testing/Test Coverage too — schemas, skill prompts, and eval fixtures all need updates alongside the docs.)
Priority
High - Actively causing problems
(Blocks the living-doc GitHub-chain milestone gate, which requires this alignment merged before real-project verification.)
Proposed Solution
- Add a glossary sync script,
scripts/sync-living-doc-glossary.sh <living-doc-ref>, that fetches the canon glossary from living-doc at the given ref, rewrites its relative links to absolute living-doc URLs, and writes the local copy under skills/shared/references/living-doc-glossary.md with a header comment <!-- synced from AbsaOSS/living-doc@<ref> -->. Add a test-scripts.yml check that re-runs the script for the ref recorded in that header and fails the build on any difference.
- Switch to one dash. Replace every en/em dash used in generated AC headers, AC bullets, entity names, and
# AC: comments with a plain hyphen; move the AC description off the header line and onto a - Rationale:-style bullet wherever a skill currently appends it after a dash.
- Rewrite the descope procedure. An AC moved out of scope becomes
(v<target> - planned) when a target version is known, otherwise (planned); the reason goes on a - Rationale: bullet. Linked Gherkin scenarios keep their @AC: tag and gain @wip + @review-needed. User-facing trigger phrases such as "AC was descoped" stay as-is in skill descriptions and in evals/trigger-eval.json user queries — only the produced output changes.
- Constrain
ac_states. In project-profile.schema.json, make ac_states an enum that is a subset of the four canonical states (planned, in_review, active, deprecated); omitting the field stays allowed, but no other spelling or extra state is accepted.
- Drop Feature and PageObject status. No skill should write a Feature
status or a PageObject status: field, and pageobject_statuses should be removed from the schema and from living-doc-bdd-schemas.md. An uninstrumented surface keeps stub-reason:; instrumenting it means removing stub-reason:, not flipping a status value. A Feature with no linked User Stories or Functionalities should be reported as an orphan (a distinct ORPHAN_FEATURE condition), not tagged candidate.
- Limit
## Status / # status: to User Stories and Functionalities in every generated entity file and issue body.
- Update every affected eval fixture (
living-doc-update, gherkin-living-doc-sync, living-doc-create-feature, data-cy-instrument, scenario-creator, pageobject-scan, gap-finder) so expected outputs match the corrected behavior, and update evals/fixture-map.md accordingly.
- Restore the Project Profile /
seed.yaml / manifest.json reference sections here if living-doc has removed its own copies in favor of linking out to this repo — add them if missing, and link back to the relevant living-doc reference docs.
Acceptance Criteria
Description of Technical Debt
agentic-toolkitauthors the issue bodies, feature-file headers and PageObject headers that theliving-doccollectors mine, but its own skills, agent definitions, schemas and docs disagree with the canonliving-docnow enforces (verified at merge commitbfcc402ff998085cbf7bb91a7fd55ea8ac12c911):skills/living-doc-update/SKILL.md:139-160still writesstatus: descoped,descoped_at,descoped_reason,future_release, and an AC line like(v1.2.0 – descoped)using en-dash bullets;:163-166puts the AC description on the header line after an em dash instead of on a- Rationale:bullet.skills/gherkin-living-doc-sync/SKILL.md(lines 7, 11, 171, 212),evals/evals.json:154-155anddocs/guides/gherkin-living-doc-sync.md(lines 15, 32) describe "descoped" scenarios with a target-release reference instead of(planned)/(v<target> - planned).skills/living-doc-update/evals/evals.json:108-112andevals/fixture-map.md:13still expect thedescopedstate..github/agents/living-doc-bdd-copilot.agent.md:278uses an en-dash in the AC reference format; roughly 81 lines acrossskills/,.github/,docs/combineAC:with an en/em dash, plus 8 dash-bulleted lines.skills/shared/references/schemas/project-profile.schema.json:40-44allows an arbitraryac_statesvalue (mentionsIn Review) instead of a subset of the four canonical states, and still carriespageobject_statuses: [planned, candidate, active, deprecated], also present inliving-doc-bdd-schemas.md(lines 46, 252, 264, 309, 349, 352).skills/living-doc-create-feature/SKILL.md(lines 79, 174) assigns a Feature astatus(includingcandidate);skills/data-cy-instrument/SKILL.md:207"promotes"status: candidatetoactiveinstead of removingstub-reason:; thecreate-feature,scenario-creator,pageobject-scanandgap-finderevals all expect a Feature or PageObject status.skills/shared/references/living-doc-glossary.mdis an older, unsynced copy of the canon glossary and has drifted.The canon it should follow now lives in
living-doc'sdocs/guides/living-doc-glossary.md,docs/guides/living-doc-header-types.mdanddocs/guides/living-doc-document-types.md(a laterliving-docmove relocates these underdocs/reference/; the sync script should be written against the current path and updated when that move lands).Impact of Technical Debt
pageobject_statuses/ Featurestatusfields actively mislead authors and tooling into producing a field the canon no longer recognizes, and drop the derived-Feature-state / orphan-Feature reporting the canon expects instead.skills/shared/references/living-doc-glossary.mdbeing an unsynced copy means authors following it are working from out-of-date rules with no automated way to detect drift.Category
Documentation
(Cuts across Code Quality/Refactoring and Testing/Test Coverage too — schemas, skill prompts, and eval fixtures all need updates alongside the docs.)
Priority
High - Actively causing problems
(Blocks the
living-docGitHub-chain milestone gate, which requires this alignment merged before real-project verification.)Proposed Solution
scripts/sync-living-doc-glossary.sh <living-doc-ref>, that fetches the canon glossary fromliving-docat the given ref, rewrites its relative links to absoluteliving-docURLs, and writes the local copy underskills/shared/references/living-doc-glossary.mdwith a header comment<!-- synced from AbsaOSS/living-doc@<ref> -->. Add atest-scripts.ymlcheck that re-runs the script for the ref recorded in that header and fails the build on any difference.# AC:comments with a plain hyphen; move the AC description off the header line and onto a- Rationale:-style bullet wherever a skill currently appends it after a dash.(v<target> - planned)when a target version is known, otherwise(planned); the reason goes on a- Rationale:bullet. Linked Gherkin scenarios keep their@AC:tag and gain@wip+@review-needed. User-facing trigger phrases such as "AC was descoped" stay as-is in skill descriptions and inevals/trigger-eval.jsonuser queries — only the produced output changes.ac_states. Inproject-profile.schema.json, makeac_statesanenumthat is a subset of the four canonical states (planned,in_review,active,deprecated); omitting the field stays allowed, but no other spelling or extra state is accepted.statusor a PageObjectstatus:field, andpageobject_statusesshould be removed from the schema and fromliving-doc-bdd-schemas.md. An uninstrumented surface keepsstub-reason:; instrumenting it means removingstub-reason:, not flipping a status value. A Feature with no linked User Stories or Functionalities should be reported as an orphan (a distinctORPHAN_FEATUREcondition), not taggedcandidate.## Status/# status:to User Stories and Functionalities in every generated entity file and issue body.living-doc-update,gherkin-living-doc-sync,living-doc-create-feature,data-cy-instrument,scenario-creator,pageobject-scan,gap-finder) so expected outputs match the corrected behavior, and updateevals/fixture-map.mdaccordingly.seed.yaml/manifest.jsonreference sections here ifliving-dochas removed its own copies in favor of linking out to this repo — add them if missing, and link back to the relevantliving-docreference docs.Acceptance Criteria
skills/shared/references/living-doc-glossary.mdmatchesscripts/sync-living-doc-glossary.sh's output for the ref recorded in its header comment;test-scripts.ymlchecks this.skills/,.github/,docs/combinesAC:with an en/em dash, opens with a dash bullet (-/—/–), or combines aUS-/FEAT-/FUNC-id with a middle-dot and an en/em dash.descopedstate,status: descoped,descoped_at, ordescoped_reasonremains outside the user-query strings inevals/trigger-eval.json; descope output uses(planned)/(v<target> - planned)plus a- Rationale:bullet.status: candidateorpageobject_statusesremains outside the user-query strings inevals/trigger-eval.json;project-profile.schema.jsonrejectsac_states: [In Review],ac_states: [done], and anypageobject_statuseskey (covered by the repo's own schema tests).living-doc-create-featureproduces no Featurestatusfield;data-cy-instrumentremovesstub-reason:on instrumentation instead of changing a status value.test-scripts.yml) pass.