<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Hong Seong Ju&apos;s Engineering Notes</title><description>Engineering notes on backend, data, AI systems, infrastructure, and the evidence behind technical decisions.</description><link>https://seongju.vercel.app/en/</link><item><title>Why green CI left ARM64 k3s running the previous image</title><link>https://seongju.vercel.app/en/writing/arm64-gitops-image-drift/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/arm64-gitops-image-drift/</guid><description>A delivery record that turned an AMD64-only OCI manifest into separate build, registry, Git write-back, reconciliation, and runtime gates.</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Why I replaced an eight-second confirmation request with an asynchronous intent</title><link>https://seongju.vercel.app/en/writing/async-confirm-action-boundary/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/async-confirm-action-boundary/</guid><description>A write-path redesign that released Tomcat request threads immediately and fixed an overly broad rule that could supersede unrelated pending approval actions.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Validating Cilium FQDN egress without touching a single-node production cluster</title><link>https://seongju.vercel.app/en/writing/cilium-fqdn-egress-lab/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/cilium-fqdn-egress-lab/</guid><description>A disposable kind lab that proved identity-specific toFQDNs and Hubble drops while keeping the risky production CNI migration behind an explicit gate.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Why a public ALB still had to be closed behind CloudFront</title><link>https://seongju.vercel.app/en/writing/cloudfront-alb-origin-lockdown/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/cloudfront-alb-origin-lockdown/</guid><description>A zero-downtime origin lockdown that moved the BFF first, then restricted direct ALB HTTP access to AWS-managed CloudFront origin-facing networks.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Let the LLM read refund policy; let code calculate the money</title><link>https://seongju.vercel.app/en/writing/deterministic-refund-calculator/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/deterministic-refund-calculator/</guid><description>Natural-language cancellation clauses become evidence-bound intervals, while a deterministic engine owns boundaries, fees, refunds, and blocking ambiguity.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>A disclosure brief that is not allowed to guess one digit</title><link>https://seongju.vercel.app/en/writing/disclosure-number-guardrail/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/disclosure-number-guardrail/</guid><description>Explaining rights issues and convertible bonds while exact-matching every number to source text and rejecting investment-language overreach.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Reducing 100 same-seat requests to one upstream write</title><link>https://seongju.vercel.app/en/writing/durable-reservation-intent-queue/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/durable-reservation-intent-queue/</guid><description>A durable reservation queue using Postgres intents, short claim leases, an outbox, and seat-level coordination around a non-idempotent school API.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>How one failed ECS revision delayed the next deployment for five hours</title><link>https://seongju.vercel.app/en/writing/ecs-deployment-circuit-breaker/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/ecs-deployment-circuit-breaker/</guid><description>Separating a masked shell exit code, ECS launch backoff, and an undersized health grace period to make automatic rollback trustworthy.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Reducing 35 support records to six FAQ candidates without auto-publishing</title><link>https://seongju.vercel.app/en/writing/evidence-grounded-faq-pipeline/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/evidence-grounded-faq-pipeline/</guid><description>A precision-first FAQ pipeline where deterministic code owns PII and evidence checks while an LLM performs bounded semantic merging and drafting.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Trusting the first X-Forwarded-For value broke rate limiting</title><link>https://seongju.vercel.app/en/writing/forwarded-ip-trust-boundary/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/forwarded-ip-trust-boundary/</guid><description>Redesigning client-IP trust across ALB and a BFF, then bounding the rate-limiter map that attacker-controlled keys could grow indefinitely.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Making a 50,000-record spatial import safe to rerun</title><link>https://seongju.vercel.app/en/writing/geocoding-contract-and-idempotency/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/geocoding-contract-and-idempotency/</guid><description>Natural keys, incremental persistence, and real HTTP contract tests for geocoding a coordinate-free public CSV into PostGIS.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Why I Split My Technical Blog into Static Pages and a Git-Backed Admin</title><link>https://seongju.vercel.app/en/writing/git-backed-blog-architecture/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/git-backed-blog-architecture/</guid><description>An architecture record of separating Astro&apos;s static reading experience from browser-based management of posts, categories, and drafts with Keystatic.</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Why Worklogs Belong on GitHub and Explanations Belong on the Blog</title><link>https://seongju.vercel.app/en/writing/github-worklog-and-blog/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/github-worklog-and-blog/</guid><description>A documentation structure that connects Issues, worklogs, ADRs, troubleshooting records, and technical articles without copying every project change into the blog.</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate></item><item><title>A GitOps deadlock between a new readiness probe and an old image</title><link>https://seongju.vercel.app/en/writing/gitops-stale-image-readiness/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/gitops-stale-image-readiness/</guid><description>GitHub redirected the repository but not the GHCR coordinate, so Argo CD combined a new /ready probe with an image that could only return 404.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Designing Kafka consumer groups when every Pod must receive an SSE event</title><link>https://seongju.vercel.app/en/writing/kafka-sse-broadcast-cutover/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/kafka-sse-broadcast-cutover/</guid><description>A cutover from lightweight database notifications to Kafka KRaft, including broadcast semantics, a duplicate-bean rollout failure, and a live broker interruption.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Why approving the card did not execute the reservation</title><link>https://seongju.vercel.app/en/writing/langgraph-hitl-resume-boundary/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/langgraph-hitl-resume-boundary/</guid><description>Separating MCP content blocks, LangGraph checkpoint forks, and stale actions to make the human-in-the-loop flow verifiable beyond the UI.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Why I trust runnable tags instead of node names in a LangGraph SSE stream</title><link>https://seongju.vercel.app/en/writing/langgraph-stream-routing-boundary/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/langgraph-stream-routing-boundary/</guid><description>A streaming and routing repair for real event metadata that differed from mocks, leaked tool preambles, and let stale turns influence new routes.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Why an LLM does not control progression in my learning game</title><link>https://seongju.vercel.app/en/writing/llm-grader-deterministic-engine/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/llm-grader-deterministic-engine/</guid><description>The model classifies free-text answers into four verdicts; authored anchors and a deterministic engine own teaching content, retries, affection, and endings.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Why I stopped asking an LLM to repeat a download URL</title><link>https://seongju.vercel.app/en/writing/lms-capability-link-terminal/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/lms-capability-link-terminal/</guid><description>A deterministic terminal formatter and safe-anchor boundary for an LMS ZIP capability link that disappeared before the final response.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Redrawing the failure boundary to preserve 70 successful LMS files</title><link>https://seongju.vercel.app/en/writing/lms-partial-export-failure-boundary/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/lms-partial-export-failure-boundary/</guid><description>How four unsupported attachments led to explicit origin checks and a partial-success policy instead of discarding an otherwise valid export.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Why I added CPU instead of another index for a 2.68-second spatial p95</title><link>https://seongju.vercel.app/en/writing/load-test-cpu-not-index/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/load-test-cpu-not-index/</guid><description>A small production read-only load test and EXPLAIN analysis that separated a CPU-bound spatial path from two unrelated missing user-query indexes.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Healthy dashboards, silent alerts, and an empty trace backend</title><link>https://seongju.vercel.app/en/writing/observability-label-and-autoconfig/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/observability-label-and-autoconfig/</guid><description>Repairing quiet observability failures by deriving Prometheus label contracts and Spring Boot tracing autoconfiguration from live evidence.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Turning a sequential autograder into a 5.73-second parallel pipeline</title><link>https://seongju.vercel.app/en/writing/posix-parallel-grader-pipeline/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/posix-parallel-grader-pipeline/</guid><description>A systems-programming retrospective on student-level pthreads, overlapped fork/exec preparation, answer caching, buffered I/O, and deterministic output.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>When an expiry predicate dominates a PostGIS spatial query</title><link>https://seongju.vercel.app/en/writing/postgis-expiry-index/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/postgis-expiry-index/</guid><description>How execution plans over 300,000 synthetic places and 210,000 reports showed that expiry aggregation—not the spatial GiST index—was the bottleneck.</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Why I store coordinates as geometry but calculate meter searches as geography</title><link>https://seongju.vercel.app/en/writing/postgis-geometry-geography-index/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/postgis-geometry-geography-index/</guid><description>A PostGIS design using expression-identical GiST indexes to preserve Hibernate and bounds-query compatibility without sacrificing correct radius and kNN semantics.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Cross-instance real-time updates without adding Redis</title><link>https://seongju.vercel.app/en/writing/postgres-notify-sse-surge/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/postgres-notify-sse-surge/</guid><description>Using PostgreSQL NOTIFY only as invalidation, then combining authoritative rereads with SSE snapshots for a small multi-instance ECS service.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Why a 3/3 connection indicator still left private tools unavailable</title><link>https://seongju.vercel.app/en/writing/provider-grant-transaction-boundary/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/provider-grant-transaction-boundary/</guid><description>A three-service authentication incident resolved by separating web identity, provider credentials, and MCP session grants.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>The success-path bug hidden behind HTTP 429</title><link>https://seongju.vercel.app/en/writing/rag-tpm-success-path/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/rag-tpm-success-path/</guid><description>How I isolated a RAG embedding failure to token throughput, then fixed the Jackson response contract that only appeared after rate limiting was gone.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>What should a rate limiter count when one API call fans out six times?</title><link>https://seongju.vercel.app/en/writing/rate-limit-fanout-unit/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/rate-limit-fanout-unit/</guid><description>A redesign of a limiter that returned 429 during a normal seat search because its unit did not match the actual upstream call graph.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Replacing an unencrypted RDS instance without losing data</title><link>https://seongju.vercel.app/en/writing/rds-encrypted-snapshot-restore/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/rds-encrypted-snapshot-restore/</guid><description>A snapshot-copy-and-restore migration for an RDS encryption setting that cannot change in place, including Terraform state recovery and 15 minutes of measured downtime.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Running a JVM with JNA and ZIP scratch files on a read-only root filesystem</title><link>https://seongju.vercel.app/en/writing/readonly-rootfs-jna-scratch/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/readonly-rootfs-jna-scratch/</guid><description>A write-path audit that reduced a writable container to explicit /tmp scratch and an export PVC, then verified the native FFI path in production.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>A mini language from lexer to AST evaluation—and the grammar contract found in review</title><link>https://seongju.vercel.app/en/writing/recursive-descent-tree-walk-interpreter/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/recursive-descent-tree-walk-interpreter/</guid><description>A retrospective on a Python and C++ recursive-descent interpreter, including runtime probes that exposed differences between its README and actual semantics.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>From a 32-bit string to a RISC-V fetch-decode-execute loop</title><link>https://seongju.vercel.app/en/writing/riscv-two-pass-simulator/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/riscv-two-pass-simulator/</guid><description>A computer-architecture retrospective on R, I, S, and B bit fields, sign extension, two-pass branch labels, and a deliberately limited virtual CPU.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Why a monthly ingestion job did not need a new distributed-lock service</title><link>https://seongju.vercel.app/en/writing/scheduled-ingest-advisory-lock/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/scheduled-ingest-advisory-lock/</guid><description>An EventBridge Scheduler Universal Target invoking ECS, with manual and scheduled runs serialized by a PostgreSQL advisory lock held on one physical connection.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Turning coordinate clicks into verifiable UI state transitions</title><link>https://seongju.vercel.app/en/writing/semantic-kiosk-automation/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/semantic-kiosk-automation/</guid><description>A design for controlling source-less Windows kiosks through UIA, OCR, verified postconditions, and a hard stop before payment input.</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Aligning identity boundaries from the browser to private MCP tools</title><link>https://seongju.vercel.app/en/writing/server-verified-principal-boundary/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/server-verified-principal-boundary/</guid><description>How discarding client-claimed principals and separating a server-verified subject from an explicit MCP session prevents IDOR on principal-owned threads and silent privilege downgrade.</description><pubDate>Wed, 15 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Why valid bearer requests returned 401 only in production</title><link>https://seongju.vercel.app/en/writing/spring-security-filter-chain-scope/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/spring-security-filter-chain-scope/</guid><description>A Spring Security incident where an Auth0 filter chain captured every path, rejected another JWT format, and remained invisible under the test profile.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>How Windows CI exposed a SQLite connection leak hidden by Linux</title><link>https://seongju.vercel.app/en/writing/sqlite-context-manager-windows-lock/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/sqlite-context-manager-windows-lock/</guid><description>A WinError 32 portability failure caused by assuming with sqlite3.Connection closes the handle, plus UTF-8 and semantic Path fixes.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Replacing a broken Set-Cookie proxy with a one-time SSO code exchange</title><link>https://seongju.vercel.app/en/writing/sso-one-time-code-exchange/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/sso-one-time-code-exchange/</guid><description>How multiple Set-Cookie headers exposed a fragile proxy boundary and led to a 256-bit, atomically consumed Redis authorization-code protocol.</description><pubDate>Sat, 18 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Contract-testing duplicated scores and Stable Roommates</title><link>https://seongju.vercel.app/en/writing/stable-roommates-contract-testing/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/stable-roommates-contract-testing/</guid><description>Shared fixtures kept parallel frontend and backend scoring aligned, while a small brute-force oracle checked the matching algorithm independently.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Why a Synced StatefulSet kept running the old configuration</title><link>https://seongju.vercel.app/en/writing/statefulset-nonready-rollout/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/statefulset-nonready-rollout/</guid><description>A production incident where Kafka and Tempo remained on broken probes and memory settings even after the Git manifests were corrected.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Why the survival score has a SQL layer and a Java layer</title><link>https://seongju.vercel.app/en/writing/survival-score-sql-policy-boundary/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/survival-score-sql-policy-boundary/</guid><description>PostGIS derives facts while a pure policy function handles weights and missing data, making a composite score explainable and testable.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>When a cached Spring context points to a dead Testcontainer</title><link>https://seongju.vercel.app/en/writing/testcontainers-context-cache-lifecycle/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/testcontainers-context-cache-lifecycle/</guid><description>Aligning class-scoped containers with a cached Spring context, then removing a second CI flake caused by a reservation worker consuming test fixtures.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item><item><title>Production was Ready while the primary URL served the old release</title><link>https://seongju.vercel.app/en/writing/vercel-manual-alias-release/</link><guid isPermaLink="true">https://seongju.vercel.app/en/writing/vercel-manual-alias-release/</guid><description>Git and Vercel succeeded, but a manually assigned .vercel.app alias remained pinned to an older deployment until promotion became an explicit, reversible step.</description><pubDate>Fri, 17 Jul 2026 00:00:00 GMT</pubDate></item></channel></rss>