<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[gitback2life]]></title><description><![CDATA[gitback2life]]></description><link>https://gitback2life.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>gitback2life</title><link>https://gitback2life.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 11:17:01 GMT</lastBuildDate><atom:link href="https://gitback2life.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[We Thought the Feature Was Finished. Then We Tried Using the Full App]]></title><description><![CDATA[The Opportunity Tracker's import and save work had been marked complete. Then I tried using the full application—and found out that “marked complete” and “works when used” are not the same thing.
The ]]></description><link>https://gitback2life.hashnode.dev/we-thought-the-feature-was-finished-then-we-tried-using-the-full-app</link><guid isPermaLink="true">https://gitback2life.hashnode.dev/we-thought-the-feature-was-finished-then-we-tried-using-the-full-app</guid><category><![CDATA[debugging]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Testing]]></category><category><![CDATA[AI]]></category><category><![CDATA[software development]]></category><dc:creator><![CDATA[GetBack 2life]]></dc:creator><pubDate>Fri, 09 Oct 2026 00:18:51 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ac816b8ae5b5258a4c5d3c2/d5723528-df3b-4f01-ab19-703d047f7582.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>The Opportunity Tracker's import and save work had been marked complete. Then I tried using the full application—and found out that “marked complete” and “works when used” are not the same thing.</p>
<p>The first step was to inspect the actual source, not rely on the handoff notes or the appearance of the page. That exposed a basic problem: the page's JavaScript wasn't executing because of a malformed <code>esc()</code> function.</p>
<p>In other words, the interface could look like a feature existed while the code responsible for making it work was failing. The right response wasn't to polish the screen or declare victory. It was to trace the failure and correct the underlying issue.</p>
<h2>The check meant to catch problems had a problem too</h2>
<p>There was a second issue. The deployment validator had a broken regular expression of its own, which meant the safety check could fail for the wrong reason.</p>
<p>That matters because a validation step is only useful if the validation step itself behaves as intended. A check that looks reassuring isn't evidence by itself. It needs to be inspected and tested too.</p>
<p>This became a useful debugging rule: <strong>don't treat a green-looking process or a completed checklist as proof that the application works. Test the actual behavior, and make sure the checks are trustworthy.</strong></p>
<h2>Test the workflow, not just the file</h2>
<p>Once the JavaScript issue was fixed, the next step was to exercise the real import flow with a valid JSON sample. That record was imported into the deployed Opportunity Tracker, and the result was confirmed in the actual tool.</p>
<p>I also tried the negative case: a file containing random characters, <code>adfhapdfhu</code>, with a <code>.json</code> extension. It was rejected correctly. The extension doesn't make the contents valid JSON.</p>
<p>That small experiment revealed an opportunity to make the error handling clearer. There are two different situations:</p>
<ul>
<li><p>The file isn't valid JSON at all.</p>
</li>
<li><p>The file is valid JSON, but doesn't contain a recognizable opportunity record.</p>
</li>
</ul>
<p>Those situations should not produce the same vague response. The importer was improved to distinguish them.</p>
<p>The testing also uncovered a problem that had nothing to do with parsing or JavaScript: the save operation worked, but the confirmation message was visually too quiet. I had to hunt for it.</p>
<p>So the message was made more visible. A user shouldn't have to search the page to find out whether an action succeeded.</p>
<p>The import/export controls also looked disconnected from the section they managed. They were moved next to the imported-files area, where their purpose was easier to understand.</p>
<p>These changes weren't one giant refactor. They were small corrections prompted by using the app as a user rather than judging it from a checklist.</p>
<h2>A more useful definition of “done”</h2>
<p>This experience changed what I want a completed checkpoint to mean. It shouldn't mean only that a file was edited or that a planned task was checked off. It should mean that the relevant behavior was tried, the result was observed, and the result matched what the feature promised—within the limits of the tests performed.</p>
<p>That doesn't mean every possible path is proven or the entire application is finished forever. It means the claim matches the evidence.</p>
<p>For a small local tool, a practical verification pass can include:</p>
<ol>
<li><p>Open the real deployed page and try the action a user would take.</p>
</li>
<li><p>Exercise a normal valid input.</p>
</li>
<li><p>Exercise an invalid or unexpected input.</p>
</li>
<li><p>Confirm the visible result, not just the internal operation.</p>
</li>
<li><p>Inspect the checks intended to catch regressions.</p>
</li>
<li><p>State what passed—and what remains untested—without exaggerating.</p>
</li>
</ol>
<p>The important part is closing the loop between the code, the check, and the user's experience.</p>
<h2>The lesson behind the bug</h2>
<p>The debugging pattern was simple, even if the route to the fix wasn't:</p>
<p><strong>Claim → inspect the actual thing → find the mismatch → fix it → verify again.</strong></p>
<p>That is also how I'm approaching gitback2life as a whole. I'm disabled and live with complicated health issues; those realities are part of my context, but they're not the entire story. The project is about learning, building useful tools, making sound decisions, and solving practical problems. This particular lesson stands on its own as engineering practice: inspect the thing that exists, not just the thing you expected to exist.</p>
<p>AI can help write code and move through unfamiliar territory faster. It can also help produce a plausible explanation for work that hasn't actually been verified. The solution isn't to avoid AI. It's to use it with a process that includes direct inspection, real testing, and honest limits on the conclusions.</p>
<p>The Opportunity Tracker wasn't really finished when the checklist said it was. It got closer when I tried using the full app, followed the evidence, and fixed what I found.</p>
<p><strong>A feature isn't verified because it looks finished. Try it, observe it, and check the result.</strong></p>
<p>Project: <a href="https://gitback2life-art.github.io/gitback2life/">https://gitback2life-art.github.io/gitback2life/</a></p>
<p>Build notes: <a href="https://github.com/gitback2life-art/gitback2life/blob/main/docs/story-log.md">https://github.com/gitback2life-art/gitback2life/blob/main/docs/story-log.md</a></p>
]]></content:encoded></item><item><title><![CDATA[I Started Building Again — Here’s What Actually Happened]]></title><description><![CDATA[I'm disabled and live with complicated health issues. For a long time, those realities limited the work and projects I could take on. I'm sharing that context honestly, but this project isn't a story ]]></description><link>https://gitback2life.hashnode.dev/i-started-building-again-here-s-what-actually-happened</link><guid isPermaLink="true">https://gitback2life.hashnode.dev/i-started-building-again-here-s-what-actually-happened</guid><category><![CDATA[AI]]></category><category><![CDATA[Programming Blogs]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[learning]]></category><category><![CDATA[open source]]></category><category><![CDATA[Productivity]]></category><dc:creator><![CDATA[GetBack 2life]]></dc:creator><pubDate>Thu, 08 Oct 2026 23:21:29 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ac816b8ae5b5258a4c5d3c2/1e80d5d5-e8a8-4b9f-8228-a485e524e381.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I'm disabled and live with complicated health issues. For a long time, those realities limited the work and projects I could take on. I'm sharing that context honestly, but this project isn't a story about disability alone. It's about what I'm working on now: learning, building useful software, and solving real problems.</p>
<p>That work became <strong>gitback2life</strong>.</p>
<p>I didn't start with a giant roadmap or a polished portfolio. I had a computer, curiosity, access to AI tools, and a willingness to learn by doing. The goal was to turn that starting point into real work: code, working tools, practical lessons, and more options for what comes next.</p>
<h2>AI helped. It didn't make the hard parts disappear.</h2>
<p>AI can explain unfamiliar ideas, suggest code, help investigate errors, and turn a vague idea into something concrete. That is meaningful leverage, especially when you're learning as you go.</p>
<p>But generated code is not the same thing as a verified result. Someone still has to notice when the answer is wrong, decide what matters, try the result, investigate failures, and determine what the evidence actually supports.</p>
<p>That distinction quickly became one of the project's core lessons: <strong>AI can accelerate the work, but it doesn't remove the need for judgment.</strong></p>
<h2>Start with something real</h2>
<p>I wasn't beginning from a blank computer. I already had an AI-assisted Windows task-management application. That meant I could learn from an existing project instead of only writing about the intention to learn programming.</p>
<p>The task manager became a concrete case study. Code changed. Bugs needed investigation. Assumptions had to be checked. And the difference between a feature that appears finished and a feature that behaves correctly for the person using it became impossible to ignore.</p>
<p>That pattern carried into the rest of gitback2life.</p>
<h2>The project itself had to be built</h2>
<p>Getting a public repository and a GitHub Pages site running wasn't one flawless automated step. There were configuration limits to work around, the wrong settings page to find, a deployment that initially failed, and privacy details that needed attention.</p>
<p>The first visual direction also wasn't right. It felt too bland for the project, so it was replaced with a stronger cyber-tech identity built around a mountain road and sunrise. The point wasn't to make the first attempt look successful. It was to make a better decision after seeing the first attempt.</p>
<p>The working pattern became:</p>
<p><strong>Attempt → problem → investigation → correction → result.</strong></p>
<h2>A new tool taught a new lesson</h2>
<p>More recently, I built an <strong>Opportunity Tracker</strong>: a small local tool for recording opportunities, deadlines, source links, evidence, notes, risk, and status.</p>
<p>During testing, I had to ask a basic question: <em>What is this actually for, and where do the opportunities come from?</em></p>
<p>That exposed a gap in the workflow. The tracker can organize opportunities, but it doesn't create them. The broader process has to include finding, researching, and evaluating legitimate opportunities before saving them in the tool.</p>
<p>Even small tests revealed useful things. I tried to import a file containing random characters—<code>adfhapdfhu</code>—as JSON. The app rejected it, as it should. A file ending in <code>.json</code> isn't automatically valid JSON. That test led to clearer handling for invalid JSON versus valid JSON that doesn't contain a recognizable opportunity record.</p>
<p>Then there was the save confirmation. Saving was working, but the success message was so subtle that I had to hunt for it. I changed the interface because a technically successful action is not enough if the person using the tool can't easily tell what happened.</p>
<p>Those aren't dramatic breakthroughs. They're practical improvements based on using the software and paying attention to what actually happens.</p>
<h2>Why document the mistakes?</h2>
<p>Because a polished-looking result can hide the work required to get there. I don't want to claim that AI did everything or that every first answer was correct. The useful record includes the wrong turns, the tests, the corrections, and the limits of what has been verified.</p>
<p>That makes the work more useful to me, and potentially to someone else trying to learn how to build with AI in the loop.</p>
<p>The goal of gitback2life is to develop skills, build useful software, and create more choices through practical problem-solving. AI is one tool in that effort; it isn't a substitute for the decisions or verification.</p>
<p>Sometimes the next step is a substantial code change. Sometimes it's figuring out a platform setting. Sometimes it's asking whether a tool solves the right problem. Sometimes it's making a tiny test file full of nonsense to see how an importer responds.</p>
<p>All of that can produce progress when it leads to clearer understanding and a better next step.</p>
<h2>This is the beginning, not a victory lap</h2>
<p>The public website is live, the repository is available, and the first software projects and lessons are documented. There is still more to learn, more to test, and more to build.</p>
<p>That's the point: not a claim of instant success, but a record of practical work and forward movement.</p>
<p><strong>Building what comes next, one line of code at a time.</strong></p>
<p>Project: <a href="https://gitback2life-art.github.io/gitback2life/">https://gitback2life-art.github.io/gitback2life/</a></p>
<p>Code and project notes: <a href="https://github.com/gitback2life-art/gitback2life">https://github.com/gitback2life-art/gitback2life</a></p>
]]></content:encoded></item></channel></rss>