@antoneeo/mkt-agentic-sdlc-skill 0.13.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -203,6 +203,11 @@ DOMAINS = {
203
203
  "risk_label": "## Threat Map / Plan Risks",
204
204
  "id_prefix": "M-",
205
205
  },
206
+ "course": {
207
+ "risk_section": ("## Learning and Content Risks",),
208
+ "risk_label": "## Learning and Content Risks",
209
+ "id_prefix": "C-",
210
+ },
206
211
  }
207
212
  # Absent everything -- no `default_domain:` line, no `domain:` field -- a project is
208
213
  # `code`. That is what every project created before this field existed already is,
@@ -1298,7 +1303,7 @@ def cmd_validate(root, strict=False, hybrid=False):
1298
1303
  "have the user validate it")
1299
1304
 
1300
1305
  # ANALYSIS: frontmatter and mandatory sections
1301
- # Ids are unique WITHIN a domain (prefixes F-/K-/M- keep them apart in practice):
1306
+ # Ids are unique WITHIN a domain (prefixes F-/K-/M-/C- keep them apart in practice):
1302
1307
  # two lenses over one tree must not collide on a number neither of them chose.
1303
1308
  seen_ids = {}
1304
1309
  default_domain = project_default_domain(root)
@@ -1574,6 +1579,13 @@ def cmd_stale(root, hybrid=False):
1574
1579
  return rc # was: return 0 — MUST carry guide rc
1575
1580
  use_git = git_available(root)
1576
1581
  entry = entry_script()
1582
+ # The audit plan records the marks: its own edits are not a change to the area
1583
+ # that contains it. Counting them made a committed hash mark of that area
1584
+ # stale again, and every re-mark repeated the loop.
1585
+ try:
1586
+ plan_rel = f.resolve().relative_to(Path(root).resolve()).as_posix()
1587
+ except ValueError:
1588
+ plan_rel = None
1577
1589
  # F-056: an ANALYZED row whose reference cannot be evaluated is UNVERIFIED,
1578
1590
  # never fresh. Each `continue` below that skips such a row records it here;
1579
1591
  # skipping silently is how a pruned reference printed `[ok]` over three areas.
@@ -1641,6 +1653,7 @@ def cmd_stale(root, hybrid=False):
1641
1653
  except ValueError: # symlink out of the tree: report absolute, never crash
1642
1654
  name = str(fp)
1643
1655
  changed.append(name)
1656
+ changed = [c for c in changed if c != plan_rel]
1644
1657
  if changed:
1645
1658
  stale.append((rel, changed))
1646
1659
 
@@ -689,3 +689,5 @@ analyses, discovery-by-grep), `audit/` (audit plan and handoff).
689
689
 
690
690
  `default_domain:` is the project's answer for every document that does not declare its own `domain:`. Whichever lens's `init` created the project seeds it; a later init never overwrites it, and an absent line resolves to `code` — so every project created before this field existed keeps behaving exactly as it did. It is written once, at project level, precisely so that the same tree gets **the same verdict from every installed lens**.
691
691
 
692
+ A course added to a marketing-default `ai_docs/` tree must mark both `vision/features/VISION_course_<slug>.md` and `solutions/ANALYSIS_course_<slug>.md` with `domain: course` and give the ANALYSIS a `C-` ID. Otherwise the untagged feature Vision is treated as marketing work. The project-wide Vision is shared across the four lenses.
693
+