Version: 0.1 (development specification)
Status: Proposed; implementation behavior must be verified on the target Windows/IIS host.
Build a small, maintainable, WSC-first MVC framework for Classic ASP. IIS receives HTTP traffic; a single ASP bootstrap dispatches requests to VBScript Windows Script Components registered as COM objects. Application behavior lives in WSC files; presentation lives in separate HTML templates. Ship verified increments rather than an elaborate untested framework.
.wsc COM components; stable ProgIDs and CLSIDs..html templates, served only through the rendering layer when containing placeholders or private content.Default.asp, plus IIS rewrite configuration and optional Global.asa only if justified.No ORM, controller auto-discovery, automatic reflection, hot reload, plugin system, migrations, authentication, session-backed COM instances, application-scoped WSC instances, database-backed example, complex DI, or production-ready HTML parser. Do not implement these speculatively.
GET /hello -> IIS URL Rewrite -> /Default.asp -> Server.CreateObject("WscMvc.Application") -> Application.Run(...) -> WscMvc.HomeController -> string/response contract -> HTTP 200, text/html; charset=utf-8, body Hello from WSC-MVC!.
Prefer a bootstrap with Option Explicit, no business logic, no includes, no embedded HTML, and only request-host wiring. Define and verify a precise ownership rule for HTTP status, headers, and writing: do not write a partially successful response before dispatch can fail. Test whether COM calls can accept the proposed ASP built-in objects; if passing an object fails, use a tested host adapter or pass only primitive request data. Do not silently assume an ASP object is serializable or universally callable from WSC.
Revised 2026-09-19 (explicit user direction, superseding the original v0.1 tree): IIS's site physical path is a public/ folder only — never the project root. Every other project directory is a sibling of the folder actually served, entirely outside the served tree — not reachable by IIS regardless of web.config, which is a stronger guarantee than request-filtering rules over a shared directory. Default.asp reaches sibling directories (e.g. logs/) via a parent-relative Server.MapPath, which requires enableParentPaths=true for the site. See docs/DECISIONS.md for the full rationale and docs/ARCHITECTURE.md for how it's wired up.
Further revised 2026-09-19 (same day, same direction): the diagnostics/test harness (GET /self-test) is its own separate IIS site/app (test-app/), not a route on the production site. Only Framework/ is shared between the two sites (registered once, globally via COM) — Controllers/ is not shared: it holds application-specific business logic, so production's Controllers/HomeController.wsc and the test-app's own test-app/Controllers/SelfTestController.wsc are kept apart. Each site also owns its thin Default.asp bootstrap and passes its fixed application name into the shared framework, so a direct Default.asp?route=... request cannot activate the other app's routes; see docs/DECISIONS.md.
WSC-MVC/
public/ # production site's IIS physical path
Default.asp # selects only production routes
web.config
test-app/
public/ # test-app site's IIS physical path (separate site/port)
Default.asp # selects only test routes
web.config # only routes /self-test
Controllers/
SelfTestController.wsc # test-app-specific; NOT in the shared Controllers/ below
logs/
app.log # this site's own log, separate from the production one
Framework/ # the ONLY folder shared between both sites
Application.wsc
Router.wsc # phase 3
RequestContext.wsc
ResponseResult.wsc # phase 2; optional if simpler contract works
ViewRenderer.wsc # phase 4
Controllers/ # production's own controllers, not shared with test-app/
HomeController.wsc
Views/
Home.html # phase 4
Layout.html # phase 4
logs/
app.log # production site's log
tests/
Test-Components.vbs
Test-Http.ps1
run-self-test.sh
tools/
Register-Components.ps1
Unregister-Components.ps1
Setup-Site.ps1
docs/
ARCHITECTURE.md
DECISIONS.md
TEST-RESULTS.md
SPEC.md
IMPLEMENTATION_PLAN.md
AGENTS.md
CLAUDE.md
README.md
The tree is a target, not an instruction to create placeholder classes before their phase.
.wsc represents one named, cohesive component. The .wsc XML <registration> establishes COM identity; <public> explicitly lists callable methods/properties; <script language="VBScript"> contains implementation.Class ... End Class placed inside a WSC becomes its exposed COM object. Use and validate the WSC script/public syntax on the target host.WscMvc.ComponentName ProgIDs, and a unique, stable GUID per component (never recycle across unrelated components).Initialize(...) is a framework convention, not an automatic WSC constructor.Set) or scalars, and how missing/Null/Empty values are handled..wsc, .vbs, .ps1, .md, .config where appropriate, source/private directories, test output, logs, and templates. IIS configuration must be tested, including direct-extension and path variations.web.config is not a substitute for NTFS permissions or placing private source outside webroot; verify both where practical.On Error Resume Next only around an operation whose Err.Number is immediately checked and cleared; otherwise use On Error GoTo 0.M0: Inspect repository/environment; record OS/IIS/ASP/bitness/permissions and missing tools. No claim of execution on Linux/macOS.
M1: Application.wsc and HomeController.wsc register and instantiate; /hello returns expected 200/body; isolated WSH test where possible; registration is reversible.
M2: Request/response context, central error mapping, per-request object lifetime; concurrent request smoke test.
M3: Static route table, GET/POST method dispatch, 400/404/405 tests, safe URL handling.
M4: Separate HTML templates and encoding tests; layout only after basic rendering passes.
M5: ADODB connection lifecycle, parameterized queries, transactions, repository tests against an explicitly configured test DB.
M6: Security, session/auth architecture, logging, deployment and concurrency hardening.
M7: Scaffolding, repeatable tests, documentation, agent-guided quality improvements.
Each milestone needs passing evidence before the next. Explicitly document any blocked milestone.
cscript //nologo tests\Test-Components.vbs reports successful creation and expected method result (if the component's public API is host-independent).powershell -File tests\Test-Http.ps1 -BaseUrl http://localhost:<port> verifies status, content type, and exact body for /hello.docs/DECISIONS.md.Powered by TurnKey Linux.