Skip to content
Closed
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
2 changes: 2 additions & 0 deletions .github/workflows/squad-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,7 @@ jobs:
if: steps.flag.outputs.skip == 'false' && steps.label.outputs.skip != 'true' && steps.changes.outputs.skip != 'true'
run: |
npm ci --ignore-scripts
node packages/squad-cli/scripts/patch-esm-imports.mjs

Copilot AI Mar 30, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The patch script currently logs warnings and returns booleans, but it doesn’t fail the step if it can’t find/patch the dependency. Consider adding an explicit verification right after this line (e.g., a quick Node ESM import of vscode-jsonrpc/node or a check that node_modules/vscode-jsonrpc/package.json has an exports map) so CI fails fast with a clear message if the patch didn’t apply.

Suggested change
node packages/squad-cli/scripts/patch-esm-imports.mjs
node packages/squad-cli/scripts/patch-esm-imports.mjs
node -e "let pkg;try{pkg=require('vscode-jsonrpc/package.json');}catch(e){console.error('::error::Failed to load vscode-jsonrpc/package.json after patch; ensure vscode-jsonrpc is installed and the patch script ran successfully.');process.exit(1);}if(!pkg || !pkg.exports){console.error('::error::vscode-jsonrpc patch did not apply: missing \"exports\" map in node_modules/vscode-jsonrpc/package.json');process.exit(1);}console.log('Verified vscode-jsonrpc patch: exports map present in node_modules/vscode-jsonrpc/package.json.');"

Copilot uses AI. Check for mistakes.
npm run build -w packages/squad-sdk

Comment on lines 351 to 356

Copilot AI Mar 30, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The PR description/title describes a narrow CI fix (“2-line change” to run the existing patch script), but this PR also includes substantial updates to .squad/decisions.md and multiple agent history.md files. To keep review risk and revert scope low, consider splitting the .squad/ documentation/history updates into a separate PR or updating the PR description to explicitly cover them.

Copilot uses AI. Check for mistakes.
- name: Build and test samples
Expand Down Expand Up @@ -721,6 +722,7 @@ jobs:
if: steps.flag.outputs.skip == 'false' && steps.label.outputs.skip != 'true' && steps.changes.outputs.skip != 'true'
run: |
npm ci --ignore-scripts
node packages/squad-cli/scripts/patch-esm-imports.mjs

Copilot AI Mar 30, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same as the samples-build job: because patch-esm-imports.mjs does not exit non-zero when it can’t patch anything, this step can silently succeed and leave the later build/import failure to surface with a less targeted error. Add a small verification right after the patch step to ensure vscode-jsonrpc/node (and/or the patched exports) is actually resolvable under Node 22 ESM rules.

Suggested change
node packages/squad-cli/scripts/patch-esm-imports.mjs
node packages/squad-cli/scripts/patch-esm-imports.mjs
node --input-type=module -e "import 'vscode-jsonrpc/node';"

Copilot uses AI. Check for mistakes.
npm run build -w packages/squad-sdk

- name: Smoke test all subpath exports
Expand Down
42 changes: 42 additions & 0 deletions .squad/agents/booster/history.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@

## Learnings

📌 **Team update (2026-03-30T00:46:00Z — PRD-120 CI Gating Review Verdict: APPROVED WITH CONDITIONS):** Booster completed CI/CD domain review for PRD-120. Verdict: **APPROVED WITH CONDITIONS**. CI gating approach technically sound and implementable. Cron detection gate feasible; allowlist mechanism practical; GitHub Actions integration straightforward. Key conditions: (1) gate workflow must use path-based filtering to avoid false triggering, (2) YAML parsing must tolerate both commented and active schedules to minimize false positives, (3) allowlist must support regex for flexible workflow matching, (4) test matrix required for edge cases. Recommendation: State machine YAML parsing over regex. Effort: 3–4 weeks (80–120 hours). Phase assessment: Phase 1–2 low-risk; Phase 3 (CI gate) medium complexity but achievable; Phase 4 orthogonal to CI domain. Full review filed at `.squad/orchestration-log/2026-03-30T00-46-prd120-review/Booster.md`. Decision merged to decisions.md.

