Context
I am a software developer in the United States. I work on a very, very small team, and we are in charge of developing and supporting a custom mobile app for one of our company's biggest clients. The app itself has been deployed to the client, and they love it. However, a few times a day, a user will call in/email for some tech support which usually requires a modification to some data on the database. These updates require us to jump onto the client's production server and modify the data manually.
For a vast majority of these requests, we have some stock SQL scripts that we can run to find and update the appropriate data. However, these scripts are prone to errors because there are a lot of manual steps to each script. For example, you have to look up an order number, then look up which statuses are valid for that order type, then update the order to one of those statuses (in several places) - updating to an invalid status causes lots of data corruption down the road... We've had to work extra time more than once to fix typos which have deleted/changed more records than they should have. We had a tool made by my manager which could handle one or two of the more complicated scenarios, but that tool was somewhat tedious to use and didn't handle errors very well. (My manager admits this himself.)
To remedy this, I thought it would be nice to automate the process. So, during my own free time on weekends, I put together a new tool using some pieces of the old one as a base. Using the example above, the tool would allow us to to select an order and then simply pick a status. The tool would handle finding valid statuses, and does all the verification "behind the scenes".
The new tool has many more features and options available. In addition to being a lot more error-proof, it also logs all actions performed, so in case we accidentally modify data that shouldn't have been changed, it's easy to look it up and change it back. I specifically designed it to be easy to use so that if our team ever hired a new person, it would be very simple to train them to take care of our most basic support requests.
Some details that may matter:
- To verify the tool actually worked correctly, I tested it on our internal development system, which is the standard procedure at our company for all applications we develop. I only did this at the end of my work day, after I had finished my actual assigned work for the day. No "company time" was wasted on this project.
- Our databases are easily restored from backups, so if I had accidentally destroyed data (which isn't very likely to begin with, but still), it would not have been a major problem. In fact, it's something I could have done myself if need be.
- I did NOT use the new tool on the client's production server, and was not planning on doing so until I had my manager's approval - even if that meant I was told not to use it at all.
- It was always my intention to tell my manager about the tool once it was finished. I told him a little earlier due to the news of a new hire.
The Conflict
As it turns out, my manager recently let me know we were indeed going to be hiring a new developer soon. Figuring this would be a good time to show him my progress, I showed him the capabilities of this new tool. His reaction was not quite what I expected. Though he was impressed at how robust and versatile the tool was, and even stated that he would be glad to replace the old tool with my updated version, he also expressed some disappointment that I hadn't told him about the project much sooner. He said that it was unproductive for me to work on it without his approval since he might not have approved of this work. He has explicitly asked me not to work on any "extra" projects on my own time anymore, unless I talk with him first. Though he didn't come right out and say it, I got the impression that he felt I had undermined his role as manager.
I honestly did not consider this perspective while I creating the tool, but now I completely understand his position. Perhaps I was looking at this project with childish naivete, hoping to surprise my manager with a "gift" that would make our jobs a little easier. Obviously that didn't pan out. I'm now worried that despite my best intentions, I overstepped my bounds as an employee. Did I? What would be an appropriate course of action at this point?