Pre-launch — Gluecron is in final validation. Public signups and git hosting for non-owner users open after launch review.
CodeIssuesDiscussionsWikiPull RequestsProjectsCommitsActionsReleasesContributorsPulse● GatesSecuritySettingsDeploymentsPipelineInsightsAgents✨ Explain✨ Ask AI✨ Workspace✨ Spec✨ Tests▓ Debt Map✨ NL Search🏛 Archaeology
claude/adoring-hopper-5x74bqclaude/affectionate-feynman-ykrf1hclaude/architecture-audit-design-wxprenclaude/build-status-update-3MXsfclaude/charming-meitner-mllb5rclaude/compare-gate-gluecron-s4mFQclaude/confident-faraday-tikcwbclaude/continue-work-XMTlIclaude/crontech-gluecron-deploy-7MIECclaude/crontech-platform-setup-SeKfwclaude/design-2026claude/ecstatic-ptolemy-jMdigclaude/enhance-github-integration-QNHdGclaude/fix-aa-loop-issue-PonMQclaude/fix-actions-and-processclaude/fix-desktop-errors-XqoW8claude/fix-red-workflowsclaude/fix-website-access-6FKJNclaude/gatetest-integration-hardeningclaude/github-audit-improvements-bDFr9claude/gluecron-launch-status-FoMRlclaude/hopeful-lamport-olfCTclaude/issue-to-pr-and-protectionsclaude/jolly-heisenberg-2sg1Qclaude/launch-preparation-QmTb6claude/new-session-xk1l7claude/plan-platform-architecture-kkN4yclaude/platform-analysis-roadmap-1nUGLclaude/platform-launch-assessment-8dWV8claude/polish-platform-release-AeDrUclaude/resume-previous-work-KzyLwclaude/review-crontech-handoff-qYEVqclaude/review-project-completeness-lHhS2claude/review-readme-docs-ulqPKclaude/serene-edison-rj87weclaude/setup-multi-repo-dev-BCwNQclaude/ship-fixes-and-tests-Jvz1cclaude/site-audit-competitive-pctlwgclaude/site-migration-vercel-XstpKclaude/standalone-product-repos-XHFTDcopilot/feat-smart-empty-states-keyboard-first-enhancementcopilot/feat-smart-morning-digest-review-context-restorecopilot/fix-and-process-workflowscopilot/update-ai-powered-code-reviewfeat/debt-mapfeat/push-policy-codeowners-hardeningfeat/smart-digest-contextfeat/stage-impactfeat/t1-secret-migrationfeat/u-polishfeat/w-self-hostfeat/w2-claude-configfix/agent-journey-orphan-sweepgatetest/auto-fix-1776586424172gatetest/auto-fix-1776586534814gatetest/auto-fix-1776590685143gatetest/auto-fix-1776590808199mainops/redeploy-retriggerstyle/dxt-cta-themeworktree-agent-a3377aad30d55da26worktree-agent-a7ef607b7ee1d6c74
AUDIT-2026-07-09.md6.5 KB · 119 lines
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# Gluecron Audit & Work Log — 2026-07-09

Verified against **code and the live site**, not the older markdown docs
(several of which were stale — noted inline). Supersedes the 2026-07-07 audit
where they disagree.

## TL;DR

- Last week's deploy **did** ship: gluecron.com runs current `main` (light
  landing, login with password form + lockout throttle, the 07-07 security
  fixes). The "still looks like the old site" feeling is the **logged-in app
  shell**, not the landing — and it was mostly a **stale `theme=dark` cookie**
  plus indigo buttons / dark-only code highlighting. Fixed (see Design).
- Biggest strategic gap remains: **CI does not run on push.**
- New priority this session: **cut the GitHub mirror, go fully self-sufficient.**
  Architecture was ready; the durability gap (no offsite repo backup) is now
  closed in code and sequenced in a runbook.

## What shipped this session (local commits on `main`, not yet deployed)

Push to `main`/deploy is pending owner authorization + a `GLUECRON_PAT`
(the auto-classifier blocked the push; deploy needs the canonical remote).

| Area | Commits | Summary |
|---|---|---|
| Self-sufficiency | offsite backup, LF attr, bootstrap, docs, runbook | See Track C below |
| Security | api-v2 IDOR/leak, GitHub OAuth takeover | 2 of 3 open HIGHs fixed |
| Design | QI light foundation | tokens + ink buttons + light code highlighting + theme default |
| Docs | MCP `.mcp.json` fix | docs.tsx + connect.tsx corrected |

## Track C — Self-sufficiency (GitHub mirror removal)

Findings: **no automatic self-mirror to GitHub exists** (safe to cut); the
`post-receive.ts``self-deploy.sh` pipeline (health-check + auto-rollback) is
fully built and GitHub-independent in steady state. Two gaps handled:

- **Durability (the real risk):** bare git repos under `GIT_REPOS_PATH` had
  **no off-box copy** — GitHub was the de-facto backup. Added
  `scripts/backup-offsite.sh` (tar repos + `pg_dump` Neon → rclone, fail-loud,
  retention, dead-man's-switch) and `scripts/restore.sh` (DR restore, never
  clobbers prod by default). `.gitattributes` forces LF so the scripts run on Linux.