### CI Workflow Audit & Preflight Patterns (2026-03-23 Release Incident)
**Context:** v0.9.0 shipped with broken dependency reference (`file:../squad-sdk` in CLI package.json). Required hotfix. Used incident as opportunity to audit entire CI/CD system.

Expand Down Expand Up @@ -110,6 +112,46 @@ Analyzed 20 CI runs from March 15. Identified 3 distinct failure categories:

**Report written to:** `.squad/decisions/inbox/booster-ci-audit.md`

### PRD-120 CI Gating Review — June 25, 2026

**Context:** Flight authored PRD-120 (Cron Disable + CI Gating + Feature Versioning) addressing silent GitHub Actions minutes burn on new installs and upgrades. Three interconnected areas: (1) Cron disable on init/upgrade, (2) CI gating to prevent cron bleedthrough, (3) Feature change management system.

**Booster's Primary Review:** CI gating for unauthorized cron schedules (FR-3).

**Key Findings:**

**✅ APPROVED WITH CONDITIONS** — Gate is technically sound and implementable.

**Technical Assessment:**
1. **Cron Detection — Sound:** Schedule detection via state machine (not naive regex) correctly identifies `schedule:` blocks while avoiding false positives on commented schedules and workflow names containing "schedule."
2. **Allowlist Mechanism — Practical:** Config-driven allowlist in `squad.config.ts` works, but should support glob patterns (`squad-*.yml`) to reduce toil. Fallback to `.squad/schedule-policy.json` JSON recommended to reduce parsing complexity.
3. **GitHub Actions Integration — Well-Designed:** Trigger on `pull_request` with `.github/workflows/**` path filter is correct. Zero false triggers, negligible cost (~0.1 min/month for typical repos). Gate is orthogonal to existing CI checks (tests, preflight, publish).
4. **False Positives/Negatives:** Risk is LOW with recommended mitigations. State machine parsing, 15+ test cases (YAML edge cases), and diagnostic logging prevent most issues. False negative risk (cron sneaking in) mitigated by making gate opt-in for existing repos.

**Concerns & Recommendations:**
- Gate must **never run on `push: main/dev`** — only `pull_request` to prevent locking out releases if gate logic breaks
- Gate should **log all execution** to `.squad/log/cron-gate-{timestamp}.log` for debugging
- Allowlist must support **glob patterns** (`squad-*.yml`, `{hourly,daily}-*.yml`)
- Error messages must include file path, line number, allowlist guidance, and link to docs

**Effort Estimate:** 1.5–2 weeks for Booster (gate workflow + installation + test support)
- Gate workflow implementation: ~30–40 hours
- Installation command (`squad schedule gate init`): ~8–12 hours
- Test coverage (15+ YAML edge cases + allowlist): ~16–24 hours (with FIDO)

**Test Matrix:** 15 test cases covering:
- Simple schedule blocks, spacing variations, multiline YAML
- Commented schedules (migration markers), schedule in comments/names
- Allowlist matching (exact paths, glob patterns)
- YAML edge cases (anchors, aliases, template expressions)
- Error message content, gate performance (<5 seconds for 15 workflows)

**Critical Path:** Phase 1 (templates) → Phase 2 (upgrade) → Phase 3 (gate, parallel with Phase 4 feature flags).

**Approval Gate:** ✅ Ready for Flight approval + implementation kickoff

**Report Location:** `.squad/decisions/inbox/booster-prd120-review.md`

### CI Cleanup & Hardening — Post-Audit

**Changes shipped:**
Expand Down
68 changes: 68 additions & 0 deletions .squad/agents/eecom/history.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,74 @@

## Learnings

📌 **Team update (2026-03-30T00:46:00Z — PRD-120 Runtime Feasibility Review Verdict: APPROVE WITH CHANGES):** EECOM completed runtime feasibility assessment for PRD-120 Cron Disable + CI Gating + Feature Management. Verdict: **APPROVE WITH CHANGES**. Key finding: Squad's existing infrastructure provides 70% foundation already. No CopilotClient/Adapter Layer changes required (config-layer only). Feature flag system straightforward; schedule command is main greenfield effort (~18h scope). Recommendation: Defer CI gate (FR-3) to v0.10.1 to keep v0.10.0 scope tight; schedule command and feature flags can ship v0.10.0 without blocking. Full review filed at `.squad/orchestration-log/2026-03-30T00-46-prd120-review/EECOM.md`. Decision merged to decisions.md.

