public/ (Default.asp, web.config), core/* (vendored framework internals, read-only per rule), app/ (controllers/, views/, models/, repositories/, autoload files), db/webdata.accdb, db/migrations/, scripts/*.vbs (generators), tests/ (aspunit harness, bootstrap.asp, test-manifest.asp), applicationhost.config, run_site.cmd, TESTING.md, logs/, .devfoundry/references/environments.mdDRAFT before user approval.specs/active/ was empty; no conflict..devfoundry/references/environments.md.completed: timestamp space.Every ASP Classic rule and reference in this repo (.devfoundry/rules/legacy-asp-vb6.md rules 6 and 8, .devfoundry/references/asp-classic-framework.md) assumes a RouteKit Classic ASP application already exists under public/, core/, app/, db/, tests/. None of those directories existed in this repo before this spec — DevFoundry was pure process scaffold with no application code. This spec vendors the framework in and confirms its baseline (migrations, error logging, aspunit harness) actually works. This is the first non-meta spec DevFoundry has completed — SPEC-001–003 were all documentation-only.
No other active specs existed, so there were no target-file conflicts.
Blocking questions resolved during drafting (research performed instead of guessing, per .devfoundry/skills/spec-interview.md step 7):
https://onefortheroadgit.sytes.net/dcovington/asp-classic-unified-framework.git at commit e15cf7bf56a44f72471d07503ae16c481e6fed3f (“Refactor project into generic starter template”).run_site.cmd + applicationhost.config — rather than requiring a full Windows Server IIS install. Confirmed IIS Express is installed on this machine (C:\Program Files\IIS Express\iisexpress.exe, both x86 and x64), and Microsoft.ACE.OLEDB.12.0 plus 64-bit Access ODBC drivers are registered.TESTING.md and confirmed by actually running it (see Step 6): the aspunit runner UI is JS-driven (ASPUnitRunner.asp fetches each manifest page client-side as <page>?task=test); for non-interactive/agent verification, hitting each manifest page directly with ?task=test returns raw JSON results.Deviation from the source repo found during vendoring: despite the source commit's message claiming removal of “domain-specific controllers, models, repositories, and views,” the checkout still contained one leftover domain-specific migration (db/migrations/20260324110000_add_do_not_call_fields_to_households.asp, referencing Households/HouseholderNames tables) and two scripts from an unrelated prior project (scripts/migrate_isbusiness_to_households.vbs, scripts/deploy-iis-git.ps1, the latter hardcoded to a project named “asp-territory”). Queried db/webdata.accdb directly via ADODB.Connection.OpenSchema before vendoring — it only contains schema_migrations and users tables, confirming the domain-specific migration was never actually applied to this copy. All three leftover files were excluded from vendoring rather than silently included.
core/, public/, db/, scripts/, tests/ directories are vendored into this repo root, then the layout matches .devfoundry/references/asp-classic-framework.md exactly. — PASSpublic/web.config <appSettings> is configured, then ConnectionString, Environment, EnableErrorLogging, and ErrorLogPath hold real working values (no secret committed in plaintext) matching .devfoundry/references/environments.md. — PASStests/ aspunit harness is wired up as its own IIS application per TESTING.md, when it is run, then the framework's own baseline test suite passes with zero application code added yet. — PASScscript scripts\runMigrations.vbs status then up is run against db/webdata.accdb, then the schema_migrations table exists and no pending migrations remain. — PASS.devfoundry/references/environments.md is reviewed, then Runtime Versions and Build/Test/Lint Commands are filled in with real confirmed values, not blanks. — PASSdb/webdata.accdb was vendored as-is (contains schema_migrations and users tables only — verified via ADODB.Connection.OpenSchema before any migration ran). No pending migrations were run beyond the framework's own pre-applied baseline. Rollback: delete the vendored public/, core/, app/, db/, scripts/, tests/, applicationhost.config, run_site.cmd, TESTING.md, logs/ directories/files — this reverts the repo to its pre-SPEC-004 scaffold-only state (no destructive change was made to any pre-existing DevFoundry file's content, only .devfoundry/references/environments.md was edited in place).core/ files.asp-classic-framework.md), satisfying the MVC-by-default rule trivially since no custom architecture decision was made here.ErrorHandler_Class as already documented in asp-classic-framework.md. EnableErrorLogging was turned on (true) with a real ErrorLogPath so future feature specs have working error logging from day one; no handled error has occurred yet, so the log file itself has not been created (flagged for the next spec that exercises an error path, not treated as a blocker here).public/, core/, tests/ existed in this repo prior to vendoring (find returned nothing) — files: specs/active/SPEC-004-routekit-bootstrap.md — completed: 2026-08-19 22:51core/, public/, app/, db/, scripts/, tests/, applicationhost.config, run_site.cmd, TESTING.md into this repo root, excluding the three leftover domain-specific files described above — files: as listed in Target Files — completed: 2026-08-19 22:55public/web.config (ConnectionString pointed at the vendored db/webdata.accdb, EnableErrorLogging=true, ErrorLogPath set), created logs/, added a second IIS Express site (Tests Web Site, port 8085) to applicationhost.config, set tests/web.config's ProductionAppBaseUrl to the real production port, and mirrored all real values into .devfoundry/references/environments.md — files: public/web.config, applicationhost.config, tests/web.config, .devfoundry/references/environments.md — completed: 2026-08-19 22:58cscript scripts/runMigrations.vbs status — output: “Applied migrations: 1 ... Pending migrations: 0” — confirmed schema_migrations/users tables exist and nothing is pending — files: db/webdata.accdb — completed: 2026-08-19 22:59iisexpress /config: without /site: only auto-starts the first <site>, so run_site.cmd was corrected to launch one process per site with ASPC_STARTER_ROOT set). Fetched http://localhost:8080/ and got a real rendered HomeController page. Ran all 8 registered aspunit test pages directly via <page>?task=test (since the browser runner is JS-driven and not curl-observable) and recorded real JSON output for each — files: tests/, run_site.cmd — completed: 2026-08-19 23:00core/, public/, app/, db/, scripts/, tests/) matches asp-classic-framework.md's documented layout — confirmed via find listing during vendoring.public/web.config appSettings confirmed non-placeholder (ConnectionString points at the real vendored .accdb path, EnableErrorLogging=true, real ErrorLogPath); no secret committed (Access connection string has no password field for this provider)..devfoundry/skills/regression-check.md step 3 — no manual-trace substitute used): all 8 manifest pages returned "passed":true" with 26/26 tests passing, 0 failures:
unit/TestHelpers.asp — 6/6 passunit/TestControllerRegistry.asp — 5/5 passcomponent/TestHomeController.asp — 2/2 passintegration/TestMvcDispatch.asp — 2/2 passintegration/TestRoutes.asp — 3/3 passintegration/TestConfigSettings.asp — 3/3 passintegration/TestRenderedOutput.asp — 2/2 pass (hit the real running production site at http://localhost:8080/ and /404, got real 200/404 responses with real rendered markup)integration/TestSharedLayout.asp — 3/3 passrunMigrations.vbs status output showed Pending migrations: 0..devfoundry/references/environments.md — Runtime Versions and Build/Test/Lint Commands sections now contain real confirmed values, no blanks remain in those sections..devfoundry/references/environments.md was extended, not replaced.Filled by the Process Improver per .devfoundry/skills/process-retrospective.md, after QA approval and before archiving.
asp-classic-framework.md's prose alone) surfaced two real, otherwise-invisible problems before they became runtime bugs: leftover domain-specific artifacts misdescribed as a “generic starter,” and an IIS Express multi-site startup behavior that silently drops the second site. Querying the .accdb's actual schema via ADODB before running any migration avoided assuming the “generic” claim was accurate. Running the real aspunit suite directly against each manifest page's ?task=test endpoint (bypassing the JS-driven browser runner, which curl can't execute) gave real, parseable, per-suite pass/fail output instead of a checklist claim..devfoundry/references/asp-classic-framework.md (written in SPEC-002) describes the framework's structure accurately but doesn't mention that: (a) the source repo can carry leftover non-generic artifacts that must be checked against the actual .accdb schema before trusting a “generic” claim, or (b) IIS Express requires one process per site with explicit /site: even when serverAutoStart="true" is set on all sites. Both are now documented directly in environments.md and run_site.cmd's own comments rather than only in this spec, so a future spec doesn't have to rediscover them..devfoundry/improvement-log.md: yesPowered by TurnKey Linux.