- **Bootstrap tie:** fresh-host bootstrap seeded from GitHub. `DEFAULT_SOURCE`
  is now empty (`self-bootstrap.ts`, `self-host-bootstrap.ts`, `index.ts`);
  a fresh host re-seeds from a restored backup, not GitHub.
- **Docs/marketing:** `CLAUDE.md` + `SELF_HOST.md` now declare Gluecron
  self-canonical; corrected the false "two-way GitHub mirror" product claim.
- **Runbook:** `docs/CUTOVER_RUNBOOK.md` — owner-executed, backup-first, then
  freeze GitHub → 7 green days → delete in 30. **Decision:** offsite rclone
  backup, freeze-then-delete GitHub, owner runs the VPS steps.

The one fact I can't verify off-box (in the runbook): the VPS `/opt/gluecron`
working-tree `origin` must point at the **local bare repo**, not GitHub.

## Track A — Verification results

**Test suite:** 2910 pass / 122 skip / **23 fail** (pre-existing). Triage:
9 stale skills-bundle assertions, 3 "2030 reboot" landing-hero (DB-mock
`innerJoin` unsupported), 1 stale login-shell assertion (signin-v2 redesign),
several playground/env tests needing `DATABASE_URL`, and **1 real minor bug**:
`GET /:owner/:repo/wiki` on a missing repo returns 200 instead of 404
(`wikis.test.ts`). None are regressions; none block this work.

**Security re-verification** (the 5 still-open 07-07 HIGHs):

| # | Finding | Verdict | Action |
|---|---|---|---|
| 1 | git-grep arg injection | **FIXED** (array argv) | none |
| 2 | X-Forwarded-For spoofing (`rate-limit.ts:89`) | **OPEN** | follow-up (infra-dependent trusted-proxy config) |
| 3 | GitHub OAuth unverified-email takeover | **FIXED this session** | `sso.ts` + `github-oauth.tsx` verified-email gate |
| 4 | SSRF DNS-rebinding | **FIXED** (`assertPublicUrl` in webhook+mirror) | none |
| 5 | api-v2 workflow-dispatch IDOR | **FIXED this session** | write-access gate; also closed an unauth private-repo runs-list leak |

**Broader follow-up:** the api-v2 write surface (issues/PR/label/topic/webhook
POSTs under `requireScope("repo")`) needs a per-endpoint authorization audit —
access level varies, so no blanket rule.

**MCP:** 60 real tools (15 `mcp-tools.ts` + 45 `mcp-tools-expanded.ts`),
`.mcp.json` correct. Fixed `/docs/mcp-server` + `/connect` teaching the wrong
config file. Live 60-tool matrix needs a running instance + PAT (deferred).

**Onboarding:** all landing "Migrate from GitHub" CTAs point to `/import`
(`import.tsx`) — that's the blessed flow; the other 4 route files are
secondary/overlapping. Live import test needs creds (deferred to runbook).

**OAuth login (owner-reported broken):** not a bug — Google/GitHub OAuth was
never configured (`getGoogleOauthConfig` reads an empty `sso_config`). Fix:
owner sets client id/secret at `/admin/google-oauth` + `/admin/github-oauth`;
and the login page should hide unconfigured providers instead of erroring
(small follow-up). GitHub login is now safe to enable after the #3 fix.

## Track B — Design (Quiet Intelligence)

Root cause corrected: the app is **already light-by-default at runtime**; the
"old dark site" was a stale `theme=dark` cookie + a `readTheme()` dark default
(fixed). Shipped B0–B2: QI light tokens (page `#fcfcfd`, ink `#16181d`, ink
primary buttons, green `#1e7f5c`, amber `#b45309`), a light syntax-highlighting
palette (code blocks were dark-only on light pages), theme-color meta — all
scoped to `:root[data-theme='light']` so the locked dark-theme tests stay green.

Remaining (next session): B3 shell chrome + shared `.qi-*` utilities; B4
high-traffic view conversions (dashboard → RepoHeader/RepoNav → repo page → PR
→ issues → auth); B5 long-tail hex sweep (717 `#5b6ee8` + 24 `#58a6ff`) + emails
+ pwa manifest; B6 a hex-count ratchet test. Then a Playwright screenshot sweep.

## Strategic answer — "the platform for the next decade?"

The AI-native/MCP layer is genuinely differentiated (60 MCP tools, agent
sessions, ship-spec — a shape GitHub doesn't have). Four table-stakes gaps keep
it at "impressive demo" rather than "platform you'd bet a company on":

1. **CI doesn't run on push** — every GitHub refugee notices day one.
2. **CI runner has no real sandbox** (env-allowlist only; gVisor/Firecracker/
   nsjail still TODO).
3. **"Verified" commit badge does no real crypto verification.**
4. **Org/team permissions aren't enforced** for repo access.

Next-decade bet: double down on the AI layer while closing those four, and —
now — nail self-sufficiency + durable backups so it can be trusted to run on
its own. The self-sufficiency work this session is the first plank of that.