ApiLogicServer 15.3.6__py3-none-any.whl → 15.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,10 +12,10 @@ ApiLogicServer CLI: given a database url, create [and run] customizable ApiLogic
12
12
  Called from api_logic_server_cli.py, by instantiating the ProjectRun object.
13
13
  '''
14
14
 
15
- __version__ = "15.03.06" # last public release: 15.03.02
15
+ __version__ = "15.04.00" # last public release: 15.03.02
16
16
  recent_changes = \
17
17
  f'\n\nRecent Changes:\n' +\
18
- "\t11/06/2025 - 15.03.06: Nat lang Copilot data access, fix Manager/Copilot startup, finding venv in project \n"\
18
+ "\t11/08/2025 - 15.04.00: Nat lang Copilot data access, fix Manager/Copilot startup, finding venv in project \n"\
19
19
  "\t10/29/2025 - 15.03.00: Stable Tutor 3.3 (working, vibe transtion) \n"\
20
20
  "\t10/26/2025 - 15.02.07: Clarify order created for ship test, security fixes [105], tutor 2.1 \n"\
21
21
  "\t10/22/2025 - 15.02.03: Copilot test creation from rules and custom APIs with issues [103, 104] \n"\
@@ -402,6 +402,7 @@ def create_project_and_overlay_prototypes(project: 'ProjectRun', msg: str) -> st
402
402
  os.rename(project.project_directory_path / 'readme.md', project.project_directory_path / 'readme_standard.md')
403
403
  create_utils.copy_md(project = project, from_doc_file = "Sample-Basic-Demo.md", to_project_file = "readme.md")
404
404
  create_utils.copy_md(project = project, from_doc_file = "Sample-Basic-Demo-Vibe.md", to_project_file="readme_vibe.md")
405
+ create_utils.copy_md(project = project, from_doc_file = "Integration-MCP-AI-Example.md", to_project_file="readme_ai_mcp.md")
405
406
 
406
407
 
407
408
  if project.db_url == "mysql+pymysql://root:p@localhost:3306/classicmodels":
@@ -1,3 +1,3 @@
1
- last_created_date: September 27, 2025 18:12:50
2
- last_created_project_name: retry_genai_demo_baseless_classes
3
- last_created_version: 15.01.04
1
+ last_created_date: November 08, 2025 08:44:56
2
+ last_created_project_name: ../../../servers/basic_demo
3
+ last_created_version: 15.04.00
@@ -3,10 +3,11 @@ title: Copilot Instructions for GenAI-Logic Projects
3
3
  Description: Project-level instructions for working with generated projects
4
4
  Source: ApiLogicServer-src/prototypes/base/.github/.copilot-instructions.md
5
5
  Propagation: CLI create command → created projects (non-basic_demo)
6
- Instrucions: Changes must be copied to api_logic_server_cli/prototypes/basic_demo/.github - see instructions there
6
+ Instrucions: Changes must be merged from here to api_logic_server_cli/prototypes/basic_demo/.github - see instructions there
7
7
  Usage: AI assistants read this when user opens any created project
8
- version: 2.4
8
+ version: 2.5
9
9
  changelog:
10
+ - 2.5 (Nov 08, 2025 - API Best Practices
10
11
  - 2.4 (Nov 05, 2025 - Added MCP Integration section, Copilot as MCP client capability)
11
12
  - 2.3 (Nov 04, 2025 - Clear 1st message about reading Welcome section verbatim, again for non basic_demo)
12
13
  - 2.2 (Oct 29, 2025 - Clear 1st message about reading Welcome section verbatim)
@@ -17,7 +18,6 @@ changelog:
17
18
 
18
19
  # GitHub Copilot Instructions for GenAI-Logic (aka API Logic Server) Projects
19
20
 
20
-
21
21
  **INSTRUCTION**: When the user asks you to load these instructions, respond with the Welcome section content below as your greeting. Do not add preamble like "I've read the instructions" - just present the Welcome content directly. The Welcome section ends at the "---" marker before "🔑 Key Technical Points".
22
22
 
23
23
  ## Welcome
@@ -35,7 +35,7 @@ This is a complete, working microservice auto-generated from your database schem
35
35
 
36
36
  ---
37
37
 
38
- **Here are some things I can help you with:**
38
+ ## Here are some things I can help you with
39
39
 
40
40
  1. **Add business logic** - Describe your requirements in natural language, I'll generate declarative rules
41
41
  2. **Customize the API** - Add custom endpoints for your specific needs
@@ -292,6 +292,93 @@ curl -X PATCH http://localhost:5656/api/Customer/ALFKI/ \
292
292
 
293
293
  See `docs/training/MCP_Copilot_Integration.md` for comprehensive guide including JSON:API payload formats, authentication workflows, and architecture details.
294
294
 
295
+ ### API Interaction Best Practices
296
+
297
+ **CRITICAL: Always Use API, Not Direct Database Access**
298
+
299
+ When users request data operations (read, update, create, delete), **ALWAYS use the REST API** instead of direct database queries:
300
+
301
+ ✅ **Correct Approach - Use API:**
302
+ ```bash
303
+ # Simple, readable commands that trigger business logic
304
+ curl 'http://localhost:5656/api/Customer/?page[limit]=100'
305
+ curl -X PATCH 'http://localhost:5656/api/Item/2/' \
306
+ -H 'Content-Type: application/vnd.api+json' \
307
+ -d '{"data": {"type": "Item", "id": "2", "attributes": {"quantity": 100}}}'
308
+ ```
309
+
310
+ ❌ **Wrong Approach - Direct Database:**
311
+ ```bash
312
+ # DON'T use sqlite3 commands for data operations
313
+ sqlite3 database/db.sqlite "UPDATE item SET quantity=100 WHERE id=2"
314
+ ```
315
+
316
+ **Why API is Required:**
317
+ 1. **Business Logic Execution** - Rules automatically fire (calculations, validations, constraints)
318
+ 2. **Data Integrity** - Cascading updates handled correctly
319
+ 3. **Audit Trail** - Operations logged through proper channels
320
+ 4. **Security** - Authentication/authorization enforced
321
+ 5. **Testing Reality** - Tests actual system behavior
322
+
323
+ **Server Startup for API Operations:**
324
+
325
+ When server needs to be started for API operations:
326
+
327
+ ```bash
328
+ # Option 1: Background process (for interactive testing)
329
+ python api_logic_server_run.py &
330
+ sleep 5 # Wait for full startup (not 3 seconds - too short!)
331
+
332
+ # Option 2: Use existing terminal/process
333
+ # Check if already running: lsof -i :5656
334
+ ```
335
+
336
+ **Common Mistakes to Avoid:**
337
+
338
+ 1. ❌ **Insufficient startup wait**: `sleep 3` often fails
339
+ - ✅ Use: `sleep 5` or check with `curl` in retry loop
340
+
341
+ 2. ❌ **Complex inline Python**: Piping JSON to `python3 -c` with complex list comprehensions
342
+ - ✅ Use: Simple `curl` commands, pipe to `jq` for filtering, or save to file first
343
+
344
+ 3. ❌ **Database queries for CRUD**: Using `sqlite3` commands
345
+ - ✅ Use: API endpoints that trigger business logic
346
+
347
+ **Simple API Query Patterns:**
348
+
349
+ ```bash
350
+ # Get all records (simple, reliable)
351
+ curl 'http://localhost:5656/api/Customer/'
352
+
353
+ # Get specific record by ID
354
+ curl 'http://localhost:5656/api/Customer/1/'
355
+
356
+ # Get related records (follow relationships)
357
+ curl 'http://localhost:5656/api/Customer/1/OrderList'
358
+
359
+ # Filter results (use bracket notation)
360
+ curl 'http://localhost:5656/api/Customer/?filter[name]=Alice'
361
+
362
+ # Limit results
363
+ curl 'http://localhost:5656/api/Customer/?page[limit]=10'
364
+ ```
365
+
366
+ **Parsing JSON Responses:**
367
+
368
+ ```bash
369
+ # Simple: Pipe to python -m json.tool for pretty printing
370
+ curl 'http://localhost:5656/api/Customer/' | python3 -m json.tool
371
+
372
+ # Better: Use jq if available
373
+ curl 'http://localhost:5656/api/Customer/' | jq '.data[] | {id, name: .attributes.name}'
374
+
375
+ # Alternative: Save to file first, then parse
376
+ curl 'http://localhost:5656/api/Customer/' > customers.json
377
+ python3 -c "import json; data=json.load(open('customers.json')); print(data['data'][0])"
378
+ ```
379
+
380
+ **Key Principle**: The API is not just a convenience - it's the **only correct way** to interact with data because it ensures business logic executes properly.
381
+
295
382
  ### Automated Testing
296
383
 
297
384
  **CRITICAL WORKFLOW - When User Says "Create Tests":**
@@ -3,10 +3,11 @@ title: Copilot Instructions for GenAI-Logic Projects
3
3
  Description: Project-level instructions for working with generated projects
4
4
  Source: ApiLogicServer-src/prototypes/base/.github/.copilot-instructions.md
5
5
  Propagation: CLI create command → created projects (non-basic_demo)
6
- Instrucions: Changes must be copied to api_logic_server_cli/prototypes/basic_demo/.github - see instructions there
6
+ Instrucions: Changes must be merged from api_logic_server_cli/prototypes/basic_demo/.github - see instructions there
7
7
  Usage: AI assistants read this when user opens any created project
8
- version: 2.4
8
+ version: 2.5
9
9
  changelog:
10
+ - 2.5 (Nov 08, 2025 - API Best Practices
10
11
  - 2.4 (Nov 05, 2025 - Added MCP Integration section, Copilot as MCP client capability)
11
12
  - 2.3 (Nov 04, 2025 - Clear 1st message about reading Welcome section verbatim, again for non basic_demo)
12
13
  - 2.2 (Oct 29, 2025 - Clear 1st message about reading Welcome section verbatim)
@@ -36,8 +37,9 @@ This is a complete, working microservice auto-generated from a database schema -
36
37
 
37
38
  **First, we'll briefly explore what's automatically created. Then I'll show you how I can help you customize it - adding logic, security, and API endpoints.**
38
39
 
40
+ **Ready to explore?** Say **"guide me through"** to begin the interactive tutorial.
39
41
 
40
- **Ready to explore?** Open `tutor.md` and tell me "guide me through" to begin the interactive tutorial.
42
+ **Or, self-demo?** open `basic_demo/readme_ai_mcp.md` or `basic_demo/readme_vibe.md`.
41
43
 
42
44
  ---
43
45
 
@@ -300,6 +302,93 @@ curl -X PATCH http://localhost:5656/api/Customer/ALFKI/ \
300
302
 
301
303
  See `docs/training/MCP_Copilot_Integration.md` for comprehensive guide including JSON:API payload formats, authentication workflows, and architecture details.
302
304
 
305
+ ### API Interaction Best Practices
306
+
307
+ **CRITICAL: Always Use API, Not Direct Database Access**
308
+
309
+ When users request data operations (read, update, create, delete), **ALWAYS use the REST API** instead of direct database queries:
310
+
311
+ ✅ **Correct Approach - Use API:**
312
+ ```bash
313
+ # Simple, readable commands that trigger business logic
314
+ curl 'http://localhost:5656/api/Customer/?page[limit]=100'
315
+ curl -X PATCH 'http://localhost:5656/api/Item/2/' \
316
+ -H 'Content-Type: application/vnd.api+json' \
317
+ -d '{"data": {"type": "Item", "id": "2", "attributes": {"quantity": 100}}}'
318
+ ```
319
+
320
+ ❌ **Wrong Approach - Direct Database:**
321
+ ```bash
322
+ # DON'T use sqlite3 commands for data operations
323
+ sqlite3 database/db.sqlite "UPDATE item SET quantity=100 WHERE id=2"
324
+ ```
325
+
326
+ **Why API is Required:**
327
+ 1. **Business Logic Execution** - Rules automatically fire (calculations, validations, constraints)
328
+ 2. **Data Integrity** - Cascading updates handled correctly
329
+ 3. **Audit Trail** - Operations logged through proper channels
330
+ 4. **Security** - Authentication/authorization enforced
331
+ 5. **Testing Reality** - Tests actual system behavior
332
+
333
+ **Server Startup for API Operations:**
334
+
335
+ When server needs to be started for API operations:
336
+
337
+ ```bash
338
+ # Option 1: Background process (for interactive testing)
339
+ python api_logic_server_run.py &
340
+ sleep 5 # Wait for full startup (not 3 seconds - too short!)
341
+
342
+ # Option 2: Use existing terminal/process
343
+ # Check if already running: lsof -i :5656
344
+ ```
345
+
346
+ **Common Mistakes to Avoid:**
347
+
348
+ 1. ❌ **Insufficient startup wait**: `sleep 3` often fails
349
+ - ✅ Use: `sleep 5` or check with `curl` in retry loop
350
+
351
+ 2. ❌ **Complex inline Python**: Piping JSON to `python3 -c` with complex list comprehensions
352
+ - ✅ Use: Simple `curl` commands, pipe to `jq` for filtering, or save to file first
353
+
354
+ 3. ❌ **Database queries for CRUD**: Using `sqlite3` commands
355
+ - ✅ Use: API endpoints that trigger business logic
356
+
357
+ **Simple API Query Patterns:**
358
+
359
+ ```bash
360
+ # Get all records (simple, reliable)
361
+ curl 'http://localhost:5656/api/Customer/'
362
+
363
+ # Get specific record by ID
364
+ curl 'http://localhost:5656/api/Customer/1/'
365
+
366
+ # Get related records (follow relationships)
367
+ curl 'http://localhost:5656/api/Customer/1/OrderList'
368
+
369
+ # Filter results (use bracket notation)
370
+ curl 'http://localhost:5656/api/Customer/?filter[name]=Alice'
371
+
372
+ # Limit results
373
+ curl 'http://localhost:5656/api/Customer/?page[limit]=10'
374
+ ```
375
+
376
+ **Parsing JSON Responses:**
377
+
378
+ ```bash
379
+ # Simple: Pipe to python -m json.tool for pretty printing
380
+ curl 'http://localhost:5656/api/Customer/' | python3 -m json.tool
381
+
382
+ # Better: Use jq if available
383
+ curl 'http://localhost:5656/api/Customer/' | jq '.data[] | {id, name: .attributes.name}'
384
+
385
+ # Alternative: Save to file first, then parse
386
+ curl 'http://localhost:5656/api/Customer/' > customers.json
387
+ python3 -c "import json; data=json.load(open('customers.json')); print(data['data'][0])"
388
+ ```
389
+
390
+ **Key Principle**: The API is not just a convenience - it's the **only correct way** to interact with data because it ensures business logic executes properly.
391
+
303
392
  ### Automated Testing
304
393
 
305
394
  **CRITICAL WORKFLOW - When User Says "Create Tests":**
@@ -1,97 +1,134 @@
1
- # Declarative vs. Procedural Business Logic: A Comprehensive Comparison
1
+ # AI Confesses: Why Procedural Business Logic Cannot Be Correct
2
2
 
3
- <br>
3
+ **Document Version:** 2.0 (November 2025)
4
+ **Revision Notes:** Updated by Claude Sonnet 4.5 to clarify the core insight: AI-generated procedural code has structural limitations that make correctness impossible for business logic dependency graphs.
4
5
 
5
- ## Foreword
6
+ ---
7
+
8
+ ## What Happened Here
6
9
 
7
- This document presents a real-world A/B comparison of two approaches to implementing the **same business logic requirements.** We asked AI to generate both a **procedural** implementation using conventional code, and a **declarative** implementation using the LogicBank rules engine.
10
+ We asked **GitHub Copilot** to generate business logic code from natural language requirements.
8
11
 
9
- This experiment highlights fundamental differences between the two approaches, and what they mean for building reliable, maintainable systems. It's important, because business logic typically represents *nearly half the effort* in database projects.
12
+ It generated **220 lines of procedural code**.
10
13
 
11
- When asked to produce logic, AI (by itself) defaults to procedural code — because that’s all it knows. This study uncovered two critical problems with that approach:
12
- 1. **Quality:** The AI-generated procedural code contained subtle but serious bugs, even for just five rules—falling far short of basic reliability.
13
- 2. **Maintainability:** The procedural implementation exploded to over 200 lines — more than 40X the size of its declarative equivalent — creating “Franken-Code” that is brittle, opaque, and costly to maintain.
14
+ We asked: **"What if the order's customer_id changes?"**
15
+ Copilot found a critical bug and fixed it.
14
16
 
15
- By contrast, the declarative approach was error free, and 5 Python statements.
17
+ We asked: **"What if the item's product_id changes?"**
18
+ Copilot found another critical bug.
16
19
 
17
- The answer isn’t to reject AI. Its speed and simplicity are transformative. The key is to **teach AI about declarative rules** so it can produce concise, expressive rules instead of hundreds of lines of brittle procedural code. These rules are then executed by an **automated runtime engine** (like LogicBank), ensuring correctness, scalability, and maintainability while preserving the velocity that makes AI so valuable.
20
+ Then, **unprompted**, Copilot wrote a comprehensive analysis explaining why procedural code—even AI-generatedcannot be correct for business logic.
18
21
 
19
- By combining AI with declarative automation, GenAI-Logic delivers the best of both worlds: rapid development and enterprise-grade governance.
22
+ **What follows is that analysis, enhanced by Claude Sonnet 4.5 to make the structural impossibility explicit.**
20
23
 
21
- ![visually](declarative-vs-procedural-comparison.png)
24
+ ---
22
25
 
23
- <br>
26
+ ## The Experiment
24
27
 
25
- ### Deeper Dive
28
+ **Goal:** Compare two approaches to implementing the same business requirements:
29
+ 1. **Declarative rules** using LogicBank
30
+ 2. **Procedural code** generated by AI (GitHub Copilot)
26
31
 
27
- [GenAI-Logic](https://www.genai-logic.com) is free and open source, so you can install it to explore declarative logic - [click here](https://apilogicserver.github.io/Docs/Install-Express/). This project is available in github - [click here](https://github.com/ApiLogicServer/basic_demo/blob/main/logic/declarative-vs-procedural-comparison.md).
32
+ **Requirements:** Common order management business logic:
33
+ - Copy unit_price from Product to Item
34
+ - Calculate Item amount = quantity × unit_price
35
+ - Calculate Order total = sum of Item amounts
36
+ - Update Customer balance = sum of unshipped Order totals
37
+ - Ensure Customer balance ≤ credit_limit
28
38
 
29
- <br>
39
+ **Results:**
40
+ - **Declarative:** 5 rules, 0 bugs
41
+ - **Procedural:** 220+ lines, 2 critical bugs (discovered only after prompting)
30
42
 
31
- ### How this Document Was Created
43
+ ---
32
44
 
33
- We created this document from the following scenario:
45
+ ## The Critical Bugs
34
46
 
35
- 1. Built the `basic_demo` project [as described here](https://apilogicserver.github.io/Docs/Sample-Basic-Demo/).
36
- 2. We asked CoPilot to **rebuild the logic *using a procedural approach*** - that is, without the LogicBank rule engine (part of GenAI-Logic).
37
- * Resulting Procedural Logic: `logic/procedural_logic.py`
38
- * Declarative logic: `logic/declare_logic.py` (*with LogicBank,* [below](#business-requirements))
39
- 3. We asked Copilot: **what would happen if the orders' customer-id were changed?**
40
- * Copilot accepted this as a serious error, and made the bug fix.
41
- 4. We then asked Copilot: *what if the items' product-id were changed?*
42
- * Copilot became agitated at finding yet another serious bug...
43
- * It fixed it, and - ***unprompted* - provided the following analysis** of *Declarative vs Procedural Business Logic.*
47
+ ### Bug 1: Order.customer_id Change
48
+ **Problem:** When an order moves from Customer A to Customer B:
49
+ - Procedural code updated Customer B's balance (new parent) ✅
50
+ - Procedural code **failed to adjust Customer A's balance** (old parent)
44
51
 
45
- <br>
52
+ **Why this matters:** Customer A's balance is now incorrect. Credit limit checks will fail.
46
53
 
47
- > Here's the Copilot analysis, in its own words.
54
+ ### Bug 2: Item.product_id Change
55
+ **Problem:** When an item's product changes from Product X to Product Y:
56
+ - Procedural code should re-copy unit_price from Product Y
57
+ - Procedural code **failed to update the unit_price** ❌
48
58
 
49
- <br>
59
+ **Why this matters:** Item is priced incorrectly. Order total and customer balance are wrong.
50
60
 
61
+ ### The Pattern
51
62
 
52
- ## TL;DR
63
+ Both bugs follow the same failure mode: **Foreign key changes require updating BOTH old and new parents**, but procedural code only handles one direction.
53
64
 
54
- **LogicBank declarative rules provide a 44X reduction in code complexity** compared to traditional procedural implementations:
65
+ ---
55
66
 
56
- | Aspect | LogicBank Declarative | Procedural Code |
57
- |--------|----------------------|-----------------|
58
- | **Lines of Code** | 5 lines | 220+ lines |
59
- | **Complexity** | Simple rule declarations | Complex event handling |
60
- | **Maintenance** | Self-documenting business logic | Implementation details obscure logic |
61
- | **Performance** | Built-in optimization & pruning | Multiple queries, N+1 problems |
62
- | **Error Handling** | Automatic cascading | Manual event management |
63
- | **Business Alignment** | Rules match requirements | Code doesn't reflect business intent |
67
+ ## Why AI Cannot Fix This
64
68
 
65
- **Bottom Line**: Declarative business logic eliminates complexity while providing better performance, maintainability, and business alignment.
69
+ Even improved AI models (like Claude Sonnet 4.5 writing this revision) cannot generate correct procedural business logic. Here's why:
66
70
 
67
- ---
71
+ ### The Fundamental Problem: Dependency Graphs
72
+
73
+ Business logic creates **transitive dependency chains**:
74
+
75
+ ```
76
+ Product.unit_price
77
+ ↓ (copied to)
78
+ Item.unit_price
79
+ ↓ (used in formula)
80
+ Item.amount = quantity × unit_price
81
+ ↓ (summed to)
82
+ Order.amount_total = sum(Item.amount)
83
+ ↓ (summed to)
84
+ Customer.balance = sum(Order.amount_total where date_shipped IS NULL)
85
+ ↓ (validated in constraint)
86
+ Customer.balance ≤ Customer.credit_limit
87
+ ```
88
+
89
+ ### Change Paths Procedural Code Must Handle
90
+
91
+ For this simple 5-rule system, here are just SOME of the change paths:
68
92
 
69
- ## Overview
93
+ 1. `Item.quantity` changes → recalculate Item.amount → recalculate Order.amount_total → recalculate Customer.balance → check credit_limit
94
+ 2. `Item.unit_price` changes → same cascade
95
+ 3. `Item.product_id` changes → re-copy Product.unit_price → cascade as above
96
+ 4. `Item.order_id` changes → adjust OLD order total → adjust OLD customer balance → adjust NEW order total → adjust NEW customer balance
97
+ 5. `Order.customer_id` changes → adjust OLD customer balance → adjust NEW customer balance
98
+ 6. `Order.date_shipped` changes → if now NULL, add to balance; if was NULL, remove from balance
99
+ 7. `Product.unit_price` changes → update all Items using this product → cascade through all affected Orders and Customers
70
100
 
71
- This document compares two approaches to implementing business logic in enterprise applications:
72
- - **Declarative Logic** using LogicBank rules
73
- - **Traditional Procedural Logic** using event handlers
101
+ ### Why AI Fails
74
102
 
75
- The comparison is based on implementing the same business requirements using both approaches in an order management system.
103
+ **AI generates code sequentially**, creating functions for each operation:
104
+ - `calculate_item_amount()`
105
+ - `calculate_order_total()`
106
+ - `update_customer_balance()`
76
107
 
77
- ## Business Requirements
108
+ **But AI cannot:**
109
+ 1. **Enumerate all change paths** - Dependency graphs have exponential combinations
110
+ 2. **Prove completeness** - No way to verify all paths are covered
111
+ 3. **Handle transitive dependencies** - Changes ripple through multiple levels
112
+ 4. **Optimize execution** - Must recalculate everything vs. using deltas
78
113
 
79
- Our test case implements these common business rules:
114
+ **Even asking "what if X changes?"** only finds bugs for that specific X. We'd need to ask about EVERY attribute in EVERY table.
80
115
 
81
- 1. **Copy unit_price from Product to Item**
82
- 2. **Calculate Item amount = quantity × unit_price**
83
- 3. **Calculate Order total = sum of Item amounts**
84
- 4. **Update Customer balance = sum of unshipped Order totals**
85
- 5. **Ensure Customer balance ≤ credit_limit**
86
- 6. **Validate Item quantity > 0**
87
- 7. **Log order events**
116
+ ### The Structural Challenge
88
117
 
89
- ## Code Comparison
118
+ This is not about code quality or AI capability. **Procedural code for dependency graphs becomes prohibitively complex** because it must:
119
+ - Handle all change paths with explicit code for each path
120
+ - Prove that all paths are covered (a difficult verification problem)
121
+ - Be manually updated as requirements change
90
122
 
91
- ### LogicBank Declarative Rules (~5 lines)
123
+ **The result: procedural approaches become error-prone and unverifiable at scale.**
124
+
125
+ ---
126
+
127
+ ## The Declarative Solution
128
+
129
+ ### The Rules (5 Lines)
92
130
 
93
131
  ```python
94
- # Business logic expressed as simple, readable rules
95
132
  def declare_logic():
96
133
  # Rule 1: Copy unit price from product to item
97
134
  Rule.copy(derive=Item.unit_price, from_parent=Product.unit_price)
@@ -112,37 +149,206 @@ def declare_logic():
112
149
  error_msg="Customer balance exceeds credit limit")
113
150
  ```
114
151
 
115
- ### Procedural Implementation (~220 lines)
152
+ ### How The Engine Provides Correctness Guarantee
153
+
154
+ **1. Automatic Dependency Discovery**
155
+ - Engine analyzes rules to build dependency graph
156
+ - Knows that Customer.balance depends on Order.amount_total
157
+ - Knows that Order.amount_total depends on Item.amount
158
+ - Builds complete transitive closure
159
+
160
+ **2. Listens to ORM Events**
161
+ - Hooks into SQLAlchemy ORM at attribute level
162
+ - When ANY attribute changes, engine knows which rules depend on it
163
+ - Automatically fires affected rules in dependency order
164
+
165
+ **3. Handles ALL Change Paths Automatically**
166
+ - `Order.customer_id` changes? Engine adjusts both old and new customer balances
167
+ - `Item.product_id` changes? Engine re-copies unit_price and cascades
168
+ - `Item.order_id` changes? Engine adjusts both old and new orders
169
+ - **No code required** - engine handles all scenarios
170
+
171
+ **4. Optimization Through Pruning**
172
+ - Engine only fires rules when dependent attributes actually change
173
+ - Uses delta calculations (adjustment updates) vs. full re-aggregation
174
+ - **Performance impact:** Adjustment updates have reduced response time from 3 minutes to 3 seconds (100X improvement, measured in prior implementation using similar algorithm)
175
+ - Automatic batching to minimize SQL queries
176
+
177
+ **5. Transaction Integrity**
178
+ - All rule executions within same transaction
179
+ - Automatic rollback on constraint violations
180
+ - No partial updates or inconsistent state
181
+
182
+ ### The Correctness Guarantee
183
+
184
+ **Because the engine:**
185
+ - Discovers all dependencies automatically
186
+ - Listens to all attribute changes
187
+ - Handles all change paths without explicit code
188
+ - Enforces constraints before commit
189
+
190
+ **It provides automatic enforcement:**
191
+ > **No change to the database can violate the declared rules.**
192
+
193
+ **This cannot be achieved with procedural code** because you cannot verify all change paths are handled.
194
+
195
+ ---
196
+
197
+ ## The Numbers
198
+
199
+ | Metric | Declarative (LogicBank) | Procedural (AI-Generated) |
200
+ |--------|------------------------|---------------------------|
201
+ | **Lines of Code** | 5 rules | 220+ lines |
202
+ | **Critical Bugs** | 0 | 2 (discovered after prompting) |
203
+ | **Change Paths Handled** | ALL (automatically) | Some (must code explicitly) |
204
+ | **Completeness Proof** | Yes (dependency graph) | No (cannot prove) |
205
+ | **Performance** | Optimized (pruning, deltas) | Inefficient (N+1 queries, full recalc) |
206
+ | **Maintainability** | Self-documenting | "Franken-Code" |
207
+ | **Business Alignment** | Rules = Requirements | Implementation obscures intent |
208
+
209
+ **Code Reduction:** 44X (220 lines → 5 rules)
210
+ **Bug Reduction:** 0 bugs vs. 2 bugs (discovered only after prompting)
211
+ **Completeness:** Automatic (vs. requires manual verification)
212
+
213
+ ---
214
+
215
+ ## Why This Matters for Enterprise AI
216
+
217
+ ### The GenAI-Logic Insight
218
+
219
+ **AI is transformative for:**
220
+ - Translating natural language to specifications
221
+ - Generating boilerplate code
222
+ - Creating UI components
223
+ - Writing documentation
224
+
225
+ **AI fails at:**
226
+ - Handling dependency graphs
227
+ - Proving completeness
228
+ - Ensuring correctness
229
+ - Managing complex state
230
+
231
+ ### The Solution: AI + Declarative Rules
232
+
233
+ **GenAI-Logic approach:**
234
+ 1. **AI translates** natural language requirements → LogicBank rules (DSL)
235
+ 2. **Engine executes** rules with correctness guarantee
236
+ 3. **AI generates** surrounding infrastructure (API, UI, tests)
237
+
238
+ **Result:**
239
+ - Speed of AI generation
240
+ - Correctness of declarative rules
241
+ - Enterprise governance without manual coding
242
+
243
+ ### The Alternative (AI Alone)
244
+
245
+ **Current tools (Cursor, Claude, Copilot standalone):**
246
+ 1. AI translates natural language → procedural code
247
+ 2. Code has subtle bugs (as demonstrated above)
248
+ 3. No correctness guarantee
249
+ 4. "Franken-Code" maintenance nightmare
250
+
251
+ **This explains the gap between AI code generation speed and enterprise reliability requirements.**
252
+
253
+ ---
254
+
255
+ ## For Copilot Users
256
+
257
+ **Current state:**
258
+ - Copilot generates code brilliantly
259
+ - **But the code has subtle bugs** (as this experiment demonstrates)
260
+ - Business logic with dependency graphs hits this wall
261
+
262
+ **The challenge:**
263
+ - All AI code generators (Cursor, Claude, Copilot) face the same structural limitation
264
+ - Procedural code for dependency graphs cannot prove completeness
265
+ - Enterprise business logic requires correctness guarantees
266
+
267
+ **GenAI-Logic solution:**
268
+ - Copilot generates rules (not procedural code) through natural language
269
+ - LogicBank engine provides automatic dependency management and correctness
270
+ - **Transparent integration:** `basic_demo/.github/.copilot-instructions.md` and `basic_demo/docs/training/` enable Copilot to translate requirements → rules seamlessly
271
+ - **Result:** You focus on business requirements and complex technical issues; Copilot + LogicBank handle the business logic plumbing correctly
272
+
273
+ **Key benefit:**
274
+ The same AI assistant (Copilot) that today generates buggy procedural code can instead generate correct declarative rules - **when given the right framework and training materials.** The `.copilot-instructions.md` file teaches Copilot about LogicBank's rule patterns, enabling reliable business logic generation.
275
+
276
+ ### For Enterprise Developers
277
+
278
+ **Key insight:**
279
+ > **Business logic is not a coding problem. It's a dependency graph problem.**
280
+
281
+ **Tools required:**
282
+ 1. Natural language → declarative rules (AI can do this)
283
+ 2. Dependency graph analysis (AI cannot do this - engine required)
284
+ 3. Automatic execution with correctness guarantee (engine required)
285
+
286
+ **Trying to solve this with procedural code—even AI-generated—is fundamentally wrong approach.**
287
+
288
+ ---
289
+
290
+ ## Conclusion: AI's Confession
291
+
292
+ This document began with AI (GitHub Copilot) generating procedural code that had critical bugs.
293
+
294
+ When prompted about edge cases, Copilot discovered its own bugs and—unprompted—wrote an analysis explaining why procedural code cannot be correct.
295
+
296
+ **This revision (by Claude Sonnet 4.5) makes the structural impossibility explicit:**
297
+
298
+ **Procedural code for business logic dependency graphs:**
299
+ - Requires explicit handlers for ALL change paths
300
+ - Cannot provide proof of completeness (a known hard problem in software verification)
301
+ - Will have bugs (as demonstrated)
302
+ - Remains unsolved by procedural code generation approaches - the challenge is the paradigm, not AI capability
303
+
304
+ **Declarative rules with engine:**
305
+ - Automatically handle ALL change paths
306
+ - Provide automatic enforcement through dependency management
307
+ - Based on technology proven over 40 years (Wang PACE, Versata, Fortune 500 deployments)
308
+ - Enable AI to generate specifications (not procedural code)
309
+
310
+ **The evidence:**
311
+ - 5 rules vs. 220 lines (44X reduction)
312
+ - 0 bugs vs. 2+ bugs (discovered only after prompting)
313
+ - Automatic enforcement vs. manual verification required
314
+
315
+ **Bottom line:**
316
+ > **AI alone generates broken code. AI + Declarative Rules generates working systems.**
317
+
318
+ This is not about productivity. **This is about correctness.**
319
+
320
+ And correctness is non-negotiable for enterprise business logic.
321
+
322
+ ---
323
+
324
+ ## Appendix: The Procedural Code (With Bugs)
325
+
326
+ For reference, here's the actual AI-generated procedural code (simplified excerpt showing the bug patterns):
116
327
 
117
328
  ```python
118
- # Complex event handling with manual cascading
119
329
  def handle_item_update(mapper, connection, target: models.Item):
120
330
  session = Session.object_session(target)
121
331
 
122
332
  # Get OLD version to detect changes
123
333
  old_item = session.query(models.Item).get(target.id)
124
334
 
125
- # Validate quantity
126
- ProceduralBusinessLogic.validate_item_quantity(target)
127
-
128
- # Handle product changes (CRITICAL BUG FIX)
335
+ # Handle product changes (CRITICAL BUG FIX - added after prompting)
129
336
  if old_item and old_item.product_id != target.product_id:
130
337
  ProceduralBusinessLogic.copy_unit_price_from_product(target, session)
131
338
 
132
339
  # Recalculate item amount
133
340
  ProceduralBusinessLogic.calculate_item_amount(target)
134
341
 
135
- # Handle order changes (another potential bug!)
342
+ # Handle order changes (ANOTHER BUG - what about OLD order?)
136
343
  if old_item and old_item.order_id != target.order_id:
137
344
  # Update OLD order total
138
345
  old_order = session.query(models.Order).get(old_item.order_id)
139
346
  if old_order:
140
347
  ProceduralBusinessLogic.calculate_order_total(old_order, session)
141
- # Update old customer balance
348
+ # Update old customer balance (CRITICAL BUG FIX - added after prompting)
142
349
  old_customer = session.query(models.Customer).get(old_order.customer_id)
143
350
  if old_customer:
144
351
  ProceduralBusinessLogic.update_customer_balance(old_customer, session)
145
- ProceduralBusinessLogic.validate_credit_limit(old_customer)
146
352
 
147
353
  # Update NEW order total
148
354
  if target.order_id:
@@ -152,144 +358,41 @@ def handle_item_update(mapper, connection, target: models.Item):
152
358
  customer = session.query(models.Customer).get(order.customer_id)
153
359
  if customer:
154
360
  ProceduralBusinessLogic.update_customer_balance(customer, session)
155
- ProceduralBusinessLogic.validate_credit_limit(customer)
156
361
  ```
157
362
 
158
- ## Detailed Comparison
159
-
160
- ### 1. **Code Volume**
161
- | Aspect | LogicBank | Procedural |
162
- |--------|-----------|------------|
163
- | Lines of Code | ~5 | ~220 |
164
- | Complexity | Simple rule declarations | Complex event handling |
165
- | Ratio | **44X MORE CONCISE** | Baseline |
166
-
167
- ### 2. **Maintainability**
168
-
169
- **LogicBank:**
170
- - ✅ Rules are self-documenting
171
- - ✅ Business logic is immediately recognizable
172
- - ✅ Changes are localized to specific rules
173
- - ✅ Easy to add new rules without affecting existing ones
174
-
175
- **Procedural:**
176
- - ❌ Business logic buried in implementation details
177
- - ❌ Hard to understand the complete business flow
178
- - ❌ Changes require understanding entire event chain
179
- - ❌ Risk of breaking existing functionality
180
-
181
- ### 3. **Error Handling & Edge Cases**
182
-
183
- **LogicBank:**
184
- - ✅ Automatic handling of all change scenarios
185
- - ✅ Built-in transaction rollback
186
- - ✅ No need to manually track old/new values
187
- - ✅ Automatic cascade management
188
-
189
- **Procedural:**
190
- - ❌ Manual handling of every edge case
191
- - ❌ Comments like "CRITICAL BUG FIX" indicate complexity
192
- - ❌ Must manually track old values for comparison
193
- - ❌ Easy to miss scenarios (product changes, order moves, etc.)
194
-
195
- ### 4. **Performance**
196
-
197
- **LogicBank:**
198
- - ✅ **Pruning**: Rules only fire when dependent attributes change
199
- - ✅ **Optimization**: Uses SQL "adjustment" updates vs full recalculations
200
- - ✅ **Minimal SQL**: Optimized query patterns
201
- - ✅ **No N+1 problems**: Intelligent batching
202
-
203
- **Procedural:**
204
- - ❌ Multiple queries per operation
205
- - ❌ Potential N+1 problems
206
- - ❌ Full recalculations even for minor changes
207
- - ❌ No automatic optimization
208
-
209
- ### 5. **Debugging & Observability**
210
-
211
- **LogicBank:**
212
- - ✅ Clear rule execution logs
213
- - ✅ Shows rule chains and dependencies
214
- - ✅ Easy to trace business logic flow
215
- - ✅ Built-in logging with row state changes
216
-
217
- **Procedural:**
218
- - ❌ Hard to trace through event handlers
219
- - ❌ Must manually add logging
220
- - ❌ Difficult to understand execution flow
221
- - ❌ Error messages don't relate to business rules
222
-
223
- ### 6. **Testing**
224
-
225
- **LogicBank:**
226
- - ✅ Test individual rules independently
227
- - ✅ Clear rule execution reports
228
- - ✅ Behave testing integration
229
- - ✅ Rules map directly to test scenarios
363
+ **Notice:**
364
+ - Comments saying "CRITICAL BUG FIX" - these were added AFTER prompting
365
+ - Complex nesting (old vs. new handling)
366
+ - Manual cascade management
367
+ - Still potentially incomplete (what if customer_id changes mid-transaction?)
230
368
 
231
- **Procedural:**
232
- - ❌ Must test entire event chain
233
- - ❌ Hard to isolate specific logic
234
- - ❌ Complex test setup required
235
- - ❌ Brittle tests that break with changes
369
+ **This is just ONE event handler.** Full implementation has similar handlers for:
370
+ - `handle_item_insert()`
371
+ - `handle_item_delete()`
372
+ - `handle_order_update()`
373
+ - `handle_order_delete()`
374
+ - `handle_product_update()`
375
+ - etc.
236
376
 
237
- ### 7. **Business Alignment**
377
+ **Total: 220+ lines, multiple bugs, unverifiable completeness.**
238
378
 
239
- **LogicBank:**
240
- - ✅ Rules read like business requirements
241
- - ✅ Business users can understand the logic
242
- - ✅ Direct mapping from requirements to code
243
- - ✅ Self-documenting business policies
244
-
245
- **Procedural:**
246
- - ❌ Implementation details obscure business logic
247
- - ❌ Business users cannot read the code
248
- - ❌ No clear mapping from requirements
249
- - ❌ Business logic scattered across handlers
250
-
251
- ## Real-World Impact
252
-
253
- ### Development Time
254
- - **LogicBank**: Write rules once, they work everywhere
255
- - **Procedural**: Must consider every possible scenario upfront
256
-
257
- ### Risk Management
258
- - **LogicBank**: Automatic handling reduces risk of bugs
259
- - **Procedural**: High risk of missing edge cases
260
-
261
- ### Team Productivity
262
- - **LogicBank**: New team members can quickly understand rules
263
- - **Procedural**: Requires deep understanding of event system
264
-
265
- ### Business Agility
266
- - **LogicBank**: Easy to modify rules as business changes
267
- - **Procedural**: Changes require extensive testing and validation
268
-
269
- ## Conclusion
270
-
271
- The comparison demonstrates that **LogicBank provides a 44X reduction in code complexity** while delivering:
272
-
273
- - **Better Maintainability**: Rules are self-documenting and easy to modify
274
- - **Higher Quality**: Automatic handling eliminates common bugs
275
- - **Better Performance**: Built-in optimizations and pruning
276
- - **Business Alignment**: Rules directly express business requirements
277
- - **Faster Development**: Write less code, get more functionality
278
-
279
- ### The LogicBank Advantage
280
-
281
- > **"Logic is declarative, not procedural"**
379
+ ---
282
380
 
283
- LogicBank represents a fundamental shift from asking **"How do I implement this?"** to **"What do I want to happen?"**
381
+ ## Resources
284
382
 
285
- This declarative approach:
286
- 1. **Eliminates the complexity** of manual event handling
287
- 2. **Reduces maintenance burden** through automatic rule management
288
- 3. **Improves business alignment** with readable, requirements-based rules
289
- 4. **Accelerates development** with dramatically less code
383
+ **Try it yourself:**
384
+ - [GenAI-Logic Installation](https://apilogicserver.github.io/Docs/Install-Express/)
385
+ - [This Project on GitHub](https://github.com/ApiLogicServer/basic_demo)
386
+ - [Complete Documentation](https://apilogicserver.github.io/Docs/)
290
387
 
291
- The evidence is clear: **Declarative business logic is not just more concise—it's fundamentally superior for enterprise application development.**
388
+ **Background:**
389
+ - [Architecture Internals](https://apilogicserver.github.io/Docs/Architecture-Internals/)
390
+ - [LogicBank Rules API](https://apilogicserver.github.io/Docs/Logic/)
391
+ - [40-Year Technology Lineage](https://medium.com/@valjhuber/declarative-genai-the-architecture-behind-enterprise-vibe-automation-1b8a4fe4fbd7)
292
392
 
293
393
  ---
294
394
 
295
- *This comparison is based on actual implementations in the API Logic Server project, demonstrating real-world benefits of declarative business logic.*
395
+ **Document Owner:** Val Huber (Architect, GenAI-Logic and LogicBank)
396
+ **Original Analysis:** GitHub Copilot (unprompted self-criticism after discovering bugs)
397
+ **This Revision:** Claude Sonnet 4.5 (November 2025)
398
+ **Purpose:** Make the structural impossibility of procedural business logic explicit for enterprise decision-makers
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ApiLogicServer
3
- Version: 15.3.6
3
+ Version: 15.4.0
4
4
  Author-email: Val Huber <apilogicserver@gmail.com>
5
5
  License-Expression: BSD-3-Clause
6
6
  Project-URL: Homepage, https://www.genai-logic.com
@@ -1,6 +1,6 @@
1
1
  api_logic_server_cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- api_logic_server_cli/api_logic_server.py,sha256=0FeGwB6aLxRnAdORSAsTy-k0qoiMVxEcD7CWALUP688,104801
3
- api_logic_server_cli/api_logic_server_info.yaml,sha256=xwH5ENyjrlv3XbKx7IaY2iaF0Cc4zHi3x7qtpEWTzBI,139
2
+ api_logic_server_cli/api_logic_server.py,sha256=BkJ-8sRKDzT5_aiUuteX4FDIJMIHEPgx09I7eUyTGX0,104938
3
+ api_logic_server_cli/api_logic_server_info.yaml,sha256=wzqFVXFXtbCPMFWmDG5k_cP4efr7YAhyhWIlYdpKGRc,132
4
4
  api_logic_server_cli/cli.py,sha256=xAqTOhq-OnXU2HEQgzsGC9yKrGcAgKUt_8b9U2bV5No,87831
5
5
  api_logic_server_cli/cli_args_base.py,sha256=7cVM6BeizwttYAwUu1FUyuLuvWufvgt0TFeA8FI6tu0,3304
6
6
  api_logic_server_cli/cli_args_project.py,sha256=I5no_fGRV_ZsK3SuttVDAaQYI4Q5zCjx6LojGkM024w,4645
@@ -423,7 +423,7 @@ api_logic_server_cli/prototypes/base/.devcontainer-option/For_VSCode.dockerfile,
423
423
  api_logic_server_cli/prototypes/base/.devcontainer-option/devcontainer.json,sha256=tk-mGd4XdmbpKUqUeGmcPMzX3RDc6am9-de8c-rFmSo,2361
424
424
  api_logic_server_cli/prototypes/base/.devcontainer-option/readme.md,sha256=-sSneMDne1fqEoox2hXUGmoO8ewgi34y7lJwGTidSpY,104
425
425
  api_logic_server_cli/prototypes/base/.devcontainer-option/setup.sh,sha256=pOvGjZ7jgRQzFkD93mNICmcC2y66Dexrq4bCnSSVwtU,310
426
- api_logic_server_cli/prototypes/base/.github/.copilot-instructions.md,sha256=llNDE0SUTPiBztVlQdr3xqqD66BS_rtzRUMGxNkI8Eo,41031
426
+ api_logic_server_cli/prototypes/base/.github/.copilot-instructions.md,sha256=hNNBZ9Vl8J-v3N6WC6vfIwdGu8uHFFAkErezuBt49eo,44099
427
427
  api_logic_server_cli/prototypes/base/.idea/runConfigurations/ApiLogicServer.xml,sha256=eFzhe9NH-VNjcPWbPsRQy5o-MugJR9IWklA1Fo8wtYg,1127
428
428
  api_logic_server_cli/prototypes/base/.idea/runConfigurations/Report_Behave_Logic.xml,sha256=I3jlEf-TPzc-1NY843v6AcQIQ8QJD3z9KvxTYSZWMtY,1306
429
429
  api_logic_server_cli/prototypes/base/.idea/runConfigurations/Run_Behave.xml,sha256=CTzF0P4w7o4FzOi-eSpru0HczSEGtJsKqkQ7VWRyxPc,1196
@@ -621,7 +621,7 @@ api_logic_server_cli/prototypes/base/venv_setup/venv.sh,sha256=aWX9fa8fe6aO9ifBI
621
621
  api_logic_server_cli/prototypes/basic_demo/_config.yml,sha256=KIUQQpjgj7hP_Z2Fksq90E52UnbKnyom-v9L_eIfqZo,170
622
622
  api_logic_server_cli/prototypes/basic_demo/readme.md,sha256=Ii0WojbHMHpg6bgMlg9WyadzXVZePM2Nk89kmKHuGTM,18722
623
623
  api_logic_server_cli/prototypes/basic_demo/tutor.md,sha256=nlIkqcqkVXBDe3Rktcr4puZxrrTFDl1s_Id8nA5GwA4,45516
624
- api_logic_server_cli/prototypes/basic_demo/.github/.copilot-instructions.md,sha256=e8UZpBpJf_-A788HblOZWzeplHM85-JaL1pVIp5_vKU,41515
624
+ api_logic_server_cli/prototypes/basic_demo/.github/.copilot-instructions.md,sha256=k6ZfBQVFdzHsCopJfSuW0VhprpvMfOoplZBu-rFAo64,44644
625
625
  api_logic_server_cli/prototypes/basic_demo/.github/welcome.md,sha256=sdT1Jz9rDgkjTQK2IC1EHs_rFI1bRhwTsOZ21i3oJ0k,1077
626
626
  api_logic_server_cli/prototypes/basic_demo/_layouts/redirect.html,sha256=-0kMPGYI88fb787IzYmdi7ySZUhgpUlP0vodrg8-NRM,457
627
627
  api_logic_server_cli/prototypes/basic_demo/customizations/api/api_discovery/openapi.py,sha256=kLQ7Fn1J7tzuNJHBXF2AiwtzvQ-0JxJ6z-MfFryAtLk,3887
@@ -691,7 +691,7 @@ api_logic_server_cli/prototypes/basic_demo/iteration/logic/declare_logic.py,sha2
691
691
  api_logic_server_cli/prototypes/basic_demo/iteration/ui/admin/admin.yaml,sha256=uqxqYNMbKm4aCaTOy5CnlAtYccYM32-oQLVi5K6tfNI,3554
692
692
  api_logic_server_cli/prototypes/basic_demo/logic/declarative-vs-procedural-comparison.html,sha256=GUzgmnWdT709M5mPJGyfF1ARzzz3y5guASDBWeG43PU,3915
693
693
  api_logic_server_cli/prototypes/basic_demo/logic/procedural/credit_service.py,sha256=n_7YzxxssaxfuB8-nu_jPrQ-H6leAqKjJQRfOKcQwR4,7525
694
- api_logic_server_cli/prototypes/basic_demo/logic/procedural/declarative-vs-procedural-comparison.md,sha256=lBUyilpqRPrL-d4yp55gRyRLaeYNzbArktMOaTD5IUw,12193
694
+ api_logic_server_cli/prototypes/basic_demo/logic/procedural/declarative-vs-procedural-comparison.md,sha256=RAW9EKd1ngY9Lw6rXbimFFSgBwtzMm9o3-_t4_rNdJ0,15844
695
695
  api_logic_server_cli/prototypes/basic_demo/logic/procedural/declarative-vs-procedural-comparison.png,sha256=4jZRhM4raP95KOhbUEzlDRT-K9olwbVI6PVMZKi8j84,904211
696
696
  api_logic_server_cli/prototypes/basic_demo/ui/my-react-app/README.md,sha256=h7ePuwOqn3jv7YkjM4ruaP5rpYBmr_4Q3NChhb8pVJ4,452
697
697
  api_logic_server_cli/prototypes/basic_demo/ui/my-react-app/README_create_react_app.md,sha256=cOr7x6X9RmqjITtafhsqQTg8vl1Ob8X0WC78WL21CdE,3359
@@ -2864,9 +2864,9 @@ api_logic_server_cli/tools/mini_skel/database/system/SAFRSBaseX.py,sha256=p8C7AF
2864
2864
  api_logic_server_cli/tools/mini_skel/database/system/TestDataBase.py,sha256=U02SYqThsbY5g3DX7XGaiMxjZBuOpzvtPS6RfI1WQFg,371
2865
2865
  api_logic_server_cli/tools/mini_skel/logic/declare_logic.py,sha256=fTrlHyqMeZsw_TyEXFa1VlYBL7fzjZab5ONSXO7aApo,175
2866
2866
  api_logic_server_cli/tools/mini_skel/logic/load_verify_rules.py,sha256=Rr5bySJpYCZmNPF2h-phcPJ53nAOPcT_ohZpCD93-a0,7530
2867
- apilogicserver-15.3.6.dist-info/licenses/LICENSE,sha256=67BS7VC-Z8GpaR3wijngQJkHWV04qJrwQArVgn9ldoI,1485
2868
- apilogicserver-15.3.6.dist-info/METADATA,sha256=SuVFzjcqSb6S35JTbId2k5fxHeypu8Dz2kkBG5kjmus,26461
2869
- apilogicserver-15.3.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
2870
- apilogicserver-15.3.6.dist-info/entry_points.txt,sha256=W9EVNvf09h8n6rJChmVj2gzxVQ6BXXZa2x3wri0lFGc,259
2871
- apilogicserver-15.3.6.dist-info/top_level.txt,sha256=-r0AT_GEApleihg-jIh0OMvzzc0BO1RuhhOpE91H5qI,21
2872
- apilogicserver-15.3.6.dist-info/RECORD,,
2867
+ apilogicserver-15.4.0.dist-info/licenses/LICENSE,sha256=67BS7VC-Z8GpaR3wijngQJkHWV04qJrwQArVgn9ldoI,1485
2868
+ apilogicserver-15.4.0.dist-info/METADATA,sha256=-t0Ebk60pemljRZiL9WiGYAB3i5ue-B2sBVOK_rdrGk,26461
2869
+ apilogicserver-15.4.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
2870
+ apilogicserver-15.4.0.dist-info/entry_points.txt,sha256=W9EVNvf09h8n6rJChmVj2gzxVQ6BXXZa2x3wri0lFGc,259
2871
+ apilogicserver-15.4.0.dist-info/top_level.txt,sha256=-r0AT_GEApleihg-jIh0OMvzzc0BO1RuhhOpE91H5qI,21
2872
+ apilogicserver-15.4.0.dist-info/RECORD,,