@dzhechkov/keysarium 1.3.0 → 1.5.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.
- package/README.md +70 -10
- package/bin/cli.js +0 -0
- package/package.json +5 -3
- package/src/utils.js +1 -1
- package/templates/.claude/commands/analyst-manual.md +38 -0
- package/templates/.claude/commands/brain-export.md +2 -0
- package/templates/.claude/commands/bto-benchmark.md +302 -0
- package/templates/.claude/commands/casarium.md +55 -4
- package/templates/.claude/commands/feature-adr.md +8 -0
- package/templates/.claude/commands/harvest.md +28 -46
- package/templates/.claude/rules/trust-tiers.md +6 -0
- package/templates/.claude/shards/feature-adr.shard.md +64 -10
- package/templates/.claude/shards/phase-ai-factory.shard.md +109 -0
- package/templates/.claude/skills/ai-factory-mapper/README.md +90 -0
- package/templates/.claude/skills/ai-factory-mapper/SKILL.md +309 -0
- package/templates/.claude/skills/ai-factory-mapper/assets/report-template.md +123 -0
- package/templates/.claude/skills/ai-factory-mapper/references/catalog.md +230 -0
- package/templates/.claude/skills/ai-factory-mapper/references/coverage-formula.md +219 -0
- package/templates/.claude/skills/ai-factory-mapper/references/decomposition-checklist.md +183 -0
- package/templates/.claude/skills/ai-factory-mapper/references/pattern-library.md +312 -0
- package/templates/.claude/skills/ai-factory-mapper/scripts/build_docx_report.js +423 -0
- package/templates/.claude/skills/analyst-manual-full/SKILL.md +286 -0
- package/templates/.claude/skills/edu-site-generator/SKILL.md +254 -0
- package/templates/.claude/skills/edu-site-generator/examples/sample-course-structure.md +116 -0
- package/templates/.claude/skills/edu-site-generator/modules/00-content-analysis.md +84 -0
- package/templates/.claude/skills/edu-site-generator/modules/01-course-structure.md +75 -0
- package/templates/.claude/skills/edu-site-generator/modules/02-data-generation.md +186 -0
- package/templates/.claude/skills/edu-site-generator/modules/03-scaffold.md +249 -0
- package/templates/.claude/skills/edu-site-generator/modules/04-components.md +130 -0
- package/templates/.claude/skills/edu-site-generator/modules/05-gamification.md +163 -0
- package/templates/.claude/skills/edu-site-generator/modules/06-deploy.md +88 -0
- package/templates/.claude/skills/edu-site-generator/modules/07-verification.md +97 -0
- package/templates/.claude/skills/edu-site-generator/references/component-templates.md +436 -0
- package/templates/.claude/skills/edu-site-generator/references/data-schemas.md +164 -0
- package/templates/.claude/skills/edu-site-generator/references/exercise-catalog.md +110 -0
- package/templates/.claude/skills/edu-site-generator/references/tech-stack.md +69 -0
- package/templates/.claude/skills/feature-adr/SKILL.md +245 -59
- package/templates/.claude/skills/feature-adr/modules/03-adr.md +43 -0
- package/templates/.claude/skills/feature-adr/modules/03.5-ideation-swarm.md +180 -0
- package/templates/.claude/skills/feature-adr/modules/06-implementation-plan.md +56 -7
- package/templates/.claude/skills/feature-adr/modules/08-qe.md +87 -23
- package/templates/.claude/skills/feature-adr/modules/09-fleet-qe.md +305 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/README.md +143 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/brutal-honesty-review.md +240 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/chaos-engineering-resilience.md +163 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/code-goal-planner.md +446 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/enterprise-integration-testing.md +111 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/mutation-testing.md +236 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/performance-testing.md +315 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/qcsd-ideation-swarm.md +126 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/qcsd-production-swarm.md +108 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-coverage-analysis.md +193 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/qe-requirements-validation.md +254 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/regression-testing.md +233 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/risk-based-testing.md +212 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/security-testing.md +311 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/shift-left-testing.md +231 -0
- package/templates/.claude/skills/feature-adr/references/agentic-qe/tdd-london-chicago.md +249 -0
- package/templates/.claude/skills/knowledge-extractor/SKILL.md +254 -0
- package/templates/.claude/skills/knowledge-extractor/modules/01-extract.md +188 -0
- package/templates/.claude/skills/knowledge-extractor/modules/02-classify.md +99 -0
- package/templates/.claude/skills/knowledge-extractor/modules/03-gate.md +150 -0
- package/templates/.claude/skills/knowledge-extractor/modules/04-integrate.md +159 -0
- package/templates/.claude/skills/knowledge-extractor/references/artifact-categories.md +100 -0
- package/templates/.claude/skills/knowledge-extractor/references/maturity-model.md +94 -0
- package/templates/.claude/skills/knowledge-extractor/references/quality-gates.md +98 -0
- package/templates/.claude/skills/knowledge-extractor/templates/artifact-card.md +63 -0
- package/templates/.claude/skills/knowledge-extractor/templates/harvest-report.md +102 -0
- package/templates/.claude/skills/transcript-site-generator/SKILL.md +287 -0
- package/templates/.claude/skills/transcript-site-generator/examples/sample-text-only-site.md +123 -0
- package/templates/.claude/skills/transcript-site-generator/examples/sample-transcript-site.md +134 -0
- package/templates/.claude/skills/transcript-site-generator/modules/00-input-analysis.md +132 -0
- package/templates/.claude/skills/transcript-site-generator/modules/01-content-parsing.md +117 -0
- package/templates/.claude/skills/transcript-site-generator/modules/02-site-generation.md +293 -0
- package/templates/.claude/skills/transcript-site-generator/modules/03-interactivity.md +406 -0
- package/templates/.claude/skills/transcript-site-generator/modules/04-deploy.md +130 -0
- package/templates/.claude/skills/transcript-site-generator/modules/05-verification.md +155 -0
- package/templates/.claude/skills/transcript-site-generator/references/component-catalog.md +86 -0
- package/templates/.claude/skills/transcript-site-generator/references/data-schemas.md +123 -0
- package/templates/.claude/skills/transcript-site-generator/references/tech-stack.md +132 -0
- package/templates/CLAUDE.md +30 -9
- package/templates/docs/continuous-learning-guide.md +622 -0
- package/templates/docs/edu-site-generator/01-deployment-guide.md +911 -0
- package/templates/docs/edu-site-generator/02-admin-guide.md +901 -0
- package/templates/docs/edu-site-generator/03-user-guide.md +1008 -0
- package/templates/docs/edu-site-generator/04-infrastructure-requirements.md +489 -0
- package/templates/docs/edu-site-generator/05-architecture.md +902 -0
- package/templates/docs/edu-site-generator/06-user-flows.md +759 -0
- package/templates/docs/improvement-directions.md +8 -4
- package/templates/docs/keysarium-core/02-functionality.md +3 -1
- package/templates/docs/skills-bto/01-deployment-guide.md +1 -1
- package/templates/docs/skills-bto/02-admin-guide.md +4 -1
- package/templates/docs/skills-bto/03-user-guide.md +4 -3
- package/templates/docs/skills-bto/04-infrastructure-requirements.md +2 -1
- package/templates/docs/skills-bto/05-architecture.md +11 -11
- package/templates/docs/skills-bto/06-user-flows.md +2 -1
- package/templates/docs/transcript-site-generator/01-deployment-guide.md +1042 -0
- package/templates/docs/transcript-site-generator/02-admin-guide.md +918 -0
- package/templates/docs/transcript-site-generator/03-user-guide.md +925 -0
- package/templates/docs/transcript-site-generator/04-infrastructure-requirements.md +482 -0
- package/templates/docs/transcript-site-generator/05-architecture.md +1068 -0
- package/templates/docs/transcript-site-generator/06-user-flows.md +855 -0
- package/templates/lib/dream-engine.md +1 -1
- package/templates/lib/memory-protocol.md +6 -2
- package/templates/lib/reward-tracker.md +6 -3
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# Quality Gates Reference
|
|
2
|
+
|
|
3
|
+
Gates applied to every candidate finding during the harvest process.
|
|
4
|
+
All 8 gates must be evaluated before a finding can be accepted into the toolkit.
|
|
5
|
+
A gate failure is a hard block unless overridden by the user (see Override Protocol).
|
|
6
|
+
|
|
7
|
+
## Gate Definitions
|
|
8
|
+
|
|
9
|
+
| Gate | Name | Check | Type | Pass Criteria | Failure Message |
|
|
10
|
+
|------|------|-------|------|---------------|-----------------|
|
|
11
|
+
| G1 | When-To-Use | Finding has a "When to use" section or equivalent guidance | deterministic | Section exists and is non-empty | Missing "When to use" guidance |
|
|
12
|
+
| G2 | When-Not-To-Use | Finding has a "When NOT to use" section or equivalent anti-guidance | deterministic | Section exists and is non-empty | Missing "When NOT to use" guidance |
|
|
13
|
+
| G3 | Decontextualized | No project-specific names, paths, slugs, dates, or hardcoded values remain | semantic | Haiku confirms no project-specific references | Project-specific references remain: {details} |
|
|
14
|
+
| G4 | Concrete Example | At least one concrete usage example is provided | semantic | Haiku confirms example is concrete and actionable | No concrete example provided |
|
|
15
|
+
| G5 | Reusability Threshold | Reusability confidence score meets minimum | deterministic | confidence >= 0.5 | Confidence {score} < 0.5 threshold |
|
|
16
|
+
| G6 | Not Duplicate | Finding is not a duplicate of an existing toolkit entry | deterministic | No existing entry with content similarity > 0.85 | Duplicate of existing entry: {existing_name} |
|
|
17
|
+
| G7 | Maturity Label | Finding has a maturity level assigned | deterministic | maturity field is one of: alpha, beta, stable | Missing maturity label |
|
|
18
|
+
| G8 | Brutal Honesty | Finding survives self-critical review — is it genuinely useful or just noise? | semantic | Haiku confirms finding has genuine reuse value beyond the source project | Fails brutal-honesty review: {reason} |
|
|
19
|
+
|
|
20
|
+
## Gate Types
|
|
21
|
+
|
|
22
|
+
**Deterministic gates** (G1, G2, G5, G6, G7) are checked by the orchestrator without LLM calls.
|
|
23
|
+
They operate on the structured finding JSON: presence of fields, numeric thresholds, set membership.
|
|
24
|
+
|
|
25
|
+
**Semantic gates** (G3, G4, G8) require a haiku LLM call with a focused single-question prompt.
|
|
26
|
+
The prompt must ask for a binary YES/NO answer plus a short explanation (1-2 sentences max).
|
|
27
|
+
Use haiku — these are high-frequency, pattern-matching evaluations that do not require deep reasoning.
|
|
28
|
+
|
|
29
|
+
## Pass Assignment (which pass each gate belongs to)
|
|
30
|
+
|
|
31
|
+
Gates are evaluated in two passes to minimize unnecessary LLM cost.
|
|
32
|
+
|
|
33
|
+
### Pass 1 — Deterministic (zero LLM cost)
|
|
34
|
+
|
|
35
|
+
Run all deterministic gates first. If any deterministic gate fails, reject immediately.
|
|
36
|
+
Do NOT proceed to Pass 2 for a rejected finding.
|
|
37
|
+
|
|
38
|
+
Gates in Pass 1 (in evaluation order):
|
|
39
|
+
1. G7 — Maturity Label (cheapest check: field presence)
|
|
40
|
+
2. G5 — Reusability Threshold (numeric comparison)
|
|
41
|
+
3. G1 — When-To-Use (section presence)
|
|
42
|
+
4. G2 — When-Not-To-Use (section presence)
|
|
43
|
+
5. G6 — Not Duplicate (similarity comparison against existing entries)
|
|
44
|
+
|
|
45
|
+
### Pass 2 — Semantic (haiku LLM calls, parallelizable)
|
|
46
|
+
|
|
47
|
+
Run only after all Pass 1 gates pass.
|
|
48
|
+
Gates G3, G4, G8 may be evaluated in parallel (3 concurrent haiku calls).
|
|
49
|
+
|
|
50
|
+
Gates in Pass 2:
|
|
51
|
+
- G3 — Decontextualized
|
|
52
|
+
- G4 — Concrete Example
|
|
53
|
+
- G8 — Brutal Honesty
|
|
54
|
+
|
|
55
|
+
## Override Protocol
|
|
56
|
+
|
|
57
|
+
A user may override a gate for a specific finding using the syntax:
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
пропусти G3 для #X
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Where `#X` is the finding number (1-indexed, matching the extraction output list).
|
|
64
|
+
|
|
65
|
+
### Override Rules
|
|
66
|
+
|
|
67
|
+
- Multiple gates may be overridden in a single command using comma-separated syntax: `"пропусти G3,G4 для #14"`.
|
|
68
|
+
- G8 (Brutal Honesty) cannot be overridden. If a finding fails G8, it must be revised or dropped.
|
|
69
|
+
- G6 (Not Duplicate) cannot be overridden. If a finding is a duplicate, either update the existing entry or drop the new one.
|
|
70
|
+
- G5 (Reusability Threshold) can be overridden only if the user provides a rationale explaining why low-confidence is acceptable for this finding.
|
|
71
|
+
- All overrides are logged in the harvest output with the gate ID, finding number, and user rationale.
|
|
72
|
+
|
|
73
|
+
### Override Log Format
|
|
74
|
+
|
|
75
|
+
When an override is applied, append to the harvest session log:
|
|
76
|
+
|
|
77
|
+
```
|
|
78
|
+
OVERRIDE: G{N} skipped for finding #{X} — user rationale: "{rationale}"
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Scoring
|
|
82
|
+
|
|
83
|
+
After all gates are evaluated for a finding:
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
gate_pass_rate = gates_passed / 8
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
This score is recorded in the finding's metadata alongside the per-gate pass/fail results.
|
|
90
|
+
|
|
91
|
+
| gate_pass_rate | Interpretation |
|
|
92
|
+
|----------------|----------------|
|
|
93
|
+
| 1.0 | Clean pass — add to toolkit |
|
|
94
|
+
| 0.875 (7/8) | One gate overridden — add with override note |
|
|
95
|
+
| < 0.875 | Rejected — do not add to toolkit |
|
|
96
|
+
|
|
97
|
+
The gate_pass_rate is surfaced in the harvest summary table for each finding.
|
|
98
|
+
It is not used as a quality score for ranking — a finding either passes all required gates or it does not.
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# Artifact Card Template
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
This template is rendered once per approved finding during Module 04 (Integrate).
|
|
5
|
+
Replace all {PLACEHOLDER} values with finding data.
|
|
6
|
+
|
|
7
|
+
## Template
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
### {NAME}
|
|
12
|
+
|
|
13
|
+
**Category:** {CATEGORY}
|
|
14
|
+
**Maturity:** {MATURITY_BADGE} {MATURITY_LEVEL}
|
|
15
|
+
**Reusability Confidence:** {CONFIDENCE}
|
|
16
|
+
**Extracted from:** {SOURCE_PROJECT}
|
|
17
|
+
**Last updated:** {DATE}
|
|
18
|
+
|
|
19
|
+
#### Description
|
|
20
|
+
|
|
21
|
+
{DESCRIPTION}
|
|
22
|
+
|
|
23
|
+
#### When to use
|
|
24
|
+
|
|
25
|
+
{WHEN_TO_USE}
|
|
26
|
+
|
|
27
|
+
#### When NOT to use
|
|
28
|
+
|
|
29
|
+
{WHEN_NOT_TO_USE}
|
|
30
|
+
|
|
31
|
+
#### Example
|
|
32
|
+
|
|
33
|
+
{EXAMPLE}
|
|
34
|
+
|
|
35
|
+
#### Changelog
|
|
36
|
+
|
|
37
|
+
- v1: Initial extraction from {SOURCE_PROJECT} ({DATE})
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## Placeholder Reference
|
|
42
|
+
|
|
43
|
+
| Placeholder | Source | Example |
|
|
44
|
+
|-------------|--------|---------|
|
|
45
|
+
| {NAME} | finding.title | "Agent Swarm Topology" |
|
|
46
|
+
| {CATEGORY} | finding.category | "patterns" |
|
|
47
|
+
| {MATURITY_BADGE} | maturity-model.md lookup | "🔴" |
|
|
48
|
+
| {MATURITY_LEVEL} | finding.maturity | "Alpha" |
|
|
49
|
+
| {CONFIDENCE} | finding.confidence | "0.85" |
|
|
50
|
+
| {SOURCE_PROJECT} | session.slug | "bank-kc-automation" |
|
|
51
|
+
| {DATE} | current date | "2026-03-03" |
|
|
52
|
+
| {DESCRIPTION} | finding.content (first paragraph) | "..." |
|
|
53
|
+
| {WHEN_TO_USE} | finding.when_to_use | "..." |
|
|
54
|
+
| {WHEN_NOT_TO_USE} | finding.when_not_to_use | "..." |
|
|
55
|
+
| {EXAMPLE} | finding.example | "..." |
|
|
56
|
+
|
|
57
|
+
## Placement Rules
|
|
58
|
+
|
|
59
|
+
For **skills** category: This template becomes the initial SKILL.md skeleton
|
|
60
|
+
For **commands** category: This template becomes the command .md file body
|
|
61
|
+
For **rules** category: Convert to rule table format (see .claude/rules/ convention)
|
|
62
|
+
For **templates/patterns/snippets** category: This card is appended to TOOLKIT_HARVEST.md under the relevant section
|
|
63
|
+
For **hooks** category: This card is appended to TOOLKIT_HARVEST.md hooks section (or created inline)
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# Harvest Report Template
|
|
2
|
+
|
|
3
|
+
## Usage
|
|
4
|
+
Generated at the end of Module 04 (Integrate) to summarize the harvest session.
|
|
5
|
+
All {PLACEHOLDER} values are computed from the findings registry.
|
|
6
|
+
|
|
7
|
+
## Template
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Harvest Report: {SESSION_ID}
|
|
12
|
+
|
|
13
|
+
**Date:** {DATE}
|
|
14
|
+
**Target:** {TARGET_PATHS}
|
|
15
|
+
**Scope:** {SCOPE_FILTER_OR_ALL}
|
|
16
|
+
**Steps completed:** {STEPS_COMPLETED} (Extract → Classify → Checkpoint → Gate → Integrate)
|
|
17
|
+
|
|
18
|
+
## Summary
|
|
19
|
+
|
|
20
|
+
| Metric | Value |
|
|
21
|
+
|--------|-------|
|
|
22
|
+
| Total findings extracted | {TOTAL_EXTRACTED} |
|
|
23
|
+
| After deduplication | {AFTER_DEDUP} |
|
|
24
|
+
| User removals | {USER_REMOVALS} |
|
|
25
|
+
| User merges | {USER_MERGES} |
|
|
26
|
+
| Approved (passed gates) | {APPROVED_COUNT} |
|
|
27
|
+
| Blocked (failed gates) | {BLOCKED_COUNT} |
|
|
28
|
+
| Gate overrides | {OVERRIDE_COUNT} |
|
|
29
|
+
| Placed artifacts | {PLACED_COUNT} |
|
|
30
|
+
|
|
31
|
+
## Findings by Category
|
|
32
|
+
|
|
33
|
+
| Category | Extracted | Approved | Placed | Destination |
|
|
34
|
+
|----------|-----------|----------|--------|-------------|
|
|
35
|
+
| skills | {N} | {N} | {N} | .claude/skills/ |
|
|
36
|
+
| commands | {N} | {N} | {N} | .claude/commands/ |
|
|
37
|
+
| hooks | {N} | {N} | {N} | TOOLKIT_HARVEST.md |
|
|
38
|
+
| rules | {N} | {N} | {N} | .claude/rules/ |
|
|
39
|
+
| templates | {N} | {N} | {N} | TOOLKIT_HARVEST.md |
|
|
40
|
+
| patterns | {N} | {N} | {N} | TOOLKIT_HARVEST.md |
|
|
41
|
+
| snippets | {N} | {N} | {N} | TOOLKIT_HARVEST.md |
|
|
42
|
+
|
|
43
|
+
## Quality Gate Results
|
|
44
|
+
|
|
45
|
+
| Gate | Pass | Fail | Override | Pass Rate |
|
|
46
|
+
|------|------|------|----------|-----------|
|
|
47
|
+
| G1 When-To-Use | {N} | {N} | {N} | {%} |
|
|
48
|
+
| G2 When-Not-To-Use | {N} | {N} | {N} | {%} |
|
|
49
|
+
| G3 Decontextualized | {N} | {N} | {N} | {%} |
|
|
50
|
+
| G4 Concrete Example | {N} | {N} | {N} | {%} |
|
|
51
|
+
| G5 Reusability | {N} | {N} | {N} | {%} |
|
|
52
|
+
| G6 Not Duplicate | {N} | {N} | {N} | {%} |
|
|
53
|
+
| G7 Maturity Label | {N} | {N} | {N} | {%} |
|
|
54
|
+
| G8 Brutal Honesty | {N} | {N} | {N} | {%} |
|
|
55
|
+
|
|
56
|
+
## Coverage Gaps
|
|
57
|
+
|
|
58
|
+
| Item | Reason |
|
|
59
|
+
|------|--------|
|
|
60
|
+
| {SKIPPED_FILES_TABLE_OR_NONE} | |
|
|
61
|
+
|
|
62
|
+
**Failed extractors:** {FAILED_EXTRACTORS_OR_NONE}
|
|
63
|
+
|
|
64
|
+
## Confidence Distribution
|
|
65
|
+
|
|
66
|
+
| Range | Count | Percentage |
|
|
67
|
+
|-------|-------|------------|
|
|
68
|
+
| 0.9 - 1.0 (Excellent) | {N} | {%} |
|
|
69
|
+
| 0.7 - 0.89 (Good) | {N} | {%} |
|
|
70
|
+
| 0.5 - 0.69 (Acceptable) | {N} | {%} |
|
|
71
|
+
| < 0.5 (Below threshold) | {N} | {%} |
|
|
72
|
+
|
|
73
|
+
## Memory Integration
|
|
74
|
+
|
|
75
|
+
- Patterns loaded from memory: {MEMORY_PATTERNS_COUNT}
|
|
76
|
+
- Reward stored: {REWARD_SCORE} ({REWARD_LABEL})
|
|
77
|
+
- Dream trigger updated: {YES_NO}
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Placeholder Reference
|
|
82
|
+
|
|
83
|
+
| Placeholder | Computation |
|
|
84
|
+
|-------------|-------------|
|
|
85
|
+
| {SESSION_ID} | HarvestSession.session_id |
|
|
86
|
+
| {DATE} | Current date (YYYY-MM-DD) |
|
|
87
|
+
| {TARGET_PATHS} | Directory path(s) scanned |
|
|
88
|
+
| {SCOPE_FILTER_OR_ALL} | Scope filter value or "all categories" |
|
|
89
|
+
| {STEPS_COMPLETED} | Count of pipeline steps that ran successfully |
|
|
90
|
+
| {TOTAL_EXTRACTED} | count(all findings at extraction) |
|
|
91
|
+
| {AFTER_DEDUP} | count(findings after Module 02 dedup) |
|
|
92
|
+
| {USER_REMOVALS} | count(findings removed by user at checkpoint) |
|
|
93
|
+
| {USER_MERGES} | count(findings with non-null merged_from) |
|
|
94
|
+
| {APPROVED_COUNT} | count(findings where status = approved) |
|
|
95
|
+
| {BLOCKED_COUNT} | count(findings where status = blocked) |
|
|
96
|
+
| {OVERRIDE_COUNT} | sum(length of all gate_overrides arrays) |
|
|
97
|
+
| {PLACED_COUNT} | count(findings where status = integrated) |
|
|
98
|
+
| {SKIPPED_FILES_TABLE_OR_NONE} | Table of files skipped (>100KB or binary), or "None" |
|
|
99
|
+
| {FAILED_EXTRACTORS_OR_NONE} | List of failed agent lenses, or "None" |
|
|
100
|
+
| {MEMORY_PATTERNS_COUNT} | count(patterns loaded from memory_query) |
|
|
101
|
+
| {REWARD_SCORE} | User checkpoint response mapped to 0.0-1.0 |
|
|
102
|
+
| {REWARD_LABEL} | excellent/good/needs_work/failed (see reward-learning.md) |
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
# transcript-site-generator — Interactive Transcript Site Generator
|
|
2
|
+
|
|
3
|
+
<!-- Trust Tier: 2 — Validated | BTO Layer 2 Score: 7.82/10 | Promoted: 2026-03-05 -->
|
|
4
|
+
|
|
5
|
+
> Generate a modern, interactive, mobile-friendly, SEO-optimized static website from a transcript or YouTube video link, ready for GitHub Pages deployment. Zero build step required.
|
|
6
|
+
|
|
7
|
+
## When To Activate
|
|
8
|
+
|
|
9
|
+
Trigger on:
|
|
10
|
+
- "generate transcript site from [content]"
|
|
11
|
+
- "create interactive transcript [topic]"
|
|
12
|
+
- "build transcript website from YouTube [url]"
|
|
13
|
+
- "сгенерируй сайт из транскрипта"
|
|
14
|
+
- "сделай сайт из видео [url]"
|
|
15
|
+
- `/transcript-site [content or YouTube URL]`
|
|
16
|
+
|
|
17
|
+
## Overview
|
|
18
|
+
|
|
19
|
+
This skill transforms text transcripts, content, or YouTube video links into production-ready interactive websites. The **default output is a pure static site** (single HTML + JS file) that deploys to GitHub Pages with zero build step — no React, no Vite, no npm install needed.
|
|
20
|
+
|
|
21
|
+
### Features
|
|
22
|
+
|
|
23
|
+
- **Interactive transcript** with section navigation, scroll-spy TOC, full-text search (Ctrl+K)
|
|
24
|
+
- **YouTube embed** with clickable timestamps for video synchronization (if URL provided)
|
|
25
|
+
- **Dark/Light mode** toggle with localStorage persistence
|
|
26
|
+
- **Reading progress bar** and back-to-top button
|
|
27
|
+
- **Copy-quote** buttons per section (copies section text to clipboard)
|
|
28
|
+
- **Reading statistics** (word count, estimated reading time, section count)
|
|
29
|
+
- **SEO optimization** — Open Graph, Twitter Cards, JSON-LD (VideoObject/Article)
|
|
30
|
+
- **Print-friendly** CSS media queries
|
|
31
|
+
- **GitHub Pages** deployment via `docs/` folder (zero build) or GitHub Actions
|
|
32
|
+
- **Mobile-friendly** — responsive layout, hamburger menu, 44px touch targets
|
|
33
|
+
- **Speaker labels** — automatic speaker detection and visual differentiation
|
|
34
|
+
|
|
35
|
+
## Architecture
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
.claude/skills/transcript-site-generator/
|
|
39
|
+
├── SKILL.md <- This file (orchestrator)
|
|
40
|
+
├── modules/
|
|
41
|
+
│ ├── 00-input-analysis.md <- Step 0: Detect input type, extract transcript
|
|
42
|
+
│ ├── 01-content-parsing.md <- Step 1: Split into sections, extract timestamps
|
|
43
|
+
│ ├── 02-site-generation.md <- Step 2: Generate index.html with all content
|
|
44
|
+
│ ├── 03-interactivity.md <- Step 3: Generate app.js (search, TOC, dark mode)
|
|
45
|
+
│ ├── 04-deploy.md <- Step 4: GitHub Pages config + Actions workflow
|
|
46
|
+
│ └── 05-verification.md <- Step 5: Validate output, open in browser
|
|
47
|
+
├── references/
|
|
48
|
+
│ ├── tech-stack.md <- Stack: Tailwind CDN, vanilla JS, static HTML
|
|
49
|
+
│ ├── data-schemas.md <- Section data structure, metadata schema
|
|
50
|
+
│ └── component-catalog.md <- HTML sections and JS modules catalog
|
|
51
|
+
└── examples/
|
|
52
|
+
├── sample-transcript-site.md <- Example: YouTube + Russian podcast
|
|
53
|
+
└── sample-text-only-site.md <- Example: text-only, English, no YouTube
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Pipeline
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
Step 0 Step 1 Step 2 Step 3
|
|
60
|
+
INPUT -> PARSE -> GENERATE -> INTERACTIVITY
|
|
61
|
+
(text/URL/ (split into (index.html (app.js:
|
|
62
|
+
yt-dlp) sections + with Tailwind search, TOC,
|
|
63
|
+
timestamps) CDN + content) dark mode)
|
|
64
|
+
|
|
65
|
+
|
|
|
66
|
+
v
|
|
67
|
+
Step 4 Step 5
|
|
68
|
+
DEPLOY -> VERIFY
|
|
69
|
+
(docs/ + (file check
|
|
70
|
+
GH Actions + open)
|
|
71
|
+
workflow)
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Input Requirements
|
|
75
|
+
|
|
76
|
+
The skill accepts one of:
|
|
77
|
+
1. **Text transcript** — pasted directly or as a file path
|
|
78
|
+
2. **YouTube URL** — extracts transcript via `yt-dlp --write-auto-sub --sub-lang ru,en --skip-download`
|
|
79
|
+
3. **Both** — YouTube URL for embed + custom/edited transcript text
|
|
80
|
+
|
|
81
|
+
Minimum: enough content for 3 sections. No maximum (long transcripts benefit most from navigation).
|
|
82
|
+
|
|
83
|
+
### YouTube Transcript Extraction
|
|
84
|
+
|
|
85
|
+
When a YouTube URL is provided:
|
|
86
|
+
```bash
|
|
87
|
+
# Check yt-dlp availability
|
|
88
|
+
which yt-dlp || pip install yt-dlp
|
|
89
|
+
|
|
90
|
+
# Extract auto-generated subtitles (prefer manual, fallback to auto)
|
|
91
|
+
yt-dlp --write-sub --sub-lang ru,en --skip-download --sub-format vtt -o "/tmp/transcript" "<URL>" 2>/dev/null \
|
|
92
|
+
|| yt-dlp --write-auto-sub --sub-lang ru,en --skip-download --sub-format vtt -o "/tmp/transcript" "<URL>"
|
|
93
|
+
|
|
94
|
+
# Extract video metadata
|
|
95
|
+
yt-dlp --print title --print channel --print duration --skip-download "<URL>"
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
If `yt-dlp` is not installed:
|
|
99
|
+
```
|
|
100
|
+
yt-dlp not found. Install with: pip install yt-dlp
|
|
101
|
+
Alternatively, paste the transcript text directly.
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Output
|
|
105
|
+
|
|
106
|
+
A **pure static site** in the `docs/` directory — zero build step, deploys directly via GitHub Pages:
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
<project-root>/
|
|
110
|
+
├── docs/ <- GitHub Pages source
|
|
111
|
+
│ ├── index.html (99KB+ single-file: HTML + inline Tailwind + SEO)
|
|
112
|
+
│ └── static/
|
|
113
|
+
│ ├── app.js (search, TOC scroll-spy, dark mode, progress bar)
|
|
114
|
+
│ └── style.css (minimal overrides)
|
|
115
|
+
├── .github/workflows/deploy.yml (GitHub Pages deployment workflow)
|
|
116
|
+
└── README.md (project description + link to live site)
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### index.html Structure
|
|
120
|
+
|
|
121
|
+
The HTML file is self-contained with:
|
|
122
|
+
- **Tailwind CSS via CDN** (`<script src="https://cdn.tailwindcss.com">`) with dark mode config
|
|
123
|
+
- **Font Awesome via CDN** for icons (moon/sun, search, copy, hamburger)
|
|
124
|
+
- **Full SEO head**: Open Graph, Twitter Cards, JSON-LD structured data
|
|
125
|
+
- **Semantic HTML**: `<header>`, `<nav>`, `<main>`, `<article>`, `<section>`, `<footer>`
|
|
126
|
+
- **All transcript content** rendered as HTML sections with anchor IDs
|
|
127
|
+
- **Responsive layout**: fixed sidebar TOC (desktop) + hamburger menu (mobile)
|
|
128
|
+
- **YouTube embed** (if video URL provided): responsive iframe with aspect-ratio container
|
|
129
|
+
|
|
130
|
+
### app.js Features
|
|
131
|
+
|
|
132
|
+
Vanilla JavaScript (no frameworks) implementing:
|
|
133
|
+
- **Full-text search** — Ctrl+K modal, 300ms debounce, highlighted results with context
|
|
134
|
+
- **TOC scroll-spy** — IntersectionObserver highlights the active section in sidebar
|
|
135
|
+
- **Dark/Light mode** — toggle with localStorage persistence, icon switch (moon/sun)
|
|
136
|
+
- **Reading progress bar** — requestAnimationFrame-based scroll tracking
|
|
137
|
+
- **Back-to-top button** — appears after 500px scroll
|
|
138
|
+
- **Copy-quote** — per-section copy button with "Copied!" feedback
|
|
139
|
+
- **Mobile navigation** — hamburger toggle with slide-out sidebar
|
|
140
|
+
- **Keyboard shortcuts** — Ctrl/Cmd+K (search), Escape (close modal)
|
|
141
|
+
- **Timestamp links** — clickable timestamps that seek YouTube player (if embedded)
|
|
142
|
+
|
|
143
|
+
## Execution Protocol
|
|
144
|
+
|
|
145
|
+
### Step 0: Input Analysis
|
|
146
|
+
```
|
|
147
|
+
Read: modules/00-input-analysis.md
|
|
148
|
+
```
|
|
149
|
+
- Detect input type (text / YouTube URL / both)
|
|
150
|
+
- If YouTube URL: extract transcript via yt-dlp, get video metadata
|
|
151
|
+
- If text: accept as-is
|
|
152
|
+
- Detect language (Russian / English)
|
|
153
|
+
- **Output:** Raw transcript text + optional video metadata + language
|
|
154
|
+
|
|
155
|
+
### Step 1: Content Parsing
|
|
156
|
+
```
|
|
157
|
+
Read: modules/01-content-parsing.md
|
|
158
|
+
```
|
|
159
|
+
- Split transcript into logical sections (by topic shifts, speaker changes, or markers)
|
|
160
|
+
- Extract timestamps if present (from VTT or inline `[HH:MM:SS]`)
|
|
161
|
+
- Generate section titles from content
|
|
162
|
+
- Detect speakers if multi-speaker transcript
|
|
163
|
+
- Calculate word counts and reading time
|
|
164
|
+
- **Output:** Structured section list with titles, content, timestamps, speakers
|
|
165
|
+
|
|
166
|
+
### Step 2: Site Generation
|
|
167
|
+
```
|
|
168
|
+
Read: modules/02-site-generation.md
|
|
169
|
+
Read: references/data-schemas.md
|
|
170
|
+
```
|
|
171
|
+
- Generate `docs/index.html` — complete self-contained page:
|
|
172
|
+
- Tailwind CSS + Font Awesome via CDN
|
|
173
|
+
- Full SEO meta tags (OG, Twitter, JSON-LD)
|
|
174
|
+
- Header with title, stats, dark mode toggle, search button
|
|
175
|
+
- Sidebar TOC with all section links
|
|
176
|
+
- YouTube embed (if video URL provided)
|
|
177
|
+
- All transcript sections as HTML with anchor IDs
|
|
178
|
+
- Footer with author credits and source link
|
|
179
|
+
- Generate `docs/static/style.css` — minimal CSS overrides
|
|
180
|
+
- **Output:** Complete HTML + CSS files
|
|
181
|
+
|
|
182
|
+
### Step 3: Interactivity
|
|
183
|
+
```
|
|
184
|
+
Read: modules/03-interactivity.md
|
|
185
|
+
Read: references/component-catalog.md
|
|
186
|
+
```
|
|
187
|
+
- Generate `docs/static/app.js` — vanilla JS:
|
|
188
|
+
- Search modal with highlighting and context snippets
|
|
189
|
+
- TOC scroll-spy (IntersectionObserver)
|
|
190
|
+
- Dark mode toggle with localStorage
|
|
191
|
+
- Reading progress bar
|
|
192
|
+
- Back-to-top button
|
|
193
|
+
- Copy-quote buttons
|
|
194
|
+
- Mobile hamburger menu
|
|
195
|
+
- Keyboard shortcuts
|
|
196
|
+
- YouTube timestamp sync (if video embedded)
|
|
197
|
+
- **Output:** Complete JS file
|
|
198
|
+
|
|
199
|
+
### Step 4: Deployment
|
|
200
|
+
```
|
|
201
|
+
Read: modules/04-deploy.md
|
|
202
|
+
```
|
|
203
|
+
- Create `.github/workflows/deploy.yml` for GitHub Pages from `docs/`
|
|
204
|
+
- Create or update `README.md` with project description and live site link
|
|
205
|
+
- Configure GitHub Pages source as `docs/` on `main` branch
|
|
206
|
+
- **Output:** Deploy config + README
|
|
207
|
+
|
|
208
|
+
### Step 5: Verification
|
|
209
|
+
```
|
|
210
|
+
Read: modules/05-verification.md
|
|
211
|
+
```
|
|
212
|
+
- Verify `docs/index.html` exists and has valid HTML structure
|
|
213
|
+
- Verify `docs/static/app.js` exists and has no syntax errors
|
|
214
|
+
- Check all section IDs are unique
|
|
215
|
+
- Check SEO meta tags are present
|
|
216
|
+
- Verify mobile responsiveness classes
|
|
217
|
+
- Check dark mode CSS works
|
|
218
|
+
- **Output:** Verification report
|
|
219
|
+
|
|
220
|
+
## Customization Points
|
|
221
|
+
|
|
222
|
+
| Parameter | Default | How to specify | Description |
|
|
223
|
+
|-----------|---------|---------------|-------------|
|
|
224
|
+
| Language | auto-detect | "language: en" in prompt | UI language (ru/en) |
|
|
225
|
+
| Theme color | Indigo | "use green theme" in prompt | Primary Tailwind color palette |
|
|
226
|
+
| YouTube URL | none | Include URL in input | Optional video embed with timestamps |
|
|
227
|
+
| Author | from transcript/video | "author: John Doe" in prompt | Attribution in footer |
|
|
228
|
+
| Show timestamps | auto (if available) | "hide timestamps" in prompt | Toggle timestamp display |
|
|
229
|
+
| Show stats | yes | "no stats" in prompt | Word count, reading time in header |
|
|
230
|
+
| Show copy buttons | yes | "no copy buttons" in prompt | Copy-quote per section |
|
|
231
|
+
| Output dir | docs/ | "output to site/" in prompt | Static site output directory |
|
|
232
|
+
| Deploy method | docs/ folder | "use GitHub Actions" in prompt | `docs/` (zero build) or GitHub Actions |
|
|
233
|
+
|
|
234
|
+
Customization is passed via natural language in the user's prompt. The agent parses these from the initial request during Step 0. If the output directory is not `docs/`, update the deploy workflow `path` accordingly.
|
|
235
|
+
|
|
236
|
+
### Conflict Detection
|
|
237
|
+
|
|
238
|
+
Before writing to the output directory, check if it already exists:
|
|
239
|
+
- If `docs/` has existing content, warn: `"docs/ already exists. Overwrite? (yes/no/use different dir)"`
|
|
240
|
+
- Never silently overwrite existing files
|
|
241
|
+
|
|
242
|
+
## Large Transcript Strategy
|
|
243
|
+
|
|
244
|
+
For transcripts exceeding 30,000 words (~150 KB HTML output), the generated `index.html` may exceed single-file output limits. In this case:
|
|
245
|
+
|
|
246
|
+
1. **Generate the HTML shell first** — `<head>`, header, sidebar TOC, search modal, footer (without section content)
|
|
247
|
+
2. **Generate transcript sections in batches** — 5-10 sections per Write operation, appending to the HTML file
|
|
248
|
+
3. **Close the HTML** — add closing `</main>`, `</div>`, `</body>`, `</html>` tags
|
|
249
|
+
4. **Verify integrity** — check that `</html>` appears exactly once and all section IDs are present
|
|
250
|
+
|
|
251
|
+
This chunked approach ensures complete output regardless of transcript length.
|
|
252
|
+
|
|
253
|
+
## Anti-Patterns
|
|
254
|
+
|
|
255
|
+
| Anti-Pattern | Detection | Fix |
|
|
256
|
+
|-------------|-----------|-----|
|
|
257
|
+
| Using React/Vite for simple transcript | Unnecessary complexity | Use static HTML + vanilla JS (default) |
|
|
258
|
+
| Transcript split into too many files | Multiple HTML pages | Single index.html with anchor navigation |
|
|
259
|
+
| Missing Tailwind CDN script | No styling | Always include `<script src="https://cdn.tailwindcss.com">` |
|
|
260
|
+
| Missing dark mode config in Tailwind | Dark mode broken | Add `tailwind.config = { darkMode: 'class' }` |
|
|
261
|
+
| Too few sections (<3) | Not enough for navigation | Merge more content or split deeper |
|
|
262
|
+
| Giant monolithic section | Section > 3000 words | Split into sub-sections |
|
|
263
|
+
| No search results feedback | Empty search shows nothing | Show "no results" message |
|
|
264
|
+
| Missing print styles | Page breaks mid-section | Add `@media print` rules |
|
|
265
|
+
| No mobile TOC | Desktop-only sidebar | Add hamburger menu for screens < 768px |
|
|
266
|
+
| YouTube embed not responsive | Fixed-width iframe | Use padding-bottom aspect-ratio trick |
|
|
267
|
+
| Missing fallback for yt-dlp | Script crashes if not installed | Check availability, offer text paste |
|
|
268
|
+
| No Font Awesome CDN | Missing icons | Include FA CDN link in `<head>` |
|
|
269
|
+
| Content in separate JS files | Unnecessary indirection for static site | Inline content directly in HTML |
|
|
270
|
+
| Using npm/build step | Over-engineering for static content | Deploy `docs/` directly, zero build |
|
|
271
|
+
|
|
272
|
+
## Dependencies
|
|
273
|
+
|
|
274
|
+
- **Tech stack:** Pure HTML + Tailwind CSS (CDN) + Vanilla JavaScript
|
|
275
|
+
- **External CDNs:** Tailwind CSS, Font Awesome
|
|
276
|
+
- **Optional:** yt-dlp (for YouTube transcript extraction)
|
|
277
|
+
- **Skills used:** None (standalone skill)
|
|
278
|
+
- **Deployment:** GitHub Pages via `docs/` folder (no build step)
|
|
279
|
+
|
|
280
|
+
## Checkpoint Protocol
|
|
281
|
+
|
|
282
|
+
After each step, output:
|
|
283
|
+
```
|
|
284
|
+
Step N/5: [Name] Complete
|
|
285
|
+
Artifacts: [list]
|
|
286
|
+
"ok" to continue | "[feedback]" to adjust
|
|
287
|
+
```
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Example: Text-Only Transcript Site (No YouTube)
|
|
2
|
+
|
|
3
|
+
## Input
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
Input type: Pasted text
|
|
7
|
+
Title: "AI in Healthcare: Panel Discussion at TechConf 2025"
|
|
8
|
+
Language: English
|
|
9
|
+
YouTube: none
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Parsed Sections (Step 1 Output)
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
Section 1: "Opening Remarks" - 480 words
|
|
16
|
+
Section 2: "Current State of Medical AI" - 1120 words
|
|
17
|
+
Section 3: "Regulatory Challenges" - 890 words
|
|
18
|
+
Section 4: "Patient Data Privacy" - 1050 words
|
|
19
|
+
Section 5: "Clinical Decision Support Systems" - 1340 words
|
|
20
|
+
Section 6: "AI-Assisted Diagnostics in Radiology" - 960 words
|
|
21
|
+
Section 7: "Audience Q&A" - 720 words
|
|
22
|
+
Section 8: "Closing Thoughts" - 410 words
|
|
23
|
+
|
|
24
|
+
Total: 6,970 words, ~35 min read, 3 speakers
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Generated File Structure
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
project-root/
|
|
31
|
+
├── docs/
|
|
32
|
+
│ ├── index.html (52 KB)
|
|
33
|
+
│ └── static/
|
|
34
|
+
│ ├── app.js (9 KB) <- smaller: no YouTube seek code
|
|
35
|
+
│ └── style.css (0.4 KB)
|
|
36
|
+
├── .github/
|
|
37
|
+
│ └── workflows/
|
|
38
|
+
│ └── deploy.yml
|
|
39
|
+
└── README.md
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Key Differences from YouTube Example
|
|
43
|
+
|
|
44
|
+
| Aspect | YouTube Example | Text-Only Example |
|
|
45
|
+
|--------|----------------|-------------------|
|
|
46
|
+
| Video embed | Yes (`<iframe>`) | Omitted |
|
|
47
|
+
| Timestamp links | Yes (`seekTo()`) | Omitted |
|
|
48
|
+
| `seekTo` function | In app.js | Not generated |
|
|
49
|
+
| `onYouTubeIframeAPIReady` | In app.js | Not generated |
|
|
50
|
+
| `og:type` | `video.other` | `article` |
|
|
51
|
+
| JSON-LD VideoObject | Yes | Omitted |
|
|
52
|
+
| `og:image` | YouTube thumbnail | Not set (or custom) |
|
|
53
|
+
| app.js size | ~11 KB | ~9 KB |
|
|
54
|
+
|
|
55
|
+
## Sample Section HTML (No Timestamp)
|
|
56
|
+
|
|
57
|
+
```html
|
|
58
|
+
<section id="section-regulatory-challenges" class="mb-12 scroll-mt-20">
|
|
59
|
+
<div class="flex items-start justify-between mb-4">
|
|
60
|
+
<h2 class="text-2xl font-bold text-gray-900 dark:text-white">
|
|
61
|
+
3. Regulatory Challenges
|
|
62
|
+
</h2>
|
|
63
|
+
<button data-copy="section-regulatory-challenges"
|
|
64
|
+
class="copy-btn flex-shrink-0 p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-800
|
|
65
|
+
text-gray-400 hover:text-gray-600 dark:hover:text-gray-300 no-print"
|
|
66
|
+
aria-label="Copy">
|
|
67
|
+
<i class="far fa-copy"></i>
|
|
68
|
+
</button>
|
|
69
|
+
</div>
|
|
70
|
+
<div class="mb-3 flex items-center gap-2">
|
|
71
|
+
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium
|
|
72
|
+
bg-primary-100 text-primary-800 dark:bg-primary-900 dark:text-primary-200">
|
|
73
|
+
Dr. Sarah Chen · Panelist
|
|
74
|
+
</span>
|
|
75
|
+
</div>
|
|
76
|
+
<div class="prose prose-lg dark:prose-invert max-w-none">
|
|
77
|
+
<p>The FDA's approach to AI-based medical devices has evolved significantly...</p>
|
|
78
|
+
<p>We're seeing a shift from traditional 510(k) pathways to the new PCCP framework...</p>
|
|
79
|
+
</div>
|
|
80
|
+
</section>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## SEO Head (Article-only, no VideoObject)
|
|
84
|
+
|
|
85
|
+
```html
|
|
86
|
+
<title>AI in Healthcare: Panel Discussion at TechConf 2025</title>
|
|
87
|
+
<meta name="description" content="Panel discussion transcript covering medical AI, regulatory challenges, patient data privacy, and clinical decision support systems." />
|
|
88
|
+
<meta property="og:type" content="article" />
|
|
89
|
+
<!-- No og:image (no YouTube thumbnail available) -->
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## JSON-LD (Article only)
|
|
93
|
+
|
|
94
|
+
```json
|
|
95
|
+
{
|
|
96
|
+
"@context": "https://schema.org",
|
|
97
|
+
"@type": "Article",
|
|
98
|
+
"headline": "AI in Healthcare: Panel Discussion at TechConf 2025",
|
|
99
|
+
"author": { "@type": "Organization", "name": "TechConf" },
|
|
100
|
+
"datePublished": "2025-11-15",
|
|
101
|
+
"description": "Panel discussion transcript covering medical AI...",
|
|
102
|
+
"wordCount": 6970
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Stats Displayed in Header
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
35 min read · 6,970 words · 8 sections
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Verification Results
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
File checks: 5/5 passed
|
|
116
|
+
HTML structure: 11/11 passed (no YouTube-specific checks)
|
|
117
|
+
Content: 6/6 passed
|
|
118
|
+
Interactivity: 8/8 passed (no seekTo/YouTube checks)
|
|
119
|
+
Responsive: 6/6 passed
|
|
120
|
+
Dark mode: 6/6 passed
|
|
121
|
+
SEO: 5/5 passed (no VideoObject checks)
|
|
122
|
+
Print: 4/4 passed
|
|
123
|
+
```
|