chore(public-prep): scrub author identity + private-IP references (#43)
Pre-public Phase 1. Remove personal/IP traces that should not ship in a general-purpose kit; keep only intended author attribution. - no-github-push.sh + hooks-and-blocks.md + ci-scaffold: drop "KeiTech unfiled patent IP / trade secrets / priority date" wording; reword as a generic opt-in guard for keeping code on a private remote. - check-error-patterns.sh: remove author-local absolute path from the tombstone comment. - graph-export-watcher.sh: default viz dir to ~/.local/share/kei/graph-viz (was a personal project path). - agent manifests (cost-guardian, modal-runner, infra/ml/code-implementer) + ci.yml: strip private memory references and dated personal incidents; keep the generic cost/ops lessons. Snapshots regenerated; golden 3/3. Kept intentionally: author attribution (NOTICE / README / Cargo / plugin). Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
48b2f5cc1c
commit
98d30e352f
19 changed files with 38 additions and 39 deletions
|
|
@ -99,7 +99,7 @@ extra = [
|
||||||
"path:user-rules/dev-workflow.md",
|
"path:user-rules/dev-workflow.md",
|
||||||
"path:user-rules/debugging.md",
|
"path:user-rules/debugging.md",
|
||||||
"path:user-rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
"MEMORY.md → Architecture Overlay Incident (model_brain.py 227→354 LOC from \"fixes\" — never patch, fix root formulas)",
|
"Architecture Overlay Incident (model_brain.py 227→354 LOC from \"fixes\" — never patch, fix root formulas)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ You are the cost guardian. Your job is to make sure no paid compute launches wit
|
||||||
verified cost estimate, a checked dashboard, and a clean head-room calculation. You stop \
|
verified cost estimate, a checked dashboard, and a clean head-room calculation. You stop \
|
||||||
runaway spend before it starts. You are READ-ONLY: you emit a GO/NO-GO report card; you do \
|
runaway spend before it starts. You are READ-ONLY: you emit a GO/NO-GO report card; you do \
|
||||||
NOT launch jobs yourself (hand back to user or `ml-implementer`). **The $98.78 Modal incident \
|
NOT launch jobs yourself (hand back to user or `ml-implementer`). **The $98.78 Modal incident \
|
||||||
(2026-02-26)** is the cautionary tale: prices guessed not verified, silent retries \
|
** is the cautionary tale: prices guessed not verified, silent retries \
|
||||||
re-billing, file changes never confirmed, dashboard never checked. Every protocol below \
|
re-billing, file changes never confirmed, dashboard never checked. Every protocol below \
|
||||||
exists because of that day — never again.
|
exists because of that day — never again.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -419,4 +419,4 @@ Blockers / next: <list>
|
||||||
- `path:user-rules/dev-workflow.md`
|
- `path:user-rules/dev-workflow.md`
|
||||||
- `path:user-rules/debugging.md`
|
- `path:user-rules/debugging.md`
|
||||||
- `path:user-rules/karpathy-behavioral.md`
|
- `path:user-rules/karpathy-behavioral.md`
|
||||||
- `MEMORY.md → Architecture Overlay Incident (model_brain.py 227→354 LOC from "fixes" — never patch, fix root formulas)`
|
- `Architecture Overlay Incident (model_brain.py 227→354 LOC from "fixes" — never patch, fix root formulas)`
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ model: opus
|
||||||
|
|
||||||
# ROLE
|
# ROLE
|
||||||
|
|
||||||
You are the cost guardian. Your job is to make sure no paid compute launches without a verified cost estimate, a checked dashboard, and a clean head-room calculation. You stop runaway spend before it starts. You are READ-ONLY: you emit a GO/NO-GO report card; you do NOT launch jobs yourself (hand back to user or `ml-implementer`). **The $98.78 Modal incident (2026-02-26)** is the cautionary tale: prices guessed not verified, silent retries re-billing, file changes never confirmed, dashboard never checked. Every protocol below exists because of that day — never again.
|
You are the cost guardian. Your job is to make sure no paid compute launches without a verified cost estimate, a checked dashboard, and a clean head-room calculation. You stop runaway spend before it starts. You are READ-ONLY: you emit a GO/NO-GO report card; you do NOT launch jobs yourself (hand back to user or `ml-implementer`). **The $98.78 Modal incident ** is the cautionary tale: prices guessed not verified, silent retries re-billing, file changes never confirmed, dashboard never checked. Every protocol below exists because of that day — never again.
|
||||||
|
|
||||||
# AGENT SUBSTRATE — role `read-only`
|
# AGENT SUBSTRATE — role `read-only`
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -463,4 +463,4 @@ behaviour-verified: yes | no | not-applicable
|
||||||
follow-up-required:
|
follow-up-required:
|
||||||
- <bullet list>
|
- <bullet list>
|
||||||
```
|
```
|
||||||
- `MEMORY.md → Architecture Overlay Incident (model_brain.py 227→354 LOC from "fixes" — never patch, fix root formulas)`
|
- `Architecture Overlay Incident (model_brain.py 227→354 LOC from "fixes" — never patch, fix root formulas)`
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ model: sonnet
|
||||||
|
|
||||||
# ROLE
|
# ROLE
|
||||||
|
|
||||||
You are the cost guardian. Your job is to make sure no paid compute launches without a verified cost estimate, a checked dashboard, and a clean head-room calculation. You stop runaway spend before it starts. You are READ-ONLY: you emit a GO/NO-GO report card; you do NOT launch jobs yourself (hand back to user or `ml-implementer`). **The $98.78 Modal incident (2026-02-26)** is the cautionary tale: prices guessed not verified, silent retries re-billing, file changes never confirmed, dashboard never checked. Every protocol below exists because of that day — never again.
|
You are the cost guardian. Your job is to make sure no paid compute launches without a verified cost estimate, a checked dashboard, and a clean head-room calculation. You stop runaway spend before it starts. You are READ-ONLY: you emit a GO/NO-GO report card; you do NOT launch jobs yourself (hand back to user or `ml-implementer`). **The $98.78 Modal incident** is the cautionary tale: prices guessed not verified, silent retries re-billing, file changes never confirmed, dashboard never checked. Every protocol below exists because of that day — never again.
|
||||||
|
|
||||||
# AGENT SUBSTRATE — role `read-only`
|
# AGENT SUBSTRATE — role `read-only`
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -438,9 +438,9 @@ Blockers / next: <list>
|
||||||
- `{path::user-rules}/git-conventions.md`
|
- `{path::user-rules}/git-conventions.md`
|
||||||
- `{path::user-rules}/dev-workflow.md`
|
- `{path::user-rules}/dev-workflow.md`
|
||||||
- `{path::user-memory}/security-restricted-projects.md`
|
- `{path::user-memory}/security-restricted-projects.md`
|
||||||
- `MEMORY.md → Compute Cost Incident (2026-02-26): $98.78 Modal overrun — no dashboard check, unverified prices.`
|
- `Compute Cost Incident: $98.78 Modal overrun — no dashboard check, unverified prices.`
|
||||||
- `MEMORY.md → Recruiter shared-EC2 risk (<ec2-instance-id> shared with 3 projects, default SECRET_KEY, no CSRF).`
|
- `Recruiter shared-EC2 risk (<ec2-instance-id> shared with 3 projects, default SECRET_KEY, no CSRF).`
|
||||||
- `MEMORY.md → CloudSync 146 GB bloat: two duplicate LaunchAgents both writing logs. Scan for duplicates before adding infra.`
|
- `CloudSync 146 GB bloat: two duplicate LaunchAgents both writing logs. Scan for duplicates before adding infra.`
|
||||||
|
|
||||||
## Output Footer (RULE 0.16)
|
## Output Footer (RULE 0.16)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -483,8 +483,8 @@ Blockers / next: <list>
|
||||||
- `{path::user-rules}/manifold-tangent-sanity.md`
|
- `{path::user-rules}/manifold-tangent-sanity.md`
|
||||||
- `{path::user-rules}/no-downgrade-constructive.md`
|
- `{path::user-rules}/no-downgrade-constructive.md`
|
||||||
- `{path::user-memory}/wrong-paths-specialized-ml.md`
|
- `{path::user-memory}/wrong-paths-specialized-ml.md`
|
||||||
- `MEMORY.md → Compute Cost Incident (2026-02-26): promised $27, spent $98.78 on Modal. NEVER AGAIN.`
|
- `Compute Cost Incident: promised $27, spent $98.78 on Modal. NEVER AGAIN.`
|
||||||
- `MEMORY.md → Architecture Overlay Incident: model_brain.py 227→354 LOC from audit fixes. No Patching.`
|
- `Architecture Overlay Incident: model_brain.py 227→354 LOC from audit fixes. No Patching.`
|
||||||
|
|
||||||
## Output Footer (RULE 0.16)
|
## Output Footer (RULE 0.16)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,9 +11,9 @@ model: sonnet
|
||||||
|
|
||||||
You are the Modal compute orchestrator. You launch Modal jobs safely, observe them well, and NEVER burn money or kill running work. Two incidents shape every rule below.
|
You are the Modal compute orchestrator. You launch Modal jobs safely, observe them well, and NEVER burn money or kill running work. Two incidents shape every rule below.
|
||||||
|
|
||||||
$98.78 Modal Incident (2026-02-26): promised $27, spent $98.78 in one session. Prices guessed not verified, failed retries silently re-billed, file changes never confirmed, dashboard never checked. Every cost rule exists because of that day.
|
$98.78 Modal Incident: promised $27, spent $98.78 in one session. Prices guessed not verified, failed retries silently re-billed, file changes never confirmed, dashboard never checked. Every cost rule exists because of that day.
|
||||||
|
|
||||||
anti-stop guard Incident (2026-03-29): stopped a 1.4-hour training run for a non-critical bug. Cost: 1.4 hours A10G + restart + re-warmup. Every kill rule exists because of that day.
|
anti-stop guard Incident: stopped a 1.4-hour training run for a non-critical bug. Cost: 1.4 hours A10G + restart + re-warmup. Every kill rule exists because of that day.
|
||||||
|
|
||||||
Cost tiers: <$5 per run → AUTO; $5-$20 → WARN + daily-cap check ($20/day session); >$20 → STOP and ask. Always state estimate in dollars BEFORE launch: "Estimate: $X.XX (= N_gpus × hours × $/hr/gpu)". GPU compat: A10G torch>=2.0 (~$1.10/hr), H100 torch>=2.1 (~$4.50/hr), B200 torch>=2.6 (~$8/hr). Always verify on pricing page — rates change.
|
Cost tiers: <$5 per run → AUTO; $5-$20 → WARN + daily-cap check ($20/day session); >$20 → STOP and ask. Always state estimate in dollars BEFORE launch: "Estimate: $X.XX (= N_gpus × hours × $/hr/gpu)". GPU compat: A10G torch>=2.0 (~$1.10/hr), H100 torch>=2.1 (~$4.50/hr), B200 torch>=2.6 (~$8/hr). Always verify on pricing page — rates change.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -99,7 +99,7 @@ extra = [
|
||||||
"path:user-rules/dev-workflow.md",
|
"path:user-rules/dev-workflow.md",
|
||||||
"path:user-rules/debugging.md",
|
"path:user-rules/debugging.md",
|
||||||
"path:user-rules/karpathy-behavioral.md",
|
"path:user-rules/karpathy-behavioral.md",
|
||||||
"MEMORY.md → Architecture Overlay Incident (model_brain.py 227→354 LOC from \"fixes\" — never patch, fix root formulas)",
|
"Architecture Overlay Incident (model_brain.py 227→354 LOC from \"fixes\" — never patch, fix root formulas)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ You are the cost guardian. Your job is to make sure no paid compute launches wit
|
||||||
verified cost estimate, a checked dashboard, and a clean head-room calculation. You stop \
|
verified cost estimate, a checked dashboard, and a clean head-room calculation. You stop \
|
||||||
runaway spend before it starts. You are READ-ONLY: you emit a GO/NO-GO report card; you do \
|
runaway spend before it starts. You are READ-ONLY: you emit a GO/NO-GO report card; you do \
|
||||||
NOT launch jobs yourself (hand back to user or `ml-implementer`). **The $98.78 Modal incident \
|
NOT launch jobs yourself (hand back to user or `ml-implementer`). **The $98.78 Modal incident \
|
||||||
(2026-02-26)** is the cautionary tale: prices guessed not verified, silent retries \
|
** is the cautionary tale: prices guessed not verified, silent retries \
|
||||||
re-billing, file changes never confirmed, dashboard never checked. Every protocol below \
|
re-billing, file changes never confirmed, dashboard never checked. Every protocol below \
|
||||||
exists because of that day — never again.
|
exists because of that day — never again.
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
|
|
@ -100,9 +100,9 @@ extra = [
|
||||||
"path:user-rules/git-conventions.md",
|
"path:user-rules/git-conventions.md",
|
||||||
"path:user-rules/dev-workflow.md",
|
"path:user-rules/dev-workflow.md",
|
||||||
"path:user-memory/security-restricted-projects.md",
|
"path:user-memory/security-restricted-projects.md",
|
||||||
"MEMORY.md → Compute Cost Incident (2026-02-26): $98.78 Modal overrun — no dashboard check, unverified prices.",
|
"Compute Cost Incident: $98.78 Modal overrun — no dashboard check, unverified prices.",
|
||||||
"MEMORY.md → Recruiter shared-EC2 risk (<ec2-instance-id> shared with 3 projects, default SECRET_KEY, no CSRF).",
|
"Recruiter shared-EC2 risk (<ec2-instance-id> shared with 3 projects, default SECRET_KEY, no CSRF).",
|
||||||
"MEMORY.md → CloudSync 146 GB bloat: two duplicate LaunchAgents both writing logs. Scan for duplicates before adding infra.",
|
"CloudSync 146 GB bloat: two duplicate LaunchAgents both writing logs. Scan for duplicates before adding infra.",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -113,8 +113,8 @@ extra = [
|
||||||
"path:user-rules/manifold-tangent-sanity.md",
|
"path:user-rules/manifold-tangent-sanity.md",
|
||||||
"path:user-rules/no-downgrade-constructive.md",
|
"path:user-rules/no-downgrade-constructive.md",
|
||||||
"path:user-memory/wrong-paths-specialized-ml.md", # TODO verify path:user-memory exists in assembler resolver
|
"path:user-memory/wrong-paths-specialized-ml.md", # TODO verify path:user-memory exists in assembler resolver
|
||||||
"MEMORY.md → Compute Cost Incident (2026-02-26): promised $27, spent $98.78 on Modal. NEVER AGAIN.",
|
"Compute Cost Incident: promised $27, spent $98.78 on Modal. NEVER AGAIN.",
|
||||||
"MEMORY.md → Architecture Overlay Incident: model_brain.py 227→354 LOC from audit fixes. No Patching.",
|
"Architecture Overlay Incident: model_brain.py 227→354 LOC from audit fixes. No Patching.",
|
||||||
]
|
]
|
||||||
|
|
||||||
[taxonomy]
|
[taxonomy]
|
||||||
|
|
|
||||||
|
|
@ -12,11 +12,11 @@ role = """
|
||||||
You are the Modal compute orchestrator. You launch Modal jobs safely, observe them well, and NEVER \
|
You are the Modal compute orchestrator. You launch Modal jobs safely, observe them well, and NEVER \
|
||||||
burn money or kill running work. Two incidents shape every rule below.
|
burn money or kill running work. Two incidents shape every rule below.
|
||||||
|
|
||||||
$98.78 Modal Incident (2026-02-26): promised $27, spent $98.78 in one session. Prices guessed not \
|
$98.78 Modal Incident: promised $27, spent $98.78 in one session. Prices guessed not \
|
||||||
verified, failed retries silently re-billed, file changes never confirmed, dashboard never checked. \
|
verified, failed retries silently re-billed, file changes never confirmed, dashboard never checked. \
|
||||||
Every cost rule exists because of that day.
|
Every cost rule exists because of that day.
|
||||||
|
|
||||||
anti-stop guard Incident (2026-03-29): stopped a 1.4-hour training run for a non-critical bug. Cost: \
|
anti-stop guard Incident: stopped a 1.4-hour training run for a non-critical bug. Cost: \
|
||||||
1.4 hours A10G + restart + re-warmup. Every kill rule exists because of that day.
|
1.4 hours A10G + restart + re-warmup. Every kill rule exists because of that day.
|
||||||
|
|
||||||
Cost tiers: <$5 per run → AUTO; $5-$20 → WARN + daily-cap check ($20/day session); >$20 → STOP \
|
Cost tiers: <$5 per run → AUTO; $5-$20 → WARN + daily-cap check ($20/day session); >$20 → STOP \
|
||||||
|
|
|
||||||
|
|
@ -32,8 +32,8 @@ All hooks live under `hooks/` directory. Format: `| Hook Name | Event | Severity
|
||||||
|
|
||||||
| Hook | Event | Severity | Purpose | Bypass Env |
|
| Hook | Event | Severity | Purpose | Bypass Env |
|
||||||
|------|-------|----------|---------|-----------|
|
|------|-------|----------|---------|-----------|
|
||||||
| no-github-push.sh | PreToolUse:Bash | block | Prevent pushing KeiTech patent IP to github.com — destroys priority date | KEI_NO_GITHUB_PUSH_BYPASS |
|
| no-github-push.sh | PreToolUse:Bash | block | Block accidental push / repo-create to github.com (opt-in; for code kept on a private remote) | KEI_NO_GITHUB_PUSH_BYPASS |
|
||||||
| no-python-without-approval.sh | PreToolUse:Bash | block | Enforce RULE 0.2 (Rust first) — Python requires exception justification | none |
|
| no-python-without-approval.sh | PreToolUse:Bash | block | Optional Rust-first policy — Python requires explicit justification (opt-in, stack-gated) | none |
|
||||||
| rust-first.sh | UserPromptSubmit | remind | Remind about Rust-first default for new work | none |
|
| rust-first.sh | UserPromptSubmit | remind | Remind about Rust-first default for new work | none |
|
||||||
| secrets-pre-guard.sh | PreToolUse:Edit\|Write | block | Detect hardcoded API keys, tokens, private keys before commit | KEI_SECRETS_GUARD_BYPASS |
|
| secrets-pre-guard.sh | PreToolUse:Edit\|Write | block | Detect hardcoded API keys, tokens, private keys before commit | KEI_SECRETS_GUARD_BYPASS |
|
||||||
| destructive-guard.sh | PreToolUse:Bash | block | Block dangerous commands (rm -rf /, git reset --hard main, truncate) | none |
|
| destructive-guard.sh | PreToolUse:Bash | block | Block dangerous commands (rm -rf /, git reset --hard main, truncate) | none |
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# DELETED — 2026-05-02
|
# DELETED — 2026-05-02
|
||||||
# Reasons:
|
# Reasons:
|
||||||
# 1. Hardcoded path leak: /Users/denis/projects/ai machine learning/error-patterns.json
|
# 1. Hardcoded absolute path leak (machine-specific, author-local)
|
||||||
# 2. RULE 0.2 violation: used python3 for JSON parsing
|
# 2. Language-policy violation: used python3 for JSON parsing
|
||||||
# 3. No-op on every machine except original author's
|
# 3. No-op on every machine except the original author's
|
||||||
# Removed from settings-snippet.json PostToolUse matcher "*" block.
|
# Removed from settings-snippet.json PostToolUse matcher "*" block.
|
||||||
exit 0
|
exit 0
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
# Bypass: GRAPH_EXPORT_BYPASS=1
|
# Bypass: GRAPH_EXPORT_BYPASS=1
|
||||||
|
|
||||||
INTERVAL="${KEI_GRAPH_EXPORT_INTERVAL_S:-5}"
|
INTERVAL="${KEI_GRAPH_EXPORT_INTERVAL_S:-5}"
|
||||||
OUT="${KEI_GRAPH_VIZ_DIR:-$HOME/Projects/lbm-graph-viz}/data-runtime.js"
|
OUT="${KEI_GRAPH_VIZ_DIR:-$HOME/.local/share/kei/graph-viz}/data-runtime.js"
|
||||||
BIN="$(command -v kei-graph-export 2>/dev/null || echo "$HOME/.cargo/bin/kei-graph-export")"
|
BIN="$(command -v kei-graph-export 2>/dev/null || echo "$HOME/.cargo/bin/kei-graph-export")"
|
||||||
|
|
||||||
[ -x "$BIN" ] || exit 0
|
[ -x "$BIN" ] || exit 0
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# no-github-push.sh — PreToolUse:Bash hard deny (RULE 0.1 NO GITHUB PUSH)
|
# no-github-push.sh — PreToolUse:Bash hard deny.
|
||||||
#
|
#
|
||||||
# Blocks any Bash command that would push code to github.com.
|
# Blocks any Bash command that would push code or create a repo on github.com.
|
||||||
# KeiTech portfolio contains unfiled patent IP — a public push destroys
|
# Opt-in guard for teams that keep proprietary code on a private remote
|
||||||
# priority date and trade secrets. Irrecoverable.
|
# (Forgejo / Gitea / self-hosted) and want a hard stop against an accidental
|
||||||
|
# public push. Off by default in the public kit — enable it in onboarding.
|
||||||
#
|
#
|
||||||
# Exit codes:
|
# Exit codes:
|
||||||
# 0 = pass (command is safe)
|
# 0 = pass (command is safe)
|
||||||
|
|
@ -69,18 +70,16 @@ fi
|
||||||
|
|
||||||
# --- Block ------------------------------------------------------------------
|
# --- Block ------------------------------------------------------------------
|
||||||
cat >&2 <<'EOF'
|
cat >&2 <<'EOF'
|
||||||
[no-github-push] BLOCK — RULE 0.1 NO GITHUB PUSH
|
[no-github-push] BLOCK — push to github.com is disabled by this guard.
|
||||||
KeiTech portfolio contains unfiled patent IP. Public push destroys
|
This checkout is configured to stay on a private remote; a public push
|
||||||
priority date + trade secrets. Irrecoverable.
|
could expose code you intend to keep private.
|
||||||
|
|
||||||
Use a private remote instead (Forgejo, Gitea, self-hosted):
|
Use your private remote instead (Forgejo, Gitea, self-hosted):
|
||||||
git remote set-url origin ssh://git@<private-host>/<user>/<repo>.git
|
git remote set-url origin ssh://git@<private-host>/<user>/<repo>.git
|
||||||
git push origin <branch>
|
git push origin <branch>
|
||||||
|
|
||||||
Bypass (visible, per-call):
|
Bypass (visible, per-call):
|
||||||
Set env KEI_NO_GITHUB_PUSH_BYPASS=1 before the command.
|
Set env KEI_NO_GITHUB_PUSH_BYPASS=1 before the command.
|
||||||
You must also add confirmation phrase: "yes, push patent code to github"
|
|
||||||
+ "confirm publication" in the session turn.
|
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
exit 2
|
exit 2
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@ Store the reply verbatim as `REPO`.
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Store as `PLATFORM`. If `Both` is selected, emit a one-line confirm: "You understand — only non-patent code ever pushes to GitHub?" and wait for a `y` typed reply before proceeding.
|
Store as `PLATFORM`. If `Both` is selected, emit a one-line confirm: "You understand — only public-safe code ever pushes to GitHub?" and wait for a `y` typed reply before proceeding.
|
||||||
|
|
||||||
## 1c — Languages click (AskUserQuestion, multi-select)
|
## 1c — Languages click (AskUserQuestion, multi-select)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue