Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions admin/qa-bundle/GO-LIVE-QA-GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

Use this guide before a cohort is opened to learners. It is the release gate for curriculum content, GitHub Classroom deployment, Learning Room automation, podcast materials, accessibility, and human test coverage.

For end-to-end execution details, use [admin/LEARNING-ROOM-E2E-QA-RUNBOOK.md](admin/LEARNING-ROOM-E2E-QA-RUNBOOK.md) as the operator procedure. This guide is the release gate summary; the runbook is the required execution playbook.

The goal is simple: a facilitator should be able to create a classroom, seed test repositories, complete every challenge path, validate every generated artifact, and know exactly what remains before students arrive.

## Release Decision
Expand Down Expand Up @@ -34,9 +36,21 @@ Do not mark a cohort ready until all required items in this section are complete
- [ ] Human testers completed the Day 1, Day 2, bonus, accessibility, and content-review passes below.
- [ ] Challenge tracking log includes explicit status and evidence for Challenges 1-16 and Bonus A-E.
- [ ] Challenge reliability matrix includes happy path, failure path, and recovery evidence for each challenge family.
- [ ] Runbook Phase 8 required checklist is complete in [admin/LEARNING-ROOM-E2E-QA-RUNBOOK.md](admin/LEARNING-ROOM-E2E-QA-RUNBOOK.md).
- [ ] Student recovery Level 2 restore test is completed and evidenced with branch and PR links.
- [ ] All in-scope automation workflows and facilitator scripts were validated with expected behavior and evidence.
- [ ] Local non-podcast readiness evidence is recorded in [admin/qa-readiness](admin/qa-readiness/README.md).
- [ ] All blocking findings have a fix, owner, or written release exception.

No-go conditions:

- Any Blocker finding remains open.
- Any required runbook Phase 8 gate is incomplete without explicit release-owner exception.
- Student progression, PR validation, or required autograder behavior is not reproducible in a test student repository.
- Template freshness proof is missing or shows drift from the latest merged template sync.
- Required QA evidence links are missing for release-signoff claims.
- Support channel links point to deprecated destinations and not to `support`.

## Source Of Truth

The following table lists each release artifact and the document that controls it.
Expand Down Expand Up @@ -88,6 +102,8 @@ Expected results:

Record the command output summary in the release notes or QA issue.

Required evidence destination for local readiness: [admin/qa-readiness/UNIT-TEST-RESULTS-2026-05-08.md](admin/qa-readiness/UNIT-TEST-RESULTS-2026-05-08.md) or an equivalent dated report in the same folder.

## Phase 2: Content Inventory Review

Every content file must be reviewed before go-live. Use this checklist to assign coverage.
Expand Down
309 changes: 284 additions & 25 deletions admin/qa-bundle/README.md

Large diffs are not rendered by default.

17 changes: 10 additions & 7 deletions admin/qa-bundle/admin/LEARNING-ROOM-E2E-QA-RUNBOOK.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ Out of scope:

## Canonical Source Files Used by This Runbook

The following table lists the source files this runbook consolidates.

**Table: Source files consolidated by this runbook**

| Area | Source file |
|---|---|
Expand All @@ -50,6 +51,12 @@ The following table lists the source files this runbook consolidates.
| Release gate baseline | [GO-LIVE-QA-GUIDE.md](../GO-LIVE-QA-GUIDE.md) |
| Support hub operations | [SUPPORT_HUB_OPERATIONS.md](SUPPORT_HUB_OPERATIONS.md) |

**Table: QA validation checkpoints for registration and classroom automation**
**Table: Student journey checkpoints and expected artifacts**
**Table: Label color and purpose for registration automation**
**Table: Screen reader options for workshop setup**
**Table: Accessibility improvements for screen reader users**

## Required Accounts, Access, and Tools