### PRD-120 Runtime Feasibility Review (2026-07-25)

**Context:** Flight submitted PRD-120 (Cron Disable, CI Gating, Feature Management) for team review. EECOM tasked with assessing runtime implementation feasibility for Functional Requirements 1–4 and identifying core runtime changes needed.

**Key Findings:**

1. **Foundation already exists** — 70% of infrastructure present:
- Ceremonies schema already has schedule support (`schedule?: string`, `enabled?: boolean`)
- Upgrade machinery (`upgrade.ts`, 362 lines, migration system at line 426) provides solid foundation
- Init workflow copying pattern (lines 913–932) reusable for schedule.json template setup
- Config loader infrastructure ready for feature flags

2. **Configuration schema extensions are minimal** — Only 2 new optional fields needed in `SquadConfig`:
- `features?: Record<string, boolean>` — Feature flag overrides (e.g., `cronSchedules: true`)
- `schedulePolicy?: { allowWorkflowCron?: string[] }` — Workflow schedule allowlist
- Both fields backward compatible; schema at `packages/squad-sdk/src/config/schema.ts`

3. **Runtime impact is isolated** — CopilotClient and session pool unaffected:
- Cron disable affects state (schedule.json) and templates (workflow YAML), not casting/spawn logic
- No session lifecycle changes; no adapter layer modifications needed
- Feature flags are config-only, no runtime data structure changes

4. **Schedule command is greenfield** — Largest implementation effort (~3.5 hours):
- No existing `packages/squad-cli/src/cli/commands/schedule.ts`
- Needs: enable <id>, enable --all, disable <id>, list subcommands
- Straightforward JSON I/O; can follow existing CLI command patterns (e.g., plugin.ts, doctor.ts)

5. **Workflow detection strategy** — Regex-based approach chosen over YAML parser (maintains NFR-3: zero new dependencies):
- Pattern: `/^(\s*)schedule:\s*$/gm` for block detection
- Risk: Regex may miss edge cases (quoted cron values, multiline syntax)
- Mitigation: Comprehensive test matrix; parser as fallback in v0.10.1 if needed

6. **Idempotency is critical** — Upgrade path must handle multiple runs safely:
- `.squad/schedule.json.pre-upgrade` backup file signals first-run completion
- Regex-based workflow commenting must detect already-commented blocks
- Risk: Without careful implementation, second upgrade could corrupt workflow files or duplicate backup files

