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:
@@ -10,27 +10,27 @@ class PhpFallbackLegacy_CodeQualityRule extends CodeQualityRule_Abstract
|
||||
{
|
||||
return 'PHP-FALLBACK-01';
|
||||
}
|
||||
|
||||
|
||||
public function get_name(): string
|
||||
{
|
||||
return 'PHP 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 ['*.php'];
|
||||
}
|
||||
|
||||
|
||||
public function get_default_severity(): string
|
||||
{
|
||||
return 'critical';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check PHP file for fallback/legacy code in comments and function calls (from line 1474)
|
||||
* Enforces fail-loud principle - no fallback implementations allowed
|
||||
@@ -41,41 +41,41 @@ class PhpFallbackLegacy_CodeQualityRule extends CodeQualityRule_Abstract
|
||||
if (str_contains($file_path, '/vendor/')) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Skip CodeQuality directory
|
||||
if (str_contains($file_path, '/CodeQuality/')) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Skip RsxCheckCommand.php - it documents what the checks do
|
||||
if (str_contains($file_path, 'RsxCheckCommand.php')) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Use original content to check comments
|
||||
$original_content = file_get_contents($file_path);
|
||||
$lines = explode("\n", $original_content);
|
||||
|
||||
|
||||
foreach ($lines as $line_num => $line) {
|
||||
$line_number = $line_num + 1;
|
||||
|
||||
|
||||
// Skip line if it's entirely a comment (starts with // after whitespace)
|
||||
$trimmed_line = trim($line);
|
||||
$is_line_comment = str_starts_with($trimmed_line, '//');
|
||||
|
||||
|
||||
// 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) ||
|
||||
preg_match('/\/\*.*\b(fallback|legacy)\b(?!\*)/i', $line) ||
|
||||
preg_match('/\*.*\b(fallback|legacy)\b(?!\*)/i', $line) ||
|
||||
preg_match('/#.*\b(fallback|legacy)\b(?!\*)/i', $line)) { // Also check # comments
|
||||
|
||||
|
||||
$this->add_violation(
|
||||
$file_path,
|
||||
$line_number,
|
||||
"🚨 CRITICAL ARCHITECTURE VIOLATION: 'fallback' or 'legacy' detected - STOP IMMEDIATELY\n\nThis is NOT just a naming issue. The presence of 'fallback/legacy' often indicates:\n1. DEAD CODE handling conditions that no longer occur\n2. DUPLICATE IMPLEMENTATIONS still partially present\n3. INCOMPLETE MIGRATION from old to new systems\n4. VIOLATION TYPE HANDLERS for deprecated systems",
|
||||
$this->get_llm_confrontation_message(),
|
||||
trim($line),
|
||||
"REQUIRED IMMEDIATE ACTIONS:\n1. INVESTIGATE: Is this code actually reachable? Run grep for the condition it handles\n2. TRACE: What system/feature does this reference? Does it still exist anywhere?\n3. SEARCH: Are there duplicate implementations? (grep for related terms)\n4. VERIFY: If it's display code, does the violation type still get produced?\n\nFor AI/LLM agents: This is a P0 STOP-THE-WORLD violation. You MUST:\n- Immediately search for what triggers this code path\n- Report ALL findings to the user before making ANY changes\n- NEVER just rename or mark with asterisk without investigation\n- If dead code found, remove entirely (don't comment out)\n\nRemember: Dead fallback code is technical debt that causes debugging nightmares.\nEvery 'fallback' is a potential duplicate implementation waiting to cause PTSD.\n\nTo mark legitimate uses (extremely rare), add '*' after the word.",
|
||||
$this->get_llm_remediation_message(),
|
||||
'critical'
|
||||
);
|
||||
}
|
||||
@@ -103,7 +103,7 @@ class PhpFallbackLegacy_CodeQualityRule extends CodeQualityRule_Abstract
|
||||
// Remove inline comments before checking
|
||||
$code_part = preg_replace('/\/\/.*$/', '', $line);
|
||||
$code_part = preg_replace('/\/\*.*?\*\//', '', $code_part);
|
||||
|
||||
|
||||
// Check if function starting or ending with "fallback" exists in non-comment part
|
||||
if (preg_match('/\b(fallback\w*|\w+fallback)\s*\(/i', $code_part)) {
|
||||
$this->add_violation(
|
||||
@@ -118,4 +118,111 @@ class PhpFallbackLegacy_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