Complete this section before Phase 1.
Expand Down Expand Up @@ -83,10 +90,6 @@ Complete all items below before any cohort launch actions.
- [x] Registration entry configuration exists and is valid:
- [x] Issue form template `workshop-registration.yml` exists
- [x] Required labels exist: `registration`, `duplicate`, `waitlist`
- [ ] Support hub is ready for student onboarding:
- [ ] `Community-Access/support` is public and reachable
- [ ] Issues and Discussions are enabled
- [ ] Support labels and templates are present
- [ ] While signed in as `accesswatch`, opening [classroom.github.com](https://classroom.github.com) shows the `Community-Access-Classroom` classroom organization.

If any precondition fails, stop and resolve before proceeding.
Expand Down Expand Up @@ -521,8 +524,8 @@ Pass criteria:
### Step 1.1 Verify support hub onboarding path

1. Open `Community-Access/support` and confirm Issues and Discussions are enabled.
2. Confirm pinned Start Here onboarding guidance exists in Discussions.
3. Open a test support issue using a template and confirm triage labels apply.
2. Confirm at least one pinned onboarding discussion or Start Here guidance exists.
3. Open a test support issue using a template and confirm labels apply correctly.

Pass criteria:

Expand Down
2 changes: 2 additions & 0 deletions admin/qa-bundle/classroom/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -386,6 +386,7 @@ Follow the [teardown-checklist.md](teardown-checklist.md) for complete post-work
1. **Export grades** from the classroom dashboard
2. **Archive the classroom** in the Classroom UI (this preserves student repos as read-only portfolio pieces)
3. **Review feedback** and update facilitation notes for next cohort
4. **Route ongoing learner support** to [Community-Access/support](https://github.com/Community-Access/support)

---

Expand Down Expand Up @@ -449,3 +450,4 @@ See [teardown-checklist.md](teardown-checklist.md) for the complete post-worksho
- [Challenge Hub](../docs/CHALLENGES.md) -- all 21 challenges with instructions
- [Solutions Directory](../docs/solutions/) -- reference solutions for facilitator use
- [Grading Guide](grading-guide.md) -- per-challenge rubric and completion levels
- [Support Hub Operations](../admin/SUPPORT_HUB_OPERATIONS.md) -- operating model for async support after the workshop
6 changes: 5 additions & 1 deletion admin/qa-bundle/docs/00-pre-workshop-setup.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@

**Table: Screen reader options for workshop setup**

**Table: Accessibility improvements for screen reader users**
# Pre-Workshop Setup - GIT Going with GitHub
>
> **Listen to Episode 1:** [Pre-Workshop Setup](../admin/PODCASTS.md) - a conversational audio overview of this chapter. Listen before reading to preview the concepts, or after to reinforce what you learned.
Expand Down Expand Up @@ -175,7 +179,7 @@ That is it. No tokens to generate, no keys to create, no strings to paste. If yo

For this workshop, participants need a GitHub account with 2FA enabled. The browser-based sign-in described above handles all Git authentication automatically - no additional setup is required beyond having a working GitHub account.

If you run into any authentication issues before the workshop, contact the workshop organizers at the email or issue link in this guide so we can help.
If you run into any authentication issues before the workshop, open a support issue at [Community-Access/support/issues](https://github.com/Community-Access/support/issues) or contact the workshop organizers directly.

### Learning Cards: Create Your GitHub Account

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@

**Table: Workflow status and triggers for deployment validation**

**Table: Error handling scenarios in deployment validation**

**Table: Metrics for deployment validation and student experience**
# Learning Room Automation - Deployment Validation Checklist

## Complete Setup Verification
Expand Down
2 changes: 2 additions & 0 deletions admin/qa-bundle/learning-room/.github/FACILITATOR_GUIDE.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@

**Table: Common facilitator questions and responses**
# Learning Room Automation - Facilitator Quick Reference

## What Students See
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@

**Table: Learning Room workflow automation and triggers**

**Table: Key documentation files for Learning Room automation**
# Learning Room Template: Implementation Guide

> **For full workshop deployment instructions, see
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@

**Table: Workflow automation in the Learning Room**

**Table: Troubleshooting common issues in Learning Room automation**
# Learning Room Automation Setup & Maintenance Guide

## Overview
Expand Down
2 changes: 2 additions & 0 deletions admin/qa-bundle/learning-room/.github/STUDENT_GUIDE.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@

**Table: What the bot does and how it helps students**
# How the Learning Room Automation Works - Student Guide

## What Is This Automation?
Expand Down
3 changes: 3 additions & 0 deletions admin/qa-bundle/learning-room/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@

**Table: Learning Room folder and file purposes**
**Table: Host voice and character mapping for VibeVoice podcast**
# Welcome to the Learning Room

This repository is your private Learning Room for the Git Going with GitHub workshop. GitHub Classroom created it from the Learning Room template so you can practice the full contribution workflow safely. In this repository you will:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ param(
)

$ErrorActionPreference = 'Stop'
# Prevent PowerShell from converting native stderr output into terminating errors.
# Git and gh often emit progress text on stderr even when commands succeed.
if (Get-Variable -Name PSNativeCommandUseErrorActionPreference -ErrorAction SilentlyContinue) {
$PSNativeCommandUseErrorActionPreference = $false
}

$script:Results = [System.Collections.Generic.List[object]]::new()
$script:CreatedRepository = $false
Expand Down Expand Up @@ -149,7 +154,10 @@ function Invoke-CheckedCommand {
# Generic command execution with special transient-retry support for gh commands.
for ($attempt = 1; $attempt -le $Retries; $attempt++) {
if ($FilePath -eq 'gh') {
$oldErrorActionPreference = $ErrorActionPreference
$ErrorActionPreference = 'Continue'
$output = & gh @Arguments 2>&1
$ErrorActionPreference = $oldErrorActionPreference
$exitCode = $LASTEXITCODE
$text = ($output | Out-String).Trim()

Expand Down Expand Up @@ -191,7 +199,10 @@ function Invoke-GhJson {
)

for ($attempt = 1; $attempt -le $Retries; $attempt++) {
$oldErrorActionPreference = $ErrorActionPreference
$ErrorActionPreference = 'Continue'
$output = & gh @Arguments 2>&1
$ErrorActionPreference = $oldErrorActionPreference
$exitCode = $LASTEXITCODE
$text = ($output | Out-String).Trim()

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,20 @@
param(
[string]$Owner = 'Community-Access',
[string]$TemplateRepo = 'learning-room-template',
[string]$SourcePath = (Join-Path $PSScriptRoot '..\..\learning-room'),
[string]$SourcePath = '',
[string]$BranchName = '',
[switch]$NoPush
[switch]$NoPush,
[switch]$SkipSourceValidation
)

$ErrorActionPreference = 'Stop'

$scriptDir = if ($PSScriptRoot) { $PSScriptRoot } else { Split-Path -Parent $MyInvocation.MyCommand.Path }

if (-not $SourcePath) {
$SourcePath = Join-Path $scriptDir '..\..\learning-room'
}

function Invoke-CheckedCommand {
param([string]$FilePath, [string[]]$Arguments)
& $FilePath @Arguments
Expand All @@ -25,6 +32,19 @@ if (-not $BranchName) {
$BranchName = 'sync/learning-room-template-' + (Get-Date -Format 'yyyyMMddHHmmss')
}

if (-not $SkipSourceValidation) {
$validatorPath = Join-Path $scriptDir 'Validate-LearningRoomTemplateSource.ps1'
if (-not (Test-Path -LiteralPath $validatorPath -PathType Leaf)) {
throw "Source validator script was not found: $validatorPath"
}

Write-Host "Validating Learning Room source before sync..."
& $validatorPath -SourcePath $source.Path
}
else {
Write-Warning "SkipSourceValidation was set. Proceeding without source sanity checks."
}

Write-Host "Checking GitHub CLI authentication..."
Invoke-CheckedCommand gh @('auth', 'status', '-h', 'github.com')

Expand Down Expand Up @@ -56,6 +76,22 @@ try {

Push-Location $clonePath
try {
$gitEmail = (git config user.email 2>$null)
$gitName = (git config user.name 2>$null)
if (-not $gitEmail -or -not $gitName) {
$login = (& gh api /user --jq '.login' 2>$null)
if (-not $login) {
$login = 'github-actions'
}
$fallbackEmail = "$login@users.noreply.github.com"
if (-not $gitName) {
Invoke-CheckedCommand git @('config', 'user.name', $login)
}
if (-not $gitEmail) {
Invoke-CheckedCommand git @('config', 'user.email', $fallbackEmail)
}
}

Invoke-CheckedCommand git @('add', '-A')
$status = git status --short
if (-not $status) {
Expand All @@ -73,8 +109,14 @@ try {

Invoke-CheckedCommand git @('commit', '-m', 'chore: sync learning room template')
Invoke-CheckedCommand git @('push', '--force', '-u', 'origin', "HEAD:$BranchName")
$existingPr = & gh pr view $BranchName -R $fullRepo --json url --jq .url 2>$null
if ($LASTEXITCODE -eq 0 -and $existingPr) {
$existingPr = $null
try {
$existingPr = & gh pr view $BranchName -R $fullRepo --json url --jq .url 2>$null
}
catch {
$existingPr = $null
}
if ($existingPr) {
Write-Host "Updated existing pull request: $existingPr"
}
else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,48 @@ function Invoke-CheckedCommand {
}
}

function Wait-ForRepositoryContent {
param(
[string]$Repository,
[int]$MaxAttempts = 12,
[int]$DelaySeconds = 5
)

for ($attempt = 1; $attempt -le $MaxAttempts; $attempt++) {
$isReady = $false
try {
& gh api "repos/$Repository/contents/.github/workflows/student-progression.yml" 1>$null 2>$null
if ($LASTEXITCODE -eq 0) {
$isReady = $true
}
}
catch {
$isReady = $false
}

if ($isReady) {
return
}

if ($attempt -lt $MaxAttempts) {
Write-Host "Template contents not ready yet (attempt $attempt/$MaxAttempts). Retrying in $DelaySeconds seconds..."
Start-Sleep -Seconds $DelaySeconds
}
}

throw "Repository content did not become available in time for $Repository."
}

$template = "$Owner/$TemplateRepo"
$smoke = "$Owner/$SmokeRepo"

Write-Host "Creating smoke-test repository $smoke from $template..."
Invoke-CheckedCommand gh @('repo', 'create', $smoke, '--private', '--template', $template)

try {
Write-Host "Waiting for template content to materialize in smoke repository..."
Wait-ForRepositoryContent -Repository $smoke

Write-Host "Checking expected template files..."
Invoke-CheckedCommand gh @('api', "repos/$smoke/contents/.github/workflows/student-progression.yml")
Invoke-CheckedCommand gh @('api', "repos/$smoke/contents/.github/ISSUE_TEMPLATE/challenge-01-find-your-way.yml")
Expand All @@ -37,6 +72,10 @@ try {
finally {
if (-not $KeepSmokeRepo) {
Write-Host "Deleting smoke-test repository $smoke..."
Invoke-CheckedCommand gh @('repo', 'delete', $smoke, '--yes')
& gh repo delete $smoke --yes
if ($LASTEXITCODE -ne 0) {
Write-Warning "Could not delete smoke repository automatically. This does not invalidate smoke validation."
Write-Warning "Delete manually when convenient: gh repo delete $smoke --yes"
}
}
}
14 changes: 14 additions & 0 deletions html/admin/qa-bundle/GO-LIVE-QA-GUIDE.html
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
<main id="main-content" class="markdown-body">
<h1 id="git-going-with-github-go-live-qa-guide">Git Going with GitHub Go-Live QA Guide</h1>
<p>Use this guide before a cohort is opened to learners. It is the release gate for curriculum content, GitHub Classroom deployment, Learning Room automation, podcast materials, accessibility, and human test coverage.</p>
<p>For end-to-end execution details, use <a href="admin/LEARNING-ROOM-E2E-QA-RUNBOOK.html">admin/LEARNING-ROOM-E2E-QA-RUNBOOK.md</a> as the operator procedure. This guide is the release gate summary; the runbook is the required execution playbook.</p>
<p>The goal is simple: a facilitator should be able to create a classroom, seed test repositories, complete every challenge path, validate every generated artifact, and know exactly what remains before students arrive.</p>
<h2 id="release-decision">Release Decision</h2>
<p>Do not mark a cohort ready until all required items in this section are complete.</p>
Expand Down Expand Up @@ -90,9 +91,21 @@ <h2 id="release-decision">Release Decision</h2>
<li><input aria-label="Human testers completed the Day 1, Day 2, bonus, accessibility, and content-review passes below." disabled="" type="checkbox"> Human testers completed the Day 1, Day 2, bonus, accessibility, and content-review passes below.</li>
<li><input aria-label="Challenge tracking log includes explicit status and evidence for Challenges 1-16 and Bonus A-E." disabled="" type="checkbox"> Challenge tracking log includes explicit status and evidence for Challenges 1-16 and Bonus A-E.</li>
<li><input aria-label="Challenge reliability matrix includes happy path, failure path, and recovery evidence for each challenge family." disabled="" type="checkbox"> Challenge reliability matrix includes happy path, failure path, and recovery evidence for each challenge family.</li>
<li><input aria-label="Runbook Phase 8 required checklist is complete in" disabled="" type="checkbox"> Runbook Phase 8 required checklist is complete in <a href="admin/LEARNING-ROOM-E2E-QA-RUNBOOK.html">admin/LEARNING-ROOM-E2E-QA-RUNBOOK.md</a>.</li>
<li><input aria-label="Student recovery Level 2 restore test is completed and evidenced with branch and PR links." disabled="" type="checkbox"> Student recovery Level 2 restore test is completed and evidenced with branch and PR links.</li>
<li><input aria-label="All in-scope automation workflows and facilitator scripts were validated with expected behavior and evidence." disabled="" type="checkbox"> All in-scope automation workflows and facilitator scripts were validated with expected behavior and evidence.</li>
<li><input aria-label="Local non-podcast readiness evidence is recorded in" disabled="" type="checkbox"> Local non-podcast readiness evidence is recorded in <a href="admin/qa-readiness/README.html">admin/qa-readiness</a>.</li>
<li><input aria-label="All blocking findings have a fix, owner, or written release exception." disabled="" type="checkbox"> All blocking findings have a fix, owner, or written release exception.</li>
</ul>
<p>No-go conditions:</p>
<ul>
<li>Any Blocker finding remains open.</li>
<li>Any required runbook Phase 8 gate is incomplete without explicit release-owner exception.</li>
<li>Student progression, PR validation, or required autograder behavior is not reproducible in a test student repository.</li>
<li>Template freshness proof is missing or shows drift from the latest merged template sync.</li>
<li>Required QA evidence links are missing for release-signoff claims.</li>
<li>Support channel links point to deprecated destinations and not to <code>support</code>.</li>
</ul>
<h2 id="source-of-truth">Source Of Truth</h2>
<p>The following table lists each release artifact and the document that controls it.</p>
<table>
Expand Down Expand Up @@ -173,6 +186,7 @@ <h2 id="phase-1-local-repository-health">Phase 1: Local Repository Health</h2>
<li><code>git diff --check</code> has no trailing-whitespace or conflict-marker errors. On Windows, LF-to-CRLF warnings may appear and are not release blockers by themselves.</li>
</ul>
<p>Record the command output summary in the release notes or QA issue.</p>
<p>Required evidence destination for local readiness: <a href="admin/qa-readiness/UNIT-TEST-RESULTS-2026-05-08.html">admin/qa-readiness/UNIT-TEST-RESULTS-2026-05-08.md</a> or an equivalent dated report in the same folder.</p>
<h2 id="phase-2-content-inventory-review">Phase 2: Content Inventory Review</h2>
<p>Every content file must be reviewed before go-live. Use this checklist to assign coverage.</p>
<ul>
Expand Down
Loading
Loading