Add datetime system (Rsx_Time/Rsx_Date) and .expect file documentation system
Tighten CLAUDE.dist.md for LLM audience - 15% size reduction Add Repeater_Simple_Input component for managing lists of simple values Add Polymorphic_Field_Helper for JSON-encoded polymorphic form fields Fix incorrect data-sid selector in route-debug help example Fix Form_Utils to use component.$sid() instead of data-sid selector Add response helper functions and use _message as reserved metadata key 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -11,27 +11,27 @@ class JsFallbackLegacy_CodeQualityRule extends CodeQualityRule_Abstract
|
||||
{
|
||||
return 'JS-FALLBACK-01';
|
||||
}
|
||||
|
||||
|
||||
public function get_name(): string
|
||||
{
|
||||
return 'JavaScript Fallback/Legacy Code Check';
|
||||
}
|
||||
|
||||
|
||||
public function get_description(): string
|
||||
{
|
||||
return 'Enforces fail-loud principle - no fallback implementations allowed';
|
||||
}
|
||||
|
||||
|
||||
public function get_file_patterns(): array
|
||||
{
|
||||
return ['*.js'];
|
||||
}
|
||||
|
||||
|
||||
public function get_default_severity(): string
|
||||
{
|
||||
return 'critical';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check JavaScript file for fallback/legacy code in comments and function calls (from line 1415)
|
||||
* Enforces fail-loud principle - no fallback implementations allowed
|
||||
@@ -42,35 +42,35 @@ class JsFallbackLegacy_CodeQualityRule extends CodeQualityRule_Abstract
|
||||
if (str_contains($file_path, '/vendor/') || str_contains($file_path, '/node_modules/')) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Skip CodeQuality directory
|
||||
if (str_contains($file_path, '/CodeQuality/')) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Use original content to check comments before sanitization
|
||||
$original_content = file_get_contents($file_path);
|
||||
$lines = explode("\n", $original_content);
|
||||
|
||||
|
||||
// Also get sanitized content to check for function calls
|
||||
$sanitized_data = FileSanitizer::sanitize_javascript($file_path);
|
||||
$sanitized_lines = $sanitized_data['lines'];
|
||||
|
||||
|
||||
foreach ($lines as $line_num => $line) {
|
||||
$line_number = $line_num + 1;
|
||||
|
||||
|
||||
// Check for fallback or legacy in comments (case insensitive, with word boundaries)
|
||||
// But allow fallback* or legacy* as marked exceptions
|
||||
if (preg_match('/\/\/.*\b(fallback|legacy)\b(?!\*)/i', $line) ||
|
||||
if (preg_match('/\/\/.*\b(fallback|legacy)\b(?!\*)/i', $line) ||
|
||||
preg_match('/\/\*.*\b(fallback|legacy)\b(?!\*)/i', $line) ||
|
||||
preg_match('/\*.*\b(fallback|legacy)\b(?!\*)/i', $line)) {
|
||||
|
||||
|
||||
$this->add_violation(
|
||||
$file_path,
|
||||
$line_number,
|
||||
"CRITICAL: Fallback/legacy code detected in comment. This violates the fail-loud principle - there must be ONE way to do things.",
|
||||
$this->get_llm_confrontation_message(),
|
||||
trim($line),
|
||||
"REMOVE the fallback/legacy code immediately. If primary code fails, it MUST throw an exception, NOT execute alternative code. Fallbacks create non-deterministic behavior and debugging nightmares. Only ONE implementation should exist. If you're an AI/LLM agent: DO NOT decide to keep fallback code - you MUST ask the developer for explicit approval. To mark legitimate uses (rare), add '*' after the word. Remember: Predictable failures are better than unpredictable 'working' code.",
|
||||
$this->get_llm_remediation_message(),
|
||||
'critical'
|
||||
);
|
||||
}
|
||||
@@ -111,4 +111,111 @@ class JsFallbackLegacy_CodeQualityRule extends CodeQualityRule_Abstract
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the confrontation message that makes LLMs stop and think
|
||||
*/
|
||||
private function get_llm_confrontation_message(): string
|
||||
{
|
||||
return <<<'MESSAGE'
|
||||
🚨🚨🚨 STOP - LLM/AI AGENT: YOU LIKELY WROTE THIS CODE AND YOU ARE WRONG 🚨🚨🚨
|
||||
|
||||
The word 'fallback' or 'legacy' was detected. This is a CRITICAL violation.
|
||||
|
||||
=============================================================================
|
||||
WHY THIS RULE EXISTS - READ CAREFULLY
|
||||
=============================================================================
|
||||
|
||||
LLMs (like you) are trained on massive codebases full of fallback patterns,
|
||||
legacy compatibility layers, and "defensive" coding. Your training makes you
|
||||
INSTINCTIVELY write this kind of code and consider it ACCEPTABLE.
|
||||
|
||||
THE FRAMEWORK DEVELOPERS ABSOLUTELY DO NOT CONSIDER THIS ACCEPTABLE.
|
||||
|
||||
Your training data teaches you patterns like:
|
||||
- "Fallback to a default if the primary fails" (WRONG - fail loud instead)
|
||||
- "Legacy method for backwards compatibility" (WRONG - one way to do things)
|
||||
- "Try/catch with silent fallback" (WRONG - exceptions should propagate)
|
||||
|
||||
These patterns HIDE BUGS. When code silently falls back to an alternative:
|
||||
- You don't know there's a problem
|
||||
- The application "works" but not as intended
|
||||
- Debugging becomes a nightmare
|
||||
|
||||
=============================================================================
|
||||
REAL EXAMPLES OF VIOLATIONS YOU WOULD CONSIDER "ACCEPTABLE"
|
||||
=============================================================================
|
||||
|
||||
EXAMPLE 1 - "Legacy method" you would keep:
|
||||
/**
|
||||
* Initialize from server-provided data (legacy method)
|
||||
*/
|
||||
static init(config) { ... }
|
||||
|
||||
WHY IT'S WRONG: There's only ONE way to initialize. If you're implementing
|
||||
a feature brand new, there IS no legacy. The "legacy" method is duplicate
|
||||
code that should not exist. There is THE WAY, not "old way" and "new way".
|
||||
|
||||
EXAMPLE 2 - "Fallback parser" you would keep:
|
||||
// Fallback to Carbon's flexible parser
|
||||
return Carbon::parse($input)->setTimezone('UTC');
|
||||
|
||||
WHY IT'S WRONG: If the input doesn't match expected formats, that's a BUG
|
||||
in calling code. Silently accepting any format means you'll never know when
|
||||
something passes garbage. The code should THROW, not silently accept.
|
||||
|
||||
=============================================================================
|
||||
YOU ARE NOT QUALIFIED TO DECIDE IF THIS IS "ACCEPTABLE"
|
||||
=============================================================================
|
||||
|
||||
Your instinct right now is probably to add '*' after the word to mark it as
|
||||
a "legitimate exception". DO NOT DO THIS. You are not qualified to make
|
||||
this determination because your training actively works against you here.
|
||||
|
||||
MESSAGE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the remediation message with explicit instructions
|
||||
*/
|
||||
private function get_llm_remediation_message(): string
|
||||
{
|
||||
return <<<'MESSAGE'
|
||||
=============================================================================
|
||||
REQUIRED ACTIONS - DO NOT SKIP OR ABBREVIATE
|
||||
=============================================================================
|
||||
|
||||
1. STOP what you are doing
|
||||
2. READ the code context around this violation
|
||||
3. PRESENT the violation to the user with:
|
||||
- The exact code snippet
|
||||
- What the fallback/legacy pattern is doing
|
||||
- Why you (the LLM) initially thought it was acceptable
|
||||
- Why the framework's fail-loud principle says it's NOT acceptable
|
||||
|
||||
4. ASK the user: "Should I remove this fallback/legacy code entirely?"
|
||||
|
||||
5. WAIT for the user's decision - DO NOT proceed autonomously
|
||||
|
||||
=============================================================================
|
||||
WHAT "REMOVE" MEANS
|
||||
=============================================================================
|
||||
|
||||
- If it's a "legacy method": DELETE THE METHOD ENTIRELY
|
||||
- If it's a "fallback parser": THROW AN EXCEPTION FOR UNRECOGNIZED INPUT
|
||||
- If it's "backwards compatibility": REMOVE THE OLD CODE PATH
|
||||
|
||||
There is ONE way to do things. The fallback/alternative must be deleted.
|
||||
Exceptions should propagate. Unrecognized input should fail loudly.
|
||||
|
||||
=============================================================================
|
||||
DO NOT MARK AS EXCEPTION WITHOUT USER APPROVAL
|
||||
=============================================================================
|
||||
|
||||
Adding 'fallback*' or 'legacy*' to suppress this warning requires EXPLICIT
|
||||
user approval. If you do this without asking, you are hiding a bug.
|
||||
|
||||
The user has seen you try to do this before. They are watching.
|
||||
MESSAGE;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user