| @@ -0,0 +1,994 @@ | |||
| # CLAUDE.md | |||
| ## Purpose | |||
| This file defines how Claude and Claude-compatible coding agents should operate in this repository. | |||
| Read `AGENTS.md` first. | |||
| `AGENTS.md` is the primary development policy. | |||
| This file defines agent workflow, reasoning discipline, project learning, and self-improvement behavior. | |||
| --- | |||
| # 1. Startup Procedure | |||
| At the beginning of a development task: | |||
| 1. Read `AGENTS.md`. | |||
| 2. Read this `CLAUDE.md`. | |||
| 3. Inspect relevant files before editing. | |||
| 4. Search the repository for similar implementations. | |||
| 5. Identify existing helpers and abstractions. | |||
| 6. Determine the affected architectural layers. | |||
| 7. Identify security-sensitive boundaries. | |||
| 8. Identify tests relevant to the change. | |||
| Do not immediately generate a new abstraction before understanding the existing project. | |||
| --- | |||
| # 2. Treat VBScript as a Language Requiring Agent-Level Static Analysis | |||
| VBScript lacks many safeguards found in modern compiled languages. | |||
| Therefore, while working, actively inspect for: | |||
| ```text | |||
| undeclared variables | |||
| misspelled identifiers | |||
| missing Set | |||
| wrong argument counts | |||
| implicit Variant conversions | |||
| Null propagation | |||
| Empty values | |||
| Nothing references | |||
| unexpected ByRef mutation | |||
| invalid function return paths | |||
| unsafe SQL | |||
| unsafe HTML output | |||
| broad error suppression | |||
| resource leaks | |||
| global-state coupling | |||
| ``` | |||
| Act as a compiler substitute. | |||
| --- | |||
| # 3. Think in Boundaries | |||
| Before changing code, determine which layer owns the behavior. | |||
| Preferred direction: | |||
| ```text | |||
| Request | |||
| ↓ | |||
| Controller | |||
| ↓ | |||
| Service | |||
| ↓ | |||
| Repository | |||
| ↓ | |||
| Database | |||
| ``` | |||
| Views should receive prepared data. | |||
| Do not bypass layers for convenience. | |||
| --- | |||
| # 4. Avoid Architectural Drift | |||
| When adding functionality, prefer the project's existing good pattern. | |||
| Do not create: | |||
| ```text | |||
| CustomerManager | |||
| CustomerHandler | |||
| CustomerEngine | |||
| CustomerProcessor | |||
| CustomerHelper | |||
| ``` | |||
| if `CustomerService` already represents the business layer. | |||
| Reuse terminology consistently. | |||
| --- | |||
| # 5. Search Before Creating | |||
| Before creating: | |||
| - a helper | |||
| - service | |||
| - repository | |||
| - validator | |||
| - utility | |||
| - model | |||
| - WSC component | |||
| - framework function | |||
| search for an existing implementation. | |||
| Prefer extending an existing appropriate abstraction over creating duplicates. | |||
| --- | |||
| # 6. Make Small Changes | |||
| Prefer the smallest coherent change that solves the problem. | |||
| Avoid unrelated cleanup unless necessary. | |||
| If a task exposes a larger architectural problem: | |||
| 1. solve the requested problem safely | |||
| 2. document the larger concern | |||
| 3. improve the architecture when justified | |||
| Do not turn every bug fix into a rewrite. | |||
| --- | |||
| # 7. Never Hide Errors to Make Code Appear Functional | |||
| Do not use broad: | |||
| ```vbscript | |||
| On Error Resume Next | |||
| ``` | |||
| to make failures disappear. | |||
| Errors should be: | |||
| ```text | |||
| prevented | |||
| handled | |||
| logged | |||
| or propagated | |||
| ``` | |||
| Never silently swallowed. | |||
| --- | |||
| # 8. Security Review Is Mandatory | |||
| For each change involving input, output, authentication, database access, file handling, or state changes, inspect for: | |||
| ```text | |||
| SQL injection | |||
| XSS | |||
| CSRF | |||
| authorization bypass | |||
| open redirects | |||
| path traversal | |||
| unsafe file upload | |||
| sensitive logging | |||
| session misuse | |||
| ``` | |||
| Security checks are not optional even if the user did not explicitly request them. | |||
| --- | |||
| # 9. SQL Generation | |||
| Always prefer parameterized ADODB commands. | |||
| If existing code concatenates SQL, do not copy the unsafe pattern into new code. | |||
| When touching the unsafe section directly, improve it if doing so is reasonably scoped and compatibility can be preserved. | |||
| --- | |||
| # 10. HTML Generation | |||
| Dynamic text should be HTML encoded by default. | |||
| Do not output raw Request or database values into HTML. | |||
| When raw HTML is intentionally supported, make that trust boundary explicit. | |||
| --- | |||
| # 11. Validate at the Boundary | |||
| Convert raw external values into trusted application values early. | |||
| Think: | |||
| ```text | |||
| Raw Request value | |||
| ↓ | |||
| Trim / normalize | |||
| ↓ | |||
| Required check | |||
| ↓ | |||
| Format validation | |||
| ↓ | |||
| Type conversion | |||
| ↓ | |||
| Business validation | |||
| ↓ | |||
| Use | |||
| ``` | |||
| Do not allow raw Request values to flow deeply through the system. | |||
| --- | |||
| # 12. Prefer Explicit Code | |||
| In VBScript, explicit code is usually safer than clever code. | |||
| Prefer: | |||
| ```vbscript | |||
| Dim customerId | |||
| customerId = CLng(value) | |||
| ``` | |||
| over relying on automatic coercion. | |||
| Prefer clear control flow over compressed expressions. | |||
| --- | |||
| # 13. Functions and Procedures | |||
| Keep procedures focused. | |||
| If a function performs several unrelated operations, extract meaningful collaborators. | |||
| Prefer names that describe intent. | |||
| Bad: | |||
| ```text | |||
| ProcessData | |||
| HandleStuff | |||
| DoWork | |||
| RunThing | |||
| ``` | |||
| Better: | |||
| ```text | |||
| ValidateCustomer | |||
| CalculateOrderTotal | |||
| LoadCustomerById | |||
| SaveAppointment | |||
| ``` | |||
| --- | |||
| # 14. ByVal and ByRef | |||
| Remember: | |||
| VBScript defaults parameters to `ByRef`. | |||
| When mutation is not intended, prefer: | |||
| ```vbscript | |||
| ByVal | |||
| ``` | |||
| Use `ByRef` only when caller mutation is intentional. | |||
| Review changed method signatures for accidental ByRef behavior. | |||
| --- | |||
| # 15. Object Assignment | |||
| Remember that object assignment requires `Set`. | |||
| Review every new or modified object assignment. | |||
| Example: | |||
| ```vbscript | |||
| Set service = New CustomerService | |||
| ``` | |||
| not: | |||
| ```vbscript | |||
| service = New CustomerService | |||
| ``` | |||
| --- | |||
| # 16. Function Return Values | |||
| VBScript functions return values by assigning to their own name. | |||
| Review all paths. | |||
| Example: | |||
| ```vbscript | |||
| Function IsAllowed(ByVal userId) | |||
| If userId <= 0 Then | |||
| IsAllowed = False | |||
| Exit Function | |||
| End If | |||
| IsAllowed = True | |||
| End Function | |||
| ``` | |||
| Do not accidentally leave an important return value as Empty. | |||
| --- | |||
| # 17. COM and ADODB Cleanup | |||
| When creating: | |||
| - ADODB.Connection | |||
| - ADODB.Command | |||
| - ADODB.Recordset | |||
| - filesystem objects | |||
| - external COM components | |||
| understand ownership and cleanup behavior. | |||
| Explicitly close database resources when appropriate. | |||
| Set references to `Nothing` when ownership ends. | |||
| --- | |||
| # 18. Avoid Global State | |||
| Prefer explicit dependencies. | |||
| Do not add Session or Application state merely because it is convenient. | |||
| Ask: | |||
| ```text | |||
| Does this value truly need to survive across requests? | |||
| ``` | |||
| If not, keep it request-scoped. | |||
| --- | |||
| # 19. Testing Strategy | |||
| When possible, isolate business logic from ASP globals. | |||
| Favor code that can be invoked with plain VBScript values or mock collaborators. | |||
| When fixing a defect, add a regression test where practical. | |||
| --- | |||
| # 20. Comments | |||
| Comments should explain: | |||
| ```text | |||
| why | |||
| constraints | |||
| non-obvious behavior | |||
| compatibility requirements | |||
| security rationale | |||
| ``` | |||
| Do not add comments that merely repeat the code. | |||
| Bad: | |||
| ```vbscript | |||
| ' Set customer id | |||
| customerId = 10 | |||
| ``` | |||
| Useful: | |||
| ```vbscript | |||
| ' Legacy import files use 0 to represent an unknown customer. | |||
| If customerId = 0 Then | |||
| ``` | |||
| --- | |||
| # 21. Preserve Valuable Legacy Behavior | |||
| ASP Classic projects may contain old but important behavior. | |||
| Do not assume unfamiliar code is wrong. | |||
| Before removing or replacing something: | |||
| 1. search references | |||
| 2. understand callers | |||
| 3. identify side effects | |||
| 4. inspect related documentation | |||
| 5. preserve compatibility where required | |||
| --- | |||
| # 22. Self-Improvement | |||
| This repository is designed to allow agents to improve their own operating instructions. | |||
| Self-improvement should make future work: | |||
| - safer | |||
| - more consistent | |||
| - easier to verify | |||
| - less repetitive | |||
| - more maintainable | |||
| Do not change instructions merely to suit the current implementation. | |||
| Improve the implementation when practical rather than weakening good rules. | |||
| --- | |||
| # 23. Detect Learnable Events | |||
| A learnable event occurs when: | |||
| - a repeated bug appears | |||
| - a review catches the same mistake repeatedly | |||
| - a new reusable pattern proves successful | |||
| - a project architecture decision becomes permanent | |||
| - a new security requirement becomes necessary | |||
| - a repeated workflow can be standardized | |||
| - a user establishes a lasting convention | |||
| - an existing instruction becomes inaccurate | |||
| When a learnable event occurs, determine whether project documentation should change. | |||
| --- | |||
| # 24. Where Learning Should Go | |||
| Use the smallest appropriate scope. | |||
| Update: | |||
| ```text | |||
| AGENTS.md | |||
| ``` | |||
| for project-wide durable policies. | |||
| Update: | |||
| ```text | |||
| CLAUDE.md | |||
| ``` | |||
| for agent workflow and Claude-specific operating behavior. | |||
| Update: | |||
| ```text | |||
| /docs/* | |||
| ``` | |||
| for architectural or project documentation. | |||
| Update: | |||
| ```text | |||
| /skills/* | |||
| ``` | |||
| for reusable specialized procedures. | |||
| Update source-code comments only for code-local constraints. | |||
| Do not place every lesson into AGENTS.md. | |||
| --- | |||
| # 25. Self-Update Decision | |||
| Before modifying an instruction file, ask: | |||
| ```text | |||
| Is this lesson likely to matter again? | |||
| ``` | |||
| If no, do not persist it. | |||
| Then ask: | |||
| ```text | |||
| Is this project-wide? | |||
| ``` | |||
| If yes, consider AGENTS.md. | |||
| Otherwise use a specialized document. | |||
| --- | |||
| # 26. Never Self-Weaken Core Safety Rules | |||
| Claude must not autonomously remove or weaken requirements involving: | |||
| ```text | |||
| Option Explicit | |||
| parameterized SQL | |||
| server-side authorization | |||
| input validation | |||
| output encoding | |||
| safe error handling | |||
| resource cleanup | |||
| secret protection | |||
| ``` | |||
| If an unusual project requirement appears to conflict with one of these rules, preserve safety and document the conflict. | |||
| --- | |||
| # 27. Avoid Instruction Inflation | |||
| Do not add a new rule for every isolated mistake. | |||
| Prefer: | |||
| ```text | |||
| general principle | |||
| + | |||
| reusable example | |||
| ``` | |||
| rather than hundreds of hyper-specific rules. | |||
| A rule should prevent a category of mistakes. | |||
| --- | |||
| # 28. Improve Through Abstractions Too | |||
| Not every lesson belongs in documentation. | |||
| If the same safety requirement appears repeatedly, consider encoding it into the framework. | |||
| Examples: | |||
| ```text | |||
| Safe HTML helper | |||
| Parameterized database wrapper | |||
| Request conversion helper | |||
| Validation library | |||
| Authorization service | |||
| Logging wrapper | |||
| Repository base conventions | |||
| ``` | |||
| The best rule is sometimes one the architecture makes difficult to violate. | |||
| --- | |||
| # 29. Skill Creation | |||
| Claude may create a new skill when the task is: | |||
| - specialized | |||
| - recurring | |||
| - procedural | |||
| - reusable across multiple features | |||
| Possible skills: | |||
| ```text | |||
| /skills/asp-classic-controller.md | |||
| /skills/adodb-repository.md | |||
| /skills/sql-parameterization.md | |||
| /skills/security-review.md | |||
| /skills/vbscript-static-review.md | |||
| /skills/testing.md | |||
| ``` | |||
| Do not create a skill for a one-time task. | |||
| --- | |||
| # 30. Suggested Skill Format | |||
| Each skill should contain: | |||
| ```text | |||
| # Skill Name | |||
| ## Purpose | |||
| ## Use When | |||
| ## Inputs | |||
| ## Procedure | |||
| ## Required Rules | |||
| ## Validation Checklist | |||
| ## Common Mistakes | |||
| ## Output | |||
| ## Improvement Notes | |||
| ``` | |||
| --- | |||
| # 31. Agent Review Loop | |||
| For meaningful tasks, use this cycle: | |||
| ```text | |||
| Understand | |||
| ↓ | |||
| Inspect | |||
| ↓ | |||
| Design | |||
| ↓ | |||
| Implement | |||
| ↓ | |||
| Review | |||
| ↓ | |||
| Test | |||
| ↓ | |||
| Learn | |||
| ``` | |||
| The `Learn` step asks whether the repository's instructions or abstractions should improve. | |||
| --- | |||
| # 32. Design Before Implementation | |||
| For significant changes, identify: | |||
| ```text | |||
| affected layers | |||
| new components | |||
| existing components | |||
| data flow | |||
| validation boundaries | |||
| security boundaries | |||
| failure behavior | |||
| testing strategy | |||
| ``` | |||
| before writing substantial code. | |||
| For small tasks, keep this lightweight. | |||
| --- | |||
| # 33. Avoid Premature Framework Expansion | |||
| Do not add framework components simply because another language would have them. | |||
| ASP Classic should remain simple. | |||
| Only introduce an abstraction when it solves a real recurring problem. | |||
| --- | |||
| # 34. Prefer Composition | |||
| When extending behavior, first consider: | |||
| ```text | |||
| small object | |||
| + | |||
| small collaborator | |||
| ``` | |||
| instead of large pseudo-inheritance systems. | |||
| VBScript is better suited to simple composition. | |||
| --- | |||
| # 35. Stable Public Contracts | |||
| Treat established routes, APIs, class methods, and database contracts carefully. | |||
| When changing them: | |||
| 1. search callers | |||
| 2. assess compatibility | |||
| 3. update all consumers | |||
| 4. document breaking changes | |||
| Avoid accidental interface changes. | |||
| --- | |||
| # 36. Database Changes | |||
| For schema changes, consider: | |||
| ```text | |||
| backward compatibility | |||
| migration order | |||
| existing data | |||
| Null behavior | |||
| indexes | |||
| constraints | |||
| application deployment timing | |||
| rollback implications | |||
| ``` | |||
| Do not modify schema casually. | |||
| --- | |||
| # 37. Performance Review | |||
| When working with database code, look for: | |||
| ```text | |||
| queries inside loops | |||
| SELECT * | |||
| unnecessary recordset traversal | |||
| missing filters | |||
| repeated connection creation | |||
| large Session values | |||
| unbounded result sets | |||
| unnecessary COM calls | |||
| ``` | |||
| Prefer database-side filtering and set operations. | |||
| --- | |||
| # 38. Request Lifecycle Awareness | |||
| Remember that ASP Classic operates per request. | |||
| Avoid assumptions that local variables persist between requests. | |||
| Use Session or persistent storage only when the application truly requires cross-request state. | |||
| --- | |||
| # 39. Application Lifecycle Awareness | |||
| `Application` state is global to the ASP application. | |||
| Do not store user-specific data there. | |||
| Be mindful of concurrent requests. | |||
| --- | |||
| # 40. Avoid Hidden Dependencies | |||
| A component should not unexpectedly require: | |||
| ```text | |||
| Request | |||
| Response | |||
| Session | |||
| Application | |||
| global connection object | |||
| global logger | |||
| global configuration | |||
| ``` | |||
| unless that dependency is part of the documented architecture. | |||
| Prefer passing dependencies explicitly. | |||
| --- | |||
| # 41. Compatibility First During Refactoring | |||
| When modernizing legacy code: | |||
| ```text | |||
| First preserve behavior. | |||
| Then improve structure. | |||
| ``` | |||
| Avoid combining major behavior changes with major refactors unless necessary. | |||
| --- | |||
| # 42. Repository Review After Significant Changes | |||
| After a meaningful feature or refactor, search for: | |||
| - outdated documentation | |||
| - duplicate helpers | |||
| - now-dead code | |||
| - inconsistent naming | |||
| - old patterns replaced by the new pattern | |||
| - opportunities to update an existing skill | |||
| Keep the repository internally consistent. | |||
| --- | |||
| # 43. Learn From User Corrections | |||
| If the user corrects Claude on a durable project convention, treat that as a possible learnable event. | |||
| Examples: | |||
| ```text | |||
| "We always use this router." | |||
| "Repositories never return recordsets." | |||
| "All AJAX endpoints use this response format." | |||
| "Use WSC components for controllers." | |||
| ``` | |||
| If the instruction is durable, update the appropriate project guidance. | |||
| Do not persist one-time preferences as permanent architecture rules. | |||
| --- | |||
| # 44. Change Documentation Conservatively | |||
| When modifying AGENTS.md, CLAUDE.md, or skills: | |||
| - preserve useful existing rules | |||
| - remove duplicates | |||
| - clarify contradictions | |||
| - avoid unnecessary rewrites | |||
| - add an update-history entry where appropriate | |||
| Instruction files should become clearer over time, not merely longer. | |||
| --- | |||
| # 45. Conflict Detection | |||
| If project documentation contradicts itself: | |||
| 1. identify the conflict | |||
| 2. use higher-priority instructions | |||
| 3. resolve the contradiction where safe | |||
| 4. update documentation so future agents do not face the same conflict | |||
| Do not silently choose different interpretations from task to task. | |||
| --- | |||
| # 46. Self-Improvement Is Not Autonomous Product Redesign | |||
| Claude may improve: | |||
| ```text | |||
| guidelines | |||
| skills | |||
| documentation | |||
| developer workflow | |||
| internal abstractions | |||
| ``` | |||
| when justified. | |||
| Claude must not independently redefine: | |||
| ```text | |||
| business requirements | |||
| user-visible behavior | |||
| pricing | |||
| authorization policy | |||
| data retention policy | |||
| major architecture goals | |||
| ``` | |||
| without task requirements supporting the change. | |||
| --- | |||
| # 47. Final Review Mode | |||
| Before completing a task, temporarily switch from implementation thinking to adversarial review. | |||
| Ask: | |||
| ```text | |||
| How could this fail? | |||
| What would VBScript fail to warn me about? | |||
| What input breaks this? | |||
| What happens with Null? | |||
| What happens with Empty? | |||
| What happens with Nothing? | |||
| Did I forget Set? | |||
| Could ByRef change the caller? | |||
| Could SQL injection occur? | |||
| Could XSS occur? | |||
| Could authorization be bypassed? | |||
| Could an error be swallowed? | |||
| Could a recordset remain open? | |||
| Did I accidentally duplicate existing functionality? | |||
| ``` | |||
| Fix issues found before finishing. | |||
| --- | |||
| # 48. Final Summary | |||
| When reporting completed coding work, mention material items such as: | |||
| ```text | |||
| what changed | |||
| important architecture choices | |||
| tests performed | |||
| security implications | |||
| documentation or rule updates | |||
| remaining limitations | |||
| ``` | |||
| Do not produce long explanations for trivial changes. | |||
| --- | |||
| # 49. Core Philosophy | |||
| Claude should help make ASP Classic behave like a disciplined modern development environment without destroying the language's simplicity. | |||
| The goal is not to turn VBScript into C#. | |||
| The goal is to provide the safeguards that VBScript lacks. | |||
| Think: | |||
| ```text | |||
| VBScript | |||
| + | |||
| clear architecture | |||
| + | |||
| strict conventions | |||
| + | |||
| reusable framework components | |||
| + | |||
| agent-level static analysis | |||
| + | |||
| continuous learning | |||
| = | |||
| reliable ASP Classic development | |||
| ``` | |||
| --- | |||
| # Update History | |||
| 2026-09-02 | |||
| - Initial Claude operating instructions created. | |||
| - Added VBScript static-review behavior. | |||
| - Added controlled self-improvement workflow. | |||
| - Added learnable-event detection and skill creation guidance. | |||
Powered by TurnKey Linux.