You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
✅ GitHub Copilot Instructions – Product Development Lifecycle
You are assisting in a structured product development process that evolves across four phases: Prototype, MVP, Release 1, and Evolution. Each phase has specific goals and quality expectations.
Testing is required at all stages. Generate code that aligns strictly with the current phase.
🔁 Global Guidelines
Always prioritize mature, battle-tested libraries.
Do not reimplement:
Caching (joblib, diskcache)
Logging (logging)
Config (pydantic, configparser, dotenv)
HTTP clients (requests, httpx)
Serialization (json, pandas, pyarrow)
Do not create wrappers around cache/log/config unless explicitly instructed.
Minimize external dependencies in early phases.
Use filesystem/local memory instead of Redis, S3, or cloud services in Prototype and MVP.
Testing is never optional.
Write tests from Prototype onwards.
Use test-first or test-after methods depending on phase and complexity.
🧪 PHASE 1 – PROTOTYPE (Technical Feasibility)
Purpose: Validate feasibility with the least code possible.
Copilot Guidelines:
Prioritize working code over structure
Avoid modularization and input validation
Prefer inline or script-style logic
Use static inputs, fakes, or hardcoded values
Avoid error handling, config files, retries
Testing Expectations:
Write minimal unit tests for non-trivial logic
Use simple assert statements or test functions at the bottom of the script
No test coverage or file structure required
Avoid live API calls: use fakes or static fixtures
Agile Practices:
XP: Working code over design
Lean: Fast feedback, discardable code
Scrum: Spike stories for discovery
Kanban: Short cycles, visual feedback
🚧 PHASE 2 – MVP (Minimum Viable Product)
Purpose: Deliver the smallest usable version of the product with early reliability.
Copilot Guidelines:
Apply Test-Driven Development for new logic
Modularize: break into fetch, transform, output, etc.
Use config files instead of hardcoded values
Begin basic validation, retry, fallback mechanisms
Add error boundaries where needed
Testing Expectations:
Write unit tests before/with implementation
Use mocks/fakes instead of live APIs
Create test files in a tests/ folder
Use pytest-compatible structure
Cover all data-transforming or state-changing functions
Agile Practices:
XP: TDD, refactor, small commits
Scrum: Deliver iteration-ready functionality
Kanban: Use WIP limits for testable units
Lean: Build only what’s required
🚀 PHASE 3 – RELEASE 1 (Production Ready)
Purpose: Build a robust and maintainable product for real usage.
Copilot Guidelines:
Follow strict test-first discipline
Use typed functions, layered structure, and clear interfaces
Handle all error cases and I/O issues
Use dependency injection for API/DB access
Add docs and CLI/script entrypoints
Testing Expectations:
Achieve full unit and integration test coverage
Test all modules and code paths, including edge cases
Use pytest, coverage, tox or similar
Validate all API contracts, model output, and file I/O
Agile Practices:
XP: CI, full coverage, clean interfaces
Scrum: “Definition of Done” includes tests, docs, type safety
GitHub Copilot Instructions – Product Development Lifecycle
You are assisting in a structured product development process that evolves across defined phases: Prototype, MVP, Release 1, and Evolution. Each phase has specific goals, expectations, and code quality requirements.
Generate code that aligns strictly with the active development phase.
PHASE 1 – PROTOTYPE (Technical Feasibility)
Purpose: Quickly test if a feature or integration is technically possible. Focus is on core logic and flow.
Copilot Guidelines:
Write only the code required to demonstrate basic functionality
Use dummy or hardcoded data
No input validation
No error handling
No modularization
No comments unless critical
No typing or documentation
Flat, inline, or script-style code preferred
Example Prompts:
"Prototype a FastAPI endpoint that echoes a POSTed JSON."
"Show a function that filters even numbers from a list."
PHASE 2 – MVP (Minimum Viable Product)
Purpose: Build a functional version with the essential use cases covered. Begin addressing stability and structure.
Copilot Guidelines:
Add minimal error handling and input validation
Refactor logic into reusable functions
Introduce types where helpful
Modularize code into clear files or components
Use config files or environment variables instead of hardcoded values
Comments only where necessary to understand logic
Example Prompts:
"Convert prototype to include validation and fallback logic."
"Split the logic into service and handler functions."
PHASE 3 – RELEASE 1 (Production Ready)
Purpose: Prepare for deployment and real-world usage. Focus on robustness, clarity, and maintainability.
Copilot Guidelines:
Full input validation and error handling
Type annotations throughout
Layered structure: controller, service, model, schema, etc.
Add logging, configuration, and extensibility
Write documentation and docstrings for all public code
Include unit and integration tests
Example Prompts:
"Refactor MVP with full typing and docstrings."
"Add test cases for edge cases and error scenarios."
Microsoft Access Application Best Practices for GitHub Copilot
This guide outlines best practices for developing Microsoft Access applications using forms, subforms, navigation panels, and VBA logic. It includes performance tips, naming conventions, and UI/UX guidance for older displays and fixed-size layouts.
Language and Error Handling
All error messages must be displayed in Spanish.
User interface text should be in Spanish where applicable.
Comments in code can be in English for developer clarity.
Do not use emoji in any code, comments, or documentation.
UI Architecture & Navigation
Use a Navigation Form as the central dashboard.
Organize forms by functional area (e.g., Customers, Orders, Products).
Implement tab controls to group related fields/data.
Use subforms and modal dialogs for detail views or advanced editing.
Avoid overloading a single screen—split into logical, focused forms.
UI/UX Best Practices for Old Monitors (1024×768 or 1280×800)
Target resolution: 1024×768 px (safe zone for legacy monitors)
Fixed Form Size: Set main forms to a fixed size of approx.:
Width: 960 px
Height: 700 px
This ensures compatibility across older displays and avoids scrollbars.
Set Auto Resize = No and Auto Center = Yes in form properties.
Set Fit to Screen = No to prevent unexpected resizing on load.
Use fonts like Tahoma, Segoe UI, or Arial at 9pt–10pt for readability.
Avoid overlapping pop-up forms; use modal forms with defined boundaries.
Keep buttons aligned left or top where screen space is limited.
Avoid full-screen forms unless the target environment supports widescreens.
Forms & Subforms Guidelines
Master-Detail Pattern Implementation
Primary Form (Master): Contains parent record data with navigation controls
Subform (Detail): Embedded form showing related child records
Link parent and child forms via Link Master Fields and Link Child Fields
Master-detail synchronization best practices:
' In master form's On Current eventPrivateSubForm_Current()
On ErrorGoTo ErrorHandler
IfNot IsNull(Me.ID) Then' Requery subform when master record changes
Me.subfrmDetails.Form.Requery
' Update subform filter if needed
Me.subfrmDetails.Form.Filter = "MasterID = " & Me.ID
Me.subfrmDetails.Form.FilterOn = TrueEnd IfExit Sub
ErrorHandler:
MsgBox "Error al sincronizar registros: " & Err.Description, vbCritical, "Error del Sistema"End Sub
Subform Configuration:
Use Continuous Forms instead of datasheets for better formatting control
Set Allow Additions = Yes for new child records
Set Allow Deletions based on business rules
Configure Link Master Fields = "MasterID" (parent key field)
Configure Link Child Fields = "MasterID" (foreign key field)
Navigation Synchronization:
' In subform's After Update eventPrivateSubForm_AfterUpdate()
' Refresh master form calculations if needed
Parent.Form.Recalc
' Update master form totals
Parent.Form.Requery
End Sub
Keep subform queries optimized and filtered on load
Use Me.Dirty = False to save master record before adding details
Implement cascading operations (delete details when master is deleted)
Filter and Grid Display Guidelines
Search and Filter Implementation:
' Global search function for formsPrivateSubtxtBuscar_AfterUpdate()
On ErrorGoTo ErrorHandler
Dim strFilter AsStringIfNot IsNull(Me.txtBuscar) And Len(Me.txtBuscar) > 0Then' Build filter string for multiple fields
strFilter = "[Nombre] Like '*" & Me.txtBuscar & "*' OR " & _"[Apellido] Like '*" & Me.txtBuscar & "*' OR " & _"[Email] Like '*" & Me.txtBuscar & "*'"
Me.Filter = strFilter
Me.FilterOn = TrueElse
Me.FilterOn = FalseEnd IfExit Sub
ErrorHandler:
MsgBox "Error al filtrar registros: " & Err.Description, vbCritical, "Error del Sistema"End Sub
Advanced Filter Options:
' Combo box filter implementationPrivateSubcmbFiltroEstado_AfterUpdate()
On ErrorGoTo ErrorHandler
IfNot IsNull(Me.cmbFiltroEstado) Then
Me.Filter = "[Estado] = '" & Me.cmbFiltroEstado & "'"
Me.FilterOn = TrueElse
Me.FilterOn = FalseEnd If' Update record count label
Me.lblConteoRegistros.Caption = "Registros: " & Me.RecordsetClone.RecordCount
Exit Sub
ErrorHandler:
MsgBox "Error al aplicar filtro: " & Err.Description, vbCritical, "Error del Sistema"End Sub
Grid Display Best Practices:
Use Continuous Forms for better control over appearance
Set row height to accommodate 9-10pt fonts
Implement alternating row colors for better readability
Add horizontal lines between records if needed
Configure column widths to fit 960px form width
Use text boxes instead of labels for data display (better performance)
Grid Navigation and Selection:
' Handle record selection in continuous formsPrivateSubForm_Current()
On ErrorGoTo ErrorHandler
' Highlight current recordIfNot IsNull(Me.ID) Then
Me.Detail.BackColor = RGB(220, 235, 250) ' Light blue highlightEnd If' Update status bar or related controls
Me.lblRegistroActual.Caption = "Registro " & (Me.CurrentRecord) & " de " & Me.RecordsetClone.RecordCount
Exit Sub
ErrorHandler:
MsgBox "Error en navegación: " & Err.Description, vbCritical, "Error del Sistema"End Sub
Performance Optimization for Grids:
Limit initial recordset size (use TOP 100 or similar)
Implement paging for large datasets
Use indexes on filtered fields
Avoid calculated fields in continuous forms when possible
Clear Filter Functionality:
PrivateSubbtnLimpiarFiltro_Click()
On ErrorGoTo ErrorHandler
' Clear all filter controls
Me.txtBuscar = Null
Me.cmbFiltroEstado = Null
Me.FilterOn = False' Refresh record count
Me.lblConteoRegistros.Caption = "Registros: " & Me.RecordsetClone.RecordCount
Exit Sub
ErrorHandler:
MsgBox "Error al limpiar filtros: " & Err.Description, vbCritical, "Error del Sistema"End Sub
Performance Optimization
Use WHERE conditions when opening forms:
DoCmd.OpenForm "frmOrders", , , "CustomerID = 42"
Split frontend/backend architecture:
Backend (*.accdb or SQL): tables only.
Frontend: forms, logic, and reports with linked tables.
Load subforms and large data only when needed (Visible = False then Load on demand).
Logic & VBA Standards
Centralize logic in shared modules (modValidation, modUtils, etc.).
Create reusable functions in dedicated modules:
modFuncionesFormulario - Form-related utility functions including master-detail synchronization
modFuncionesValidacion - Data validation functions
Use icons sparingly and only where they add clear value.
Security & Data Integrity
Hide backend objects and disable direct navigation where needed.
Use logic-based permissions to hide or disable UI components by role.
Implement basic audit logging using hidden tables or append queries.
Use read-only forms for sensitive data views.
File Types Used in Microsoft Access (Resumen Visual)
Categoría
Extensiones principales
Descripción
Bases de datos
.accdb, .mdb, .accde, .mde
Archivos de base de datos. .accdb es el formato moderno; .accde es compilado sin código editable.
Módulos de código
.bas, .cls, .vba
Código VBA exportado. .bas para módulos estándar, .cls para formularios/clases, .vba menos común.
Formularios e informes
.frm, .frx, .rep
Estructuras visuales exportadas como texto (usadas en sistemas con control de versiones o automatización).
Datos y estructura
.sql, .csv, .xml, .txt, .json
Datos estructurados o scripts SQL para creación/importación de datos.
Macros y plantillas
.accda, .accdt, .maf
Complementos, plantillas, y macros exportadas.
Integración externa
.xlsx, .xls, .pdf, .html
Archivos para importar/exportar datos e informes.
Control y seguridad
.laccdb, .ldb, .bak, .udl, .dsn
Archivos generados por Access para bloqueo multiusuario, backups, y conexiones externas.
Nota: Muchos de estos archivos no se manipulan directamente desde la interfaz de Access, pero son clave en entornos de desarrollo, integración, y mantenimiento profesional.
File Type Usage Guidelines
Development Environment: Use .accdb for development and .accde for production deployment
Version Control: Export forms and modules as .bas, .cls, and .frm files for source control
Data Exchange: Prefer .csv or .xlsx for data imports/exports over proprietary formats
Backup Strategy: Maintain .bak files and monitor .laccdb files for multi-user scenarios
Documentation: Export database schema to .sql files for documentation and deployment scripts
Naming Conventions
Object
Prefix
Example
Table
tbl
tblCustomers
Query
qry
qrySalesByRegion
Form
frm
frmInvoices
Subform
subfrm
subfrmInvoiceItems
Module
mod
modBusinessRules
Controls
txt, cmb, lbl, etc.
txtFirstName, cmbStatus
Language Conventions for Code Elements
Function Names: Use English with descriptive names
Use TempVars or hidden forms to pass global values between forms.
Track application version with a lblVersion control on the main form.
Document complex VBA logic inline with comments for maintainability.
Copilot Contribution Guidelines
Perform only the specific task requested - Do not add extra features, suggestions, or improvements unless explicitly asked to perform those specific tasks
Follow the naming conventions listed above.
Use English for function and variable names, Spanish for table field references
Use modular design with a single responsibility per form/subform.
Create reusable functions in appropriate utility modules (modFuncionesFormulario, modFuncionesValidacion, etc.)
Always create reusable master-detail functions instead of repeating synchronization code across multiple forms
When suggesting VBA:
Include comments and error handling.
Validate data inputs before committing to the database.
Error messages must be in Spanish.
Consider if the code should be a reusable function in a utility module.
For master-detail operations, always suggest creating or using functions from modFuncionesFormulario
Use English for function/variable names, maintain Spanish table field names
Avoid macros unless requested explicitly.
When generating forms, ensure the form layout fits within 1024×768 px.
Never use emoji in code, comments, or documentation.
This project is built to support legacy hardware, enforce UX consistency, and keep logic clean. Use these standards to maximize maintainability and user satisfaction.
PLAN MAESTRO PARA DESARROLLAR UN SISTEMA EN MICROSOFT ACCESS
1. OBJETIVO GENERAL
Desarrollar un sistema integral en Microsoft Access para gestionar información específica (personas, productos, operaciones, etc.) con una interfaz amigable, control de acceso por roles y funcionalidades automatizadas.
2. ETAPAS DEL PROYECTO
2.1 ANÁLISIS FUNCIONAL Y DISEÑO
2.1.1 Relevamiento de Requisitos
Definir alcance y objetivo funcional del sistema
Identificar actores y roles del sistema (Administrador, Usuario, Consulta)
Determinar procesos clave a informatizar
Establecer requerimientos técnicos, legales y de seguridad
2.1.2 Diseño de Modelo de Datos
Diagramar modelo entidad-relación (DER)
Definir entidades principales, atributos y relaciones
Establecer claves primarias y foráneas
Normalizar tablas hasta 3FN (cuando sea aplicable)
2.1.3 Documento Técnico Inicial
Catálogo de tablas con campos, tipos de datos y propiedades
Reglas de validación y listas de valores
Requisitos de formularios, consultas, informes y lógica de negocio
2.2 IMPLEMENTACIÓN DE BASE DE DATOS (BACKEND)
2.2.1 Creación de Estructura de Tablas
Construcción de tablas en Microsoft Access
Configuración de tipos de datos correctos (Texto, Fecha/Hora, Número, Sí/No)
Asignación de propiedades: requerido, predeterminado, tamaño del campo
2.2.2 Establecimiento de Relaciones
Implementación de claves foráneas y relaciones uno-a-muchos, muchos-a-muchos (con tablas intermedias)
Habilitación de integridad referencial
Activación de acciones en cascada (actualización/eliminación), según necesidad
2.2.3 Carga Inicial de Datos Maestros
Ingreso de datos estáticos de referencia (Roles, Categorías, Tipos, Estados)
Verificación de consistencia de claves
2.3 DISEÑO DE INTERFAZ DE USUARIO (FRONTEND)
2.3.1 Formularios Principales
Creación de formularios para alta, baja y modificación de datos
Uso eficiente de controles: combos, cuadros de texto, botones, fechas
Inclusión de botones de navegación y acciones
2.3.2 Formularios Relacionados (Subformularios)
Relación maestro-detalle, como por ejemplo Clientes > Pedidos
Enlace mediante campos relacionados
2.3.3 Menú Principal y Navegación
Diseño de un formulario menú principal con accesos directos
Incorporación de botones para ingreso a módulos principales y reportes
2.3.4 Autenticación de Usuario (opcional)
Formulario de inicio de sesión con verificación de credenciales
logging_config.py: sets up structured logging with levels
Include /metrics and /health endpoints for observability
src/fastapi_starter_kit/config.py
Application configuration using pydantic.BaseSettings
Load environment variables from .env files
Use pydantic_settings for better configuration management
tests/
Test files organized to mirror the src/fastapi_starter_kit/ structure
Use conftest.py for shared fixtures
Follow pytest best practices with proper async test setup
Package Management with Poetry
Adding Dependencies
# Production dependencies
poetry add "fastapi>=0.115.0""uvicorn[standard]>=0.34.0""sqlalchemy>=2.0.0"# Development dependencies
poetry add --group dev pytest black isort mypy pre-commit
# Install dependencies
poetry install
Running the Application
# Activate virtual environment
poetry shell
# Run with uvicorn
poetry run uvicorn src.fastapi_starter_kit.main:app --reload --host 0.0.0.0 --port 8000
# Run tests
poetry run pytest
# Format code
poetry run black src/ tests/
poetry run isort src/ tests/
Auth Rules
Use OAuth2 password flow with JWT tokens.
Store passwords hashed using bcrypt or argon2.
All protected routes must use Depends(get_current_user).
Implement proper token refresh mechanisms.
Use HTTPS in production environments.
Performance
Load models once at startup using FastAPI lifespan events.
Avoid re-loading joblib or transformers pipelines per request.
Offload blocking model inference to Celery tasks.
Use connection pooling for database operations.
Implement proper caching strategies with Redis.
Dependencies
Use these libraries via Poetry (with version constraints):
# Good: Test the real thingdeftest_analyze_real_invoice():
analyzer=DocumentAnalyzer()
result=analyzer.extract_invoice_data('test_invoice.pdf')
assert'VendorName'inresult# Don't start with: Complex mocking@patch('azure.ai.documentintelligence.DocumentIntelligenceClient')deftest_analyze_invoice_mocked(mock_client):
# Complex setup...
2. One Test Per Feature
# Good: Simple, focused testsdeftest_invoice_extraction():
# Test one thingdeftest_receipt_extraction():
# Test one thing# Bad: Complex test classesclassTestDocumentAnalyzer:
@pytest.fixturedefanalyzer(self):
# Complex setup@pytest.mark.parametrize("file_type,expected", [...])deftest_analyze_various_formats(self):
# Complex parameterized test
When to Add Complexity
Only add these when you actually hit the problem:
1. Add Async When You Have Multiple Documents
# Start with syncdefanalyze_invoice(self, file_path: str):
returnself.client.begin_analyze_document(...)
# Add async only when processing multiple filesasyncdefanalyze_multiple_invoices(self, file_paths: list[str]):
tasks= [self.analyze_invoice_async(path) forpathinfile_paths]
returnawaitasyncio.gather(*tasks)
2. Add Retries When API Calls Fail
# Start without retriesdefanalyze_document(self, model_id: str, file_path: str):
returnself.client.begin_analyze_document(model_id, file_data)
# Add retries when you see failuresdefanalyze_document(self, model_id: str, file_path: str, retries: int=3):
forattemptinrange(retries):
try:
returnself.client.begin_analyze_document(model_id, file_data)
exceptExceptionase:
ifattempt==retries-1:
raisetime.sleep(2**attempt) # Simple exponential backoff
3. Add Validation When You Get Bad Input
# Start without validationdefanalyze_invoice(self, file_path: str):
withopen(file_path, 'rb') asf:
returnself.client.begin_analyze_document("prebuilt-invoice", f)
# Add validation when you encounter issuesdefanalyze_invoice(self, file_path: str):
ifnotos.path.exists(file_path):
raiseFileNotFoundError(f"File not found: {file_path}")
ifnotfile_path.lower().endswith(('.pdf', '.jpg', '.png')):
raiseValueError("Unsupported file format")
withopen(file_path, 'rb') asf:
returnself.client.begin_analyze_document("prebuilt-invoice", f)
Documentation Rules
1. Code Should Be Self-Documenting
# Good: Clear names, minimal commentsdefextract_vendor_name_from_invoice(self, file_path: str) ->str:
result=self.analyze_invoice(file_path)
returnresult.documents[0].fields.get('VendorName', {}).get('content', '')
# Bad: Comments explaining unclear codedefprocess_doc(self, fp: str) ->str:
# Extract vendor name from invoice document# using Azure Document Intelligence API# Returns vendor name string or empty string if not foundres=self.analyze(fp, 'inv')
returnres.docs[0].flds.get('VN', {}).get('cont', '')
2. Docstrings Only for Public Methods
# Good: Docstring for public APIdefextract_invoice_data(self, file_path: str) ->dict:
"""Extract structured data from invoice PDF. Args: file_path: Path to invoice PDF file Returns: Dictionary with extracted invoice fields """def_parse_result(self, result):
# Private method, no docstring neededpass
.cursorrules - KISS & Agile Focused PoC Development
Core Principles
KISS (Keep It Simple, Stupid)
Prioritize simple, readable solutions over clever ones
Choose the most straightforward approach that solves the problem
Avoid premature optimization - make it work first, optimize later
Use clear, descriptive variable and function names
Minimize dependencies and external libraries
Write self-documenting code that doesn't need extensive comments
Agile Focus
Deliver working software quickly and iteratively
Focus on MVP (Minimum Viable Product) features first
Break down large tasks into small, manageable chunks
Prioritize features that provide immediate value
Keep solutions flexible for rapid changes and iterations
Code Style Guidelines
General Rules
Write code that a junior developer can understand in 6 months
One function/method should do one thing well
Keep functions small (ideally under 20 lines)
Use meaningful names instead of comments when possible
Avoid deep nesting (max 3 levels)
Prefer composition over inheritance
Use early returns to reduce nesting
File Organization
Keep files small and focused on a single responsibility
Use clear folder structure that reflects business logic
Avoid deeply nested directory structures
Name files descriptively based on their primary function
PoC-Specific Guidelines
Speed over Perfection
Hard-code values when configuration adds unnecessary complexity
Use inline styles/logic if it speeds up development
Skip elaborate error handling for non-critical paths
Focus on the happy path first, edge cases later
Use TODO comments liberally for future improvements
Testing Strategy
Write tests for core business logic only
Prefer integration tests over unit tests for PoCs
Test the critical user journey, skip edge cases initially
Use simple assertion libraries, avoid complex test frameworks
Documentation
README should explain what the PoC proves, not how to use it
Include setup instructions in 5 steps or less
Document assumptions and limitations clearly
Keep API documentation minimal but accurate
Technology Choices
Prefer Simple Tech Stack
Use technologies the team already knows
Choose boring, stable technologies over cutting-edge ones
Minimize the number of different languages/frameworks
Use cloud services instead of building infrastructure
Leverage existing platforms and APIs when possible
Database/Storage
Start with the simplest storage that works (files, SQLite, etc.)
Use managed services over self-hosted solutions
Avoid complex database schemas initially
Don't worry about scalability until it's proven necessary
Agile Practices
Development Process
Work in short sprints (1-2 weeks max)
Daily standup focusing on blockers and progress
Demo working features frequently (even if rough)
Get user feedback early and often
Pivot quickly based on learnings
Code Reviews
Focus reviews on logic correctness, not style perfection
Approve if it works and is readable
Save refactoring discussions for later iterations
Prioritize knowledge sharing over nitpicking
Version Control
Commit frequently with clear, simple messages
Use feature branches for anything taking more than a day
Merge to main often (daily if possible)
Don't worry about perfect commit history
Use conventional commits if the team prefers structure
Anti-Patterns to Avoid
Over-Engineering
Don't build abstractions until you need them at least 3 times
Avoid creating your own frameworks or libraries
Don't implement features "because we might need them later"
Skip elaborate configuration systems
Don't optimize for theoretical future requirements
Analysis Paralysis
Set strict time boxes for technical decisions
Choose the first viable solution, not the perfect one
Don't research every possible option
Make reversible decisions quickly
Document decisions to avoid re-debating them
Perfectionism
Ship with known minor bugs if they don't block core functionality
Don't spend days on edge cases that affect <1% of users
Accept technical debt in non-critical areas
Focus on user value over code aesthetics
Remember: this is a PoC, not production software
Success Metrics for PoC
Time to first working demo
Number of core user stories completed
Stakeholder feedback quality and frequency
Team velocity and morale
Technical feasibility validation
Business hypothesis validation
Remember
The goal is to prove or disprove a concept quickly and cheaply. Every decision should be evaluated against this objective. Perfect code that takes too long is worse than imperfect code that proves the concept and enables learning.