**Verdict:** **APPROVE WITH CHANGES**
- FR-1 (Cron Disable Init/Upgrade) — Fully feasible, recommend v0.10.0
- FR-4.3 (Feature Flags) — Fully feasible, recommend v0.10.0
- FR-3 (CI Gate) — Defer to v0.10.1 (doesn't block cron disable, adds ~6 hours complexity)
- FR-4.1–4.5 (Change Manifest System) — Defer to v0.10.1 (infrastructure-heavy, not on critical path)

**Complexity estimate:**
- v0.10.0 core (FR-1 + FR-4.3 + schedule command): ~18 hours
- Full scope (include FR-3 + FR-4.x): ~28 hours
- Rationale: Deferring gate + manifest keeps v0.10.0 tight; users get immediate value from cron disable

**Key recommendations for implementation:**
1. Config schema: Add both fields as optional, with defensive defaults in config loader
2. Init: Reuse workflow copy pattern for schedule.json template (static JSON at init time)
3. Upgrade: Extend `TEMPLATE_MANIFEST` pattern for schedule.json; create migration functions `migrateSchedules()` and `migrateWorkflows()` with idempotency guards
4. Schedule command: Follow existing CLI patterns (dynamic imports, help text wiring in cli-entry.ts)
5. Feature flags: Implement as simple config-level boolean overrides; warn on unknown flags for forward compatibility
6. Tests: New test suite ~450 lines; extend existing init/upgrade tests for schedule migration; add idempotency matrix tests for workflow commenting

**Risk mitigations:**
- Idempotency: Backup file flag + regex-based detection for already-commented blocks; regression test (upgrade twice, compare files)
- Regex fragility: Test matrix covering inline/multiline/quoted/commented edge cases; parser fallback approved as v0.10.1 tech debt
- User experience: `squad schedule enable` cost warning every time; `squad doctor` checks enabled schedules
- Feature flag sprawl: Policy (flags sunset after 2 major versions) owned by Procedures; unknown flags warn not error

**Questions for Flight/team:** See review document section "Open Questions" for v0.10.0 vs v0.10.1 delineation, multi-repo support, changelog automation strategy.

**Review output:** `.squad/decisions/inbox/eecom-prd120-review.md` (2.1KB, structured with executive summary → verdict → detailed assessment → risks → test strategy → conclusion)

### archiveDecisions() count-based fallback (#626) (2025-07-24)

**Context:** `archiveDecisions()` in `packages/squad-cli/src/cli/core/nap.ts` silently returned `null` when all `###` entries were <30 days old (`old.length === 0`), even if the file was well over 20KB. Active projects generating many decisions per session could hit 145KB+ — 35K tokens burned per agent spawn.
Expand Down
84 changes: 83 additions & 1 deletion .squad/agents/fido/history.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,94 @@

Quality gate authority for all PRs. Test assertion arrays (EXPECTED_GUIDES, EXPECTED_FEATURES, EXPECTED_SCENARIOS, etc.) MUST stay in sync with files on disk. When reviewing PRs with CI failures, always check if dev branch has the same failures — don't block PRs for pre-existing issues. 3,931 tests passing, 149 test files, ~89s runtime.

📌 **Team update (2026-03-26T06:41:00Z — Crash Recovery Execution & Community PR Review):** Post-CLI crash recovery completed: Round 1 baseline verified (5,038 tests ✅ green), Round 2 executed duplicate closures (#605/#604/#602) and 9-PR community batch review. FIDO approved 3 PRs (#625 notification-routing, #603 Challenger agent, #608 security policy—merged via Coordinator) and issued change requests on 6 PRs identifying systemic issues: changeset package naming (4 PRs used unscoped `squad-cli` instead of `@bradygaster/squad-cli`); file paths (2 PRs placed files at root instead of correct package structure). Quality gate result: high-bar community acceptance—approved 3/9 (33%), change-request 6/9 (67%), 0 rejections. PR #592 (legacy, high-quality) also merged. All actions complete; dev branch remains green. Decision inbox merged and deleted. Next: Monitor 6 change-request PRs for author responses.
📌 **Team update (2026-03-30T00:46:00Z — PRD-120 Test Strategy Review Verdict: CONDITIONAL GO):** FIDO completed comprehensive test strategy review for PRD-120. Verdict: **CONDITIONAL GO** — approval contingent on test strategy implementation before code review begins. PRD architecturally sound with clear acceptance criteria; however, introduces significant testing complexity across init, upgrade, schedule, config, and CI workflows. Risk: subtle regressions in upgrade path, false positives in CI gate, feature flag sprawl, backward compatibility breaks. Conditions: GO on implementation IF test strategy matrix is committed before code starts; FAIL on merge IF PRs lack tests for the matrix; NO-GO on general availability IF regression tests don't confirm 80%+ coverage. Test matrix needed: 54–72 tests across 5 files: init.test.ts (12–15 tests, new install paths), upgrade.test.ts (18–20 tests, migration), schedule.test.ts (10–12 tests, enable/disable), features.test.ts (8–10 tests, flag overrides), ci-gate.integration.ts (6–8 tests, gate workflow). Backward compatibility: pre-existing test suite must pass at 80%+ coverage. Full review filed at `.squad/orchestration-log/2026-03-30T00-46-prd120-review/FIDO.md`. Decision merged to decisions.md.

📌 **Team update (2026-03-26T06:41:00Z — Crash Recovery Execution & Community PR Review):**Post-CLI crash recovery completed: Round 1 baseline verified (5,038 tests ✅ green), Round 2 executed duplicate closures (#605/#604/#602) and 9-PR community batch review. FIDO approved 3 PRs (#625 notification-routing, #603 Challenger agent, #608 security policy—merged via Coordinator) and issued change requests on 6 PRs identifying systemic issues: changeset package naming (4 PRs used unscoped `squad-cli` instead of `@bradygaster/squad-cli`); file paths (2 PRs placed files at root instead of correct package structure). Quality gate result: high-bar community acceptance—approved 3/9 (33%), change-request 6/9 (67%), 0 rejections. PR #592 (legacy, high-quality) also merged. All actions complete; dev branch remains green. Decision inbox merged and deleted. Next: Monitor 6 change-request PRs for author responses.

Copilot AI Mar 30, 2026

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Minor formatting: there’s no space after the bold marker ("...Review):**Post-CLI..."). Add a space after :** for readability and consistency with other history entries.

Suggested change
📌 **Team update (2026-03-26T06:41:00Z — Crash Recovery Execution & Community PR Review):**Post-CLI crash recovery completed: Round 1 baseline verified (5,038 tests ✅ green), Round 2 executed duplicate closures (#605/#604/#602) and 9-PR community batch review. FIDO approved 3 PRs (#625 notification-routing, #603 Challenger agent, #608 security policy—merged via Coordinator) and issued change requests on 6 PRs identifying systemic issues: changeset package naming (4 PRs used unscoped `squad-cli` instead of `@bradygaster/squad-cli`); file paths (2 PRs placed files at root instead of correct package structure). Quality gate result: high-bar community acceptance—approved 3/9 (33%), change-request 6/9 (67%), 0 rejections. PR #592 (legacy, high-quality) also merged. All actions complete; dev branch remains green. Decision inbox merged and deleted. Next: Monitor 6 change-request PRs for author responses.
📌 **Team update (2026-03-26T06:41:00Z — Crash Recovery Execution & Community PR Review):** Post-CLI crash recovery completed: Round 1 baseline verified (5,038 tests ✅ green), Round 2 executed duplicate closures (#605/#604/#602) and 9-PR community batch review. FIDO approved 3 PRs (#625 notification-routing, #603 Challenger agent, #608 security policy—merged via Coordinator) and issued change requests on 6 PRs identifying systemic issues: changeset package naming (4 PRs used unscoped `squad-cli` instead of `@bradygaster/squad-cli`); file paths (2 PRs placed files at root instead of correct package structure). Quality gate result: high-bar community acceptance—approved 3/9 (33%), change-request 6/9 (67%), 0 rejections. PR #592 (legacy, high-quality) also merged. All actions complete; dev branch remains green. Decision inbox merged and deleted. Next: Monitor 6 change-request PRs for author responses.

Copilot uses AI. Check for mistakes.

📌 **Team update (2026-03-25T15:23Z — Triage Session & PR Review Batch):** FIDO reviewed 10 open PRs for quality and merge readiness. Identified 3 duplicate/overlap pairs consolidating 6 PRs into 4: #607 (retro enforcement, comprehensive) approved for merge, #605 closed as duplicate (less comprehensive). #603 (Challenger agent, correct paths) approved for merge, #604 closed as duplicate (wrong file paths). #606 (tiered memory superset, 3-tier model) approved for merge, #602 closed as duplicate (narrower 2-tier scope). Merge-ready PRs identified: #611 (blocked on #610), #592 (joniba wiring guide, high-quality). Draft #567 not ready. Impact: reduces PR count from 10 to 7, eliminates file conflicts, preserves unique value. All other PRs (#611, #608, #592, #567) can proceed independently. Decisions merged to decisions.md and decisions inbox deleted.

## Learnings

### PRD-120 Test Strategy Review (2026-06-25T14:30:00Z)

**Context:** Flight requested FIDO test strategy review for PRD-120 (cron disable + CI gating + feature versioning). This is a three-phase feature affecting init/upgrade/schedule logic plus new CI gate workflow.

**Assessment:** 🟡 **CONDITIONAL GO** — Architecture is sound; test strategy is CRITICAL prerequisite. Identified 5 medium-to-high-risk areas and ~80–100 missing tests across 8–10 test files.

**Critical Findings:**

1. **Cron Disable Tests (MEDIUM RISK):** No tests exist for:
- `schedule.json` template defaults (`enabled: false`)
- `squad schedule enable <id>` / `squad schedule enable --all` commands
- Upgrade schedule migration (YAML comment-insertion, .pre-upgrade backup)
- Upgrade idempotence (3x consecutive runs)

**Gap:** All 4 acceptance criteria (FR-1.1 through FR-2.4) need dedicated test module.

2. **CI Gate Tests (MEDIUM-HIGH RISK):** Zero coverage for:
- YAML schedule block detection (must avoid false positives: `# schedule:`, `"schedule": value`)
- Allowlist enforcement from `squad.config.ts`
- Error message format (file/line/doc link)
- Performance gate (<10 seconds)

**Edge Case:** Detecting `schedule:` in YAML is HARD. Recommended: Use js-yaml parser, not regex, to avoid false positives on commented blocks and string literals.

3. **Feature Flag Tests (MEDIUM RISK):** Missing:
- Config schema for `features: { cronSchedules: true/false }`
- Feature flag loading from `squad.config.ts`
- Deprecation warnings for deprecated features
- Feature flag override behavior (does it trump manifest setting? Needs spec)

4. **Regression Risk (HIGH):** Existing tests could break:
- init.test.ts assumes schedule.json structure (now changed to all `enabled: false`)
- upgrade.test.ts assumes no schedule migration (new code path added)
- config-schema.test.ts must handle optional `features` field without breaking merge logic

5. **E2E Coverage (CRITICAL):** No tests for full lifecycle:
- Fresh init → schedule defaults to disabled
- Upgrade v0.9→v0.10 → cron disabled, backup created, output formatted
- User runs `squad schedule enable` → costs warning, flag flipped
- CI gate blocks PR with unauthorized `schedule:` → error message clear

**Test Matrix Recommendation:**
| Area | Test Count | Risk | Owner |
|------|-----------|------|-------|
| Cron Disable (init/upgrade/enable) | 20–25 | MEDIUM | EECOM |
| CI Gate (detect/allowlist/perf) | 15–20 | HIGH | Booster |
| Feature Flags (config/deprecation/override) | 12–18 | MEDIUM | EECOM |
| E2E Scenarios (full lifecycle) | 6–8 | CRITICAL | FIDO |
| Regression Baseline (existing suite) | 1 | HIGH | FIDO |
| **TOTAL** | **54–72** | | |

**YAML Detection Risk:** Must use parser, not regex:
```typescript
// BAD: Regex catches comment
const regex = /^\s*schedule:/m;
regex.test('# schedule:') // ← FALSE POSITIVE

// GOOD: YAML parser knows it's a comment
const yaml = YAML.parse(content);
yaml.on?.schedule // ← Correctly undefined for comments
```

**Verdict Conditions for Approval:**
- ✅ Test strategy approved before coding starts
- ✅ All MUST-HAVE tests implemented (20 core scenarios)
- ✅ Regression baseline confirms zero new failures
- ✅ E2E scenarios verified on test repos
- ✅ Cron gate proven <10s on large repos
- ✅ Feature flag spec clarified (flag vs. manifest precedence)

**Blockers for Merge:**
- ❌ Any MUST-HAVE test missing
- ❌ Idempotence fails on 3rd run
- ❌ Coverage drops below 80%
- ❌ Backup file overwritten on 2nd upgrade

**Recommendation:** Block code review until test infrastructure + YAML parser approach is committed. This PRD is too risky (user impact, cost bleedthrough) to ship without comprehensive test coverage first.

**Decision:** Review written to `.squad/decisions/inbox/fido-prd120-review.md` (29KB). Awaiting Flight approval.

### Test Assertion Sync Discipline
EXPECTED_* arrays in docs-build.test.ts must match filesystem reality. When PRs add new content files, verify the corresponding test arrays are updated. Consider dynamic discovery pattern (used for blog posts) for resilience against content additions. Stale assertions that block CI are FIDO's responsibility.

Expand Down
Loading
Loading