Epilogue: Portfolio Graduation
Epilogue: Portfolio Graduation
Congratulations! You have completed the final curriculum in the track.
You started with a clean terminal environment, learning the basic loops of the SOLO protocol. From there, you constructed a multi-layered distributed software system. Let's review what you built, how to show it off, and how to write about it on your resume.
The Architecture Map
This is the complete system you designed and implemented across all five courses:
[ THE CLOUD BOUNDARY ]
│
│ [ Google Cloud ]
┌─────────────────────┐ │ ┌──────────────────────┐
│ Local CLI Tracker ├─────────┼──►│ Gemini 2.5 Flash │
│ (Python Console) │ │ │ (AI Studio API) │
└──────────┬──────────┘ │ └──────────────────────┘
│ │
│ │ [ Render / GCP ]
│ │ ┌──────────────────────┐
│ │ │ Deployed Web Service │
└────────────────────┼──►│ (FastAPI App Engine) │
│ └──────────┬───────────┘
│ │
│ ▼ (Postgres SQL)
│ ┌──────────────────────┐
│ │ Neon PostgreSQL │
│ │ (Cloud Database) │
│ └──────────────────────┘
- Foundational Layer (SOLO): A test-driven local Python CLI application that reads and records schedules.
- Backend Services (API Design): A FastAPI REST backend that moves state tracking from local disk to a relational database manager (SQLite).
- Security Shield (Authentication): BCrypt cryptographic hashing for passwords, stateless JWT signature tokens, and route dependency middleware to scope database records to authenticated users.
- Cloud Infrastructure (DevOps): Packaging the system into a Docker container, replacing SQLite with a production serverless PostgreSQL engine, and deploying via automated GitHub Actions CI/CD workflows.
- Intelligence Layer (AI Agents): Hooking Gemini into your local CLI, writing custom Pydantic schemas, and declaring local function callbacks to query and write to your live cloud databases under Human-in-the-Loop constraints.
How to Demo This Project to Recruiters
When showing this off in interviews or peer reviews, follow this step-by-step demonstration sequence to make the most impact:
- Step 1: Show the Live API Documentation.
Open your browser to your live Render/GCP URL (e.g.,
https://my-api-app.onrender.com/docs). Point out the endpoints, the schemas, and explain how the JWT authentication headers protect the routes. - Step 2: Run the CLI Agent Live.
Open your terminal and run the agent in front of them:
python main.py coach "suggest a plan for learning Docker this afternoon" - Step 3: Point Out the Safety Gates.
Highlight the Human-in-the-Loop confirmation block. Explain that the AI proposed a structured schedule but halted write permissions, displaying the milestones and waiting for manual console approval (
y/n). - Step 4: Verify the Database Write.
Type
yto accept, then pull up the database manager dashboard or query the live Swagger API to show that the new records were successfully written to your Postgres database in the cloud.
Resume Copy-Paste Template
Add this project to the Projects section of your resume. Customize the technologies to match your specific repository:
Agentic Task & Study Coordinator | Python, FastAPI, PostgreSQL, Docker, GitHub Actions, Gemini API, Pytest
- Designed and deployed a secure, containerized distributed backend application using FastAPI and Docker, automating deployment to a cloud hosting provider via a custom GitHub Actions CI/CD pipeline.
- Implemented zero-trust authentication using BCrypt password hashing, stateless JSON Web Tokens (JWT), and FastAPI dependency injection filters to isolate database records.
- Integrated natural language processing capabilities using the Gemini API, writing custom Python tool registries and recursive loop-guards to execute local database actions.
- Enforced strict type safety and prevented LLM formatting drift by validating API inputs and agent outputs using Pydantic V2 schemas.
Interview Q&A Preparation
Q: How did you handle the non-deterministic nature of LLM responses in your code?
"I avoided raw text parsing completely. I configured the model's response configuration to enforce a strict JSON schema mapped directly to a Pydantic V2 model. If the API returns values that don't match our constraints (like negative hours), Pydantic catches it immediately, allowing us to log the exception and handle it without crashing the program."
Q: Why didn't you use an agent framework like LangChain or AutoGen?
"I wanted to understand agent mechanics at the systems level. Writing the orchestrator loop, the triage router, and the conversation memory serialization class from scratch in plain Python showed me how token state buffers and function calling operate under the hood, without the overhead of heavy framework wrappers."
Q: How does your app prevent the agent from infinitely executing tool callbacks?
"I implemented a loop-guard counter within the callback execution logic. If the agent makes more than 3 recursive tool execution requests in a single turn, the script automatically breaks the loop and raises an exception. This protects our API limits and prevents terminal hangs."
Q: How did you secure your API endpoints from unauthorized actions?
"I implemented stateless JWT (JSON Web Token) authentication. When a client logs in, the server hashes and verifies their password using bcrypt and generates a signed token. On subsequent requests, a FastAPI middleware dependency extracts the token from the HTTP Authorization header, decodes it, and scopes all SQL queries specifically to the user's authenticated ID, preventing cross-user data leakage."
Q: Why did you migrate the database from SQLite to Postgres for deployment?
"SQLite is local and file-based. Serverless cloud engines like Render and GCP Cloud Run deploy ephemeral container instances that scale down to zero when idle. If I used SQLite, the database file would be reset or lost every time the container restarted. Moving to a cloud PostgreSQL instance (Neon) separates database state from ephemeral compute nodes, ensuring data persistence."
Q: How did you test your LLM agent integration without burning through API token limits during automated builds?
"I wrote integration tests using Python's
unittest.mocklibrary. I mocked the Geminigenai.Clientresponses to simulate model tool-call payloads and response schemas. This allowed the test suite to assert routing logic and tool callback execution deterministically, in milliseconds, with zero API cost and zero internet dependencies."
Q: How is security maintained in your automated CI/CD pipeline when deploying to the cloud?
"Instead of hardcoding access credentials inside our repository or docker containers, all secrets (like the Postgres DATABASE_URL and the JWT cryptographic key) are configured as environment variables inside the cloud provider's console. For automated deployments, GitHub Actions leverages encrypted repo secrets and IAM role-bound Service Accounts, preventing credential leaks in git history."